From 3c93b92b02c33ecb8567d2f0a5a8539a223b0308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=AFc=20Crouzet?= <noic.crouzet@irit.fr> Date: Fri, 29 Nov 2024 10:36:43 +0100 Subject: [PATCH] Removed all but XDMA, updated to newer linux kernels --- QDMA/linux-kernel/COPYING => COPYING | 0 XDMA/linux-kernel/LICENSE => LICENSE | 0 QDMA/DPDK/RELEASE | 195 - QDMA/DPDK/docs/README.txt | 557 -- QDMA/DPDK/drivers/net/qdma/meson.build | 79 - QDMA/DPDK/drivers/net/qdma/qdma.h | 500 - .../eqdma_cpm5_access/eqdma_cpm5_access.c | 6879 -------------- .../eqdma_cpm5_access/eqdma_cpm5_access.h | 360 - .../eqdma_cpm5_access/eqdma_cpm5_reg.h | 1300 --- .../eqdma_cpm5_access/eqdma_cpm5_reg_dump.c | 4025 --------- .../eqdma_soft_access/eqdma_soft_access.c | 6833 -------------- .../eqdma_soft_access/eqdma_soft_access.h | 361 - .../eqdma_soft_access/eqdma_soft_reg.h | 1540 ---- .../eqdma_soft_access/eqdma_soft_reg_dump.c | 5338 ----------- .../net/qdma/qdma_access/qdma_access_common.c | 1530 ---- .../net/qdma/qdma_access/qdma_access_common.h | 942 -- .../net/qdma/qdma_access/qdma_access_errors.h | 89 - .../net/qdma/qdma_access/qdma_access_export.h | 278 - .../qdma/qdma_access/qdma_access_version.h | 53 - .../qdma_cpm4_access/qdma_cpm4_access.c | 6071 ------------- .../qdma_cpm4_access/qdma_cpm4_access.h | 300 - .../qdma_cpm4_access/qdma_cpm4_reg.h | 2062 ----- .../qdma_cpm4_access/qdma_cpm4_reg_dump.c | 8029 ----------------- .../drivers/net/qdma/qdma_access/qdma_list.c | 78 - .../drivers/net/qdma/qdma_access/qdma_list.h | 142 - .../net/qdma/qdma_access/qdma_mbox_protocol.c | 2156 ----- .../net/qdma/qdma_access/qdma_mbox_protocol.h | 711 -- .../net/qdma/qdma_access/qdma_platform.h | 193 - .../net/qdma/qdma_access/qdma_reg_dump.h | 99 - .../net/qdma/qdma_access/qdma_resource_mgmt.c | 811 -- .../net/qdma/qdma_access/qdma_resource_mgmt.h | 230 - .../qdma_soft_access/qdma_soft_access.c | 6255 ------------- .../qdma_soft_access/qdma_soft_access.h | 310 - .../qdma_soft_access/qdma_soft_reg.h | 599 -- QDMA/DPDK/drivers/net/qdma/qdma_common.c | 657 -- QDMA/DPDK/drivers/net/qdma/qdma_devops.c | 1984 ---- QDMA/DPDK/drivers/net/qdma/qdma_devops.h | 515 -- QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.c | 316 - QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.h | 118 - QDMA/DPDK/drivers/net/qdma/qdma_ethdev.c | 976 -- QDMA/DPDK/drivers/net/qdma/qdma_log.h | 47 - QDMA/DPDK/drivers/net/qdma/qdma_mbox.c | 424 - QDMA/DPDK/drivers/net/qdma/qdma_mbox.h | 75 - QDMA/DPDK/drivers/net/qdma/qdma_platform.c | 264 - .../DPDK/drivers/net/qdma/qdma_platform_env.h | 61 - QDMA/DPDK/drivers/net/qdma/qdma_rxtx.c | 1464 --- QDMA/DPDK/drivers/net/qdma/qdma_rxtx.h | 51 - .../DPDK/drivers/net/qdma/qdma_rxtx_vec_sse.c | 851 -- QDMA/DPDK/drivers/net/qdma/qdma_user.c | 295 - QDMA/DPDK/drivers/net/qdma/qdma_user.h | 253 - QDMA/DPDK/drivers/net/qdma/qdma_vf_ethdev.c | 1265 --- QDMA/DPDK/drivers/net/qdma/qdma_xdebug.c | 1468 --- QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.c | 1821 ---- QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.h | 888 -- QDMA/DPDK/drivers/net/qdma/version.h | 52 - QDMA/DPDK/drivers/net/qdma/version.map | 166 - QDMA/DPDK/examples/qdma_testapp/Makefile | 97 - QDMA/DPDK/examples/qdma_testapp/commands.c | 1526 ---- QDMA/DPDK/examples/qdma_testapp/commands.h | 38 - .../examples/qdma_testapp/parse_obj_list.c | 197 - .../examples/qdma_testapp/parse_obj_list.h | 147 - QDMA/DPDK/examples/qdma_testapp/pcierw.c | 56 - QDMA/DPDK/examples/qdma_testapp/pcierw.h | 43 - QDMA/DPDK/examples/qdma_testapp/qdma_regs.h | 231 - QDMA/DPDK/examples/qdma_testapp/testapp.c | 1118 --- QDMA/DPDK/examples/qdma_testapp/testapp.h | 108 - ...MA-xdebug-to-proc-info-of-dpdk-22.11.patch | 362 - ....0-Patch-to-add-Jumbo-packet-support.patch | 320 - ....1-Patch-to-add-Jumbo-packet-support.patch | 466 - QDMA/DPDK/tools/README.txt | 45 - QDMA/linux-kernel/LICENSE | 30 - QDMA/linux-kernel/Makefile | 184 - QDMA/linux-kernel/RELEASE | 208 - QDMA/linux-kernel/apps/Makefile | 122 - QDMA/linux-kernel/apps/dma-ctl/Makefile | 38 - QDMA/linux-kernel/apps/dma-ctl/cmd_parse.c | 1259 --- QDMA/linux-kernel/apps/dma-ctl/cmd_parse.h | 20 - QDMA/linux-kernel/apps/dma-ctl/main.c | 208 - QDMA/linux-kernel/apps/dma-ctl/version.h | 19 - .../apps/dma-from-device/Makefile | 27 - .../apps/dma-from-device/dma_from_device.c | 236 - .../apps/dma-from-device/version.h | 19 - QDMA/linux-kernel/apps/dma-latency/Makefile | 39 - QDMA/linux-kernel/apps/dma-latency/Readme.txt | 38 - QDMA/linux-kernel/apps/dma-latency/dmalat.c | 1133 --- .../dma-latency/sample_dma_latency_config.txt | 28 - QDMA/linux-kernel/apps/dma-latency/version.h | 19 - QDMA/linux-kernel/apps/dma-perf/Makefile | 39 - QDMA/linux-kernel/apps/dma-perf/dmaperf.c | 2275 ----- .../apps/dma-perf/dmaperf_config/st-bi.zip | Bin 112903 -> 0 bytes .../dmaperf_config/st-c2h-pfetch1.zip | Bin 111916 -> 0 bytes .../apps/dma-perf/dmaperf_config/st-h2c.zip | Bin 105919 -> 0 bytes QDMA/linux-kernel/apps/dma-perf/version.h | 19 - QDMA/linux-kernel/apps/dma-to-device/Makefile | 39 - .../apps/dma-to-device/dma_to_device.c | 265 - .../linux-kernel/apps/dma-to-device/version.h | 19 - QDMA/linux-kernel/apps/dma-utils/Makefile | 26 - .../apps/dma-utils/dma_xfer_utils.c | 214 - QDMA/linux-kernel/apps/dma-utils/dmactl.c | 884 -- .../apps/dma-utils/dmactl_internal.h | 23 - QDMA/linux-kernel/apps/dma-utils/dmactl_reg.c | 461 - QDMA/linux-kernel/apps/dma-utils/dmautils.c | 45 - QDMA/linux-kernel/apps/dma-utils/dmautils.h | 619 -- QDMA/linux-kernel/apps/dma-utils/dmaxfer.c | 1118 --- QDMA/linux-kernel/apps/dma-utils/dmaxfer.h | 46 - QDMA/linux-kernel/apps/dma-utils/version.h | 19 - QDMA/linux-kernel/apps/dma-xfer/Makefile | 39 - QDMA/linux-kernel/apps/dma-xfer/dmaxfer.c | 1266 --- .../apps/dma-xfer/sample_qdma_xfer_config.txt | 30 - QDMA/linux-kernel/apps/dma-xfer/version.h | 18 - QDMA/linux-kernel/apps/include/qdma_nl.h | 480 - .../apps/include/qdma_user_reg_dump.h | 54 - QDMA/linux-kernel/apps/include/xdev_regs.h | 238 - QDMA/linux-kernel/bsd_license.txt | 12 - QDMA/linux-kernel/docs/README | 323 - QDMA/linux-kernel/docs/dma-ctl.8.gz | Bin 2403 -> 0 bytes QDMA/linux-kernel/driver/Makefile | 272 - QDMA/linux-kernel/driver/include/qdma_nl.h | 488 - .../driver/include/qdma_user_reg_dump.h | 61 - QDMA/linux-kernel/driver/include/xdev_regs.h | 246 - QDMA/linux-kernel/driver/libqdma/Makefile | 66 - .../driver/libqdma/libqdma_config.c | 639 -- .../driver/libqdma/libqdma_config.h | 264 - .../driver/libqdma/libqdma_export.c | 2818 ------ .../driver/libqdma/libqdma_export.h | 1698 ---- .../eqdma_cpm5_access/eqdma_cpm5_access.c | 6863 -------------- .../eqdma_cpm5_access/eqdma_cpm5_access.h | 344 - .../eqdma_cpm5_access/eqdma_cpm5_reg.h | 1284 --- .../eqdma_cpm5_access/eqdma_cpm5_reg_dump.c | 4009 -------- .../eqdma_soft_access/eqdma_soft_access.c | 6817 -------------- .../eqdma_soft_access/eqdma_soft_access.h | 345 - .../eqdma_soft_access/eqdma_soft_reg.h | 1524 ---- .../eqdma_soft_access/eqdma_soft_reg_dump.c | 5322 ----------- .../libqdma/qdma_access/qdma_access_common.c | 1514 ---- .../libqdma/qdma_access/qdma_access_common.h | 926 -- .../libqdma/qdma_access/qdma_access_errors.h | 73 - .../libqdma/qdma_access/qdma_access_export.h | 262 - .../libqdma/qdma_access/qdma_access_version.h | 37 - .../qdma_cpm4_access/qdma_cpm4_access.c | 6055 ------------- .../qdma_cpm4_access/qdma_cpm4_access.h | 284 - .../qdma_cpm4_access/qdma_cpm4_reg.h | 2046 ----- .../qdma_cpm4_access/qdma_cpm4_reg_dump.c | 8013 ---------------- .../driver/libqdma/qdma_access/qdma_list.c | 62 - .../driver/libqdma/qdma_access/qdma_list.h | 126 - .../libqdma/qdma_access/qdma_mbox_protocol.c | 2140 ----- .../libqdma/qdma_access/qdma_mbox_protocol.h | 695 -- .../libqdma/qdma_access/qdma_platform.h | 177 - .../libqdma/qdma_access/qdma_reg_dump.h | 83 - .../libqdma/qdma_access/qdma_resource_mgmt.c | 795 -- .../libqdma/qdma_access/qdma_resource_mgmt.h | 214 - .../qdma_soft_access/qdma_soft_access.c | 6239 ------------- .../qdma_soft_access/qdma_soft_access.h | 294 - .../qdma_soft_access/qdma_soft_reg.h | 583 -- .../linux-kernel/driver/libqdma/qdma_compat.h | 107 - .../driver/libqdma/qdma_context.c | 952 -- .../driver/libqdma/qdma_context.h | 159 - .../driver/libqdma/qdma_debugfs.c | 74 - .../driver/libqdma/qdma_debugfs.h | 51 - .../driver/libqdma/qdma_debugfs_dev.c | 1009 --- .../driver/libqdma/qdma_debugfs_dev.h | 29 - .../driver/libqdma/qdma_debugfs_queue.c | 964 -- .../driver/libqdma/qdma_debugfs_queue.h | 33 - QDMA/linux-kernel/driver/libqdma/qdma_descq.c | 2139 ----- QDMA/linux-kernel/driver/libqdma/qdma_descq.h | 613 -- .../linux-kernel/driver/libqdma/qdma_device.c | 635 -- .../linux-kernel/driver/libqdma/qdma_device.h | 266 - QDMA/linux-kernel/driver/libqdma/qdma_intr.c | 1024 --- QDMA/linux-kernel/driver/libqdma/qdma_intr.h | 259 - .../driver/libqdma/qdma_license.h | 22 - QDMA/linux-kernel/driver/libqdma/qdma_mbox.c | 594 -- QDMA/linux-kernel/driver/libqdma/qdma_mbox.h | 163 - .../driver/libqdma/qdma_platform.c | 145 - .../driver/libqdma/qdma_platform_env.h | 33 - QDMA/linux-kernel/driver/libqdma/qdma_regs.c | 610 -- QDMA/linux-kernel/driver/libqdma/qdma_regs.h | 185 - QDMA/linux-kernel/driver/libqdma/qdma_sriov.c | 279 - .../linux-kernel/driver/libqdma/qdma_st_c2h.c | 1286 --- .../linux-kernel/driver/libqdma/qdma_st_c2h.h | 227 - .../linux-kernel/driver/libqdma/qdma_thread.c | 236 - .../linux-kernel/driver/libqdma/qdma_thread.h | 76 - .../linux-kernel/driver/libqdma/qdma_ul_ext.h | 99 - QDMA/linux-kernel/driver/libqdma/thread.c | 194 - QDMA/linux-kernel/driver/libqdma/thread.h | 146 - QDMA/linux-kernel/driver/libqdma/version.h | 40 - QDMA/linux-kernel/driver/libqdma/xdev.c | 1535 ---- QDMA/linux-kernel/driver/libqdma/xdev.h | 622 -- .../driver/make_rules/common_flags.mk | 28 - .../driver/make_rules/distro_check.mk | 132 - .../driver/make_rules/kernel_check.mk | 351 - QDMA/linux-kernel/driver/src/Makefile | 147 - QDMA/linux-kernel/driver/src/cdev.c | 819 -- QDMA/linux-kernel/driver/src/cdev.h | 183 - QDMA/linux-kernel/driver/src/nl.c | 2902 ------ QDMA/linux-kernel/driver/src/nl.h | 49 - QDMA/linux-kernel/driver/src/pci_ids.h | 477 - QDMA/linux-kernel/driver/src/qdma_mod.c | 1927 ---- QDMA/linux-kernel/driver/src/qdma_mod.h | 238 - QDMA/linux-kernel/driver/src/version.h | 47 - QDMA/linux-kernel/license.txt | 14 - .../scripts/datafile_16bit_pattern.bin | Bin 262144 -> 0 bytes .../license-for-datafile_16bit_pattern.txt | 19 - .../scripts/qdma_generate_conf_file.sh | 121 - .../scripts/qdma_run_test_mm_vf.sh | 162 - QDMA/linux-kernel/scripts/qdma_run_test_pf.sh | 508 -- .../scripts/qdma_run_test_st_vf.sh | 229 - QDMA/linux-kernel/scripts/qdma_vf_auto_tst.sh | 102 - QDMA/windows/QDMA.sln | 69 - QDMA/windows/README.md | 266 - QDMA/windows/RELEASE | 76 - .../apps/common/include/device_file.hpp | 293 - QDMA/windows/apps/dma-arw/datafile256K.bin | Bin 262144 -> 0 bytes QDMA/windows/apps/dma-arw/datafile4K.bin | Bin 4096 -> 0 bytes QDMA/windows/apps/dma-arw/dma_arw.cpp | 723 -- QDMA/windows/apps/dma-arw/dma_arw.hpp | 315 - QDMA/windows/apps/dma-arw/dma_arw.vcxproj | 146 - .../apps/dma-arw/dma_arw.vcxproj.filters | 30 - .../windows/apps/dma-arw/dma_arw.vcxproj.user | 4 - QDMA/windows/apps/dma-arw/version.h | 26 - QDMA/windows/apps/dma-ctl/dmactl.cpp | 1440 --- QDMA/windows/apps/dma-ctl/dmactl.vcxproj | 146 - .../apps/dma-ctl/dmactl.vcxproj.filters | 30 - QDMA/windows/apps/dma-ctl/dmactl.vcxproj.user | 4 - QDMA/windows/apps/dma-ctl/version.h | 26 - QDMA/windows/apps/dma-rw/datafile256K.bin | Bin 262144 -> 0 bytes QDMA/windows/apps/dma-rw/datafile4K.bin | Bin 4096 -> 0 bytes QDMA/windows/apps/dma-rw/dma_rw.cpp | 543 -- QDMA/windows/apps/dma-rw/dma_rw.hpp | 296 - QDMA/windows/apps/dma-rw/dma_rw.vcxproj | 146 - .../apps/dma-rw/dma_rw.vcxproj.filters | 30 - QDMA/windows/apps/dma-rw/dma_rw.vcxproj.user | 4 - QDMA/windows/apps/dma-rw/version.h | 26 - .../windows/sys/drv/include/qdma_driver_api.h | 434 - QDMA/windows/sys/drv/qdma.inf | 325 - QDMA/windows/sys/drv/qdma_generic.vcxproj | 213 - .../sys/drv/qdma_generic.vcxproj.filters | 73 - .../windows/sys/drv/qdma_generic.vcxproj.user | 36 - QDMA/windows/sys/drv/resource/Resource.aps | Bin 2984 -> 0 bytes QDMA/windows/sys/drv/resource/Resource.rc | Bin 2038 -> 0 bytes QDMA/windows/sys/drv/source/device.cpp | 248 - QDMA/windows/sys/drv/source/device.h | 65 - QDMA/windows/sys/drv/source/driver.cpp | 98 - QDMA/windows/sys/drv/source/driver.h | 32 - QDMA/windows/sys/drv/source/io_queue.cpp | 1441 --- QDMA/windows/sys/drv/source/io_queue.h | 52 - QDMA/windows/sys/drv/source/trace.h | 89 - QDMA/windows/sys/drv/source/windows_common.h | 29 - .../sys/libqdma/include/qdma_exports.h | 940 -- QDMA/windows/sys/libqdma/include/xversion.hpp | 75 - QDMA/windows/sys/libqdma/libqdma.vcxproj | 229 - .../sys/libqdma/libqdma.vcxproj.filters | 129 - QDMA/windows/sys/libqdma/libqdma.vcxproj.user | 36 - .../windows/sys/libqdma/source/interrupts.cpp | 947 -- .../windows/sys/libqdma/source/interrupts.hpp | 107 - QDMA/windows/sys/libqdma/source/qdma.cpp | 4235 --------- QDMA/windows/sys/libqdma/source/qdma.h | 616 -- .../eqdma_soft_access/eqdma_soft_access.c | 5868 ------------ .../eqdma_soft_access/eqdma_soft_access.h | 306 - .../eqdma_soft_access/eqdma_soft_reg.h | 1226 --- .../eqdma_soft_access/eqdma_soft_reg_dump.c | 3938 -------- .../source/qdma_access/qdma_access_common.c | 1284 --- .../source/qdma_access/qdma_access_common.h | 902 -- .../source/qdma_access/qdma_access_errors.h | 72 - .../source/qdma_access/qdma_access_export.h | 255 - .../source/qdma_access/qdma_access_version.h | 36 - .../libqdma/source/qdma_access/qdma_list.c | 61 - .../libqdma/source/qdma_access/qdma_list.h | 125 - .../source/qdma_access/qdma_platform.h | 168 - .../source/qdma_access/qdma_reg_dump.h | 82 - .../source/qdma_access/qdma_resource_mgmt.c | 794 -- .../source/qdma_access/qdma_resource_mgmt.h | 213 - .../qdma_s80_hard_access.c | 5894 ------------ .../qdma_s80_hard_access.h | 278 - .../qdma_s80_hard_access/qdma_s80_hard_reg.h | 2045 ----- .../qdma_s80_hard_reg_dump.c | 8013 ---------------- .../qdma_soft_access/qdma_soft_access.c | 6151 ------------- .../qdma_soft_access/qdma_soft_access.h | 292 - .../qdma_soft_access/qdma_soft_reg.h | 582 -- QDMA/windows/sys/libqdma/source/qdma_config.h | 20 - .../windows/sys/libqdma/source/qdma_license.h | 18 - .../sys/libqdma/source/qdma_platform.cpp | 180 - .../sys/libqdma/source/qdma_platform_env.h | 43 - .../windows/sys/libqdma/source/qdma_reg_ext.h | 171 - QDMA/windows/sys/libqdma/source/thread.cpp | 341 - QDMA/windows/sys/libqdma/source/thread.h | 86 - QDMA/windows/sys/libqdma/source/trace.h | 94 - QDMA/windows/sys/libqdma/source/xpcie.cpp | 376 - QDMA/windows/sys/libqdma/source/xpcie.hpp | 76 - README.md | 33 - XDMA/linux-kernel/RELEASE => RELEASE | 0 XDMA/linux-kernel/COPYING | 340 - XVSEC/linux-kernel/COPYING | 340 - XVSEC/linux-kernel/LICENSE | 30 - XVSEC/linux-kernel/Makefile | 99 - XVSEC/linux-kernel/README | 1 - XVSEC/linux-kernel/RELEASE | 81 - XVSEC/linux-kernel/docs/README | 662 -- XVSEC/linux-kernel/drv/Makefile | 39 - XVSEC/linux-kernel/drv/version.h | 40 - XVSEC/linux-kernel/drv/xvsec_cdev.c | 133 - XVSEC/linux-kernel/drv/xvsec_cdev.h | 79 - XVSEC/linux-kernel/drv/xvsec_drv.c | 570 -- XVSEC/linux-kernel/drv/xvsec_drv.h | 155 - XVSEC/linux-kernel/drv/xvsec_drv_int.h | 117 - .../drv/xvsec_mcap/us/xvsec_mcap_us.c | 1190 --- .../drv/xvsec_mcap/us/xvsec_mcap_us.h | 158 - .../drv/xvsec_mcap/versal/xvsec_mcap_versal.c | 1144 --- .../drv/xvsec_mcap/versal/xvsec_mcap_versal.h | 170 - .../linux-kernel/drv/xvsec_mcap/xvsec_mcap.c | 873 -- .../linux-kernel/drv/xvsec_mcap/xvsec_mcap.h | 537 -- XVSEC/linux-kernel/drv/xvsec_util.c | 172 - XVSEC/linux-kernel/drv/xvsec_util.h | 45 - XVSEC/linux-kernel/libxvsec/Makefile | 24 - XVSEC/linux-kernel/libxvsec/version.h | 36 - XVSEC/linux-kernel/libxvsec/xvsec.c | 388 - XVSEC/linux-kernel/libxvsec/xvsec.h | 877 -- XVSEC/linux-kernel/libxvsec/xvsec_int.h | 43 - XVSEC/linux-kernel/libxvsec/xvsec_mcap.c | 887 -- XVSEC/linux-kernel/tools/Makefile | 20 - XVSEC/linux-kernel/tools/main.c | 473 - XVSEC/linux-kernel/tools/main.h | 164 - XVSEC/linux-kernel/tools/mcap_ops.c | 753 -- XVSEC/linux-kernel/tools/mcap_ops.h | 51 - XVSEC/linux-kernel/tools/version.h | 36 - XVSEC/linux-kernel/tools/xvsec_parser.c | 965 -- XVSEC/linux-kernel/tools/xvsec_parser.h | 56 - docs/source/includeme.rst | 1 - .../include => include}/libxdma_api.h | 0 index.html | 30 - XDMA/linux-kernel/readme.txt => readme.txt | 0 .../tests => tests}/data/datafile0_4K.bin | Bin .../tests => tests}/data/datafile1_4K.bin | Bin .../tests => tests}/data/datafile2_4K.bin | Bin .../tests => tests}/data/datafile3_4K.bin | Bin .../tests => tests}/data/datafile_256K.bin | Bin .../tests => tests}/data/datafile_32M.bin | Bin .../tests => tests}/data/datafile_8K.bin | Bin .../tests => tests}/dma_memory_mapped_test.sh | 0 .../tests => tests}/dma_streaming_test.sh | 0 .../tests => tests}/load_driver.sh | 0 .../tests => tests}/perform_hwcount.sh | 0 .../linux-kernel/tests => tests}/run_test.sh | 0 .../scripts_mm/fio_parse_result.sh | 0 .../tests => tests}/scripts_mm/fio_test.sh | 0 .../tests => tests}/scripts_mm/io.sh | 0 .../tests => tests}/scripts_mm/io_sweep.sh | 0 .../tests => tests}/scripts_mm/libtest.sh | 0 .../tests => tests}/scripts_mm/unaligned.sh | 0 .../tests => tests}/scripts_mm/xdma_mm.sh | 0 {XDMA/linux-kernel/tools => tools}/Makefile | 0 .../tools => tools}/dma_from_device.c | 0 .../tools => tools}/dma_to_device.c | 0 .../linux-kernel/tools => tools}/dma_utils.c | 0 .../tools => tools}/performance.c | 0 {XDMA/linux-kernel/tools => tools}/reg_rw.c | 0 .../tools => tools}/test_chrdev.c | 0 {XDMA/linux-kernel/xdma => xdma}/Makefile | 0 .../linux-kernel/xdma => xdma}/cdev_bypass.c | 0 {XDMA/linux-kernel/xdma => xdma}/cdev_ctrl.c | 4 + {XDMA/linux-kernel/xdma => xdma}/cdev_ctrl.h | 0 .../linux-kernel/xdma => xdma}/cdev_events.c | 0 {XDMA/linux-kernel/xdma => xdma}/cdev_sgdma.c | 10 +- {XDMA/linux-kernel/xdma => xdma}/cdev_sgdma.h | 0 {XDMA/linux-kernel/xdma => xdma}/cdev_xvc.c | 0 {XDMA/linux-kernel/xdma => xdma}/cdev_xvc.h | 0 {XDMA/linux-kernel/xdma => xdma}/libxdma.c | 0 {XDMA/linux-kernel/xdma => xdma}/libxdma.h | 0 {XDMA/linux-kernel/xdma => xdma}/version.h | 0 {XDMA/linux-kernel/xdma => xdma}/xdma_cdev.c | 4 + {XDMA/linux-kernel/xdma => xdma}/xdma_cdev.h | 0 {XDMA/linux-kernel/xdma => xdma}/xdma_mod.c | 0 {XDMA/linux-kernel/xdma => xdma}/xdma_mod.h | 0 .../linux-kernel/xdma => xdma}/xdma_thread.c | 0 .../linux-kernel/xdma => xdma}/xdma_thread.h | 0 373 files changed, 17 insertions(+), 243698 deletions(-) rename QDMA/linux-kernel/COPYING => COPYING (100%) mode change 100755 => 100644 rename XDMA/linux-kernel/LICENSE => LICENSE (100%) delete mode 100755 QDMA/DPDK/RELEASE delete mode 100755 QDMA/DPDK/docs/README.txt delete mode 100755 QDMA/DPDK/drivers/net/qdma/meson.build delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_access.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_access.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_reg.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_common.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_common.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_errors.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_export.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_version.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_list.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_list.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_mbox_protocol.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_mbox_protocol.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_platform.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_reg_dump.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_resource_mgmt.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_resource_mgmt.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_access.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_access.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_reg.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_common.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_devops.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_devops.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_ethdev.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_log.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_mbox.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_mbox.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_platform.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_platform_env.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_rxtx.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_rxtx.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_rxtx_vec_sse.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_user.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_user.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_vf_ethdev.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/qdma_xdebug.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.c delete mode 100755 QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/version.h delete mode 100755 QDMA/DPDK/drivers/net/qdma/version.map delete mode 100755 QDMA/DPDK/examples/qdma_testapp/Makefile delete mode 100755 QDMA/DPDK/examples/qdma_testapp/commands.c delete mode 100755 QDMA/DPDK/examples/qdma_testapp/commands.h delete mode 100755 QDMA/DPDK/examples/qdma_testapp/parse_obj_list.c delete mode 100755 QDMA/DPDK/examples/qdma_testapp/parse_obj_list.h delete mode 100755 QDMA/DPDK/examples/qdma_testapp/pcierw.c delete mode 100755 QDMA/DPDK/examples/qdma_testapp/pcierw.h delete mode 100755 QDMA/DPDK/examples/qdma_testapp/qdma_regs.h delete mode 100755 QDMA/DPDK/examples/qdma_testapp/testapp.c delete mode 100755 QDMA/DPDK/examples/qdma_testapp/testapp.h delete mode 100755 QDMA/DPDK/tools/0001-Add-QDMA-xdebug-to-proc-info-of-dpdk-22.11.patch delete mode 100755 QDMA/DPDK/tools/0001-PKTGEN-20.12.0-Patch-to-add-Jumbo-packet-support.patch delete mode 100755 QDMA/DPDK/tools/0001-PKTGEN-22.04.1-Patch-to-add-Jumbo-packet-support.patch delete mode 100755 QDMA/DPDK/tools/README.txt delete mode 100755 QDMA/linux-kernel/LICENSE delete mode 100755 QDMA/linux-kernel/Makefile delete mode 100755 QDMA/linux-kernel/RELEASE delete mode 100755 QDMA/linux-kernel/apps/Makefile delete mode 100755 QDMA/linux-kernel/apps/dma-ctl/Makefile delete mode 100755 QDMA/linux-kernel/apps/dma-ctl/cmd_parse.c delete mode 100755 QDMA/linux-kernel/apps/dma-ctl/cmd_parse.h delete mode 100755 QDMA/linux-kernel/apps/dma-ctl/main.c delete mode 100755 QDMA/linux-kernel/apps/dma-ctl/version.h delete mode 100755 QDMA/linux-kernel/apps/dma-from-device/Makefile delete mode 100755 QDMA/linux-kernel/apps/dma-from-device/dma_from_device.c delete mode 100755 QDMA/linux-kernel/apps/dma-from-device/version.h delete mode 100755 QDMA/linux-kernel/apps/dma-latency/Makefile delete mode 100755 QDMA/linux-kernel/apps/dma-latency/Readme.txt delete mode 100755 QDMA/linux-kernel/apps/dma-latency/dmalat.c delete mode 100755 QDMA/linux-kernel/apps/dma-latency/sample_dma_latency_config.txt delete mode 100755 QDMA/linux-kernel/apps/dma-latency/version.h delete mode 100755 QDMA/linux-kernel/apps/dma-perf/Makefile delete mode 100755 QDMA/linux-kernel/apps/dma-perf/dmaperf.c delete mode 100644 QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-bi.zip delete mode 100644 QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-c2h-pfetch1.zip delete mode 100644 QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-h2c.zip delete mode 100755 QDMA/linux-kernel/apps/dma-perf/version.h delete mode 100755 QDMA/linux-kernel/apps/dma-to-device/Makefile delete mode 100755 QDMA/linux-kernel/apps/dma-to-device/dma_to_device.c delete mode 100755 QDMA/linux-kernel/apps/dma-to-device/version.h delete mode 100755 QDMA/linux-kernel/apps/dma-utils/Makefile delete mode 100755 QDMA/linux-kernel/apps/dma-utils/dma_xfer_utils.c delete mode 100755 QDMA/linux-kernel/apps/dma-utils/dmactl.c delete mode 100755 QDMA/linux-kernel/apps/dma-utils/dmactl_internal.h delete mode 100755 QDMA/linux-kernel/apps/dma-utils/dmactl_reg.c delete mode 100755 QDMA/linux-kernel/apps/dma-utils/dmautils.c delete mode 100755 QDMA/linux-kernel/apps/dma-utils/dmautils.h delete mode 100755 QDMA/linux-kernel/apps/dma-utils/dmaxfer.c delete mode 100755 QDMA/linux-kernel/apps/dma-utils/dmaxfer.h delete mode 100755 QDMA/linux-kernel/apps/dma-utils/version.h delete mode 100755 QDMA/linux-kernel/apps/dma-xfer/Makefile delete mode 100755 QDMA/linux-kernel/apps/dma-xfer/dmaxfer.c delete mode 100755 QDMA/linux-kernel/apps/dma-xfer/sample_qdma_xfer_config.txt delete mode 100755 QDMA/linux-kernel/apps/dma-xfer/version.h delete mode 100755 QDMA/linux-kernel/apps/include/qdma_nl.h delete mode 100755 QDMA/linux-kernel/apps/include/qdma_user_reg_dump.h delete mode 100755 QDMA/linux-kernel/apps/include/xdev_regs.h delete mode 100755 QDMA/linux-kernel/bsd_license.txt delete mode 100755 QDMA/linux-kernel/docs/README delete mode 100755 QDMA/linux-kernel/docs/dma-ctl.8.gz delete mode 100755 QDMA/linux-kernel/driver/Makefile delete mode 100755 QDMA/linux-kernel/driver/include/qdma_nl.h delete mode 100755 QDMA/linux-kernel/driver/include/qdma_user_reg_dump.h delete mode 100755 QDMA/linux-kernel/driver/include/xdev_regs.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/Makefile delete mode 100755 QDMA/linux-kernel/driver/libqdma/libqdma_config.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/libqdma_config.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/libqdma_export.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/libqdma_export.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_common.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_common.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_errors.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_export.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_version.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_list.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_list.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_mbox_protocol.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_mbox_protocol.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_platform.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_reg_dump.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_resource_mgmt.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_resource_mgmt.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_access.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_access.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_reg.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_compat.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_context.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_context.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_debugfs.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_debugfs.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_debugfs_dev.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_debugfs_dev.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_debugfs_queue.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_debugfs_queue.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_descq.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_descq.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_device.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_device.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_intr.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_intr.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_license.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_mbox.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_mbox.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_platform.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_platform_env.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_regs.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_regs.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_sriov.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_st_c2h.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_st_c2h.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_thread.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_thread.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/qdma_ul_ext.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/thread.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/thread.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/version.h delete mode 100755 QDMA/linux-kernel/driver/libqdma/xdev.c delete mode 100755 QDMA/linux-kernel/driver/libqdma/xdev.h delete mode 100755 QDMA/linux-kernel/driver/make_rules/common_flags.mk delete mode 100755 QDMA/linux-kernel/driver/make_rules/distro_check.mk delete mode 100755 QDMA/linux-kernel/driver/make_rules/kernel_check.mk delete mode 100755 QDMA/linux-kernel/driver/src/Makefile delete mode 100755 QDMA/linux-kernel/driver/src/cdev.c delete mode 100755 QDMA/linux-kernel/driver/src/cdev.h delete mode 100755 QDMA/linux-kernel/driver/src/nl.c delete mode 100755 QDMA/linux-kernel/driver/src/nl.h delete mode 100755 QDMA/linux-kernel/driver/src/pci_ids.h delete mode 100755 QDMA/linux-kernel/driver/src/qdma_mod.c delete mode 100755 QDMA/linux-kernel/driver/src/qdma_mod.h delete mode 100755 QDMA/linux-kernel/driver/src/version.h delete mode 100755 QDMA/linux-kernel/license.txt delete mode 100755 QDMA/linux-kernel/scripts/datafile_16bit_pattern.bin delete mode 100755 QDMA/linux-kernel/scripts/license-for-datafile_16bit_pattern.txt delete mode 100755 QDMA/linux-kernel/scripts/qdma_generate_conf_file.sh delete mode 100755 QDMA/linux-kernel/scripts/qdma_run_test_mm_vf.sh delete mode 100755 QDMA/linux-kernel/scripts/qdma_run_test_pf.sh delete mode 100755 QDMA/linux-kernel/scripts/qdma_run_test_st_vf.sh delete mode 100755 QDMA/linux-kernel/scripts/qdma_vf_auto_tst.sh delete mode 100644 QDMA/windows/QDMA.sln delete mode 100644 QDMA/windows/README.md delete mode 100644 QDMA/windows/RELEASE delete mode 100644 QDMA/windows/apps/common/include/device_file.hpp delete mode 100644 QDMA/windows/apps/dma-arw/datafile256K.bin delete mode 100644 QDMA/windows/apps/dma-arw/datafile4K.bin delete mode 100644 QDMA/windows/apps/dma-arw/dma_arw.cpp delete mode 100644 QDMA/windows/apps/dma-arw/dma_arw.hpp delete mode 100644 QDMA/windows/apps/dma-arw/dma_arw.vcxproj delete mode 100644 QDMA/windows/apps/dma-arw/dma_arw.vcxproj.filters delete mode 100644 QDMA/windows/apps/dma-arw/dma_arw.vcxproj.user delete mode 100644 QDMA/windows/apps/dma-arw/version.h delete mode 100644 QDMA/windows/apps/dma-ctl/dmactl.cpp delete mode 100644 QDMA/windows/apps/dma-ctl/dmactl.vcxproj delete mode 100644 QDMA/windows/apps/dma-ctl/dmactl.vcxproj.filters delete mode 100644 QDMA/windows/apps/dma-ctl/dmactl.vcxproj.user delete mode 100644 QDMA/windows/apps/dma-ctl/version.h delete mode 100644 QDMA/windows/apps/dma-rw/datafile256K.bin delete mode 100644 QDMA/windows/apps/dma-rw/datafile4K.bin delete mode 100644 QDMA/windows/apps/dma-rw/dma_rw.cpp delete mode 100644 QDMA/windows/apps/dma-rw/dma_rw.hpp delete mode 100644 QDMA/windows/apps/dma-rw/dma_rw.vcxproj delete mode 100644 QDMA/windows/apps/dma-rw/dma_rw.vcxproj.filters delete mode 100644 QDMA/windows/apps/dma-rw/dma_rw.vcxproj.user delete mode 100644 QDMA/windows/apps/dma-rw/version.h delete mode 100644 QDMA/windows/sys/drv/include/qdma_driver_api.h delete mode 100644 QDMA/windows/sys/drv/qdma.inf delete mode 100644 QDMA/windows/sys/drv/qdma_generic.vcxproj delete mode 100644 QDMA/windows/sys/drv/qdma_generic.vcxproj.filters delete mode 100644 QDMA/windows/sys/drv/qdma_generic.vcxproj.user delete mode 100644 QDMA/windows/sys/drv/resource/Resource.aps delete mode 100644 QDMA/windows/sys/drv/resource/Resource.rc delete mode 100644 QDMA/windows/sys/drv/source/device.cpp delete mode 100644 QDMA/windows/sys/drv/source/device.h delete mode 100644 QDMA/windows/sys/drv/source/driver.cpp delete mode 100644 QDMA/windows/sys/drv/source/driver.h delete mode 100644 QDMA/windows/sys/drv/source/io_queue.cpp delete mode 100644 QDMA/windows/sys/drv/source/io_queue.h delete mode 100644 QDMA/windows/sys/drv/source/trace.h delete mode 100644 QDMA/windows/sys/drv/source/windows_common.h delete mode 100644 QDMA/windows/sys/libqdma/include/qdma_exports.h delete mode 100644 QDMA/windows/sys/libqdma/include/xversion.hpp delete mode 100644 QDMA/windows/sys/libqdma/libqdma.vcxproj delete mode 100644 QDMA/windows/sys/libqdma/libqdma.vcxproj.filters delete mode 100644 QDMA/windows/sys/libqdma/libqdma.vcxproj.user delete mode 100644 QDMA/windows/sys/libqdma/source/interrupts.cpp delete mode 100644 QDMA/windows/sys/libqdma/source/interrupts.hpp delete mode 100644 QDMA/windows/sys/libqdma/source/qdma.cpp delete mode 100644 QDMA/windows/sys/libqdma/source/qdma.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_access.c delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_access.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_reg.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_common.c delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_common.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_errors.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_export.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_version.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_list.c delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_list.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_platform.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_reg_dump.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_resource_mgmt.c delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_resource_mgmt.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_access.c delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_access.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_reg.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_reg_dump.c delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_access.c delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_access.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_reg.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_config.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_license.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_platform.cpp delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_platform_env.h delete mode 100644 QDMA/windows/sys/libqdma/source/qdma_reg_ext.h delete mode 100644 QDMA/windows/sys/libqdma/source/thread.cpp delete mode 100644 QDMA/windows/sys/libqdma/source/thread.h delete mode 100644 QDMA/windows/sys/libqdma/source/trace.h delete mode 100644 QDMA/windows/sys/libqdma/source/xpcie.cpp delete mode 100644 QDMA/windows/sys/libqdma/source/xpcie.hpp delete mode 100644 README.md rename XDMA/linux-kernel/RELEASE => RELEASE (100%) delete mode 100644 XDMA/linux-kernel/COPYING delete mode 100644 XVSEC/linux-kernel/COPYING delete mode 100644 XVSEC/linux-kernel/LICENSE delete mode 100644 XVSEC/linux-kernel/Makefile delete mode 100644 XVSEC/linux-kernel/README delete mode 100644 XVSEC/linux-kernel/RELEASE delete mode 100644 XVSEC/linux-kernel/docs/README delete mode 100644 XVSEC/linux-kernel/drv/Makefile delete mode 100644 XVSEC/linux-kernel/drv/version.h delete mode 100644 XVSEC/linux-kernel/drv/xvsec_cdev.c delete mode 100644 XVSEC/linux-kernel/drv/xvsec_cdev.h delete mode 100644 XVSEC/linux-kernel/drv/xvsec_drv.c delete mode 100644 XVSEC/linux-kernel/drv/xvsec_drv.h delete mode 100644 XVSEC/linux-kernel/drv/xvsec_drv_int.h delete mode 100644 XVSEC/linux-kernel/drv/xvsec_mcap/us/xvsec_mcap_us.c delete mode 100644 XVSEC/linux-kernel/drv/xvsec_mcap/us/xvsec_mcap_us.h delete mode 100644 XVSEC/linux-kernel/drv/xvsec_mcap/versal/xvsec_mcap_versal.c delete mode 100644 XVSEC/linux-kernel/drv/xvsec_mcap/versal/xvsec_mcap_versal.h delete mode 100644 XVSEC/linux-kernel/drv/xvsec_mcap/xvsec_mcap.c delete mode 100644 XVSEC/linux-kernel/drv/xvsec_mcap/xvsec_mcap.h delete mode 100644 XVSEC/linux-kernel/drv/xvsec_util.c delete mode 100644 XVSEC/linux-kernel/drv/xvsec_util.h delete mode 100644 XVSEC/linux-kernel/libxvsec/Makefile delete mode 100644 XVSEC/linux-kernel/libxvsec/version.h delete mode 100644 XVSEC/linux-kernel/libxvsec/xvsec.c delete mode 100644 XVSEC/linux-kernel/libxvsec/xvsec.h delete mode 100644 XVSEC/linux-kernel/libxvsec/xvsec_int.h delete mode 100644 XVSEC/linux-kernel/libxvsec/xvsec_mcap.c delete mode 100644 XVSEC/linux-kernel/tools/Makefile delete mode 100644 XVSEC/linux-kernel/tools/main.c delete mode 100644 XVSEC/linux-kernel/tools/main.h delete mode 100644 XVSEC/linux-kernel/tools/mcap_ops.c delete mode 100644 XVSEC/linux-kernel/tools/mcap_ops.h delete mode 100644 XVSEC/linux-kernel/tools/version.h delete mode 100644 XVSEC/linux-kernel/tools/xvsec_parser.c delete mode 100644 XVSEC/linux-kernel/tools/xvsec_parser.h delete mode 100644 docs/source/includeme.rst rename {XDMA/linux-kernel/include => include}/libxdma_api.h (100%) delete mode 100644 index.html rename XDMA/linux-kernel/readme.txt => readme.txt (100%) rename {XDMA/linux-kernel/tests => tests}/data/datafile0_4K.bin (100%) rename {XDMA/linux-kernel/tests => tests}/data/datafile1_4K.bin (100%) rename {XDMA/linux-kernel/tests => tests}/data/datafile2_4K.bin (100%) rename {XDMA/linux-kernel/tests => tests}/data/datafile3_4K.bin (100%) rename {XDMA/linux-kernel/tests => tests}/data/datafile_256K.bin (100%) rename {XDMA/linux-kernel/tests => tests}/data/datafile_32M.bin (100%) rename {XDMA/linux-kernel/tests => tests}/data/datafile_8K.bin (100%) rename {XDMA/linux-kernel/tests => tests}/dma_memory_mapped_test.sh (100%) rename {XDMA/linux-kernel/tests => tests}/dma_streaming_test.sh (100%) rename {XDMA/linux-kernel/tests => tests}/load_driver.sh (100%) rename {XDMA/linux-kernel/tests => tests}/perform_hwcount.sh (100%) rename {XDMA/linux-kernel/tests => tests}/run_test.sh (100%) rename {XDMA/linux-kernel/tests => tests}/scripts_mm/fio_parse_result.sh (100%) rename {XDMA/linux-kernel/tests => tests}/scripts_mm/fio_test.sh (100%) rename {XDMA/linux-kernel/tests => tests}/scripts_mm/io.sh (100%) rename {XDMA/linux-kernel/tests => tests}/scripts_mm/io_sweep.sh (100%) rename {XDMA/linux-kernel/tests => tests}/scripts_mm/libtest.sh (100%) rename {XDMA/linux-kernel/tests => tests}/scripts_mm/unaligned.sh (100%) rename {XDMA/linux-kernel/tests => tests}/scripts_mm/xdma_mm.sh (100%) rename {XDMA/linux-kernel/tools => tools}/Makefile (100%) rename {XDMA/linux-kernel/tools => tools}/dma_from_device.c (100%) rename {XDMA/linux-kernel/tools => tools}/dma_to_device.c (100%) rename {XDMA/linux-kernel/tools => tools}/dma_utils.c (100%) rename {XDMA/linux-kernel/tools => tools}/performance.c (100%) rename {XDMA/linux-kernel/tools => tools}/reg_rw.c (100%) rename {XDMA/linux-kernel/tools => tools}/test_chrdev.c (100%) rename {XDMA/linux-kernel/xdma => xdma}/Makefile (100%) rename {XDMA/linux-kernel/xdma => xdma}/cdev_bypass.c (100%) rename {XDMA/linux-kernel/xdma => xdma}/cdev_ctrl.c (98%) rename {XDMA/linux-kernel/xdma => xdma}/cdev_ctrl.h (100%) rename {XDMA/linux-kernel/xdma => xdma}/cdev_events.c (100%) rename {XDMA/linux-kernel/xdma => xdma}/cdev_sgdma.c (98%) rename {XDMA/linux-kernel/xdma => xdma}/cdev_sgdma.h (100%) rename {XDMA/linux-kernel/xdma => xdma}/cdev_xvc.c (100%) rename {XDMA/linux-kernel/xdma => xdma}/cdev_xvc.h (100%) rename {XDMA/linux-kernel/xdma => xdma}/libxdma.c (100%) rename {XDMA/linux-kernel/xdma => xdma}/libxdma.h (100%) rename {XDMA/linux-kernel/xdma => xdma}/version.h (100%) rename {XDMA/linux-kernel/xdma => xdma}/xdma_cdev.c (99%) rename {XDMA/linux-kernel/xdma => xdma}/xdma_cdev.h (100%) rename {XDMA/linux-kernel/xdma => xdma}/xdma_mod.c (100%) rename {XDMA/linux-kernel/xdma => xdma}/xdma_mod.h (100%) rename {XDMA/linux-kernel/xdma => xdma}/xdma_thread.c (100%) rename {XDMA/linux-kernel/xdma => xdma}/xdma_thread.h (100%) diff --git a/QDMA/linux-kernel/COPYING b/COPYING old mode 100755 new mode 100644 similarity index 100% rename from QDMA/linux-kernel/COPYING rename to COPYING diff --git a/XDMA/linux-kernel/LICENSE b/LICENSE similarity index 100% rename from XDMA/linux-kernel/LICENSE rename to LICENSE diff --git a/QDMA/DPDK/RELEASE b/QDMA/DPDK/RELEASE deleted file mode 100755 index 806779b..0000000 --- a/QDMA/DPDK/RELEASE +++ /dev/null @@ -1,195 +0,0 @@ -RELEASE: 2023.2.1 -================= - -This release is based on DPDK v20.11, v21.11 and v22.11 and -contains QDMA poll mode driver and QDMA test application. - -This release is validated for - - On VCU1525 for QDMA5.0 2022.1 example design - - On VCU1525 for QDMA4.0 2020.2 example design - - On VCU1525 for QDMA3.1 2019.2 example design - - On XCVP1202 for CPM5 2022.1 example design - - On XCVC1902 for CPM4 2022.1 example design - -This release includes patch files for dpdk-pktgen v20.12.0 and v22.04.1 that extends -dpdk-pktgen application to handle packets with packet sizes more than 1518 bytes -and it disables the packet size classification logic in dpdk-pktgen to remove -application overhead in performance measurement.This patch is used for -performance testing with dpdk-pktgen application. - -The driver is validated against dpdk-pktgen and testpmd applications for API compliance. - -SUPPORTED FEATURES: -=================== -2018.2 Features ---------------- -- Support for both the AXI4 Memory Mapped(MM) and AXI4 Streaming(ST) Interfaces -- 2048 Queue Sets - - 2048 H2C Descriptor Rings - - 2048 C2H Descriptor Rings - - 2048 C2H Completion Rings -- Supports Polling Mode -- Supports SR-IOV with 4 Physical Functions(PF) and 252 Virtual Functions(VF) -- Allows Only Privileged/Physical functions to program the contexts and registers -- Mailbox Support -- Supports Descriptor Prefetch -- ST H2C to C2H and C2H to H2C loopback support -- Zero-byte transfer support - -2018.3 Features ---------------- -- Descriptor (8, 16, 32, 64 bytes) bypass support -- Support for Completion queue descriptors of 64 bytes size -- Support flexible BAR mapping for QDMA configuration register space -- Support disabling overflow check in completion ring -- Indirect programming of FMAP registers -- Version for SW and HW - -2019.1 Features ---------------- -- Support DPDK v18.11 LTS -- Interrupt support for Mailbox events -- Support Completions in Memory mapped mode -- Interoperability between Linux driver (as PF/VF) and DPDK driver (as PF/VF) -- Error monitoring and error logging -- Driver restructuring to partition QDMA access code such that it can be used across different drivers -- Device configuration through additional driver APIs - -2019.2 Features ---------------- -- Support reset of a VF device (via rte_eth_dev_reset() API) -- Support PF device removal when its VF device is active -- Split user logic related data path handling code to qdma_user.c and qdma_user.h -- Bug Fixes - - Correct the PF and VF function ID used in the driver in accordance with HW - - Fix dma_from_device command in qdma_testapp application that requests more data from user logic than specified - - Fix memory offset calculation in dma_from_device and dma_to_device command in qdma_testapp application for MM mode - -2020.1 Updates --------------- -- Support DPDK v19.11 LTS -- Support QDMA4.0 context and register changes -- Common driver to support QDMA3.1 and QDMA4.0 designs -- Updated and validated the example design with marker changes for QDMA4.0 and without marker changes for QDMA3.1 -- Added support for more than 256 functions -- Support multiple bus numbers on single card -- CPU resource optimization in Tx and Rx data path - -2020.1 Patch Updates --------------------- -- Resolved HW errors observed with QDMA4.0 MM only design -- Verified QDMA DPDK software with IOVA=VA mode by enabling hugepage allocation matching support in DPDK - (i.e. by specifying the --match-allocations command-line switch to the EAL). - -2020.2 Updates --------------- -- Added support for detailed register dump -- Added support for post processing HW error messages -- Added support for Debug mode and Internal only mode -- Resolved the issue related to mbuf packet length -- Fixed VF FMAP programming of qmax issue by setting qmax to the actual user configured total queue number - -2020.2.1 Updates ----------------- -- Migrated qdma dpdk driver to use DPDK framework v20.11 - -2022.1 Updates --------------- -CPM5 - - FMAP context dump - - Debug register dump for ST and MM Errors - - Dual Instance support - -2022.1.1 Patch Updates ----------------------- -- Added VF 4K queues support for CPM5 design. This feature is applicable only when corresponding RTL support is added. - -2022.1.2 Patch Updates ----------------------- -- Added support for QDMA5.0 which has some performance optimization changes compared to QDMA4.0 - -2022.1.3 Patch Updates ----------------------- -- Added PF/VF 4K queues support for CPM5 design. This feature is applicable only when corresponding RTL support is added. - -2023.1.0 Updates ----------------- -- Added support for DPDK framework v21.11 and v22.11 and retained the backward compatibility for v20.11 -- Enabled 128 bit SIMD vectorization for Intel and AMD platforms by default for qdma Receive and Transmit APIs -- Added IO memory barriers for H2C/C2H producer index and completion ring consumer index updates - -2023.1.1 Updates ----------------- -- Optimized the driver code and HW register settings for performance improvements - -2023.1.2 Updates ----------------- -- Optimized dpdk PMD and HW register settings for CPM5 performance improvements - -2023.2.0 Updates ----------------- -- Added driver support for CPM4 design. -- Added support for Tx and Rx queue statistics to enhance debugging capabilities -- Added support for latency measurements in Tx and Rx data path to enhance debugging capabilities - -2023.2.1 Updates ----------------- -- Added support for latency measurements in Tx and Rx data path for VF - -KNOWN ISSUE: -============ -- CPM4: - - HW pdi limitation - - VF functionality with vfio-pci on host is not verified - - VF functionality on VM is not verified - - Forwarding performance numbers are not reaching 100Gbps and capping at 98.8Gbps - -- CPM5: - - Smaller packet forwarding performance optimizations are in progress and report will be updated in subsequent releases - -- All Designs - - Function Level Reset(FLR) of PF device when VFs are attached to this PF results in mailbox communication failure - - -DRIVER LIMITATIONS: -=================== -- CPM5 Only - - VF functionality is verified with 240 VF's as per CPM5 HW limitation - -- All Designs - - Big endian systems are not supported - - For optimal QDMA streaming performance, packet buffers of the descriptor ring should be aligned to at least 256 bytes. - - -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ diff --git a/QDMA/DPDK/docs/README.txt b/QDMA/DPDK/docs/README.txt deleted file mode 100755 index a4ff05e..0000000 --- a/QDMA/DPDK/docs/README.txt +++ /dev/null @@ -1,557 +0,0 @@ -############################################################################### - - Xilinx QDMA Software README - -############################################################################### - -_____________________________________________________________________________ -Contents - -1. Setup: Download and modifications -2 Setup: Host system -3. Setup: Build Commands -4. Compile Test application -5. Running the DPDK software test application -_____________________________________________________________________________ - - -Note: This DPDK driver and applciation were tested on Ubuntu 18.04 machine. - - -1.) Setup: Download and modifications - -The reference driver code requires DPDK version 22.11. -Follow the steps below to download the proper version of DPDK and apply -driver code and test application supplied in the GitHub. - -Extract the DPDK driver software database from the Xilinx GitHub to the server where VCU1525 -is installed. Henceforth, this area is referred as <dpdk_sw_database>. - -Create a directory for the DPDK download on the server where the VCU1525 -is installed and move to this directory. - - $ mkdir <server_dir>/<dpdk_test_area> - $ cd <server_dir>/<dpdk_test_area> - $ git clone http://dpdk.org/git/dpdk-stable - $ cd dpdk-stable - $ git checkout v22.11 - $ git clone git://dpdk.org/dpdk-kmods - $ cp -r <dpdk_sw_database>/drivers/net/qdma ./drivers/net/ - $ cp -r <dpdk_sw_database>/examples/qdma_testapp ./examples/ - - Additionally, make below changes to the DPDK 22.11 tree to build QDMA driver, - support 4K queues and populate Xilinx devices for binding. - - i. Add QDMA driver - a. To support 4K queues and 256 PCIe functions, update below configurations in ./config/rte_config.h - CONFIG_RTE_MAX_MEMZONE=40960 - CONFIG_RTE_MAX_ETHPORTS=256 - CONFIG_RTE_MAX_QUEUES_PER_PORT=4096 - - b. Add below lines to ./config/meson.build in DPDK 22.11 tree - # Set maximum Ethernet ports to 256 - dpdk_conf.set('RTE_MAX_ETHPORTS', 256) - - # Set maximum VFIO Groups to 256 - dpdk_conf.set('RTE_MAX_VFIO_GROUPS', 256) - - c. Add below lines to ./config/rte_config.h to enable driver debug logs - #define RTE_LIBRTE_QDMA_DEBUG_DRIVER 1 - - d. Add below line to ./drivers/net/meson.build, where PMDs are added to drivers list - 'qdma', - - e. To add Xilinx devices for device binding, add below lines to ./usertools/dpdk-devbind.py after cavium_pkx class, where PCI base class for devices are listed. - xilinx_qdma_pf = {'Class': '05', 'Vendor': '10ee', 'Device': '9011,9111,9211,9311,9014,9114,9214,9314,9018,9118,9218,9318,901f,911f,921f,931f,9021,9121,9221,9321,9024,9124,9224,9324,9028,9128,9228,9328,902f,912f,922f,932f,9031,9131,9231,9331,9034,9134,9234,9334,9038,9138,9238,9338,903f,913f,923f,933f,9041,9141,9241,9341,9044,9144,9244,9344,9048,9148,9248,9348,b011,b111,b211,b311,b014,b114,b214,b314,b018,b118,b218,b318,b01f,b11f,b21f,b31f,b021,b121,b221,b321,b024,b124,b224,b324,b028,b128,b228,b328,b02f,b12f,b22f,b32f,b031,b131,b231,b331,b034,b134,b234,b334,b038,b138,b238,b338,b03f,b13f,b23f,b33f,b041,b141,b241,b341,b044,b144,b244,b344,b048,b148,b248,b348', - 'SVendor': None, 'SDevice': None} - xilinx_qdma_vf = {'Class': '05', 'Vendor': '10ee', 'Device': 'a011,a111,a211,a311,a014,a114,a214,a314,a018,a118,a218,a318,a01f,a11f,a21f,a31f,a021,a121,a221,a321,a024,a124,a224,a324,a028,a128,a228,a328,a02f,a12f,a22f,a32f,a031,a131,a231,a331,a034,a134,a234,a334,a038,a138,a238,a338,a03f,a13f,a23f,a33f,a041,a141,a241,a341,a044,a144,a244,a344,a048,a148,a248,a348,c011,c111,c211,c311,c014,c114,c214,c314,c018,c118,c218,c318,c01f,c11f,c21f,c31f,c021,c121,c221,c321,c024,c124,c224,c324,c028,c128,c228,c328,c02f,c12f,c22f,c32f,c031,c131,c231,c331,c034,c134,c234,c334,c038,c138,c238,c338,c03f,c13f,c23f,c33f,c041,c141,c241,c341,c044,c144,c244,c344,c048,c148,c248,c348', - 'SVendor': None, 'SDevice': None} - - d. Update entries in network devices class in ./usertools/dpdk-devbind.py to add Xilinx devices - network_devices = [network_class, cavium_pkx, xilinx_qdma_pf, xilinx_qdma_vf], - -2.) Setup: Host system - -DPDK requires that hugepages are setup on the server. -The following modifications must be made to the /boot/grub/grub.cfg on the host system - - i. Add hugepages for DPDK - - Add following parameter to /etc/default/grub file - GRUB_CMDLINE_LINUX="default_hugepagesz=1GB hugepagesz=1G hugepages=20" - - This example adds 20 1GB hugepages, which are required to support 2048 queues, with descriptor ring of 1024 entries and each descriptor buffer length of 4KB. The number of hugepages required should be changed if the above configuration (queues, ring size, buffer size) changes. - - ii. Enable IOMMU for VM testing - - Update /etc/default/grub file as below. - GRUB_CMDLINE_LINUX="default_hugepagesz=1GB hugepagesz=1G hugepages=20 iommu=pt intel_iommu=on" - - iii. Execute the following command to modify the /boot/grub/grub.cfg with the configuration set in the above steps and permanently add them to the kernel command line. - update-grub - - iv. Reboot host system after making the above modifications. - -3.) Setup: Build Commands - - i. Compile DPDK & QDMA driver - a. Execute the following to compile and install the driver. - cd <server_dir>/<dpdk_test_area>/dpdk-stable - meson build - cd build - ninja - ninja install - ldconfig - - - The following should appear when ninja completes - Linking target app/test/dpdk-test. - - - Verify that librte_net_qdma.a is installed in ./build/drivers directory. - - ii. Execute the following to compile the igb_uio kernel driver. - cd <server_dir>/<dpdk_test_area>/dpdk-stable/dpdk-kmods/linux/igb_uio - make - - Important Note for VF 4K queue support for CPM5 design only - ----------------------------------------------------------- - - To enable VF 4K queue driver support for CPM5 design, QDMA DPDK driver need - to compile by enabling the EQDMA_CPM5_VF_GT_256Q_SUPPORTED macro - - cd <server_dir>/<dpdk_test_area>/dpdk-stable - meson build -DEQDMA_CPM5_VF_GT_256Q_SUPPORTED=1 - cd build - ninja - ninja install - ldconfig - -4.) Compile Test application - - i. Change to root user and compile the application - sudo su - cd examples/qdma_testapp - make RTE_SDK=`pwd`/../.. RTE_TARGET=build - - - The following should appear when make completes - ln -sf qdma_testapp-shared build/qdma_testapp - - ii. Additionally, for memory mapped mode, BRAM size can be configured with make command. - Default BRAM size is set to 512KB in the driver makefile. - - -5.) Running the DPDK software test application - -The below steps describe the step by step procedure to run the DPDK QDMA test -application and to interact with the QDMA PCIe device. - - i. Navigate to examples/qdma_testapp directory. - cd <server_dir>/<dpdk_test_area>/dpdk-stable/examples/qdma_testapp - - ii. Run the 'lspci' command on the console and verify that the PFs are detected as shown below. Here, '81' is the PCIe bus number on which Xilinx QDMA device is installed. - # lspci | grep Xilinx - 81:00.0 Memory controller: Xilinx Corporation Device 903f - 81:00.1 Memory controller: Xilinx Corporation Device 913f - 81:00.2 Memory controller: Xilinx Corporation Device 923f - 81:00.3 Memory controller: Xilinx Corporation Device 933f - - iii. Execute the following commands required for running the DPDK application - # mkdir /mnt/huge - # mount -t hugetlbfs nodev /mnt/huge - # modprobe uio - # insmod <server_dir>/<dpdk_test_area>/dpdk-stable/dpdk-kmods/linux/igb_uio/igb_uio.ko - - iv. Bind PF ports to the igb_uio module as shown below - # ../../usertools/dpdk-devbind.py -b igb_uio 81:00.0 - # ../../usertools/dpdk-devbind.py -b igb_uio 81:00.1 - # ../../usertools/dpdk-devbind.py -b igb_uio 81:00.2 - # ../../usertools/dpdk-devbind.py -b igb_uio 81:00.3 - - v. The execution of steps iii and iv creates a max_vfs file entry in /sys/bus/pci/devices/0000:<bus>:<device>.<function>. - - vi. Enable VFs for each PF by writing the number of VFs to enable to this file as shown below. - This example creates 1 VF for each PF. - # echo 1 > /sys/bus/pci/devices/0000\:81\:00.0/max_vfs - # echo 1 > /sys/bus/pci/devices/0000\:81\:00.1/max_vfs - # echo 1 > /sys/bus/pci/devices/0000\:81\:00.2/max_vfs - # echo 1 > /sys/bus/pci/devices/0000\:81\:00.3/max_vfs - - vii. Run the lspci command on the console and verify that the VFs are listed in the output as shown below - # lspci | grep Xilinx - 81:00.0 Memory controller: Xilinx Corporation Device 903f - 81:00.1 Memory controller: Xilinx Corporation Device 913f - 81:00.2 Memory controller: Xilinx Corporation Device 923f - 81:00.3 Memory controller: Xilinx Corporation Device 933f - 81:00.4 Memory controller: Xilinx Corporation Device a03f - 81:08.4 Memory controller: Xilinx Corporation Device a13f - 81:10.0 Memory controller: Xilinx Corporation Device a23f - 81:17.4 Memory controller: Xilinx Corporation Device a33f - - viii. Execute the following commands to bind the VF ports to igb_uio module - # ../../usertools/dpdk-devbind.py -b igb_uio 81:00.4 - # ../../usertools/dpdk-devbind.py -b igb_uio 81:08.4 - # ../../usertools/dpdk-devbind.py -b igb_uio 81:10.0 - # ../../usertools/dpdk-devbind.py -b igb_uio 81:17.4 - - ix. Run the qdma_testapp using the following command - #./build/qdma_testapp -c 0xf -n 4 - - '-c' represents processor mask - - '-n' represents number of memory channels - -CLI support in qdma_testapp -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Sample log of the qdma_testapp execution is given below. -After running the qdma_testapp, command line prompt appears on the console as shown below. - -:: - - #./build/qdma_testapp -c 0xf -n 4 - QDMA testapp rte eal init... - EAL: Detected 8 lcore(s) - EAL: Probing VFIO support... - EAL: PCI device 0000:81:00.0 on NUMA socket -1 - EAL: probe driver: 10ee:903f net_qdma - EAL: PCI device 0000:81:00.1 on NUMA socket -1 - EAL: probe driver: 10ee:913f net_qdma - EAL: PCI device 0000:81:00.2 on NUMA socket -1 - EAL: probe driver: 10ee:923f net_qdma - EAL: PCI device 0000:81:00.3 on NUMA socket -1 - EAL: probe driver: 10ee:933f net_qdma - EAL: PCI device 0000:81:00.4 on NUMA socket -1 - EAL: probe driver: 10ee:a03f net_qdma - EAL: PCI device 0000:81:08.4 on NUMA socket -1 - EAL: probe driver: 10ee:a13f net_qdma - EAL: PCI device 0000:81:10.0 on NUMA socket -1 - EAL: probe driver: 10ee:a23f net_qdma - EAL: PCI device 0000:81:17.4 on NUMA socket -1 - EAL: probe driver: 10ee:a33f net_qdma - Ethernet Device Count: 8 - Logical Core Count: 4 - xilinx-app> - -Commands supported by the qdma_testapp CLI -++++++++++++++++++++++++++++++++++++++++++ - -1. port_init - - This command assigns queues to the port, sets up required resources for the queues, and prepares queues for data processing. - Format for this commad is: - - port_init <port-id> <num-queues> <num-st-queues> <ring-depth> <pkt-buff-size> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - num-queues represents the total number of queues to be assigned to the port - - num-st-queues represents the total number of queues to be configured in streaming mode. - This implies that the (num-queues - num-st-queues) number of queues has to be configured in memory mapped mode. - - ring-depth represents the number of entries in C2H and H2C descriptor rings of each queue of the port - - pkt-buff-size represents the size of the data that a single C2H or H2C descriptor can support - - Example usage: - - port_init 1 32 16 1024 4096 - - This example initializes Port 1 with first 16 queues in streaming mode and remaining 16 queues in memory mapped mode. - Number of C2H and H2C descriptor ring depth is set to 1024 and data buffer of 4KB supported by each descriptor. - -2. port_close - - This command frees up all the allocated resources and removes the queues associated with the port. - Format for this commad is: - - port_close <port-id> - - **port-id** represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - Example usage: - - :: - - port_close 0 - - This example closes the port 0. Port 0 can again be re-initialized with `port_init` command after `port_close` command. - -3. port_reset - - This command resets the DPDK port. This command is supported for VF port only. - This command closes the port and re-initializes it with the values provided in this command. - Format for this commad is: - - port_reset <port-id> <num-queues> <num-st-queues> <ring-depth> <pkt-buff-size> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - num-queues represents the total number of queues to be assigned to the port - - num-st-queues represents the total number of queues to be configured in streaming mode. - This implies that the (num-queues - num-st-queues) number of queues has to be configured in memory mapped mode. - - ring-depth represents the number of entries in C2H and H2C descriptor rings of each queue of the port - - pkt-buff-size represents the size of the data that a single C2H or H2C descriptor can support - - Example usage: - - port_reset 4 32 16 1024 4096 - - This example command resets the port 4 and re-initializes it with first 16 queues in streaming mode and - remaining 16 queues in memory mapped mode. Number of C2H and H2C descriptor ring depth is set to 1024 - and data buffer of 4KB supported by each descriptor. - -4. port_remove - - This command frees up all the resources allocated for the port and removes the port from application use. - User will need to restart the application to use the port again. - Format for this commad is: - - port_remove <port-id> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - Example usage: - - port_remove 4 - - This example removes the port 4. Restart the application to use port 4 again. - -5. dma_to_device - - This command is used to DMA the data from host to card. - Format for this commad is: - - dma_to_device <port-id> <num-queues> <input-filename> <dst-addr> <size> <iterations> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - num-queues represents the total number of queues to use for transmitting the data - - input-filename represents the path to a valid binary data file, contents of which needs to be DMA'ed - - dst-addr represents the destination address (offset) in the card to where DMA should be done in memory mapped mode. - This field is ignored for streaming mode queues. - - size represents the amount of data in bytes that needs to be transmitted to the card from the given input file. - Data will be segmented across queues such that the total data transferred to the card is `size` amount - - iterations represents the number of loops to repeat the same DMA transfer - - Example usage: - - dma_to_device 0 2048 mm_datafile_1MB.bin 0 524288 0 - - This example segments the (524288) bytes from the mm_datafile_1MB.bin file equally to 2048 queues - and transmits the segmented data on each queue starting at destination BRAM offset 0 for 1st queue, - offset (1*524288)/2048 for 2nd queue, and so on. - -6. dma_from_device - - This command is used to DMA the data from card to host. - Format for this commad is: - - dma_from_device <port-id> <num-queues> <output-filename> <src-addr> <size> <iterations> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - num-queues represents the total number of queues to use to receive the data - - output-filename represents the path to output file to dump the received data - - src-addr represents the source address (offset) in the card from where DMA should be done in memory mapped mode. - This field is ignored for streaming mode queues. - - size represents the amount of data in bytes that needs to be received from the card. - Data will be segmented across queues such that the total data transferred from the card is `size` amount - - iterations represents the number of loops to repeat the same DMA transfer - - Example usage: - - dma_from_device 0 2048 port0_qcount2048_size524288.bin 0 524288 0 - - This example receives 524288 bytes from 2048 queues and writes to port0_qcount2048_size524288.bin file. - 1st queue receives (524288/2048) bytes of data from BRAM offset 0, - 2nd queue receives (524288/2048) bytes of data from BRAM offset (1*524288)/2048, and so on. - -7. reg_read - - This command is used to read the specified register. - Format for this commad is: - - reg_read <port-id> <bar-num> <address> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - bar-num represents the PCIe BAR where the register is located - - address represents offset of the register in the PCIe BAR `bar-num` - -8. reg_write - - This command is used to write a 32-bit value to the specified register. - Format for this commad is: - - reg_write <port-id> <bar-num> <address> <value> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - bar-num represents the PCIe BAR where the register is located - - address represents offset of the register in the PCIe BAR `bar-num` - - value represents the value to be written at the register offset `address` - -9. reg_dump - - This command dumps important QDMA registers values of the given port on console. - Format for this commad is: - - reg_dump <port-id> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - -10. reg_info_read - - This command reads the field info for the specified number of registers of the given port on console. - Format for this commad is: - - reg_info_read <port-id> <reg-addr> <num-regs> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - reg-addr represents offset of the register in the PCIe BAR bar-num - - rum-regs represents number of registers to read - -11. queue_dump - - This command dumps the queue context of the specified queue number of the given port. - Format for this commad is: - - queue_dump <port-id> <queue-id> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - queue-id represents the queue number relative to the port, whose context information needs to be logged - -12. desc_dump - - This command dumps the descriptors of the C2H and H2C rings of the specified queue number of the given port. - Format for this commad is: - - desc_dump <port-id> <queue-id> - - port-id represents a logical numbering for PCIe functions in the order they are bind to igb_uio driver. - The first PCIe function that is bound has port id as 0. - - queue-id represents the queue number relative to the port, whose C2H and H2C ring descriptors needs to be dumped - -13. load_cmds - - This command executes the list of CLI commands from the given file. - Format for this commad is: - - load_cmds <file_name> - - file_name represents path to a valid file containing list of above described CLI commands to be executed in sequence. - -14. help - - This command dumps the help menu with supported commands and their format. - Format for this commad is: - - help - -15. ctrl+d - - The keyboard keys Ctrl and D when pressed together quits the application. - -Instructions on how to use proc-info test for driver debugging: -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -1. Apply the below patch on top of the code changes mentioned in the dpdk driver documentation page and build the dpdk source code. - patch -p1 < 0001-Add-QDMA-xdebug-to-proc-info-of-dpdk-22.11.patch - -2. Run the testpmd application as primary application on one linux terminal - ./build/app/dpdk-testpmd -l 1-17 -n 4 -a 65:00.0,desc_prefetch=1,cmpt_desc_len=16 --log-level=3 -- --burst=256 -i --nb-cores=1 --rxq=1 --txq=1 --forward-mode=io --rxd=2048 --txd=2048 --mbcache=512 --mbuf-size=4096 - -3. Run the proc info as secondary application on another linux terminal as mentioned below with diferent port combinations. -One port: - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 -g - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 --qdevice - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 --qinfo - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 --qstats_clr - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 --qstats - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 --desc-dump tx - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 --desc-dump rx - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 --desc-dump cmpt - ./build/app/dpdk-proc-info -a 81:00.0 --log-level=7 -- -p 1 -q 0 --stats -Two ports: - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 -g - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 --qdevice - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 --qinfo - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 --qstats_clr - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 --qstats - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 --desc-dump tx - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 --desc-dump rx - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 --desc-dump cmpt - ./build/app/dpdk-proc-info -a 81:00.0, -a 81:00.1, --log-level=7 -- -p 3 -q 0 --stats -4. Available commands for proc info are mentioned below. - -m to display DPDK memory zones, segments and TAILQ information - -g to display DPDK QDMA PMD global CSR info - -p PORTMASK: hexadecimal bitmask of ports to retrieve stats for - --stats: to display port statistics, enabled by default - --qdevice: to display QDMA device structure - --qinfo: to display QDMA queue context and queue structures - --qstats: to display QDMA Tx and Rx queue stats - --qstats_clr: to clear QDMA Tx and Rx queue stats - --desc-dump {rx | tx | cmpt}: to dump QDMA queue descriptors - --xstats: to display extended port statistics, disabled by default - --metrics: to display derived metrics of the ports, disabled by - - - -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - diff --git a/QDMA/DPDK/drivers/net/qdma/meson.build b/QDMA/DPDK/drivers/net/qdma/meson.build deleted file mode 100755 index 0a04d4d..0000000 --- a/QDMA/DPDK/drivers/net/qdma/meson.build +++ /dev/null @@ -1,79 +0,0 @@ -# BSD LICENSE -# -# Copyright (c) 2021-2022 Xilinx, Inc. All rights reserved. -# Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -cflags += ['-DRTE_LIBRTE_QDMA_PMD'] -cflags += ['-DDMA_BRAM_SIZE=524288'] -cflags += ['-DTHROUGHPUT_MEASUREMENT'] - -# Use QDMA_DPDK_22_11 compiler flag for DPDK v22.11 -# Use QDMA_DPDK_21_11 compiler flag for DPDK v21.11 -# Use QDMA_DPDK_20_11 compiler flag for DPDK v20.11 -cflags += ['-DQDMA_DPDK_22_11'] - -includes += include_directories('.') -includes += include_directories('qdma_access') -includes += include_directories('qdma_access/qdma_soft_access') -includes += include_directories('qdma_access/eqdma_soft_access') -includes += include_directories('qdma_access/qdma_cpm4_access') -includes += include_directories('qdma_access/eqdma_cpm5_access') - -headers += files('rte_pmd_qdma.h') - -deps += ['mempool_ring'] - -sources = files( - 'qdma_ethdev.c', - 'qdma_vf_ethdev.c', - 'qdma_devops.c', - 'qdma_common.c', - 'qdma_rxtx.c', - 'qdma_xdebug.c', - 'qdma_user.c', - 'qdma_access/eqdma_soft_access/eqdma_soft_access.c', - 'qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c', - 'qdma_access/qdma_cpm4_access/qdma_cpm4_access.c', - 'qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c', - 'qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c', - 'qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c', - 'qdma_access/qdma_soft_access/qdma_soft_access.c', - 'qdma_access/qdma_list.c', - 'qdma_access/qdma_resource_mgmt.c', - 'qdma_access/qdma_mbox_protocol.c', - 'qdma_access/qdma_access_common.c', - 'qdma_mbox.c', - 'qdma_platform.c', - 'rte_pmd_qdma.c', - 'qdma_dpdk_compat.c' -) - -if arch_subdir == 'x86' - sources += files('qdma_rxtx_vec_sse.c') -endif \ No newline at end of file diff --git a/QDMA/DPDK/drivers/net/qdma/qdma.h b/QDMA/DPDK/drivers/net/qdma/qdma.h deleted file mode 100755 index b699069..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma.h +++ /dev/null @@ -1,500 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_H__ -#define __QDMA_H__ - -#include <stdbool.h> -#include <rte_dev.h> -#include <rte_ethdev.h> -#include <rte_spinlock.h> -#include <rte_log.h> -#include <rte_cycles.h> -#include <rte_byteorder.h> -#include <rte_memzone.h> -#include <linux/pci.h> -#include "qdma_user.h" -#include "qdma_resource_mgmt.h" -#include "qdma_mbox.h" -#include "rte_pmd_qdma.h" -#include "qdma_log.h" -#include "qdma_dpdk_compat.h" - -#define QDMA_NUM_BARS (6) -#define DEFAULT_PF_CONFIG_BAR (0) -#define DEFAULT_VF_CONFIG_BAR (0) -#define BAR_ID_INVALID (-1) - -#define QDMA_FUNC_ID_INVALID 0xFFFF - -#define DEFAULT_QUEUE_BASE (0) - -#define QDMA_MAX_BURST_SIZE (128) -#define QDMA_MIN_RXBUFF_SIZE (256) - -/* Descriptor Rings aligned to 4KB boundaries - only supported value */ -#define QDMA_ALIGN (4096) - -#define DEFAULT_TIMER_CNT_TRIG_MODE_TIMER (5) -#define DEFAULT_TIMER_CNT_TRIG_MODE_COUNT_TIMER (30) - -#define MIN_RX_PIDX_UPDATE_THRESHOLD (1) -#define MIN_TX_PIDX_UPDATE_THRESHOLD (1) -#define DEFAULT_MM_CMPT_CNT_THRESHOLD (2) -#define QDMA_TXQ_PIDX_UPDATE_INTERVAL (1000) //100 uSec - -/** Delays **/ -#define MAILBOX_PF_MSG_DELAY (20) -#define MAILBOX_VF_MSG_DELAY (10) -#define MAILBOX_PROG_POLL_COUNT (1250) - -#define WB_TIMEOUT (100000) -#define RESET_TIMEOUT (60000) -#define SHUTDOWN_TIMEOUT (60000) - -#define QDMA_MAX_BUFLEN (2048 * 10) - -#ifdef spin_lock_init -#undef spin_lock_init -#endif -#define spin_lock_init(sl) rte_spinlock_init(sl) - -/** Completion Context config */ -#define CMPT_DEFAULT_COLOR_BIT (1) -#define CMPT_CNTXT_DESC_SIZE_8B (0) -#define CMPT_CNTXT_DESC_SIZE_16B (1) -#define CMPT_CNTXT_DESC_SIZE_32B (2) -#define CMPT_CNTXT_DESC_SIZE_64B (3) - -/** SOFTWARE DESC CONTEXT */ -#define SW_DESC_CNTXT_8B_BYPASS_DMA (0) -#define SW_DESC_CNTXT_16B_BYPASS_DMA (1) -#define SW_DESC_CNTXT_32B_BYPASS_DMA (2) -#define SW_DESC_CNTXT_64B_BYPASS_DMA (3) - -#define SW_DESC_CNTXT_C2H_STREAM_DMA (0) -#define SW_DESC_CNTXT_H2C_STREAM_DMA (1) -#define SW_DESC_CNTXT_MEMORY_MAP_DMA (2) - -#define DEFAULT_QDMA_CMPT_DESC_LEN (RTE_PMD_QDMA_CMPT_DESC_LEN_8B) - -#define LATENCY_MAX_QUEUES 4 -#define LATENCY_CNT 20 - -#ifdef LATENCY_MEASUREMENT -extern const struct rte_memzone *txq_lat_buf_mz; -extern const struct rte_memzone *rxq_lat_buf_mz; -extern double (*h2c_pidx_to_hw_cidx_lat)[LATENCY_CNT]; -extern double (*c2h_pidx_to_cmpt_pidx_lat)[LATENCY_CNT]; -#endif - -enum dma_data_direction { - DMA_BIDIRECTIONAL = 0, - DMA_TO_DEVICE = 1, - DMA_FROM_DEVICE = 2, - DMA_NONE = 3, -}; - -enum reset_state_t { - RESET_STATE_IDLE, - RESET_STATE_RECV_PF_RESET_REQ, - RESET_STATE_RECV_PF_RESET_DONE, - RESET_STATE_INVALID -}; - -/** MM Write-back status structure **/ -struct __attribute__ ((packed)) wb_status -{ - volatile uint16_t pidx; /** in C2H WB **/ - volatile uint16_t cidx; /** Consumer-index **/ - uint32_t rsvd2; /** Reserved. **/ -}; - -struct qdma_pkt_stats { - uint64_t pkts; - uint64_t bytes; -}; - -struct qdma_pkt_lat { - double prev; - double curr; -}; - -struct qdma_txq_stats { - uint16_t pidx; - uint16_t wrb_cidx; - uint16_t txq_tail; - uint16_t in_use_desc; - uint16_t nb_pkts; - uint16_t lat_cnt; - uint32_t ring_wrap_cnt; - uint32_t txq_full_cnt; -#ifdef LATENCY_MEASUREMENT - uint32_t wrb_cidx_cnt_no_change; - uint32_t wrb_cidx_cnt_lt_8; - uint32_t wrb_cidx_cnt_8_to_32; - uint32_t wrb_cidx_cnt_32_to_64; - uint32_t wrb_cidx_cnt_gt_64; - struct qdma_pkt_lat pkt_lat; -#endif -}; - -struct qdma_rxq_stats { - uint16_t pidx; - uint16_t wrb_pidx; - uint16_t wrb_cidx; - uint16_t rxq_cmpt_tail; - uint16_t pending_desc; - uint16_t lat_cnt; - uint32_t ring_wrap_cnt; - uint32_t mbuf_avail_cnt; - uint32_t mbuf_in_use_cnt; -#ifdef LATENCY_MEASUREMENT - struct qdma_pkt_lat pkt_lat; -#endif -}; - -/* - * Structure associated with each CMPT queue. - */ -struct qdma_cmpt_queue { - struct qdma_ul_cmpt_ring *cmpt_ring; - struct wb_status *wb_status; - struct qdma_q_cmpt_cidx_reg_info cmpt_cidx_info; - struct rte_eth_dev *dev; - - uint16_t cmpt_desc_len; - uint16_t nb_cmpt_desc; - uint32_t queue_id; /**< CMPT queue index. */ - - uint8_t status:1; - uint8_t st_mode:1; /**< dma-mode: MM or ST */ - uint8_t dis_overflow_check:1; - uint8_t func_id; - uint16_t port_id; /**< Device port identifier. */ - int8_t ringszidx; - int8_t threshidx; - int8_t timeridx; - int8_t triggermode; - /* completion descriptor memzone */ - const struct rte_memzone *cmpt_mz; -}; - -/** - * Structure associated with each RX queue. - */ -struct qdma_rx_queue { - /* Move more accessed elementes into first cacheline */ - struct rte_mempool *mb_pool; /**< mbuf pool to populate RX ring. */ - void *rx_ring; /**< RX ring virtual address */ - union qdma_ul_st_cmpt_ring *cmpt_ring; - struct wb_status *wb_status; - struct rte_mbuf **sw_ring; /**< address of RX software ring. */ - enum rte_pmd_qdma_bypass_desc_len bypass_desc_sz:7; - - uint16_t rx_tail; - uint16_t cmpt_desc_len; - uint16_t rx_buff_size; - uint16_t nb_rx_desc; /**< number of RX descriptors. */ - uint16_t nb_rx_cmpt_desc; - uint32_t queue_id; /**< RX queue index. */ - uint64_t mbuf_initializer; /**< value to init mbufs */ - - struct qdma_q_pidx_reg_info q_pidx_info; - struct qdma_q_cmpt_cidx_reg_info cmpt_cidx_info; - struct qdma_pkt_stats stats; - struct qdma_rxq_stats qstats; - - struct rte_eth_dev *dev; - - uint16_t port_id; /**< Device port identifier. */ - uint8_t status:1; - uint8_t err:1; - uint8_t st_mode:1; /**< dma-mode: MM or ST */ - uint8_t dump_immediate_data:1; - uint8_t rx_deferred_start:1; - uint8_t en_prefetch:1; - uint8_t en_bypass:1; - uint8_t en_bypass_prefetch:1; - uint8_t dis_overflow_check:1; - - union qdma_ul_st_cmpt_ring cmpt_data[QDMA_MAX_BURST_SIZE]; - - uint8_t func_id; /**< RX queue index. */ - uint64_t ep_addr; - - int8_t ringszidx; - int8_t cmpt_ringszidx; - int8_t buffszidx; - int8_t threshidx; - int8_t timeridx; - int8_t triggermode; - - const struct rte_memzone *rx_mz; - /* C2H stream mode, completion descriptor result */ - const struct rte_memzone *rx_cmpt_mz; - -#ifdef QDMA_LATENCY_OPTIMIZED - /**< pend_pkt_moving_avg: average rate of packets received */ - unsigned int pend_pkt_moving_avg; - /**< pend_pkt_avg_thr_hi: higher average threshold */ - unsigned int pend_pkt_avg_thr_hi; - /**< pend_pkt_avg_thr_lo: lower average threshold */ - unsigned int pend_pkt_avg_thr_lo; - /**< sorted_c2h_cntr_idx: sorted c2h counter index */ - int8_t sorted_c2h_cntr_idx; - /**< c2h_cntr_monitor_cnt: c2h counter stagnant monitor count */ - unsigned char c2h_cntr_monitor_cnt; -#endif //QDMA_LATENCY_OPTIMIZED -}; - -/** - * Structure associated with each TX queue. - */ -struct qdma_tx_queue { - /* Move more accessed elementes into first cacheline */ - enum rte_pmd_qdma_bypass_desc_len bypass_desc_sz:7; - uint16_t tx_fl_tail; - void *tx_ring; /* TX ring virtual address*/ - struct qdma_q_pidx_reg_info q_pidx_info; - - struct wb_status *wb_status; - struct rte_mbuf **sw_ring;/* SW ring virtual address*/ - uint16_t tx_desc_pend; - uint16_t nb_tx_desc; /* No of TX descriptors.*/ - rte_spinlock_t pidx_update_lock; - uint64_t offloads; /* Tx offloads */ - - struct rte_eth_dev *dev; - - uint8_t st_mode:1;/* dma-mode: MM or ST */ - uint8_t tx_deferred_start:1; - uint8_t en_bypass:1; - uint8_t status:1; - uint16_t port_id; /* Device port identifier. */ - uint8_t func_id; /* RX queue index. */ - int8_t ringszidx; - - struct qdma_pkt_stats stats; - struct qdma_txq_stats qstats; - - uint64_t ep_addr; - uint32_t queue_id; /* TX queue index. */ - uint32_t num_queues; /* TX queue index. */ - const struct rte_memzone *tx_mz; -}; - -struct qdma_vf_info { - uint16_t func_id; -}; - -struct queue_info { - uint32_t queue_mode:1; - uint32_t rx_bypass_mode:2; - uint32_t tx_bypass_mode:1; - uint32_t cmpt_desc_sz:7; - uint8_t immediate_data_state:1; - uint8_t dis_cmpt_ovf_chk:1; - uint8_t en_prefetch:1; - enum rte_pmd_qdma_bypass_desc_len rx_bypass_desc_sz:7; - enum rte_pmd_qdma_bypass_desc_len tx_bypass_desc_sz:7; - uint8_t timer_count; - int8_t trigger_mode; -}; - -struct qdma_pci_dev { - void *bar_addr[QDMA_NUM_BARS]; /* memory mapped I/O addr for BARs */ - int config_bar_idx; - int user_bar_idx; - int bypass_bar_idx; - - /* Driver Attributes */ - uint32_t qsets_en; /* no. of queue pairs enabled */ - uint32_t queue_base; - uint16_t func_id; /* Function id */ - - /* DMA identifier used by the resource manager - * for the DMA instances used by this driver - */ - uint32_t dma_device_index; - - /* Device capabilities */ - struct qdma_dev_attributes dev_cap; - - uint8_t cmpt_desc_len; - uint8_t c2h_bypass_mode; - uint8_t h2c_bypass_mode; -#ifdef TANDEM_BOOT_SUPPORTED - uint8_t en_st_mode; -#endif - uint8_t trigger_mode; - uint8_t timer_count; - - uint8_t dev_configured:1; - uint8_t is_vf:1; - uint8_t is_master:1; - uint8_t en_desc_prefetch:1; - - /* Reset state */ - uint8_t reset_in_progress; - enum reset_state_t reset_state; - - /* Hardware version info*/ - uint32_t vivado_rel:4; - uint32_t rtl_version:4; - uint32_t device_type:4; - uint32_t ip_type:4; - - struct queue_info *q_info; - struct qdma_dev_mbox mbox; - uint8_t init_q_range; - - uint32_t g_ring_sz[QDMA_NUM_RING_SIZES]; - uint32_t g_c2h_cnt_th[QDMA_NUM_C2H_COUNTERS]; - uint32_t g_c2h_buf_sz[QDMA_NUM_C2H_BUFFER_SIZES]; - uint32_t g_c2h_timer_cnt[QDMA_NUM_C2H_TIMERS]; -#ifdef QDMA_LATENCY_OPTIMIZED - uint32_t sorted_idx_c2h_cnt_th[QDMA_NUM_C2H_COUNTERS]; -#endif //QDMA_LATENCY_OPTIMIZED - void **cmpt_queues; - /*Pointer to QDMA access layer function pointers*/ - struct qdma_hw_access *hw_access; - - struct qdma_vf_info *vfinfo; - uint8_t vf_online_count; - - int16_t tx_qid_statid_map[RTE_ETHDEV_QUEUE_STAT_CNTRS]; - int16_t rx_qid_statid_map[RTE_ETHDEV_QUEUE_STAT_CNTRS]; - - uint8_t rx_vec_allowed:1; - uint8_t tx_vec_allowed:1; -}; - -void qdma_dev_ops_init(struct rte_eth_dev *dev); -uint32_t qdma_read_reg(uint64_t reg_addr); -void qdma_write_reg(uint64_t reg_addr, uint32_t val); -void qdma_txq_pidx_update(void *arg); -int qdma_pf_csr_read(struct rte_eth_dev *dev); -int qdma_vf_csr_read(struct rte_eth_dev *dev); - -uint8_t qmda_get_desc_sz_idx(enum rte_pmd_qdma_bypass_desc_len); -int qdma_vf_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t qid); -int qdma_vf_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qid); -int qdma_vf_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qid); -int qdma_vf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qid); - -int qdma_init_rx_queue(struct qdma_rx_queue *rxq); -void qdma_reset_tx_queue(struct qdma_tx_queue *txq); -void qdma_reset_rx_queue(struct qdma_rx_queue *rxq); - -void qdma_clr_rx_queue_ctxts(struct rte_eth_dev *dev, uint32_t qid, - uint32_t mode); -void qdma_inv_rx_queue_ctxts(struct rte_eth_dev *dev, uint32_t qid, - uint32_t mode); -void qdma_clr_tx_queue_ctxts(struct rte_eth_dev *dev, uint32_t qid, - uint32_t mode); -void qdma_inv_tx_queue_ctxts(struct rte_eth_dev *dev, uint32_t qid, - uint32_t mode); -int qdma_identify_bars(struct rte_eth_dev *dev); -int qdma_get_hw_version(struct rte_eth_dev *dev); - -/* implemented in rxtx.c */ -uint16_t qdma_recv_pkts_st(struct qdma_rx_queue *rxq, struct rte_mbuf **rx_pkts, - uint16_t nb_pkts); -uint16_t qdma_recv_pkts_mm(struct qdma_rx_queue *rxq, struct rte_mbuf **rx_pkts, - uint16_t nb_pkts); -uint16_t qdma_xmit_pkts_st(struct qdma_tx_queue *txq, struct rte_mbuf **tx_pkts, - uint16_t nb_pkts); -uint16_t qdma_xmit_pkts_mm(struct qdma_tx_queue *txq, struct rte_mbuf **tx_pkts, - uint16_t nb_pkts); - -#ifdef TEST_64B_DESC_BYPASS -uint16_t qdma_xmit_64B_desc_bypass(struct qdma_tx_queue *txq, - struct rte_mbuf **tx_pkts, uint16_t nb_pkts); -#endif - -uint32_t qdma_pci_read_reg(struct rte_eth_dev *dev, uint32_t bar, uint32_t reg); -void qdma_pci_write_reg(struct rte_eth_dev *dev, uint32_t bar, - uint32_t reg, uint32_t val); - -int index_of_array(uint32_t *arr, uint32_t n, uint32_t element); - -int qdma_check_kvargs(struct rte_devargs *devargs, - struct qdma_pci_dev *qdma_dev); - -static inline const -struct rte_memzone *qdma_zone_reserve(struct rte_eth_dev *dev, - const char *ring_name, - uint32_t queue_id, - uint32_t ring_size, - int socket_id) -{ - char z_name[RTE_MEMZONE_NAMESIZE]; - snprintf(z_name, sizeof(z_name), "%s%s%d_%u", - dev->device->driver->name, ring_name, - dev->data->port_id, queue_id); - return rte_memzone_reserve_aligned(z_name, (uint64_t)ring_size, - socket_id, 0, QDMA_ALIGN); -} - -bool is_qdma_supported(struct rte_eth_dev *dev); -bool is_vf_device_supported(struct rte_eth_dev *dev); -bool is_pf_device_supported(struct rte_eth_dev *dev); - -void qdma_check_errors(void *arg); - -struct rte_mbuf *prepare_segmented_packet(struct qdma_rx_queue *rxq, - uint16_t pkt_length, uint16_t *tail); -int reclaim_tx_mbuf(struct qdma_tx_queue *txq, - uint16_t cidx, uint16_t free_cnt); -int qdma_ul_extract_st_cmpt_info(void *ul_cmpt_entry, void *cmpt_info); - -/* Transmit API for Streaming mode */ -uint16_t qdma_xmit_pkts_vec(void *tx_queue, - struct rte_mbuf **tx_pkts, uint16_t nb_pkts); -uint16_t qdma_xmit_pkts_st_vec(struct qdma_tx_queue *txq, - struct rte_mbuf **tx_pkts, uint16_t nb_pkts); - -/* Receive API for Streaming mode */ -uint16_t qdma_recv_pkts_vec(void *rx_queue, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts); -uint16_t qdma_recv_pkts_st_vec(struct qdma_rx_queue *rxq, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts); - -void __rte_cold qdma_set_tx_function(struct rte_eth_dev *dev); -void __rte_cold qdma_set_rx_function(struct rte_eth_dev *dev); - -int qdma_tx_qstats_clear(struct rte_eth_dev *dev, uint16_t queue); -int qdma_rx_qstats_clear(struct rte_eth_dev *dev, uint16_t queue); - -#endif /* ifndef __QDMA_H__ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c deleted file mode 100755 index 11f9cca..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c +++ /dev/null @@ -1,6879 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "eqdma_cpm5_access.h" -#include "eqdma_cpm5_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_cpm5_access.tmh" -#endif - -#define UNUSED(x) (void)(x) - -/** EQDMA Context array size */ -#define EQDMA_CPM5_FMAP_NUM_WORDS 2 -#define EQDMA_CPM5_SW_CONTEXT_NUM_WORDS 8 -#define EQDMA_CPM5_HW_CONTEXT_NUM_WORDS 2 -#define EQDMA_CPM5_PFETCH_CONTEXT_NUM_WORDS 2 -#define EQDMA_CPM5_CR_CONTEXT_NUM_WORDS 1 -#define EQDMA_CPM5_CMPT_CONTEXT_NUM_WORDS 6 -#define EQDMA_CPM5_IND_INTR_CONTEXT_NUM_WORDS 4 - -#define EQDMA_CPM5_VF_USER_BAR_ID 2 - -#define EQDMA_CPM5_REG_GROUP_1_START_ADDR 0x000 -#define EQDMA_CPM5_REG_GROUP_2_START_ADDR 0x804 -#define EQDMA_CPM5_REG_GROUP_3_START_ADDR 0xB00 -#define EQDMA_CPM5_REG_GROUP_4_START_ADDR 0x5014 - -#define EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS 11 -#define EQDMA_CPM5_GLBL_TRQ_ERR_ALL_MASK 0XB3 -#define EQDMA_CPM5_GLBL_DSC_ERR_ALL_MASK 0X1F9037E -#define EQDMA_CPM5_C2H_ERR_ALL_MASK 0X3F6DF -#define EQDMA_CPM5_C2H_FATAL_ERR_ALL_MASK 0X1FDF1B -#define EQDMA_CPM5_H2C_ERR_ALL_MASK 0X3F -#define EQDMA_CPM5_SBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_CPM5_DBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_CPM5_MM_C2H_ERR_ALL_MASK 0X70000003 -#define EQDMA_CPM5_MM_H2C0_ERR_ALL_MASK 0X3041013E - -/* H2C Throttle settings */ -#define EQDMA_CPM5_H2C_THROT_DATA_THRESH 0x5000 -#define EQDMA_CPM5_THROT_EN_DATA 1 -#define EQDMA_CPM5_THROT_EN_REQ 0 -#define EQDMA_CPM5_H2C_THROT_REQ_THRESH 0xC0 - - -/** Auxillary Bitmasks for fields spanning multiple words */ -#define EQDMA_CPM5_SW_CTXT_PASID_GET_H_MASK GENMASK(21, 12) -#define EQDMA_CPM5_SW_CTXT_PASID_GET_L_MASK GENMASK(11, 0) -#define EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK GENMASK_ULL(63, 53) -#define EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK GENMASK_ULL(52, 21) -#define EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK GENMASK_ULL(20, 0) -#define EQDMA_CPM5_CMPL_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_CPM5_CMPL_CTXT_PASID_GET_L_MASK GENMASK(8, 0) -#define EQDMA_CPM5_INTR_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_CPM5_INTR_CTXT_PASID_GET_L_MASK GENMASK(8, 0) - -#define EQDMA_CPM5_OFFSET_GLBL2_PF_BARLITE_EXT 0x10C - -#define QDMA_OFFSET_GLBL2_PF_BARLITE_INT 0x104 -#define QDMA_GLBL2_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define QDMA_GLBL2_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define QDMA_GLBL2_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define QDMA_GLBL2_PF0_BAR_MAP_MASK GENMASK(5, 0) - -#define EQDMA_CPM5_GLBL2_DBG_MODE_EN_MASK BIT(4) -#define EQDMA_CPM5_GLBL2_DESC_ENG_MODE_MASK GENMASK(3, 2) -#define EQDMA_CPM5_GLBL2_FLR_PRESENT_MASK BIT(1) -#define EQDMA_CPM5_GLBL2_MAILBOX_EN_MASK BIT(0) - -#define EQDMA_CPM5_DEFAULT_C2H_INTR_TIMER_TICK 50 -#define PREFETCH_QUEUE_COUNT_STEP 4 -#define EQDMA_CPM5_DEFAULT_CMPT_COAL_MAX_BUF_SZ 0x3F - -/* TODO: This is work around and this needs to be auto generated from ODS */ -/** EQDMA_CPM5_IND_REG_SEL_FMAP */ -#define EQDMA_CPM5_FMAP_CTXT_W1_QID_MAX_MASK GENMASK(12, 0) -#define EQDMA_CPM5_FMAP_CTXT_W0_QID_MASK GENMASK(11, 0) - -static void eqdma_cpm5_hw_st_h2c_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_st_c2h_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_desc_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_trq_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_ram_sbe_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_ram_dbe_err_process(void *dev_hndl); -static void eqdma_cpm5_mm_h2c0_err_process(void *dev_hndl); -static void eqdma_cpm5_mm_c2h0_err_process(void *dev_hndl); - -static struct eqdma_cpm5_hw_err_info - eqdma_cpm5_err_info[EQDMA_CPM5_ERRS_ALL] = { - /* Descriptor errors */ - { - EQDMA_CPM5_DSC_ERR_POISON, - "Poison error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_UR_CA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_BCNT, - "Unexpected Byte count in completion error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_BCNT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_PARAM, - "Parameter mismatch error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PARAM_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_ADDR, - "Address mismatch error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_ADDR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_TAG, - "Unexpected tag error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TAG_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_FLR, - "FLR error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_TIMEOUT, - "Timed out error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_DAT_POISON, - "Poison data error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DAT_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_DMA, - "DMA engine error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DMA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_DSC, - "Invalid PIDX update error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DSC_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_SBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_PORT_ID, - "Port ID Error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PORT_ID_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_ALL, - "All Descriptor errors", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - - /* TRQ errors */ - { - EQDMA_CPM5_TRQ_ERR_CSR_UNMAPPED, - "Access targeted unmapped register space via CSR pathway error", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_VF_ACCESS, - "VF attempted to access Global register space or Function map", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_TCP_CSR_TIMEOUT, - "Timeout on request to dma internal csr register", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_QSPC_UNMAPPED, - "Access targeted unmapped register via queue space pathway", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_QID_RANGE, - "Qid range error", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QID_RANGE_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_TCP_QSPC_TIMEOUT, - "Timeout on request to dma internal queue space register", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_ALL, - "All TRQ errors", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - - /* C2H Errors*/ - { - EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_SH_CMPT_DSC, - "A Shared CMPT queue has encountered a descriptor error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_DESC_RSP_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MSI_INT_FAIL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ERR_DESC_CNT_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_CMPT_INV_Q_ERR, - "Writeback on invalid queue error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_CMPT_QFULL_ERR, - "Completion queue gets full error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_QFULL_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_CMPT_CIDX_ERR, - "Bad CIDX update by the software error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_CIDX_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_CMPT_PRTY_ERR, - "C2H completion Parity error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PRTY_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_AVL_RING_DSC, - "Available ring fetch returns descriptor with error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_HDR_ECC_UNC, - "multi-bit ecc error on c2h packet header", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_HDR_ECC_COR, - "single-bit ecc error on c2h packet header", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_WRB_PORT_ID_ERR, - "Port ID error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_ALL, - "All C2h errors", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - EQDMA_CPM5_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - EQDMA_CPM5_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_WPL_DATA_PAR, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_HDR_ECC_UNC, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_ALL, - "All fatal errors", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - EQDMA_CPM5_ST_H2C_ERR_ZERO_LEN_DESC, - "Zero length descriptor error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_ZERO_LEN_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - "A non-EOP descriptor received", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_NO_DMA_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_DBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_PAR, - "Internal data parity error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_ALL, - "All H2C errors", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - EQDMA_CPM5_H2C_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - EQDMA_CPM5_SBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Even RAM single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM 1 single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_ALL, - "All SBE Errors.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - EQDMA_CPM5_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, -{ - EQDMA_CPM5_SBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slavle FIFO RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_ALL, - "All SBE errors", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - EQDMA_CPM5_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - - - /* DBE errors */ - { - EQDMA_CPM5_DBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_ALL, - "All DBE errors", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - EQDMA_CPM5_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_FUNC_MAP, - "Function map RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slave FIFO RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_ALL, - "All DBE errors", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - EQDMA_CPM5_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - - /* MM C2H Engine 0 errors */ - { - EQDMA_CPM5_MM_C2H_WR_SLR_ERR, - "MM C2H0 WR SLV Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_RD_SLR_ERR, - "MM C2H0 RD SLV Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_WR_FLR_ERR, - "MM C2H0 WR FLR Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_UR_ERR, - "MM C2H0 Unsupported Request Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_WR_UC_RAM_ERR, - "MM C2H0 Write Uncorrectable RAM Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_ERR_ALL, - "All MM C2H Errors", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - EQDMA_CPM5_MM_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - /* MM H2C Engine 0 Errors */ - { - EQDMA_CPM5_MM_H2C0_RD_HDR_POISON_ERR, - "MM H2C0 Read cmpt header pison Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_UR_CA_ERR, - "MM H2C0 Read cmpt unsupported request Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_HDR_BYTE_ERR, - "MM H2C0 Read cmpt hdr byte cnt Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_HDR_PARAM_ERR, - "MM H2C0 Read cmpt hdr param mismatch Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_HDR_ADR_ERR, - "MM H2C0 Read cmpt hdr address mismatch Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_FLR_ERR, - "MM H2C0 Read flr Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_DAT_POISON_ERR, - "MM H2C0 Read data poison Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_RQ_DIS_ERR, - "MM H2C0 Read request disable Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_WR_DEC_ERR, - "MM H2C0 Write desc Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_WR_SLV_ERR, - "MM H2C0 Write slv Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_ERR_ALL, - "All MM H2C Errors", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - EQDMA_CPM5_MM_H2C0_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_hw_desc_err_process - }, -}; - - -static int32_t -all_eqdma_cpm5_hw_errs[EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS] = { - - EQDMA_CPM5_DSC_ERR_ALL, - EQDMA_CPM5_TRQ_ERR_ALL, - EQDMA_CPM5_ST_C2H_ERR_ALL, - EQDMA_CPM5_ST_FATAL_ERR_ALL, - EQDMA_CPM5_ST_H2C_ERR_ALL, - EQDMA_CPM5_SBE_1_ERR_ALL, - EQDMA_CPM5_SBE_ERR_ALL, - EQDMA_CPM5_DBE_1_ERR_ALL, - EQDMA_CPM5_DBE_ERR_ALL, - EQDMA_CPM5_MM_C2H_ERR_ALL, - EQDMA_CPM5_MM_H2C0_ERR_ALL -}; - -static struct qctx_entry eqdma_cpm5_sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Function Id", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Address Translation", 0}, - {"Fetch Max", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Interrupt with VF", 0}, - {"Pack descriptor output interface", 0}, - {"Irq Bypass", 0}, -}; - -static struct qctx_entry eqdma_cpm5_hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry eqdma_cpm5_credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry eqdma_cpm5_cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Addr High (L)[37:6]", 0}, - {"Base Addr High(H)[63:38]", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, - {"Over Flow Check Disable", 0}, - {"Address Translation", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Insterrupt with VF", 0}, - {"c2h Direction", 0}, - {"Base Addr Low[5:2]", 0}, - {"Shared Completion Queue", 0}, -}; - -static struct qctx_entry eqdma_cpm5_c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Variable Descriptor", 0}, - {"Number of descriptors prefetched", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry eqdma_cpm5_ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, - {"at", 0}, - {"Function Id", 0}, -}; - -static struct qctx_entry eqdma_cpm5_fmap_ctxt_entries[] = { - {"Queue Base", 0}, - {"Queue Max", 0}, -}; - -static int eqdma_cpm5_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_cpm5_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_cpm5_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int eqdma_cpm5_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - -uint32_t eqdma_cpm5_get_config_num_regs(void) -{ - return eqdma_cpm5_config_num_regs_get(); -} - -struct xreg_info *eqdma_cpm5_get_config_regs(void) -{ - return eqdma_cpm5_config_regs_get(); -} - -uint32_t eqdma_cpm5_reg_dump_buf_len(void) -{ - uint32_t length = (eqdma_cpm5_config_num_regs_get() + 1) - * REG_DUMP_SIZE_PER_LINE; - return length; -} - -int eqdma_cpm5_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - int len = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(eqdma_cpm5_cmpt_ctxt_entries) / - sizeof(eqdma_cpm5_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(eqdma_cpm5_sw_ctxt_entries) / - sizeof(eqdma_cpm5_sw_ctxt_entries[0])) + 1) - * REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_cpm5_hw_ctxt_entries) / - sizeof(eqdma_cpm5_hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_cpm5_credit_ctxt_entries) / - sizeof(eqdma_cpm5_credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_cpm5_fmap_ctxt_entries) / - sizeof(eqdma_cpm5_fmap_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(eqdma_cpm5_cmpt_ctxt_entries) / - sizeof(eqdma_cpm5_cmpt_ctxt_entries[0])) + - 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_cpm5_c2h_pftch_ctxt_entries) - / - sizeof(eqdma_cpm5_c2h_pftch_ctxt_entries[0] - )) + 1) * REG_DUMP_SIZE_PER_LINE); - } - } - - *buflen = len; - return 0; -} - -static uint32_t eqdma_cpm5_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(eqdma_cpm5_ind_intr_ctxt_entries) / - sizeof(eqdma_cpm5_ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * eqdma_cpm5_set_perf_opt() - Helper function to set the - * cpm5 perf optimizations. - * - */ -static void eqdma_cpm5_set_perf_opt(void *dev_hndl) -{ - uint32_t reg_val = 0; - uint32_t pftch_cache_depth = 0; - uint32_t pftch_qcnt = 0; - uint32_t pftch_evnt_qcnt_th = 0; - uint32_t crdt_coal_fifo_th = 0; - uint32_t crdt_coal_crdt_th = 0; - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_INT_TIMER_TICK_ADDR, - EQDMA_CPM5_DEFAULT_C2H_INTR_TIMER_TICK); - -/* - * #define EQDMA_CPM5_C2H_PFCH_CACHE_DEPTH_ADDR 0xBE0 - * #define C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK GENMASK(23, 16) - * #define C2H_PFCH_CACHE_DEPTH_MASK GENMASK(7, 0) - */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_PFCH_CACHE_DEPTH_ADDR); - pftch_cache_depth = FIELD_GET(C2H_PFCH_CACHE_DEPTH_MASK, reg_val); - -/* - * #define EQDMA_CPM5_GLBL_DSC_CFG_ADDR 0x250 - * #define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 10) - * #define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) - * #define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) - * #define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) - * #define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) - * #define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) - */ -#define GLBL_DSC_CFG_RSVD_1_DFLT 0 -#define GLBL_DSC_CFG_UNC_OVR_COR_DFLT 0 -#define GLBL_DSC_CFG_CTXT_FER_DIS_DFLT 0 -#define GLBL_DSC_CFG_RSVD_2_DFLT 0 -/* =IF(Internal mode, 2,5) */ -#define GLBL_DSC_CFG_MAXFETCH 2 -#define GLBL_DSC_CFG_WB_ACC_INT 5 - reg_val = - FIELD_SET(GLBL_DSC_CFG_RSVD_1_MASK, GLBL_DSC_CFG_RSVD_1_DFLT) | - FIELD_SET(GLBL_DSC_CFG_UNC_OVR_COR_MASK, - GLBL_DSC_CFG_UNC_OVR_COR_DFLT) | - FIELD_SET(GLBL_DSC_CFG_CTXT_FER_DIS_MASK, - GLBL_DSC_CFG_CTXT_FER_DIS_DFLT) | - FIELD_SET(GLBL_DSC_CFG_RSVD_2_MASK, GLBL_DSC_CFG_RSVD_2_DFLT) | - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - GLBL_DSC_CFG_MAXFETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - GLBL_DSC_CFG_WB_ACC_INT); - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_DSC_CFG_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_GLBL_DSC_CFG_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_GLBL_DSC_CFG_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR 0x4C - * #define CFG_BLK_MISC_CTL_RSVD_1_MASK GENMASK(31, 24) - * #define CFG_BLK_MISC_CTL_10B_TAG_EN_MASK BIT(23) - * #define CFG_BLK_MISC_CTL_RSVD_2_MASK BIT(22) - * #define CFG_BLK_MISC_CTL_AXI_WBK_MASK BIT(21) - * #define CFG_BLK_MISC_CTL_AXI_DSC_MASK BIT(20) - * #define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) - * #define CFG_BLK_MISC_CTL_RSVD_3_MASK GENMASK(7, 5) - * #define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) - */ -#define CFG_BLK_MISC_CTL_RSVD_1_DFLT 0 -#define CFG_BLK_MISC_CTL_RSVD_2_DFLT 0 -#define CFG_BLK_MISC_CTL_AXI_WBK_DFLT 0 -#define CFG_BLK_MISC_CTL_AXI_DSC_DFLT 0 -/* IF(10bit tag enabled, 512,256) */ -#ifdef EQDMA_CPM5_10BIT_TAG_ENABLE -#define CFG_BLK_MISC_CTL_10B_TAG_DFLT 1 -#define CFG_BLK_MISC_CTL_NUM_TAG_DFLT 512 -#else -#define CFG_BLK_MISC_CTL_10B_TAG_DFLT 0 -#define CFG_BLK_MISC_CTL_NUM_TAG_DFLT 256 -#endif -#define CFG_BLK_MISC_CTL_RSVD_3_DFLT 0 -#define EQDMA_CFG_BLK_MISC_CTL_RQ_METERING_MUL 31 - reg_val = - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_1_MASK, - CFG_BLK_MISC_CTL_RSVD_1_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_10B_TAG_EN_MASK, - CFG_BLK_MISC_CTL_10B_TAG_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_2_MASK, - CFG_BLK_MISC_CTL_RSVD_2_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_AXI_WBK_MASK, - CFG_BLK_MISC_CTL_AXI_WBK_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_AXI_DSC_MASK, - CFG_BLK_MISC_CTL_AXI_DSC_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_NUM_TAG_MASK, - CFG_BLK_MISC_CTL_NUM_TAG_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_3_MASK, - CFG_BLK_MISC_CTL_RSVD_3_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK, - EQDMA_CFG_BLK_MISC_CTL_RQ_METERING_MUL); - qdma_reg_write(dev_hndl, EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_C2H_PFCH_CFG_ADDR 0xB08 - * #define C2H_PFCH_CFG_EVTFL_TH_MASK GENMASK(31, 16) - * #define C2H_PFCH_CFG_FL_TH_MASK GENMASK(15, 0) - */ -#define EQDMA_PFTCH_CFG_EVT_PFTH_FL_TH 256 -#define C2H_PFCH_CFG_FL_TH_DFLT 256 - reg_val = - FIELD_SET(C2H_PFCH_CFG_EVTFL_TH_MASK, - EQDMA_PFTCH_CFG_EVT_PFTH_FL_TH) | - FIELD_SET(C2H_PFCH_CFG_FL_TH_MASK, - C2H_PFCH_CFG_FL_TH_DFLT); - - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_PFCH_CFG_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR 0xA80 - * #define C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK GENMASK(31, 16) - * #define C2H_PFCH_CFG_1_QCNT_MASK GENMASK(15, 0) - */ - pftch_qcnt = pftch_cache_depth - PREFETCH_QUEUE_COUNT_STEP; - pftch_evnt_qcnt_th = pftch_qcnt - PREFETCH_QUEUE_COUNT_STEP; - reg_val = - FIELD_SET(C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK, pftch_evnt_qcnt_th) | - FIELD_SET(C2H_PFCH_CFG_1_QCNT_MASK, pftch_qcnt); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR 0xA84 - * #define C2H_PFCH_CFG_2_FENCE_MASK BIT(31) - * #define C2H_PFCH_CFG_2_RSVD_MASK GENMASK(30, 29) - * #define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK BIT(28) - * #define C2H_PFCH_CFG_2_LL_SZ_TH_MASK GENMASK(27, 12) - * #define C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK GENMASK(11, 6) - * #define C2H_PFCH_CFG_2_NUM_MASK GENMASK(5, 0) - */ -#define C2H_PFCH_CFG_2_FENCE_EN 1 -#define C2H_PFCH_CFG_2_RSVD_DFLT 0 -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_DFLT 0 -#define C2H_PFCH_CFG_2_LL_SZ_TH_DFLT 1024 -#define C2H_PFCH_CFG_2_VAR_DESC_NUM 15 -#define C2H_PFCH_CFG_2_NUM_PFCH_DFLT 16 - reg_val = - FIELD_SET(C2H_PFCH_CFG_2_FENCE_MASK, - C2H_PFCH_CFG_2_FENCE_EN) | - FIELD_SET(C2H_PFCH_CFG_2_RSVD_MASK, - C2H_PFCH_CFG_2_RSVD_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK, - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_LL_SZ_TH_MASK, - C2H_PFCH_CFG_2_LL_SZ_TH_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK, - C2H_PFCH_CFG_2_VAR_DESC_NUM) | - FIELD_SET(C2H_PFCH_CFG_2_NUM_MASK, - C2H_PFCH_CFG_2_NUM_PFCH_DFLT); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR, reg_val); - -/* Registers Not Applicable for CPM5 - * #define EQDMA_PFCH_CFG_3_ADDR 0x147C - * #define EQDMA_PFCH_CFG_4_ADDR 0x1484 - */ - -/* - * #define EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR 0x1400 - * #define C2H_CRDT_COAL_CFG_1_RSVD_1_MASK GENMASK(31, 18) - * #define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK GENMASK(17, 10) - * #define C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK GENMASK(9, 0)4 - */ -#define C2H_CRDT_COAL_CFG_1_RSVD_1_DFLT 0 -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_DFLT 16 -#define C2H_CRDT_COAL_CFG_1_TIMER_TH 16 - reg_val = - FIELD_SET(C2H_CRDT_COAL_CFG_1_RSVD_1_MASK, - C2H_CRDT_COAL_CFG_1_RSVD_1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK, - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK, - C2H_CRDT_COAL_CFG_1_TIMER_TH); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR 0x1404 - * #define C2H_CRDT_COAL_CFG_2_RSVD_1_MASK GENMASK(31, 24) - * #define C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK GENMASK(23, 16) - * #define C2H_CRDT_COAL_CFG_2_RESERVED1_MASK GENMASK(15, 11) - * #define C2H_CRDT_COAL_CFG_2_NT_TH_MASK GENMASK(10, 0) - */ -#define C2H_CRDT_COAL_CFG_2_RSVD_1_DFLT 0 -#define C2H_CRDT_COAL_CFG_2_RESERVED1_DFLT 0 -#define C2H_CRDT_COAL_CFG_2_CRDT_CNT_TH_DFLT 156 - crdt_coal_fifo_th = pftch_cache_depth - 8; - crdt_coal_crdt_th = C2H_CRDT_COAL_CFG_2_CRDT_CNT_TH_DFLT; - reg_val = - FIELD_SET(C2H_CRDT_COAL_CFG_2_RSVD_1_MASK, - C2H_CRDT_COAL_CFG_2_RSVD_1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK, - crdt_coal_fifo_th) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_RESERVED1_MASK, - C2H_CRDT_COAL_CFG_2_RESERVED1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_NT_TH_MASK, - crdt_coal_crdt_th); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR 0xE24 - * #define H2C_REQ_THROT_PCIE_EN_REQ_MASK BIT(31) - * #define H2C_REQ_THROT_PCIE_MASK GENMASK(30, 19) - * #define H2C_REQ_THROT_PCIE_EN_DATA_MASK BIT(18) - * #define H2C_REQ_THROT_PCIE_DATA_THRESH_MASK GENMASK(17, 0) - */ -#define H2C_REQ_THROT_PCIE_EN_REQ 1 -/* IF(10bit tag enabled, 512-64, 192) */ -#ifdef EQDMA_CPM5_10BIT_TAG_ENABLE -#define H2C_REQ_THROT_PCIE_REQ_TH 448 -#else -#define H2C_REQ_THROT_PCIE_REQ_TH 192 -#endif -#define H2C_REQ_THROT_PCIE_EN_DATA 1 -#define H2C_REQ_THROT_PCIE_DATA_TH 57344 - reg_val = - FIELD_SET(H2C_REQ_THROT_PCIE_EN_REQ_MASK, - H2C_REQ_THROT_PCIE_EN_REQ) | - FIELD_SET(H2C_REQ_THROT_PCIE_MASK, - H2C_REQ_THROT_PCIE_REQ_TH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_DATA_MASK, - H2C_REQ_THROT_PCIE_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_PCIE_DATA_THRESH_MASK, - H2C_REQ_THROT_PCIE_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR 0xE2C - * #define H2C_REQ_THROT_AXIMM_EN_REQ_MASK BIT(31) - * #define H2C_REQ_THROT_AXIMM_MASK GENMASK(30, 19) - * #define H2C_REQ_THROT_AXIMM_EN_DATA_MASK BIT(18) - * #define H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK GENMASK(17, 0) - */ -#define H2C_REQ_THROT_AXIMM_EN_REQ 0 -/* IF(10bit tag en=1, 512-64, 192) */ -#ifdef EQDMA_CPM5_10BIT_TAG_ENABLE -#define H2C_REQ_THROT_AXIMM_REQ_TH 448 -#else -#define H2C_REQ_THROT_AXIMM_REQ_TH 192 -#endif -#define H2C_REQ_THROT_AXIMM_EN_DATA 0 -#define H2C_REQ_THROT_AXIMM_DATA_TH 65536 - reg_val = - FIELD_SET(H2C_REQ_THROT_AXIMM_EN_REQ_MASK, - H2C_REQ_THROT_AXIMM_EN_REQ) | - FIELD_SET(H2C_REQ_THROT_AXIMM_MASK, - H2C_REQ_THROT_AXIMM_REQ_TH) | - FIELD_SET(H2C_REQ_THROT_AXIMM_EN_DATA_MASK, - H2C_REQ_THROT_AXIMM_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK, - H2C_REQ_THROT_AXIMM_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR, reg_val); - -#define EQDMA_CPM5_H2C_MM_DATA_THROTTLE_ADDR 0x12EC -#define H2C_MM_DATA_THROTTLE_RSVD_1_MASK GENMASK(31, 17) -#define H2C_MM_DATA_THROTTLE_DAT_EN_MASK BIT(16) -#define H2C_MM_DATA_THROTTLE_DAT_MASK GENMASK(15, 0) -#define H2C_MM_DATA_THROTTLE_RSVD_1_DFLT 0 -#define H2C_MM_DATA_TH_EN 1 -#define H2C_MM_DATA_TH 57344 - reg_val = - FIELD_SET(H2C_MM_DATA_THROTTLE_RSVD_1_MASK, - H2C_MM_DATA_THROTTLE_RSVD_1_DFLT) | - FIELD_SET(H2C_MM_DATA_THROTTLE_DAT_EN_MASK, H2C_MM_DATA_TH_EN) | - FIELD_SET(H2C_MM_DATA_THROTTLE_DAT_MASK, H2C_MM_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_CPM5_H2C_MM_DATA_THROTTLE_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_H2C_MM_DATA_THROTTLE_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_H2C_MM_DATA_THROTTLE_ADDR, reg_val); -} - -/* - * eqdma_cpm5_indirect_reg_invalidate() - helper function to invalidate - * indirect context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_cpm5_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_cpm5_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_cpm5_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_cpm5_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_cpm5_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = EQDMA_CPM5_IND_CTXT_DATA_ADDR; - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - - qdma_reg_write(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_cpm5_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_cpm5_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_IND_CTXT_DATA_NUM_REGS; index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = EQDMA_CPM5_IND_CTXT_DATA_ADDR; - - for (index = 0; index < ((2 * QDMA_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_cpm5_fill_sw_ctxt() - Helper function to fill sw context into - * structure - * - */ -static void eqdma_cpm5_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - int i = 0; - - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->pidx; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_arm; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->fnc_id; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->qen; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->frcd_en; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->wbi_chk; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->wbi_intvl_en; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->at; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->fetch_max; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->rngsz_idx; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->desc_sz; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->bypass; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->mm_chn; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->wbk_en; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_en; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->port_id; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_no_last; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->err; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->err_wb_sent; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_req; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->mrkr_dis; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->is_mm; - eqdma_cpm5_sw_ctxt_entries[i++].value = - sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - eqdma_cpm5_sw_ctxt_entries[i++].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->vec; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->intr_aggr; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->dis_intr_on_vf; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->pack_byp_out; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_byp; - -} - -/* - * eqdma_cpm5_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void eqdma_cpm5_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt - *cmpt_ctxt) -{ - int i = 0; - - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_stat_desc; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_int; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->trig_mode; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->fnc_id; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->counter_idx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_idx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->in_st; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->color; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ringsz_idx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_L_MASK, - cmpt_ctxt->bs_addr); - eqdma_cpm5_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_H_MASK, - cmpt_ctxt->bs_addr); - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->desc_sz; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->pidx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->cidx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->valid; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->err; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->user_trig_pend; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_running; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->full_upd; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ovf_chk_dis; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->at; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->vec; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->int_aggr; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dis_intr_on_vf; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dir_c2h; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_CPM5_COMPL_CTXT_BADDR_LOW_MASK, - cmpt_ctxt->bs_addr); - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->sh_cmpt; -} - -/* - * eqdma_cpm5_fill_hw_ctxt() - Helper function to fill HW context into - * structure - * - */ -static void eqdma_cpm5_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - int i = 0; - - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->cidx; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->crd_use; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->dsc_pend; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->idl_stp_b; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->evt_pnd; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->fetch_pnd; -} - -/* - * eqdma_cpm5_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void eqdma_cpm5_fill_credit_ctxt(struct qdma_descq_credit_ctxt - *cr_ctxt) -{ - eqdma_cpm5_credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * eqdma_cpm5_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void eqdma_cpm5_fill_pfetch_ctxt(struct qdma_descq_prefetch_ctxt - *pfetch_ctxt) -{ - int i = 0; - - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->bypass; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = - pfetch_ctxt->bufsz_idx; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->port_id; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = - pfetch_ctxt->var_desc; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = - pfetch_ctxt->num_pftch; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->err; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch_en; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->sw_crdt; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->valid; -} - -/* - * eqdma_cpm5_fill_fmap_ctxt() - Helper function to fill fmap context - * into structure - * - */ -static void eqdma_cpm5_fill_fmap_ctxt(struct qdma_fmap_cfg *fmap_ctxt) -{ - eqdma_cpm5_fmap_ctxt_entries[0].value = fmap_ctxt->qbase; - eqdma_cpm5_fmap_ctxt_entries[1].value = fmap_ctxt->qmax; -} - -/* - * eqdma_cpm5_fill_intr_ctxt() - Helper function to fill interrupt context - * into structure - * - */ -static void eqdma_cpm5_fill_intr_ctxt(struct qdma_indirect_intr_ctxt - *intr_ctxt) -{ - int i = 0; - - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->valid; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->vec; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->int_st; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->color; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->page_size; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->pidx; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->at; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->func_id; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_set_default_global_csr() - function to set the global CSR - * register to default values. The value can be modified later by using the - * set/get csr functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, 385, - 513, 769, 1025, 1537, 3073, 4097, 6145, 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, 32, 48, 64, - 80, 96, 112, 128, 144, 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 8192, - 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_GLBL_RNG_SZ_1_ADDR, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_C2H_CNT_TH_ADDR, - 0, QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, - EQDMA_CPM5_C2H_TIMER_CNT_ADDR, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_DSC_CFG_ADDR, - reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_C2H_BUF_SZ_ADDR, - 0, QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* C2h Completion Coalesce Configuration */ - reg_val = - FIELD_SET(C2H_WRB_COAL_CFG_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(C2H_WRB_COAL_CFG_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK, - EQDMA_CPM5_DEFAULT_CMPT_COAL_MAX_BUF_SZ); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_WRB_COAL_CFG_ADDR, - reg_val); - } - - eqdma_cpm5_set_perf_opt(dev_hndl); - return QDMA_SUCCESS; -} - -/* - * dump_eqdma_cpm5_context() - Helper function to dump queue context into - * string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_cpm5_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - eqdma_cpm5_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_H2C) { - eqdma_cpm5_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_cpm5_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_cpm5_fill_credit_ctxt(&queue_context->cr_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_C2H) { - eqdma_cpm5_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_cpm5_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_cpm5_fill_credit_ctxt(&queue_context->cr_ctxt); - if (st) { - eqdma_cpm5_fill_pfetch_ctxt( - &queue_context->pfetch_ctxt); - eqdma_cpm5_fill_cmpt_ctxt( - &queue_context->cmpt_ctxt); - } - } - - eqdma_cpm5_fill_fmap_ctxt(&queue_context->fmap); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, rv); - goto INSUF_BUF_EXIT; - } - } - - /* SW context dump */ - n = sizeof(eqdma_cpm5_sw_ctxt_entries) / - sizeof((eqdma_cpm5_sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[i].name, - eqdma_cpm5_sw_ctxt_entries[i].value, - eqdma_cpm5_sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(eqdma_cpm5_hw_ctxt_entries) / - sizeof((eqdma_cpm5_hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_hw_ctxt_entries[i].name, - eqdma_cpm5_hw_ctxt_entries[i].value, - eqdma_cpm5_hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(eqdma_cpm5_credit_ctxt_entries) / - sizeof((eqdma_cpm5_credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_credit_ctxt_entries[i].name, - eqdma_cpm5_credit_ctxt_entries[i].value, - eqdma_cpm5_credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(eqdma_cpm5_cmpt_ctxt_entries) / - sizeof((eqdma_cpm5_cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[i].name, - eqdma_cpm5_cmpt_ctxt_entries[i].value, - eqdma_cpm5_cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(eqdma_cpm5_c2h_pftch_ctxt_entries) / - sizeof(eqdma_cpm5_c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_c2h_pftch_ctxt_entries[i].name, - eqdma_cpm5_c2h_pftch_ctxt_entries[i].value, - eqdma_cpm5_c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* Fmap context dump */ - n = sizeof(eqdma_cpm5_fmap_ctxt_entries) / - sizeof(eqdma_cpm5_fmap_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Fmap Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_fmap_ctxt_entries[i].name, - eqdma_cpm5_fmap_ctxt_entries[i].value, - eqdma_cpm5_fmap_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * dump_eqdma_cpm5_intr_context() - Helper function to dump interrupt - * context into string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_cpm5_intr_context(struct qdma_indirect_intr_ctxt - *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - eqdma_cpm5_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(eqdma_cpm5_ind_intr_ctxt_entries) / - sizeof((eqdma_cpm5_ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_ind_intr_ctxt_entries[i].name, - eqdma_cpm5_ind_intr_ctxt_entries[i].value, - eqdma_cpm5_ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_get_version() - Function to get the eqdma version - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @version_info: pointer to hold the version info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_CPM5_OFFSET_VF_VERSION : - EQDMA_CPM5_GLBL2_MISC_CAP_ADDR; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - qdma_fetch_version_details(dev_hndl, is_vf, reg_val, version_info); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[EQDMA_CPM5_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - pasid_l = - FIELD_GET(EQDMA_CPM5_SW_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CPM5_SW_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - virtio_desc_base_l = (uint32_t)FIELD_GET( - EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_m = (uint32_t)FIELD_GET( - EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_h = (uint32_t)FIELD_GET( - EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - ctxt->virtio_dsc_base); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W0_PIDX_MASK, ctxt->pidx) | - FIELD_SET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, ctxt->irq_arm) | - FIELD_SET(SW_IND_CTXT_DATA_W0_FNC_MASK, ctxt->fnc_id); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x\n", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - ctxt->wbi_intvl_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_AT_MASK, ctxt->at) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, ctxt->fetch_max) | - FIELD_SET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - ctxt->irq_no_last) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_MASK, ctxt->err) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - ctxt->err_wb_sent) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, ctxt->is_mm); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,err=%x", - __func__, ctxt->port_id, ctxt->irq_no_last, ctxt->err); - qdma_log_debug(", err_wb_sent=%x\n", ctxt->err_wb_sent); - - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->intr_aggr) | - FIELD_SET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - ctxt->virtio_en) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - ctxt->pack_byp_out) | - FIELD_SET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, ctxt->irq_byp) | - FIELD_SET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - virtio_desc_base_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - virtio_desc_base_m); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - virtio_desc_base_h); - - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t sw_ctxt[EQDMA_CPM5_SW_CONTEXT_NUM_WORDS] = {0}; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(SW_IND_CTXT_DATA_W0_PIDX_MASK, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, - sw_ctxt[0])); - ctxt->fnc_id = FIELD_GET(SW_IND_CTXT_DATA_W0_FNC_MASK, sw_ctxt[0]); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - ctxt->qen = FIELD_GET(SW_IND_CTXT_DATA_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, sw_ctxt[1]); - ctxt->at = FIELD_GET(SW_IND_CTXT_DATA_W1_AT_MASK, sw_ctxt[1]); - ctxt->fetch_max = - (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, - sw_ctxt[1]); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, - sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, - sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, - sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, - sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, - sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, - sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, - sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, - sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, - sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, - sw_ctxt[1])); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,", - __func__, ctxt->port_id, ctxt->irq_no_last); - qdma_log_debug(" err=%x, err_wb_sent=%x\n", - ctxt->err, ctxt->err_wb_sent); - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - ctxt->vec = FIELD_GET(SW_IND_CTXT_DATA_W4_VEC_MASK, sw_ctxt[4]); - ctxt->intr_aggr = (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, - sw_ctxt[4])); - ctxt->dis_intr_on_vf = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - sw_ctxt[4])); - ctxt->virtio_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - sw_ctxt[4])); - ctxt->pack_byp_out = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - sw_ctxt[4])); - ctxt->irq_byp = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, - sw_ctxt[4])); - ctxt->host_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, - sw_ctxt[4])); - pasid_l = FIELD_GET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, sw_ctxt[4]); - - pasid_h = FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, sw_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, - sw_ctxt[5]); - virtio_desc_base_l = - FIELD_GET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - sw_ctxt[5]); - virtio_desc_base_m = - FIELD_GET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - sw_ctxt[6]); - - virtio_desc_base_h = - FIELD_GET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - sw_ctxt[6]); - - ctxt->pasid = - FIELD_SET(EQDMA_CPM5_SW_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CPM5_SW_CTXT_PASID_GET_H_MASK, pasid_h); - - ctxt->virtio_dsc_base = - FIELD_SET(EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - (uint64_t)virtio_desc_base_l) | - FIELD_SET(EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - (uint64_t)virtio_desc_base_m) | - FIELD_SET(EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - (uint64_t)virtio_desc_base_h); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_sw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_sw_context_write(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_sw_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_context_write() - create prefetch context and program - * it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[EQDMA_CPM5_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, - ctxt->num_pftch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - ctxt->var_desc) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_ERR_MASK, ctxt->err) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, ctxt->pfch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, sw_crdt_l); - - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(PREFETCH_CTXT_DATA_W1_VALID_MASK, ctxt->valid); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t pfetch_ctxt[EQDMA_CPM5_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, pfetch_ctxt[0]); - ctxt->bufsz_idx = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - pfetch_ctxt[0]); - ctxt->num_pftch = (uint16_t) FIELD_GET( - PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, pfetch_ctxt[0]); - ctxt->port_id = - FIELD_GET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, pfetch_ctxt[0]); - ctxt->var_desc = (uint8_t) - FIELD_GET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - pfetch_ctxt[0]); - ctxt->err = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - FIELD_GET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, pfetch_ctxt[0]); - - sw_crdt_h = - FIELD_GET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_pfetch_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_pfetch_context_read(dev_hndl, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_pfetch_context_write(dev_hndl, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_pfetch_context_invalidate(dev_hndl, - hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_context_write() - create completion context and program - * it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[EQDMA_CPM5_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr4_high_l, baddr4_high_h, - baddr4_low, pidx_l, pidx_h, pasid_l, pasid_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR) { - qdma_log_error("%s: trig_mode(%d) > (%d) is invalid, err:%d\n", - __func__, - ctxt->trig_mode, - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr4_high_l = - (uint32_t)FIELD_GET(EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_L_MASK, - ctxt->bs_addr); - baddr4_high_h = - (uint32_t)FIELD_GET(EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_H_MASK, - ctxt->bs_addr); - baddr4_low = - (uint32_t)FIELD_GET(EQDMA_CPM5_COMPL_CTXT_BADDR_LOW_MASK, - ctxt->bs_addr); - - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, ctxt->pidx); - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, ctxt->pidx); - - pasid_l = - FIELD_GET(EQDMA_CPM5_CMPL_CTXT_PASID_GET_L_MASK, - ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CPM5_CMPL_CTXT_PASID_GET_H_MASK, - ctxt->pasid); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(CMPL_CTXT_DATA_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - ctxt->counter_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, ctxt->timer_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_INT_ST_MASK, ctxt->in_st) | - FIELD_SET(CMPL_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, ctxt->ringsz_idx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, baddr4_high_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, baddr4_high_h) | - FIELD_SET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, ctxt->desc_sz) | - FIELD_SET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, pidx_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, pidx_h) | - FIELD_SET(CMPL_CTXT_DATA_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(CMPL_CTXT_DATA_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(CMPL_CTXT_DATA_W3_ERR_MASK, ctxt->err) | - FIELD_SET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - ctxt->user_trig_pend); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, - ctxt->timer_running) | - FIELD_SET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, ctxt->full_upd) | - FIELD_SET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, - ctxt->ovf_chk_dis) | - FIELD_SET(CMPL_CTXT_DATA_W4_AT_MASK, ctxt->at) | - FIELD_SET(CMPL_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->int_aggr) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(CMPL_CTXT_DATA_W4_VIO_MASK, ctxt->vio) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, ctxt->dir_c2h) | - FIELD_SET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(CMPL_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - ctxt->pasid_en) | - FIELD_SET(CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, - baddr4_low) | - FIELD_SET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, ctxt->vio_eop) | - FIELD_SET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, ctxt->sh_cmpt); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cmpt_ctxt[EQDMA_CPM5_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr4_high_l, baddr4_high_h, baddr4_low, - pidx_l, pidx_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(CMPL_CTXT_DATA_W0_EN_INT_MASK, cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = FIELD_GET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, cmpt_ctxt[0]); - ctxt->counter_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, - cmpt_ctxt[0])); - - baddr4_high_l = FIELD_GET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, - cmpt_ctxt[1]); - - baddr4_high_h = FIELD_GET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, - cmpt_ctxt[2]); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, cmpt_ctxt[2]); - - pidx_h = FIELD_GET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(CMPL_CTXT_DATA_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_ERR_MASK, - cmpt_ctxt[3])); - ctxt->user_trig_pend = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - cmpt_ctxt[3])); - - ctxt->timer_running = - FIELD_GET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, cmpt_ctxt[4]); - ctxt->full_upd = - FIELD_GET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, cmpt_ctxt[4]); - ctxt->ovf_chk_dis = - FIELD_GET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, cmpt_ctxt[4]); - ctxt->at = FIELD_GET(CMPL_CTXT_DATA_W4_AT_MASK, cmpt_ctxt[4]); - ctxt->vec = FIELD_GET(CMPL_CTXT_DATA_W4_VEC_MASK, cmpt_ctxt[4]); - ctxt->int_aggr = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, cmpt_ctxt[4])); - ctxt->dis_intr_on_vf = (uint8_t) - FIELD_GET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - cmpt_ctxt[4]); - ctxt->vio = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_VIO_MASK, - cmpt_ctxt[4]); - ctxt->dir_c2h = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, - cmpt_ctxt[4]); - ctxt->host_id = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, - cmpt_ctxt[4]); - pasid_l = FIELD_GET(CMPL_CTXT_DATA_W4_PASID_L_MASK, cmpt_ctxt[4]); - - pasid_h = (uint32_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_H_MASK, - cmpt_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - cmpt_ctxt[5]); - baddr4_low = (uint8_t)FIELD_GET( - CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, cmpt_ctxt[5]); - ctxt->vio_eop = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, - cmpt_ctxt[5]); - ctxt->sh_cmpt = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, - cmpt_ctxt[5]); - - ctxt->bs_addr = - FIELD_SET(EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_L_MASK, - (uint64_t)baddr4_high_l) | - FIELD_SET(EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_H_MASK, - (uint64_t)baddr4_high_h) | - FIELD_SET(EQDMA_CPM5_COMPL_CTXT_BADDR_LOW_MASK, - (uint64_t)baddr4_low); - - ctxt->pasid = - FIELD_SET(EQDMA_CPM5_CMPL_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CPM5_CMPL_CTXT_PASID_GET_H_MASK, - (uint64_t)pasid_h); - - ctxt->pidx = - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, pidx_l) | - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, pidx_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_cmpt_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_cmpt_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_cmpt_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_cmpt_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t hw_ctxt[EQDMA_CPM5_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or hw_ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(HW_IND_CTXT_DATA_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(HW_IND_CTXT_DATA_W0_CRD_USE_MASK, - hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, - hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->evt_pnd = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_EVT_PND_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = (uint8_t) - (FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, hw_ctxt[1])); - - qdma_log_debug("%s: cidx=%hu, crd_use=%hu, dsc_pend=%x\n", - __func__, ctxt->cidx, ctxt->crd_use, ctxt->dsc_pend); - qdma_log_debug("%s: idl_stp_b=%x, evt_pnd=%x, fetch_pnd=%x\n", - __func__, ctxt->idl_stp_b, ctxt->evt_pnd, - ctxt->fetch_pnd); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_hw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_hw_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[EQDMA_CPM5_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(CRED_CTXT_DATA_W0_CREDT_MASK, cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_credit_ctx_conf() - configure credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_credit_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_credit_context_clear(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_credit_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_fmap_context_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_fmap_context_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap[EQDMA_CPM5_FMAP_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - fmap[num_words_count++] = - FIELD_SET(EQDMA_CPM5_FMAP_CTXT_W0_QID_MASK, config->qbase); - fmap[num_words_count++] = - FIELD_SET(EQDMA_CPM5_FMAP_CTXT_W1_QID_MAX_MASK, - config->qmax); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, func_id, - fmap, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_fmap_context_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_fmap_context_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - int rv = QDMA_SUCCESS; - uint32_t fmap[EQDMA_CPM5_FMAP_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, func_id, - EQDMA_CPM5_FMAP_NUM_WORDS, fmap); - if (rv < 0) - return rv; - - config->qbase = FIELD_GET(EQDMA_CPM5_FMAP_CTXT_W0_QID_MASK, - fmap[0]); - config->qmax = FIELD_GET(EQDMA_CPM5_FMAP_CTXT_W1_QID_MAX_MASK, - fmap[1]); - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_fmap_context_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_fmap_context_clear(void *dev_hndl, uint16_t func_id) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu\n", __func__, func_id); - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, func_id); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_fmap_context_read(dev_hndl, - func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_fmap_context_write(dev_hndl, - func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_fmap_context_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_context_write() - create indirect interrupt - * context and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_indirect_intr_context_write(void *dev_hndl, - uint16_t ring_index, const struct qdma_indirect_intr_ctxt - *ctxt) -{ - uint32_t intr_ctxt[EQDMA_CPM5_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint32_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_m = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, - ctxt->baddr_4k); - baddr_h = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - pasid_l = - FIELD_GET(EQDMA_CPM5_INTR_CTXT_PASID_GET_L_MASK, - ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CPM5_INTR_CTXT_PASID_GET_H_MASK, - ctxt->pasid); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(INTR_CTXT_DATA_W0_VEC_MASK, ctxt->vec) | - FIELD_SET(INTR_CTXT_DATA_W0_INT_ST_MASK, ctxt->int_st) | - FIELD_SET(INTR_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, baddr_m); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, baddr_h) | - FIELD_SET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, ctxt->page_size) | - FIELD_SET(INTR_CTXT_DATA_W2_PIDX_MASK, ctxt->pidx) | - FIELD_SET(INTR_CTXT_DATA_W2_AT_MASK, ctxt->at) | - FIELD_SET(INTR_CTXT_DATA_W2_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(INTR_CTXT_DATA_W2_PASID_L_MASK, pasid_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W3_PASID_H_MASK, pasid_h) | - FIELD_SET(INTR_CTXT_DATA_W3_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(INTR_CTXT_DATA_W3_FUNC_MASK, ctxt->func_id); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_context_read() - read indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_indirect_intr_context_read(void *dev_hndl, - uint16_t ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t intr_ctxt[EQDMA_CPM5_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, ring_index, - EQDMA_CPM5_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(INTR_CTXT_DATA_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(INTR_CTXT_DATA_W0_VEC_MASK, intr_ctxt[0]); - ctxt->int_st = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_INT_ST_MASK, - intr_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_COLOR_MASK, - intr_ctxt[0])); - baddr_l = FIELD_GET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, intr_ctxt[0]); - - baddr_m = FIELD_GET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, intr_ctxt[1]); - - baddr_h = FIELD_GET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, intr_ctxt[2]); - ctxt->page_size = - FIELD_GET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, intr_ctxt[2]); - ctxt->pidx = - (uint16_t)(FIELD_GET(INTR_CTXT_DATA_W2_PIDX_MASK, - intr_ctxt[2])); - ctxt->at = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_AT_MASK, intr_ctxt[2])); - ctxt->host_id = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_HOST_ID_MASK, - intr_ctxt[2])); - pasid_l = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_PASID_L_MASK, - intr_ctxt[2])); - - pasid_h = FIELD_GET(INTR_CTXT_DATA_W3_PASID_H_MASK, intr_ctxt[3]); - ctxt->pasid_en = (uint8_t)FIELD_GET(INTR_CTXT_DATA_W3_PASID_EN_MASK, - intr_ctxt[3]); - - ctxt->func_id = (uint16_t)FIELD_GET(INTR_CTXT_DATA_W3_FUNC_MASK, - intr_ctxt[3]); - - ctxt->baddr_4k = - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, baddr_m) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - ctxt->pasid = - FIELD_SET(EQDMA_CPM5_INTR_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CPM5_INTR_CTXT_PASID_GET_H_MASK, pasid_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_context_clear() - clear indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_indirect_intr_context_clear(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_context_invalidate() - invalidate indirect - * interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, - ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_ctx_conf() - configure indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_indirect_intr_context_read(dev_hndl, - ring_index, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_indirect_intr_context_write(dev_hndl, - ring_index, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_indirect_intr_context_invalidate(dev_hndl, - ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_dump_config_regs() - Function to get qdma config register - * dump in a buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_cpm5_config_num_regs_get(); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < eqdma_cpm5_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = eqdma_cpm5_config_regs_get(); - - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s", reg_info[i].name); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm_queue_context() - Function to get qdma queue context dump - * in a buffer - * - * @dev_hndl: device handle - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @context: Queue Context - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_cpm5_context(ctxt_data, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_dump_intr_context() - Function to get qdma interrupt context - * dump in a buffer - * - * @dev_hndl: device handle - * @intr_ctx: Interrupt Context - * @ring_index: Ring index - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - req_buflen = eqdma_cpm5_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_cpm5_intr_context(intr_ctx, ring_index, buf, - buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_dump_queue_context() - Function to read and dump the - * queue context in a buffer - * - * @dev_hndl: device handle - * @func_id: function id - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = eqdma_cpm5_sw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.sw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read sw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_cpm5_hw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.hw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read hw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_cpm5_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read credit context, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = eqdma_cpm5_pfetch_ctx_conf(dev_hndl, - qid_hw, - &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read pftech context, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = eqdma_cpm5_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read cmpt context, err = %d", - __func__, rv); - return rv; - } - } - - rv = eqdma_cpm5_fmap_conf(dev_hndl, func_id, - &(context.fmap), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read fmap context, err = %d", - __func__, rv); - return rv; - } - - rv = dump_eqdma_cpm5_context(&context, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_get_user_bar() - Function to get the AXI Master - * Lite(user bar) number - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite bar number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar) -{ - /* TODO: In future, user bar is identified using RR */ - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - UNUSED(func_id); - UNUSED(is_vf); - - *user_bar = 2; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_ram_sbe_err_process() - Function to dump SBE error - * debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_ram_sbe_err_process(void *dev_hndl) -{ - eqdma_cpm5_dump_reg_info(dev_hndl, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, 1, NULL, 0); - eqdma_cpm5_dump_reg_info(dev_hndl, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_ram_dbe_err_process() - Function to dump DBE error - * debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_ram_dbe_err_process(void *dev_hndl) -{ - eqdma_cpm5_dump_reg_info(dev_hndl, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, 1, NULL, 0); - eqdma_cpm5_dump_reg_info(dev_hndl, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_desc_err_process() - Function to dump Descriptor - * Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_LOG0_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_LOG1_ADDR, - EQDMA_CPM5_GLBL_DSC_DBG_DAT0_ADDR, - EQDMA_CPM5_GLBL_DSC_DBG_DAT1_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_LOG2_ADDR - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_trq_err_process() - Function to dump Target Access - * Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_LOG_ADDR - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_err_dump_ctxt_info() - Dump the imp ctxt fields on HW error - * - * @dev_hndl: device handle - * @first_err_qid: First Error QID - * @en_st: ST Mode or MM Mode enabled - * @c2h: C2H or H2C Mode - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_err_dump_ctxt_info(void *dev_hndl, - uint32_t first_err_qid_reg, - uint8_t en_st, uint8_t c2h) -{ - uint16_t first_err_qid = 0; - struct qdma_descq_sw_ctxt sw_ctxt; - struct qdma_descq_hw_ctxt hw_ctxt; - struct qdma_descq_cmpt_ctxt cmpt_ctxt; - - first_err_qid = qdma_reg_read(dev_hndl, first_err_qid_reg); - - eqdma_cpm5_sw_context_read(dev_hndl, c2h, first_err_qid, &sw_ctxt); - eqdma_cpm5_hw_context_read(dev_hndl, c2h, first_err_qid, &hw_ctxt); - eqdma_cpm5_fill_sw_ctxt(&sw_ctxt); - eqdma_cpm5_fill_hw_ctxt(&hw_ctxt); - - if (sw_ctxt.pidx != hw_ctxt.cidx) { - qdma_log_info("\n%40s\n", "SW Context:"); - /** SW Context: PIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[0].name, - eqdma_cpm5_sw_ctxt_entries[0].value, - eqdma_cpm5_sw_ctxt_entries[0].value); - qdma_log_info("\n%40s\n", "HW Context:"); - /*** HW Context: CIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_hw_ctxt_entries[0].name, - eqdma_cpm5_hw_ctxt_entries[0].value, - eqdma_cpm5_hw_ctxt_entries[0].value); - } - - if (sw_ctxt.err != 0) { - /*** SW Context: ERR ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[17].name, - eqdma_cpm5_sw_ctxt_entries[17].value, - eqdma_cpm5_sw_ctxt_entries[17].value); - } - - /*** SW Context: ERR WB SENT***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[18].name, - eqdma_cpm5_sw_ctxt_entries[18].value, - eqdma_cpm5_sw_ctxt_entries[18].value); - - /*** SW Context: IRQ REQ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[19].name, - eqdma_cpm5_sw_ctxt_entries[19].value, - eqdma_cpm5_sw_ctxt_entries[19].value); - - if (en_st && c2h) { - eqdma_cpm5_cmpt_context_read(dev_hndl, - first_err_qid, &cmpt_ctxt); - eqdma_cpm5_fill_cmpt_ctxt(&cmpt_ctxt); - - qdma_log_info("\n%40s\n", "CMPT Context:"); - - /*** CMPT Context: int_st ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[6].name, - eqdma_cpm5_cmpt_ctxt_entries[6].value, - eqdma_cpm5_cmpt_ctxt_entries[6].value); - - /** CMPT Context: PIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[12].name, - eqdma_cpm5_cmpt_ctxt_entries[12].value, - eqdma_cpm5_cmpt_ctxt_entries[12].value); - /*** CMPT Context: CIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[13].name, - eqdma_cpm5_cmpt_ctxt_entries[13].value, - eqdma_cpm5_cmpt_ctxt_entries[13].value); - - if (cmpt_ctxt.err != 0) { - /*** CMPT Context: ERR ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[15].name, - eqdma_cpm5_cmpt_ctxt_entries[15].value, - eqdma_cpm5_cmpt_ctxt_entries[15].value); - } - } -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_st_h2c_err_process() - Function to dump MM H2C Error - * information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - EQDMA_CPM5_H2C_FIRST_ERR_QID_ADDR, - EQDMA_CPM5_H2C_DBG_REG0_ADDR, - EQDMA_CPM5_H2C_DBG_REG1_ADDR, - EQDMA_CPM5_H2C_DBG_REG2_ADDR, - EQDMA_CPM5_H2C_DBG_REG3_ADDR, - EQDMA_CPM5_H2C_DBG_REG4_ADDR - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, st_h2c_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_cpm5_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_CPM5_H2C_FIRST_ERR_QID_ADDR, 1, 1); -} - - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_st_c2h_err_process() - Function to dump MM H2C - * Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_CPM5_C2H_FIRST_ERR_QID_ADDR, - EQDMA_CPM5_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR, - EQDMA_CPM5_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR, - EQDMA_CPM5_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR, - EQDMA_CPM5_C2H_STAT_AXIS_PKG_CMP_ADDR, - EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_0_ADDR, - EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_1_ADDR, - EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_2_ADDR, - EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_3_ADDR, - EQDMA_CPM5_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR, - EQDMA_CPM5_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, st_c2h_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_cpm5_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_CPM5_C2H_FIRST_ERR_QID_ADDR, 1, 1); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_mm_c2h0_err_process() - Function to dump MM C2H - * Error information - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_mm_c2h0_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t mm_c2h_err_reg_list[] = { - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - EQDMA_CPM5_C2H_MM_CMPL_DESC_CNT_ADDR, - EQDMA_CPM5_C2H_MM_ERR_CODE_ADDR, - EQDMA_CPM5_C2H_MM_ERR_INFO_ADDR, - EQDMA_CPM5_C2H_MM_DBG_ADDR - }; - int mm_c2h_err_num_regs = sizeof(mm_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < mm_c2h_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, mm_c2h_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_cpm5_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_CPM5_C2H_MM_ERR_INFO_ADDR, 0, 1); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_mm_h2c0_err_process() - Function to dump MM H2C - * Error information - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_mm_h2c0_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t mm_h2c_err_reg_list[] = { - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - EQDMA_CPM5_H2C_MM_CMPL_DESC_CNT_ADDR, - EQDMA_CPM5_H2C_MM_ERR_CODE_ADDR, - EQDMA_CPM5_H2C_MM_ERR_INFO_ADDR, - EQDMA_CPM5_H2C_MM_DBG_ADDR - }; - int mm_h2c_err_num_regs = sizeof(mm_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < mm_h2c_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, mm_h2c_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_cpm5_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_CPM5_H2C_MM_ERR_INFO_ADDR, 0, 1); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_get_error_name() - Function to get the error in string - * format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *eqdma_cpm5_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= EQDMA_CPM5_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, - (enum eqdma_cpm5_error_idx)err_idx); - return NULL; - } - - return eqdma_cpm5_err_info[(enum - eqdma_cpm5_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t bit = 0, i = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[ - EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS] = { - EQDMA_CPM5_DSC_ERR_POISON, - EQDMA_CPM5_TRQ_ERR_CSR_UNMAPPED, - EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_CPM5_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_CPM5_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_CPM5_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_CPM5_SBE_ERR_MI_H2C0_DAT, - EQDMA_CPM5_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_CPM5_DBE_ERR_MI_H2C0_DAT, - EQDMA_CPM5_MM_C2H_WR_SLR_ERR, - EQDMA_CPM5_MM_H2C0_RD_HDR_POISON_ERR - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_ERR_STAT_ADDR); - - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - - qdma_log_info("%s: Global Err Reg(0x%x) = 0x%x\n", - __func__, EQDMA_CPM5_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - for (i = 0; i < EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - bit = hw_err_position[i]; - - if ((!dev_cap.st_en) && - (bit == EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH || - bit == EQDMA_CPM5_ST_FATAL_ERR_MTY_MISMATCH || - bit == EQDMA_CPM5_ST_H2C_ERR_ZERO_LEN_DESC)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - eqdma_cpm5_err_info[bit].stat_reg_addr); - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - eqdma_cpm5_err_info[bit].stat_reg_addr, - err_stat); - - eqdma_cpm5_err_info[ - bit].eqdma_cpm5_hw_err_process(dev_hndl); - for (idx = bit; idx < all_eqdma_cpm5_hw_errs[i]; - idx++) { - /* call the platform specific handler */ - if (err_stat & - eqdma_cpm5_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s\n", - __func__, - eqdma_cpm5_hw_get_error_name(idx)); - } - qdma_reg_write(dev_hndl, - eqdma_cpm5_err_info[bit].stat_reg_addr, - err_stat); - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > EQDMA_CPM5_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, - (enum eqdma_cpm5_error_idx)err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == EQDMA_CPM5_ERRS_ALL) { - for (i = 0; i < EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS; - i++) { - - idx = all_eqdma_cpm5_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == EQDMA_CPM5_ST_C2H_ERR_ALL || - idx == EQDMA_CPM5_ST_FATAL_ERR_ALL - || idx == EQDMA_CPM5_ST_H2C_ERR_ALL) - continue; - } - - reg_val = eqdma_cpm5_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - eqdma_cpm5_err_info[idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_ERR_MASK_ADDR); - reg_val |= FIELD_SET( - eqdma_cpm5_err_info[idx].global_err_mask, - 1); - qdma_reg_write(dev_hndl, - EQDMA_CPM5_GLBL_ERR_MASK_ADDR, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH - && err_idx <= - EQDMA_CPM5_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - eqdma_cpm5_err_info[err_idx].mask_reg_addr); - reg_val |= - FIELD_SET( - eqdma_cpm5_err_info[err_idx].leaf_err_mask, - 1); - qdma_reg_write(dev_hndl, - eqdma_cpm5_err_info[err_idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_ERR_MASK_ADDR); - reg_val |= - FIELD_SET - (eqdma_cpm5_err_info[err_idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_ERR_MASK_ADDR, - reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_get_device_attributes() - Function to get the qdma device - * attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_PF_BARLITE_INT); - dev_info->num_pfs = FIELD_GET(QDMA_GLBL2_PF0_BAR_MAP_MASK, reg_val); - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL2_CHANNEL_CAP_ADDR); - dev_info->num_qs = - FIELD_GET(GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK, reg_val); - - /* There are 12 bits assigned in EQDMA_CPM5_GLBL2_CHANNEL_CAP_ADDR - * to represent the num_qs. For CPM5, max queues can be 4096 which needs - * 13 bits(0x1000). Adding a hack in driver to represent 4096 queues - * when HW sets the num_qs to 0xFFF - */ - if (dev_info->num_qs == 0xFFF) - dev_info->num_qs++; - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_GLBL2_MISC_CAP_ADDR); - dev_info->mailbox_en = FIELD_GET(EQDMA_CPM5_GLBL2_MAILBOX_EN_MASK, - reg_val); - dev_info->flr_present = FIELD_GET(EQDMA_CPM5_GLBL2_FLR_PRESENT_MASK, - reg_val); - dev_info->mm_cmpt_en = 0; - dev_info->debug_mode = FIELD_GET(EQDMA_CPM5_GLBL2_DBG_MODE_EN_MASK, - reg_val); - dev_info->desc_eng_mode = - FIELD_GET(EQDMA_CPM5_GLBL2_DESC_ENG_MODE_MASK, - reg_val); - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL2_CHANNEL_MDMA_ADDR); - dev_info->st_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ST_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ST_MASK, reg_val)) ? 1 : 0; - dev_info->mm_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ENG_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ENG_MASK, reg_val)) ? 1 : 0; - - /* num of mm channels */ - /* TODO : Register not yet defined for this. - * Hard coding it to 2 for CPM5 - */ - dev_info->mm_channel_max = 2; - - dev_info->qid2vec_ctx = 0; - dev_info->cmpt_ovf_chk_dis = 1; - dev_info->mailbox_intr = 1; - dev_info->sw_desc_64b = 1; - dev_info->cmpt_desc_64b = 1; - dev_info->dynamic_bar = 1; - dev_info->legacy_intr = 1; - dev_info->cmpt_trig_count_timer = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_init_ctxt_memory() - function to initialize the context - * memory - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_cpm5_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - -#ifdef TANDEM_BOOT_SUPPORTED - for (; sel <= QDMA_CTXT_SEL_CR_H2C; sel++) { - rv = eqdma_cpm5_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } -#else - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** TODO: Check for Tandem boot **/ - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = eqdma_cpm5_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } -#endif - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - eqdma_cpm5_indirect_reg_clear(dev_hndl, - QDMA_CTXT_SEL_FMAP, i); - -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return QDMA_SUCCESS; - -} - -#ifdef TANDEM_BOOT_SUPPORTED -/*****************************************************************************/ -/** - * eqdma_cpm5_init_st_ctxt() - Initialize the ST context - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_cpm5_init_st_ctxt(void *dev_hndl) -{ - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_CMPT; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = eqdma_cpm5_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - return QDMA_SUCCESS; - -} -#endif - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_cpm5_config_num_regs_get(); - - reg_info = eqdma_cpm5_config_regs_get(); - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_cpm5_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = eqdma_cpm5_config_regs_get(); - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - for (reg_count = 0; - (reg_count < total_regs);) { - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[reg_count].is_debug_reg == 1) - continue; - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; - -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_cpm5_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_cpm5_config_num_regs_get(); - struct xreg_info *eqdma_cpm5_config_regs = - eqdma_cpm5_config_regs_get(); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_group) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = EQDMA_CPM5_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = EQDMA_CPM5_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = EQDMA_CPM5_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = EQDMA_CPM5_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid slot received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - reg_info = &eqdma_cpm5_config_regs[reg_index]; - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_write_global_ring_sizes() - function to set the global ring - * size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_GLBL_RNG_SZ_1_ADDR, - index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_global_ring_sizes() - function to get the global rng_sz - * array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, EQDMA_CPM5_GLBL_RNG_SZ_1_ADDR, - index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_write_global_timer_count(void *dev_hndl, uint8_t - index, uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, - EQDMA_CPM5_C2H_TIMER_CNT_ADDR, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_read_global_timer_count(void *dev_hndl, - uint8_t index, uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - EQDMA_CPM5_C2H_TIMER_CNT_ADDR, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_write_global_counter_threshold() - function to set the - * counter threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_write_global_counter_threshold(void *dev_hndl, - uint8_t index, uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_C2H_CNT_TH_ADDR, - index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_global_counter_threshold() - function to get the counter - * threshold - * values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_read_global_counter_threshold(void *dev_hndl, uint8_t - index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, EQDMA_CPM5_C2H_CNT_TH_ADDR, - index, count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_write_global_buffer_sizes() - function to set the buffer - * sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_write_global_buffer_sizes(void *dev_hndl, uint8_t - index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_C2H_BUF_SZ_ADDR, - index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_read_global_buffer_sizes(void *dev_hndl, uint8_t - index, uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, EQDMA_CPM5_C2H_BUF_SZ_ADDR, - index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_global_csr_conf(void *dev_hndl, uint8_t index, - uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_cpm5_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_cpm5_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_cpm5_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_cpm5_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_global_writeback_interval_write() - function to set - * the writeback interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_DSC_CFG_ADDR); - reg_val |= FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_DSC_CFG_ADDR, - reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_global_writeback_interval_read() - function to get the - * writeback - * interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_DSC_CFG_ADDR); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_global_writeback_interval_read(dev_hndl, - wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_global_writeback_interval_write(dev_hndl, - *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * eqdma_cpm5_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? EQDMA_CPM5_C2H_MM_CTL_ADDR : - EQDMA_CPM5_H2C_MM_CTL_ADDR; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - - - return QDMA_SUCCESS; -} - -int eqdma_cpm5_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = eqdma_cpm5_config_num_regs_get(); - struct xreg_info *config_regs = eqdma_cpm5_config_regs_get(); - struct qdma_dev_attributes dev_cap; - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - config_regs[j].is_debug_reg == 1) - continue; - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; -} - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.h deleted file mode 100755 index 8c14e04..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.h +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __EQDMA_CPM5_SOFT_ACCESS_H_ -#define __EQDMA_CPM5_SOFT_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -/** - * enum eqdma_cpm5_error_idx - qdma errors - */ -enum eqdma_cpm5_error_idx { - /* Descriptor errors */ - EQDMA_CPM5_DSC_ERR_POISON, - EQDMA_CPM5_DSC_ERR_UR_CA, - EQDMA_CPM5_DSC_ERR_BCNT, - EQDMA_CPM5_DSC_ERR_PARAM, - EQDMA_CPM5_DSC_ERR_ADDR, - EQDMA_CPM5_DSC_ERR_TAG, - EQDMA_CPM5_DSC_ERR_FLR, - EQDMA_CPM5_DSC_ERR_TIMEOUT, - EQDMA_CPM5_DSC_ERR_DAT_POISON, - EQDMA_CPM5_DSC_ERR_FLR_CANCEL, - EQDMA_CPM5_DSC_ERR_DMA, - EQDMA_CPM5_DSC_ERR_DSC, - EQDMA_CPM5_DSC_ERR_RQ_CANCEL, - EQDMA_CPM5_DSC_ERR_DBE, - EQDMA_CPM5_DSC_ERR_SBE, - EQDMA_CPM5_DSC_ERR_PORT_ID, - EQDMA_CPM5_DSC_ERR_ALL, - - /* TRQ Errors */ - EQDMA_CPM5_TRQ_ERR_CSR_UNMAPPED, - EQDMA_CPM5_TRQ_ERR_VF_ACCESS, - EQDMA_CPM5_TRQ_ERR_TCP_CSR_TIMEOUT, - EQDMA_CPM5_TRQ_ERR_QSPC_UNMAPPED, - EQDMA_CPM5_TRQ_ERR_QID_RANGE, - EQDMA_CPM5_TRQ_ERR_TCP_QSPC_TIMEOUT, - EQDMA_CPM5_TRQ_ERR_ALL, - - /* ST C2H Errors */ - EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_CPM5_ST_C2H_ERR_LEN_MISMATCH, - EQDMA_CPM5_ST_C2H_ERR_SH_CMPT_DSC, - EQDMA_CPM5_ST_C2H_ERR_QID_MISMATCH, - EQDMA_CPM5_ST_C2H_ERR_DESC_RSP_ERR, - EQDMA_CPM5_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - EQDMA_CPM5_ST_C2H_ERR_MSI_INT_FAIL, - EQDMA_CPM5_ST_C2H_ERR_ERR_DESC_CNT, - EQDMA_CPM5_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - EQDMA_CPM5_ST_C2H_ERR_CMPT_INV_Q_ERR, - EQDMA_CPM5_ST_C2H_ERR_CMPT_QFULL_ERR, - EQDMA_CPM5_ST_C2H_ERR_CMPT_CIDX_ERR, - EQDMA_CPM5_ST_C2H_ERR_CMPT_PRTY_ERR, - EQDMA_CPM5_ST_C2H_ERR_AVL_RING_DSC, - EQDMA_CPM5_ST_C2H_ERR_HDR_ECC_UNC, - EQDMA_CPM5_ST_C2H_ERR_HDR_ECC_COR, - EQDMA_CPM5_ST_C2H_ERR_WRB_PORT_ID_ERR, - EQDMA_CPM5_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - EQDMA_CPM5_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_CPM5_ST_FATAL_ERR_LEN_MISMATCH, - EQDMA_CPM5_ST_FATAL_ERR_QID_MISMATCH, - EQDMA_CPM5_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_WPL_DATA_PAR, - EQDMA_CPM5_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_HDR_ECC_UNC, - EQDMA_CPM5_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - EQDMA_CPM5_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_CPM5_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - EQDMA_CPM5_ST_H2C_ERR_NO_DMA_DSC, - EQDMA_CPM5_ST_H2C_ERR_SBE, - EQDMA_CPM5_ST_H2C_ERR_DBE, - EQDMA_CPM5_ST_H2C_ERR_PAR, - EQDMA_CPM5_ST_H2C_ERR_ALL, - - /* Single bit errors */ - EQDMA_CPM5_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_CPM5_SBE_1_ERR_TAG_ODD_RAM, - EQDMA_CPM5_SBE_1_ERR_TAG_EVEN_RAM, - EQDMA_CPM5_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_CPM5_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_CPM5_SBE_1_ERR_ALL, - - /* Single bit errors */ - EQDMA_CPM5_SBE_ERR_MI_H2C0_DAT, - EQDMA_CPM5_SBE_ERR_MI_H2C1_DAT, - EQDMA_CPM5_SBE_ERR_MI_H2C2_DAT, - EQDMA_CPM5_SBE_ERR_MI_H2C3_DAT, - EQDMA_CPM5_SBE_ERR_MI_C2H0_DAT, - EQDMA_CPM5_SBE_ERR_MI_C2H1_DAT, - EQDMA_CPM5_SBE_ERR_MI_C2H2_DAT, - EQDMA_CPM5_SBE_ERR_MI_C2H3_DAT, - EQDMA_CPM5_SBE_ERR_H2C_RD_BRG_DAT, - EQDMA_CPM5_SBE_ERR_H2C_WR_BRG_DAT, - EQDMA_CPM5_SBE_ERR_C2H_RD_BRG_DAT, - EQDMA_CPM5_SBE_ERR_C2H_WR_BRG_DAT, - EQDMA_CPM5_SBE_ERR_FUNC_MAP, - EQDMA_CPM5_SBE_ERR_DSC_HW_CTXT, - EQDMA_CPM5_SBE_ERR_DSC_CRD_RCV, - EQDMA_CPM5_SBE_ERR_DSC_SW_CTXT, - EQDMA_CPM5_SBE_ERR_DSC_CPLI, - EQDMA_CPM5_SBE_ERR_DSC_CPLD, - EQDMA_CPM5_SBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_TIMER_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_QID_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_CPM5_SBE_ERR_INT_CTXT_RAM, - EQDMA_CPM5_SBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_PFCH_CTXT_RAM, - EQDMA_CPM5_SBE_ERR_WRB_CTXT_RAM, - EQDMA_CPM5_SBE_ERR_PFCH_LL_RAM, - EQDMA_CPM5_SBE_ERR_PEND_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_CPM5_SBE_ERR_ALL, - - /* Double bit Errors */ - EQDMA_CPM5_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_CPM5_DBE_1_ERR_TAG_ODD_RAM, - EQDMA_CPM5_DBE_1_ERR_TAG_EVEN_RAM, - EQDMA_CPM5_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_CPM5_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_CPM5_DBE_1_ERR_ALL, - - /* Double bit Errors */ - EQDMA_CPM5_DBE_ERR_MI_H2C0_DAT, - EQDMA_CPM5_DBE_ERR_MI_H2C1_DAT, - EQDMA_CPM5_DBE_ERR_MI_H2C2_DAT, - EQDMA_CPM5_DBE_ERR_MI_H2C3_DAT, - EQDMA_CPM5_DBE_ERR_MI_C2H0_DAT, - EQDMA_CPM5_DBE_ERR_MI_C2H1_DAT, - EQDMA_CPM5_DBE_ERR_MI_C2H2_DAT, - EQDMA_CPM5_DBE_ERR_MI_C2H3_DAT, - EQDMA_CPM5_DBE_ERR_H2C_RD_BRG_DAT, - EQDMA_CPM5_DBE_ERR_H2C_WR_BRG_DAT, - EQDMA_CPM5_DBE_ERR_C2H_RD_BRG_DAT, - EQDMA_CPM5_DBE_ERR_C2H_WR_BRG_DAT, - EQDMA_CPM5_DBE_ERR_FUNC_MAP, - EQDMA_CPM5_DBE_ERR_DSC_HW_CTXT, - EQDMA_CPM5_DBE_ERR_DSC_CRD_RCV, - EQDMA_CPM5_DBE_ERR_DSC_SW_CTXT, - EQDMA_CPM5_DBE_ERR_DSC_CPLI, - EQDMA_CPM5_DBE_ERR_DSC_CPLD, - EQDMA_CPM5_DBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_TIMER_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_QID_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_CPM5_DBE_ERR_INT_CTXT_RAM, - EQDMA_CPM5_DBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_PFCH_CTXT_RAM, - EQDMA_CPM5_DBE_ERR_WRB_CTXT_RAM, - EQDMA_CPM5_DBE_ERR_PFCH_LL_RAM, - EQDMA_CPM5_DBE_ERR_PEND_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_CPM5_DBE_ERR_ALL, - - /* MM C2H Errors */ - EQDMA_CPM5_MM_C2H_WR_SLR_ERR, - EQDMA_CPM5_MM_C2H_RD_SLR_ERR, - EQDMA_CPM5_MM_C2H_WR_FLR_ERR, - EQDMA_CPM5_MM_C2H_UR_ERR, - EQDMA_CPM5_MM_C2H_WR_UC_RAM_ERR, - EQDMA_CPM5_MM_C2H_ERR_ALL, - - /* MM H2C Engine0 Errors */ - EQDMA_CPM5_MM_H2C0_RD_HDR_POISON_ERR, - EQDMA_CPM5_MM_H2C0_RD_UR_CA_ERR, - EQDMA_CPM5_MM_H2C0_RD_HDR_BYTE_ERR, - EQDMA_CPM5_MM_H2C0_RD_HDR_PARAM_ERR, - EQDMA_CPM5_MM_H2C0_RD_HDR_ADR_ERR, - EQDMA_CPM5_MM_H2C0_RD_FLR_ERR, - EQDMA_CPM5_MM_H2C0_RD_DAT_POISON_ERR, - EQDMA_CPM5_MM_H2C0_RD_RQ_DIS_ERR, - EQDMA_CPM5_MM_H2C0_WR_DEC_ERR, - EQDMA_CPM5_MM_H2C0_WR_SLV_ERR, - EQDMA_CPM5_MM_H2C0_ERR_ALL, - - EQDMA_CPM5_ERRS_ALL -}; - -struct eqdma_cpm5_hw_err_info { - enum eqdma_cpm5_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*eqdma_cpm5_hw_err_process)(void *dev_hndl); -}; - -#ifdef EQDMA_CPM5_VF_GT_256Q_SUPPORTED -#define EQDMA_CPM5_OFFSET_VF_VERSION 0x21014 -#define EQDMA_CPM5_OFFSET_MBOX_BASE_VF 0x21000 -#else -#define EQDMA_CPM5_OFFSET_VF_VERSION 0x5014 -#define EQDMA_CPM5_OFFSET_MBOX_BASE_VF 0x5000 -#endif - -#define EQDMA_CPM5_OFFSET_MBOX_BASE_PF 0x42400 -#define EQDMA_CPM5_OFFSET_VF_USER_BAR 0x5018 - -#define EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_H_MASK GENMASK_ULL(63, 38) -#define EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_L_MASK GENMASK_ULL(37, 6) -#define EQDMA_CPM5_COMPL_CTXT_BADDR_LOW_MASK GENMASK_ULL(5, 2) - -int eqdma_cpm5_init_ctxt_memory(void *dev_hndl); - -#ifdef TANDEM_BOOT_SUPPORTED -int eqdma_cpm5_init_st_ctxt(void *dev_hndl); -#endif - -int eqdma_cpm5_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - -int eqdma_cpm5_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int eqdma_cpm5_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -int eqdma_cpm5_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -uint32_t eqdma_cpm5_reg_dump_buf_len(void); - -int eqdma_cpm5_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int eqdma_cpm5_hw_error_process(void *dev_hndl); -const char *eqdma_cpm5_hw_get_error_name(uint32_t err_idx); -int eqdma_cpm5_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int eqdma_cpm5_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int eqdma_cpm5_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -int eqdma_cpm5_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - -int eqdma_cpm5_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int eqdma_cpm5_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int eqdma_cpm5_set_default_global_csr(void *dev_hndl); - -int eqdma_cpm5_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, uint8_t enable); - -int eqdma_cpm5_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -uint32_t eqdma_cpm5_get_config_num_regs(void); - -struct xreg_info *eqdma_cpm5_get_config_regs(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __EQDMA_CPM5_SOFT_ACCESS_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg.h deleted file mode 100755 index 1099ede..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg.h +++ /dev/null @@ -1,1300 +0,0 @@ -/* - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __EQDMA_CPM5_REG_H -#define __EQDMA_CPM5_REG_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - -#define DEBGFS_LINE_SZ (81) - -#ifdef ARRAY_SIZE -#undef ARRAY_SIZE -#endif -#define ARRAY_SIZE(arr) (sizeof(arr) / \ - sizeof(arr[0])) - - -uint32_t eqdma_cpm5_config_num_regs_get(void); -struct xreg_info *eqdma_cpm5_config_regs_get(void); -#define EQDMA_CPM5_CFG_BLK_IDENTIFIER_ADDR 0x00 -#define CFG_BLK_IDENTIFIER_MASK GENMASK(31, 20) -#define CFG_BLK_IDENTIFIER_1_MASK GENMASK(19, 16) -#define CFG_BLK_IDENTIFIER_RSVD_1_MASK GENMASK(15, 8) -#define CFG_BLK_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_CPM5_CFG_BLK_PCIE_MAX_PLD_SIZE_ADDR 0x08 -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ADDR 0x0C -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_BLK_SYSTEM_ID_ADDR 0x10 -#define CFG_BLK_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 17) -#define CFG_BLK_SYSTEM_ID_INST_TYPE_MASK BIT(16) -#define CFG_BLK_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_CPM5_CFG_BLK_MSIX_ENABLE_ADDR 0x014 -#define CFG_BLK_MSIX_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CPM5_CFG_PCIE_DATA_WIDTH_ADDR 0x18 -#define CFG_PCIE_DATA_WIDTH_RSVD_1_MASK GENMASK(31, 3) -#define CFG_PCIE_DATA_WIDTH_DATAPATH_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_PCIE_CTL_ADDR 0x1C -#define CFG_PCIE_CTL_RSVD_1_MASK GENMASK(31, 18) -#define CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK GENMASK(17, 16) -#define CFG_PCIE_CTL_RSVD_2_MASK GENMASK(15, 2) -#define CFG_PCIE_CTL_RRQ_DISABLE_MASK BIT(1) -#define CFG_PCIE_CTL_RELAXED_ORDERING_MASK BIT(0) -#define EQDMA_CPM5_CFG_BLK_MSI_ENABLE_ADDR 0x20 -#define CFG_BLK_MSI_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CPM5_CFG_AXI_USER_MAX_PLD_SIZE_ADDR 0x40 -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_AXI_USER_MAX_READ_REQ_SIZE_ADDR 0x44 -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR 0x4C -#define CFG_BLK_MISC_CTL_RSVD_1_MASK GENMASK(31, 24) -#define CFG_BLK_MISC_CTL_10B_TAG_EN_MASK BIT(23) -#define CFG_BLK_MISC_CTL_RSVD_2_MASK BIT(22) -#define CFG_BLK_MISC_CTL_AXI_WBK_MASK BIT(21) -#define CFG_BLK_MISC_CTL_AXI_DSC_MASK BIT(20) -#define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) -#define CFG_BLK_MISC_CTL_RSVD_3_MASK GENMASK(7, 5) -#define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) -#define EQDMA_CPM5_CFG_PL_CRED_CTL_ADDR 0x68 -#define CFG_PL_CRED_CTL_RSVD_1_MASK GENMASK(31, 5) -#define CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK BIT(4) -#define CFG_PL_CRED_CTL_RSVD_2_MASK GENMASK(3, 1) -#define CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK BIT(0) -#define EQDMA_CPM5_CFG_BLK_SCRATCH_ADDR 0x80 -#define CFG_BLK_SCRATCH_MASK GENMASK(31, 0) -#define EQDMA_CPM5_CFG_GIC_ADDR 0xA0 -#define CFG_GIC_RSVD_1_MASK GENMASK(31, 1) -#define CFG_GIC_GIC_IRQ_MASK BIT(0) -#define EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR 0xE0 -#define RAM_SBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR 0xE4 -#define RAM_SBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR 0xE8 -#define RAM_DBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR 0xEC -#define RAM_DBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_CPM5_RAM_SBE_MSK_A_ADDR 0xF0 -#define RAM_SBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_CPM5_RAM_SBE_STS_A_ADDR 0xF4 -#define RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_SBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_SBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_SBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_SBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_SBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_SBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_SBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_SBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_SBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_SBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_SBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_SBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_SBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_SBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_SBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_SBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_SBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_SBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_SBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_CPM5_RAM_DBE_MSK_A_ADDR 0xF8 -#define RAM_DBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_CPM5_RAM_DBE_STS_A_ADDR 0xFC -#define RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_DBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_DBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_DBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_DBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_DBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_DBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_DBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_DBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_DBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_DBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_DBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_DBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_DBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_DBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_DBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_DBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_DBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_DBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_DBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_IDENTIFIER_ADDR 0x100 -#define GLBL2_IDENTIFIER_MASK GENMASK(31, 8) -#define GLBL2_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_INST_ADDR 0x114 -#define GLBL2_CHANNEL_INST_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_INST_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_INST_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_INST_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_INST_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_INST_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_INST_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_MDMA_ADDR 0x118 -#define GLBL2_CHANNEL_MDMA_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_MDMA_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_MDMA_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_MDMA_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_MDMA_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_MDMA_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_MDMA_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_STRM_ADDR 0x11C -#define GLBL2_CHANNEL_STRM_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_STRM_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_STRM_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_STRM_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_STRM_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_STRM_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_STRM_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_CAP_ADDR 0x120 -#define GLBL2_CHANNEL_CAP_RSVD_1_MASK GENMASK(31, 12) -#define GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK GENMASK(11, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_PASID_CAP_ADDR 0x128 -#define GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK GENMASK(31, 2) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK BIT(1) -#define GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_SYSTEM_ID_ADDR 0x130 -#define GLBL2_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL2_MISC_CAP_ADDR 0x134 -#define GLBL2_MISC_CAP_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL2_DBG_PCIE_RQ0_ADDR 0x1B8 -#define GLBL2_PCIE_RQ0_NPH_AVL_MASK GENMASK(31, 20) -#define GLBL2_PCIE_RQ0_RCB_AVL_MASK GENMASK(19, 9) -#define GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK GENMASK(8, 2) -#define GLBL2_PCIE_RQ0_TAG_EP_MASK GENMASK(1, 0) -#define EQDMA_CPM5_GLBL2_DBG_PCIE_RQ1_ADDR 0x1BC -#define GLBL2_PCIE_RQ1_RSVD_1_MASK GENMASK(31, 21) -#define GLBL2_PCIE_RQ1_TAG_FL_MASK GENMASK(20, 19) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK BIT(18) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK BIT(17) -#define GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK BIT(16) -#define GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK BIT(15) -#define GLBL2_PCIE_RQ1_TLPSM_MASK GENMASK(14, 12) -#define GLBL2_PCIE_RQ1_TLPSM512_MASK GENMASK(11, 9) -#define GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK BIT(8) -#define GLBL2_PCIE_RQ1_RREQ0_SLV_MASK BIT(7) -#define GLBL2_PCIE_RQ1_RREQ0_VLD_MASK BIT(6) -#define GLBL2_PCIE_RQ1_RREQ0_RDY_MASK BIT(5) -#define GLBL2_PCIE_RQ1_RREQ1_SLV_MASK BIT(4) -#define GLBL2_PCIE_RQ1_RREQ1_VLD_MASK BIT(3) -#define GLBL2_PCIE_RQ1_RREQ1_RDY_MASK BIT(2) -#define GLBL2_PCIE_RQ1_WTLP_REQ_MASK BIT(1) -#define GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_AXIMM_WR0_ADDR 0x1C0 -#define GLBL2_AXIMM_WR0_RSVD_1_MASK GENMASK(31, 27) -#define GLBL2_AXIMM_WR0_WR_REQ_MASK BIT(26) -#define GLBL2_AXIMM_WR0_WR_CHN_MASK GENMASK(25, 23) -#define GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK BIT(22) -#define GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK BIT(21) -#define GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK GENMASK(20, 18) -#define GLBL2_AXIMM_WR0_WRREQ_CNT_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR0_BID_MASK GENMASK(11, 9) -#define GLBL2_AXIMM_WR0_BVALID_MASK BIT(8) -#define GLBL2_AXIMM_WR0_BREADY_MASK BIT(7) -#define GLBL2_AXIMM_WR0_WVALID_MASK BIT(6) -#define GLBL2_AXIMM_WR0_WREADY_MASK BIT(5) -#define GLBL2_AXIMM_WR0_AWID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_WR0_AWVALID_MASK BIT(1) -#define GLBL2_AXIMM_WR0_AWREADY_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_AXIMM_WR1_ADDR 0x1C4 -#define GLBL2_AXIMM_WR1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_WR1_BRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_WR1_BRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_WR1_BRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR1_BRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_WR1_BRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_CPM5_GLBL2_DBG_AXIMM_RD0_ADDR 0x1C8 -#define GLBL2_AXIMM_RD0_RSVD_1_MASK GENMASK(31, 23) -#define GLBL2_AXIMM_RD0_PND_CNT_MASK GENMASK(22, 17) -#define GLBL2_AXIMM_RD0_RD_REQ_MASK BIT(16) -#define GLBL2_AXIMM_RD0_RD_CHNL_MASK GENMASK(15, 13) -#define GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK GENMASK(12, 10) -#define GLBL2_AXIMM_RD0_RID_MASK GENMASK(9, 7) -#define GLBL2_AXIMM_RD0_RVALID_MASK BIT(6) -#define GLBL2_AXIMM_RD0_RREADY_MASK BIT(5) -#define GLBL2_AXIMM_RD0_ARID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_RD0_ARVALID_MASK BIT(1) -#define GLBL2_AXIMM_RD0_ARREADY_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_AXIMM_RD1_ADDR 0x1CC -#define GLBL2_AXIMM_RD1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_RD1_RRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_RD1_RRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_RD1_RRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_RD1_RRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_RD1_RRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_CPM5_GLBL2_DBG_FAB0_ADDR 0x1D0 -#define GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK BIT(31) -#define GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK BIT(30) -#define GLBL2_FAB0_H2C_SEG_IN_VLD_MASK BIT(29) -#define GLBL2_FAB0_H2C_SEG_IN_RDY_MASK BIT(28) -#define GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK GENMASK(27, 24) -#define GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK BIT(23) -#define GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK GENMASK(22, 16) -#define GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK BIT(15) -#define GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK BIT(14) -#define GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK GENMASK(13, 10) -#define GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK BIT(9) -#define GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK BIT(8) -#define GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK BIT(7) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK BIT(6) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK BIT(5) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK BIT(3) -#define GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK BIT(2) -#define GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK BIT(1) -#define GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_FAB1_ADDR 0x1D4 -#define GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK GENMASK(31, 25) -#define GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK GENMASK(24, 18) -#define GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK BIT(17) -#define GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK BIT(16) -#define GLBL2_FAB1_RSVD_1_MASK GENMASK(15, 13) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK BIT(12) -#define GLBL2_FAB1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK BIT(8) -#define GLBL2_FAB1_RSVD_3_MASK GENMASK(7, 5) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB1_RSVD_4_MASK GENMASK(3, 1) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_MATCH_SEL_ADDR 0x1F4 -#define GLBL2_MATCH_SEL_RSV_MASK GENMASK(31, 18) -#define GLBL2_MATCH_SEL_CSR_SEL_MASK GENMASK(17, 13) -#define GLBL2_MATCH_SEL_CSR_EN_MASK BIT(12) -#define GLBL2_MATCH_SEL_ROTATE1_MASK GENMASK(11, 10) -#define GLBL2_MATCH_SEL_ROTATE0_MASK GENMASK(9, 8) -#define GLBL2_MATCH_SEL_SEL_MASK GENMASK(7, 0) -#define EQDMA_CPM5_GLBL2_DBG_MATCH_MSK_ADDR 0x1F8 -#define GLBL2_MATCH_MSK_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL2_DBG_MATCH_PAT_ADDR 0x1FC -#define GLBL2_MATCH_PAT_PATTERN_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_1_ADDR 0x204 -#define GLBL_RNG_SZ_1_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_1_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_2_ADDR 0x208 -#define GLBL_RNG_SZ_2_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_2_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_3_ADDR 0x20C -#define GLBL_RNG_SZ_3_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_3_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_4_ADDR 0x210 -#define GLBL_RNG_SZ_4_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_4_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_5_ADDR 0x214 -#define GLBL_RNG_SZ_5_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_5_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_6_ADDR 0x218 -#define GLBL_RNG_SZ_6_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_6_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_7_ADDR 0x21C -#define GLBL_RNG_SZ_7_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_7_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_8_ADDR 0x220 -#define GLBL_RNG_SZ_8_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_8_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_9_ADDR 0x224 -#define GLBL_RNG_SZ_9_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_9_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_A_ADDR 0x228 -#define GLBL_RNG_SZ_A_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_A_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_B_ADDR 0x22C -#define GLBL_RNG_SZ_B_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_B_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_C_ADDR 0x230 -#define GLBL_RNG_SZ_C_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_C_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_D_ADDR 0x234 -#define GLBL_RNG_SZ_D_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_D_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_E_ADDR 0x238 -#define GLBL_RNG_SZ_E_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_E_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_F_ADDR 0x23C -#define GLBL_RNG_SZ_F_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_F_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_10_ADDR 0x240 -#define GLBL_RNG_SZ_10_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_10_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_ERR_STAT_ADDR 0x248 -#define GLBL_ERR_STAT_RSVD_1_MASK GENMASK(31, 18) -#define GLBL_ERR_STAT_ERR_FAB_MASK BIT(17) -#define GLBL_ERR_STAT_ERR_H2C_ST_MASK BIT(16) -#define GLBL_ERR_STAT_ERR_BDG_MASK BIT(15) -#define GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK GENMASK(14, 9) -#define GLBL_ERR_STAT_ERR_C2H_ST_MASK BIT(8) -#define GLBL_ERR_STAT_ERR_C2H_MM_1_MASK BIT(7) -#define GLBL_ERR_STAT_ERR_C2H_MM_0_MASK BIT(6) -#define GLBL_ERR_STAT_ERR_H2C_MM_1_MASK BIT(5) -#define GLBL_ERR_STAT_ERR_H2C_MM_0_MASK BIT(4) -#define GLBL_ERR_STAT_ERR_TRQ_MASK BIT(3) -#define GLBL_ERR_STAT_ERR_DSC_MASK BIT(2) -#define GLBL_ERR_STAT_ERR_RAM_DBE_MASK BIT(1) -#define GLBL_ERR_STAT_ERR_RAM_SBE_MASK BIT(0) -#define EQDMA_CPM5_GLBL_ERR_MASK_ADDR 0x24C -#define GLBL_ERR_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL_DSC_CFG_ADDR 0x250 -#define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 10) -#define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) -#define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) -#define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) -#define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) -#define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR 0x254 -#define GLBL_DSC_ERR_STS_RSVD_1_MASK GENMASK(31, 26) -#define GLBL_DSC_ERR_STS_PORT_ID_MASK BIT(25) -#define GLBL_DSC_ERR_STS_SBE_MASK BIT(24) -#define GLBL_DSC_ERR_STS_DBE_MASK BIT(23) -#define GLBL_DSC_ERR_STS_RQ_CANCEL_MASK BIT(22) -#define GLBL_DSC_ERR_STS_DSC_MASK BIT(21) -#define GLBL_DSC_ERR_STS_DMA_MASK BIT(20) -#define GLBL_DSC_ERR_STS_FLR_CANCEL_MASK BIT(19) -#define GLBL_DSC_ERR_STS_RSVD_2_MASK GENMASK(18, 17) -#define GLBL_DSC_ERR_STS_DAT_POISON_MASK BIT(16) -#define GLBL_DSC_ERR_STS_TIMEOUT_MASK BIT(9) -#define GLBL_DSC_ERR_STS_FLR_MASK BIT(8) -#define GLBL_DSC_ERR_STS_TAG_MASK BIT(6) -#define GLBL_DSC_ERR_STS_ADDR_MASK BIT(5) -#define GLBL_DSC_ERR_STS_PARAM_MASK BIT(4) -#define GLBL_DSC_ERR_STS_BCNT_MASK BIT(3) -#define GLBL_DSC_ERR_STS_UR_CA_MASK BIT(2) -#define GLBL_DSC_ERR_STS_POISON_MASK BIT(1) -#define EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR 0x258 -#define GLBL_DSC_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL_DSC_ERR_LOG0_ADDR 0x25C -#define GLBL_DSC_ERR_LOG0_VALID_MASK BIT(31) -#define GLBL_DSC_ERR_LOG0_SEL_MASK BIT(30) -#define GLBL_DSC_ERR_LOG0_RSVD_1_MASK GENMASK(29, 13) -#define GLBL_DSC_ERR_LOG0_QID_MASK GENMASK(12, 0) -#define EQDMA_CPM5_GLBL_DSC_ERR_LOG1_ADDR 0x260 -#define GLBL_DSC_ERR_LOG1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_ERR_LOG1_CIDX_MASK GENMASK(27, 12) -#define GLBL_DSC_ERR_LOG1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK GENMASK(8, 5) -#define GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK GENMASK(4, 0) -#define EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR 0x264 -#define GLBL_TRQ_ERR_STS_RSVD_1_MASK GENMASK(31, 8) -#define GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK BIT(7) -#define GLBL_TRQ_ERR_STS_RSVD_2_MASK BIT(6) -#define GLBL_TRQ_ERR_STS_QID_RANGE_MASK BIT(5) -#define GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK BIT(4) -#define GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK BIT(3) -#define GLBL_TRQ_ERR_STS_RSVD_3_MASK BIT(2) -#define GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK BIT(1) -#define GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK BIT(0) -#define EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR 0x268 -#define GLBL_TRQ_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL_TRQ_ERR_LOG_ADDR 0x26C -#define GLBL_TRQ_ERR_LOG_SRC_MASK BIT(31) -#define GLBL_TRQ_ERR_LOG_TARGET_MASK GENMASK(30, 27) -#define GLBL_TRQ_ERR_LOG_FUNC_MASK GENMASK(26, 17) -#define GLBL_TRQ_ERR_LOG_ADDRESS_MASK GENMASK(16, 0) -#define EQDMA_CPM5_GLBL_DSC_DBG_DAT0_ADDR 0x270 -#define GLBL_DSC_DAT0_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK BIT(29) -#define GLBL_DSC_DAT0_CTXT_ARB_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK GENMASK(16, 12) -#define GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK BIT(11) -#define GLBL_DSC_DAT0_TMSTALL_MASK BIT(10) -#define GLBL_DSC_DAT0_RRQ_STALL_MASK GENMASK(9, 8) -#define GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK GENMASK(7, 6) -#define GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK GENMASK(5, 4) -#define GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK GENMASK(3, 2) -#define GLBL_DSC_DAT0_DSC_OUT_STALL_MASK GENMASK(1, 0) -#define EQDMA_CPM5_GLBL_DSC_DBG_DAT1_ADDR 0x274 -#define GLBL_DSC_DAT1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_DAT1_EVT_SPC_C2H_MASK GENMASK(27, 22) -#define GLBL_DSC_DAT1_EVT_SP_H2C_MASK GENMASK(21, 16) -#define GLBL_DSC_DAT1_DSC_SPC_C2H_MASK GENMASK(15, 8) -#define GLBL_DSC_DAT1_DSC_SPC_H2C_MASK GENMASK(7, 0) -#define EQDMA_CPM5_GLBL_DSC_DBG_CTL_ADDR 0x278 -#define GLBL_DSC_CTL_RSVD_1_MASK GENMASK(31, 3) -#define GLBL_DSC_CTL_SELECT_MASK GENMASK(2, 0) -#define EQDMA_CPM5_GLBL_DSC_ERR_LOG2_ADDR 0x27c -#define GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK GENMASK(31, 16) -#define GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_GLBL_INTERRUPT_CFG_ADDR 0x2c4 -#define GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK GENMASK(31, 2) -#define GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK BIT(1) -#define GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK BIT(0) -#define EQDMA_CPM5_GLBL_VCH_HOST_PROFILE_ADDR 0x2c8 -#define GLBL_VCH_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_VCH_HOST_PROFILE_2C_MM_MASK GENMASK(27, 24) -#define GLBL_VCH_HOST_PROFILE_2C_ST_MASK GENMASK(23, 20) -#define GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK GENMASK(19, 16) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK GENMASK(15, 12) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK GENMASK(7, 4) -#define GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK GENMASK(3, 0) -#define EQDMA_CPM5_GLBL_BRIDGE_HOST_PROFILE_ADDR 0x308 -#define GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 4) -#define GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK GENMASK(3, 0) -#define EQDMA_CPM5_AXIMM_IRQ_DEST_ADDR_ADDR 0x30c -#define AXIMM_IRQ_DEST_ADDR_ADDR_MASK GENMASK(31, 0) -#define EQDMA_CPM5_FAB_ERR_LOG_ADDR 0x314 -#define FAB_ERR_LOG_RSVD_1_MASK GENMASK(31, 7) -#define FAB_ERR_LOG_SRC_MASK GENMASK(6, 0) -#define EQDMA_CPM5_IND_CTXT_DATA_ADDR 0x804 -#define IND_CTXT_DATA_DATA_MASK GENMASK(31, 0) -#define EQDMA_CPM5_IND_CTXT_MASK_ADDR 0x824 -#define IND_CTXT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_IND_CTXT_CMD_ADDR 0x844 -#define IND_CTXT_CMD_RSVD_1_MASK GENMASK(31, 20) -#define IND_CTXT_CMD_QID_MASK GENMASK(19, 7) -#define IND_CTXT_CMD_OP_MASK GENMASK(6, 5) -#define IND_CTXT_CMD_SEL_MASK GENMASK(4, 1) -#define IND_CTXT_CMD_BUSY_MASK BIT(0) -#define EQDMA_CPM5_C2H_TIMER_CNT_ADDR 0xA00 -#define C2H_TIMER_CNT_RSVD_1_MASK GENMASK(31, 16) -#define C2H_TIMER_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CNT_TH_ADDR 0xA40 -#define C2H_CNT_TH_RSVD_1_MASK GENMASK(31, 16) -#define C2H_CNT_TH_THESHOLD_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR 0xA88 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR 0xA8C -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR 0xA90 -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_AXIS_PKG_CMP_ADDR 0xA94 -#define C2H_STAT_AXIS_PKG_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_AXIS_PKG_CMP_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_ACCEPTED_ADDR 0xA98 -#define C2H_STAT_DESC_RSP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_ACCEPTED_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_CMP_ADDR 0xA9C -#define C2H_STAT_DESC_RSP_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_CMP_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_WRQ_OUT_ADDR 0xAA0 -#define C2H_STAT_WRQ_OUT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WRQ_OUT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_WPL_REN_ACCEPTED_ADDR 0xAA4 -#define C2H_STAT_WPL_REN_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WPL_REN_ACCEPTED_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_TOTAL_WRQ_LEN_ADDR 0xAA8 -#define C2H_STAT_TOTAL_WRQ_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_TOTAL_WRQ_LEN_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_TOTAL_WPL_LEN_ADDR 0xAAC -#define C2H_STAT_TOTAL_WPL_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_TOTAL_WPL_LEN_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_BUF_SZ_ADDR 0xAB0 -#define C2H_BUF_SZ_IZE_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_ERR_STAT_ADDR 0xAF0 -#define C2H_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK BIT(20) -#define C2H_ERR_STAT_HDR_PAR_ERR_MASK BIT(19) -#define C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK BIT(18) -#define C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(17) -#define C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK BIT(16) -#define C2H_ERR_STAT_WRB_PRTY_ERR_MASK BIT(15) -#define C2H_ERR_STAT_WRB_CIDX_ERR_MASK BIT(14) -#define C2H_ERR_STAT_WRB_QFULL_ERR_MASK BIT(13) -#define C2H_ERR_STAT_WRB_INV_Q_ERR_MASK BIT(12) -#define C2H_ERR_STAT_RSVD_2_MASK BIT(11) -#define C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK BIT(10) -#define C2H_ERR_STAT_ERR_DESC_CNT_MASK BIT(9) -#define C2H_ERR_STAT_RSVD_3_MASK BIT(8) -#define C2H_ERR_STAT_MSI_INT_FAIL_MASK BIT(7) -#define C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define C2H_ERR_STAT_RSVD_4_MASK BIT(5) -#define C2H_ERR_STAT_DESC_RSP_ERR_MASK BIT(4) -#define C2H_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK BIT(2) -#define C2H_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_CPM5_C2H_ERR_MASK_ADDR 0xAF4 -#define C2H_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR 0xAF8 -#define C2H_FATAL_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(20) -#define C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK BIT(19) -#define C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK BIT(18) -#define C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK BIT(17) -#define C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK BIT(15) -#define C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define C2H_FATAL_ERR_STAT_RESERVED2_MASK BIT(13) -#define C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK BIT(9) -#define C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK BIT(8) -#define C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK GENMASK(7, 4) -#define C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_FATAL_ERR_STAT_RESERVED1_MASK BIT(2) -#define C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR 0xAFC -#define C2H_FATAL_ERR_C2HEN_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_FATAL_ERR_ENABLE_ADDR 0xB00 -#define C2H_FATAL_ERR_ENABLE_RSVD_1_MASK GENMASK(31, 2) -#define C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK BIT(1) -#define C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK BIT(0) -#define EQDMA_CPM5_GLBL_ERR_INT_ADDR 0xB04 -#define GLBL_ERR_INT_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_ERR_INT_HOST_ID_MASK GENMASK(29, 26) -#define GLBL_ERR_INT_DIS_INTR_ON_VF_MASK BIT(25) -#define GLBL_ERR_INT_ARM_MASK BIT(24) -#define GLBL_ERR_INT_EN_COAL_MASK BIT(23) -#define GLBL_ERR_INT_VEC_MASK GENMASK(22, 12) -#define GLBL_ERR_INT_FUNC_MASK GENMASK(11, 0) -#define EQDMA_CPM5_C2H_PFCH_CFG_ADDR 0xB08 -#define C2H_PFCH_CFG_EVTFL_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_FL_TH_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR 0xA80 -#define C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_1_QCNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR 0xA84 -#define C2H_PFCH_CFG_2_FENCE_MASK BIT(31) -#define C2H_PFCH_CFG_2_RSVD_MASK GENMASK(30, 29) -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK BIT(28) -#define C2H_PFCH_CFG_2_LL_SZ_TH_MASK GENMASK(27, 12) -#define C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK GENMASK(11, 6) -#define C2H_PFCH_CFG_2_NUM_MASK GENMASK(5, 0) -#define EQDMA_CPM5_C2H_INT_TIMER_TICK_ADDR 0xB0C -#define C2H_INT_TIMER_TICK_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR 0xB10 -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR 0xB14 -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_REQ_ADDR 0xB18 -#define C2H_STAT_DESC_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_REQ_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_0_ADDR 0xB1C -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK BIT(31) -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK BIT(30) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK GENMASK(29, 27) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK GENMASK(26, 24) -#define C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK BIT(23) -#define C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK BIT(22) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK BIT(21) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK GENMASK(20, 9) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK BIT(8) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK GENMASK(7, 5) -#define C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK BIT(4) -#define C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK GENMASK(3, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_1_ADDR 0xB20 -#define C2H_STAT_DMA_ENG_1_RSVD_1_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK GENMASK(6, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_2_ADDR 0xB24 -#define C2H_STAT_DMA_ENG_2_RSVD_1_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_MASK GENMASK(6, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_3_ADDR 0xB28 -#define C2H_STAT_DMA_ENG_3_RSVD_1_MASK GENMASK(31, 24) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT_MASK GENMASK(23, 19) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK BIT(18) -#define C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK BIT(17) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK BIT(16) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK BIT(15) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK BIT(14) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK BIT(13) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK BIT(12) -#define C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK BIT(11) -#define C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK BIT(10) -#define C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0_MASK BIT(9) -#define C2H_STAT_DMA_ENG_3_WRQ_VLD_MASK BIT(8) -#define C2H_STAT_DMA_ENG_3_WRQ_RDY_MASK BIT(7) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY_MASK BIT(6) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP_MASK BIT(5) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR_MASK BIT(4) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER_MASK BIT(3) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR_MASK BIT(2) -#define C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK BIT(1) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK BIT(0) -#define EQDMA_CPM5_C2H_DBG_PFCH_ERR_CTXT_ADDR 0xB2C -#define C2H_PFCH_ERR_CTXT_RSVD_1_MASK GENMASK(31, 14) -#define C2H_PFCH_ERR_CTXT_ERR_STAT_MASK BIT(13) -#define C2H_PFCH_ERR_CTXT_CMD_WR_MASK BIT(12) -#define C2H_PFCH_ERR_CTXT_QID_MASK GENMASK(11, 1) -#define C2H_PFCH_ERR_CTXT_DONE_MASK BIT(0) -#define EQDMA_CPM5_C2H_FIRST_ERR_QID_ADDR 0xB30 -#define C2H_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(20, 16) -#define C2H_FIRST_ERR_QID_RSVD_MASK GENMASK(15, 13) -#define C2H_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_CPM5_STAT_NUM_WRB_IN_ADDR 0xB34 -#define STAT_NUM_WRB_IN_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_IN_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_WRB_OUT_ADDR 0xB38 -#define STAT_NUM_WRB_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_OUT_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_WRB_DRP_ADDR 0xB3C -#define STAT_NUM_WRB_DRP_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_DRP_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_STAT_DESC_OUT_ADDR 0xB40 -#define STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_STAT_DESC_OUT_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_DSC_CRDT_SENT_ADDR 0xB44 -#define STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_DSC_CRDT_SENT_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_FCH_DSC_RCVD_ADDR 0xB48 -#define STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_BYP_DSC_RCVD_ADDR 0xB4C -#define STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK GENMASK(31, 11) -#define STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK GENMASK(10, 0) -#define EQDMA_CPM5_C2H_WRB_COAL_CFG_ADDR 0xB50 -#define C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define C2H_WRB_COAL_CFG_TICK_VAL_MASK GENMASK(25, 14) -#define C2H_WRB_COAL_CFG_TICK_CNT_MASK GENMASK(13, 2) -#define C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK BIT(1) -#define C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK BIT(0) -#define EQDMA_CPM5_C2H_INTR_H2C_REQ_ADDR 0xB54 -#define C2H_INTR_H2C_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_MM_REQ_ADDR 0xB58 -#define C2H_INTR_C2H_MM_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_MM_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_ERR_INT_REQ_ADDR 0xB5C -#define C2H_INTR_ERR_INT_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_ERR_INT_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_REQ_ADDR 0xB60 -#define C2H_INTR_C2H_ST_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_ADDR 0xB64 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_ADDR 0xB68 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_ADDR 0xB6C -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_ADDR 0xB70 -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_MSIX_ACK_ADDR 0xB74 -#define C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_MSIX_FAIL_ADDR 0xB78 -#define C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_NO_MSIX_ADDR 0xB7C -#define C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_CTXT_INVAL_ADDR 0xB80 -#define C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_WR_CMP_ADDR 0xB84 -#define C2H_STAT_WR_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WR_CMP_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_4_ADDR 0xB88 -#define C2H_STAT_DMA_ENG_4_RSVD_1_MASK GENMASK(31, 24) -#define C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT_MASK GENMASK(23, 19) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_MASK BIT(18) -#define C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_MASK BIT(17) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_MASK BIT(16) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_MASK BIT(15) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK BIT(14) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_MASK BIT(13) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_MASK BIT(12) -#define C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_MASK BIT(11) -#define C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_MASK BIT(10) -#define C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0_MASK BIT(9) -#define C2H_STAT_DMA_ENG_4_WRQ_VLD_MASK BIT(8) -#define C2H_STAT_DMA_ENG_4_WRQ_RDY_MASK BIT(7) -#define C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY_MASK BIT(6) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP_MASK BIT(5) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR_MASK BIT(4) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER_MASK BIT(3) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR_MASK BIT(2) -#define C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_MASK BIT(1) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_MASK BIT(0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_5_ADDR 0xB8C -#define C2H_STAT_DMA_ENG_5_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK BIT(29) -#define C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK GENMASK(28, 24) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK GENMASK(23, 22) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK GENMASK(21, 6) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK BIT(5) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK BIT(4) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK BIT(3) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK BIT(2) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK BIT(1) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK BIT(0) -#define EQDMA_CPM5_C2H_DBG_PFCH_QID_ADDR 0xB90 -#define C2H_PFCH_QID_RSVD_1_MASK GENMASK(31, 16) -#define C2H_PFCH_QID_ERR_CTXT_MASK BIT(15) -#define C2H_PFCH_QID_TARGET_MASK GENMASK(14, 12) -#define C2H_PFCH_QID_QID_OR_TAG_MASK GENMASK(11, 0) -#define EQDMA_CPM5_C2H_DBG_PFCH_ADDR 0xB94 -#define C2H_PFCH_DATA_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_INT_DBG_ADDR 0xB98 -#define C2H_INT_RSVD_1_MASK GENMASK(31, 8) -#define C2H_INT_INT_COAL_SM_MASK GENMASK(7, 4) -#define C2H_INT_INT_SM_MASK GENMASK(3, 0) -#define EQDMA_CPM5_C2H_STAT_IMM_ACCEPTED_ADDR 0xB9C -#define C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_IMM_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_MARKER_ACCEPTED_ADDR 0xBA0 -#define C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_MARKER_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DISABLE_CMP_ACCEPTED_ADDR 0xBA4 -#define C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_PLD_FIFO_CRDT_CNT_ADDR 0xBA8 -#define C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_PLD_FIFO_CRDT_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_DYN_REQ_ADDR 0xBAC -#define C2H_INTR_DYN_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_DYN_MISC_ADDR 0xBB0 -#define C2H_INTR_DYN_MISC_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_MISC_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_DROP_LEN_MISMATCH_ADDR 0xBB4 -#define C2H_DROP_LEN_MISMATCH_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_LEN_MISMATCH_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_DROP_DESC_RSP_LEN_ADDR 0xBB8 -#define C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_DESC_RSP_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_DROP_QID_FIFO_LEN_ADDR 0xBBC -#define C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_QID_FIFO_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_DROP_PLD_CNT_ADDR 0xBC0 -#define C2H_DROP_PLD_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_0_ADDR 0xBC4 -#define C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_0_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_1_ADDR 0xBC8 -#define C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_1_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_2_ADDR 0xBCC -#define C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_2_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_3_ADDR 0xBD0 -#define C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_3_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_4_ADDR 0xBD4 -#define C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_4_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_5_ADDR 0xBD8 -#define C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_5_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_6_ADDR 0xBDC -#define C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_6_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_PFCH_CACHE_DEPTH_ADDR 0xBE0 -#define C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK GENMASK(23, 16) -#define C2H_PFCH_CACHE_DEPTH_MASK GENMASK(7, 0) -#define EQDMA_CPM5_C2H_WRB_COAL_BUF_DEPTH_ADDR 0xBE4 -#define C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK GENMASK(31, 8) -#define C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK GENMASK(7, 0) -#define EQDMA_CPM5_C2H_PFCH_CRDT_ADDR 0xBE8 -#define C2H_PFCH_CRDT_RSVD_1_MASK GENMASK(31, 1) -#define C2H_PFCH_CRDT_RSVD_2_MASK BIT(0) -#define EQDMA_CPM5_C2H_STAT_HAS_CMPT_ACCEPTED_ADDR 0xBEC -#define C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_HAS_PLD_ACCEPTED_ADDR 0xBF0 -#define C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_PLD_PKT_ID_ADDR 0xBF4 -#define C2H_PLD_PKT_ID_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_DATA_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_PLD_PKT_ID_1_ADDR 0xBF8 -#define C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_1_DATA_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_DROP_PLD_CNT_1_ADDR 0xBFC -#define C2H_DROP_PLD_CNT_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_1_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_H2C_ERR_STAT_ADDR 0xE00 -#define H2C_ERR_STAT_RSVD_1_MASK GENMASK(31, 6) -#define H2C_ERR_STAT_PAR_ERR_MASK BIT(5) -#define H2C_ERR_STAT_SBE_MASK BIT(4) -#define H2C_ERR_STAT_DBE_MASK BIT(3) -#define H2C_ERR_STAT_NO_DMA_DS_MASK BIT(2) -#define H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK BIT(1) -#define H2C_ERR_STAT_ZERO_LEN_DS_MASK BIT(0) -#define EQDMA_CPM5_H2C_ERR_MASK_ADDR 0xE04 -#define H2C_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_FIRST_ERR_QID_ADDR 0xE08 -#define H2C_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 20) -#define H2C_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(19, 16) -#define H2C_FIRST_ERR_QID_RSVD_2_MASK GENMASK(15, 13) -#define H2C_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_CPM5_H2C_DBG_REG0_ADDR 0xE0C -#define H2C_REG0_NUM_DSC_RCVD_MASK GENMASK(31, 16) -#define H2C_REG0_NUM_WRB_SENT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_H2C_DBG_REG1_ADDR 0xE10 -#define H2C_REG1_NUM_REQ_SENT_MASK GENMASK(31, 16) -#define H2C_REG1_NUM_CMP_SENT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_H2C_DBG_REG2_ADDR 0xE14 -#define H2C_REG2_RSVD_1_MASK GENMASK(31, 16) -#define H2C_REG2_NUM_ERR_DSC_RCVD_MASK GENMASK(15, 0) -#define EQDMA_CPM5_H2C_DBG_REG3_ADDR 0xE18 -#define H2C_REG3_RSVD_1_MASK BIT(31) -#define H2C_REG3_DSCO_FIFO_EMPTY_MASK BIT(30) -#define H2C_REG3_DSCO_FIFO_FULL_MASK BIT(29) -#define H2C_REG3_CUR_RC_STATE_MASK GENMASK(28, 26) -#define H2C_REG3_RDREQ_LINES_MASK GENMASK(25, 16) -#define H2C_REG3_RDATA_LINES_AVAIL_MASK GENMASK(15, 6) -#define H2C_REG3_PEND_FIFO_EMPTY_MASK BIT(5) -#define H2C_REG3_PEND_FIFO_FULL_MASK BIT(4) -#define H2C_REG3_CUR_RQ_STATE_MASK GENMASK(3, 2) -#define H2C_REG3_DSCI_FIFO_FULL_MASK BIT(1) -#define H2C_REG3_DSCI_FIFO_EMPTY_MASK BIT(0) -#define EQDMA_CPM5_H2C_DBG_REG4_ADDR 0xE1C -#define H2C_REG4_RDREQ_ADDR_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_FATAL_ERR_EN_ADDR 0xE20 -#define H2C_FATAL_ERR_EN_RSVD_1_MASK GENMASK(31, 1) -#define H2C_FATAL_ERR_EN_H2C_MASK BIT(0) -#define EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR 0xE24 -#define H2C_REQ_THROT_PCIE_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_PCIE_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_PCIE_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_PCIE_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_CPM5_H2C_ALN_DBG_REG0_ADDR 0xE28 -#define H2C_ALN_REG0_NUM_PKT_SENT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR 0xE2C -#define H2C_REQ_THROT_AXIMM_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_AXIMM_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_AXIMM_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_MM_CTL_ADDR 0x1004 -#define C2H_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define C2H_MM_CTL_ERRC_EN_MASK BIT(8) -#define C2H_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define C2H_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_CPM5_C2H_MM_STATUS_ADDR 0x1040 -#define C2H_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define C2H_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_CPM5_C2H_MM_CMPL_DESC_CNT_ADDR 0x1048 -#define C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1054 -#define C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK BIT(31) -#define C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK BIT(30) -#define C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK BIT(29) -#define C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK BIT(28) -#define C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK GENMASK(27, 2) -#define C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK BIT(1) -#define C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(0) -#define EQDMA_CPM5_C2H_MM_ERR_CODE_ADDR 0x1058 -#define C2H_MM_ERR_CODE_RESERVED1_MASK GENMASK(31, 28) -#define C2H_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define C2H_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define C2H_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define C2H_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_CPM5_C2H_MM_ERR_INFO_ADDR 0x105C -#define C2H_MM_ERR_INFO_VALID_MASK BIT(31) -#define C2H_MM_ERR_INFO_SEL_MASK BIT(30) -#define C2H_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define C2H_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_CTL_ADDR 0x10C0 -#define C2H_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define C2H_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define C2H_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_CYCLE_CNT0_ADDR 0x10C4 -#define C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_CYCLE_CNT1_ADDR 0x10C8 -#define C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_DATA_CNT0_ADDR 0x10CC -#define C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_DATA_CNT1_ADDR 0x10D0 -#define C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_CPM5_C2H_MM_DBG_ADDR 0x10E8 -#define C2H_MM_RSVD_1_MASK GENMASK(31, 24) -#define C2H_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define C2H_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define C2H_MM_RD_STALL_MASK BIT(6) -#define C2H_MM_RRQ_FIFO_FI_MASK BIT(5) -#define C2H_MM_WR_STALL_MASK BIT(4) -#define C2H_MM_WRQ_FIFO_FI_MASK BIT(3) -#define C2H_MM_WBK_STALL_MASK BIT(2) -#define C2H_MM_DSC_FIFO_EP_MASK BIT(1) -#define C2H_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_CTL_ADDR 0x1204 -#define H2C_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define H2C_MM_CTL_ERRC_EN_MASK BIT(8) -#define H2C_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define H2C_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_STATUS_ADDR 0x1240 -#define H2C_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define H2C_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_CMPL_DESC_CNT_ADDR 0x1248 -#define H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1254 -#define H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK GENMASK(31, 30) -#define H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(29) -#define H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK BIT(28) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK GENMASK(27, 23) -#define H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK BIT(22) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK GENMASK(21, 17) -#define H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK BIT(16) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK GENMASK(15, 9) -#define H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK BIT(8) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK GENMASK(7, 6) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK BIT(5) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK BIT(4) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK BIT(3) -#define H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK BIT(2) -#define H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK BIT(1) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_ERR_CODE_ADDR 0x1258 -#define H2C_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 28) -#define H2C_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define H2C_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define H2C_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define H2C_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_CPM5_H2C_MM_ERR_INFO_ADDR 0x125C -#define H2C_MM_ERR_INFO_VALID_MASK BIT(31) -#define H2C_MM_ERR_INFO_SEL_MASK BIT(30) -#define H2C_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define H2C_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_CTL_ADDR 0x12C0 -#define H2C_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define H2C_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define H2C_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_CYCLE_CNT0_ADDR 0x12C4 -#define H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_CYCLE_CNT1_ADDR 0x12C8 -#define H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_DATA_CNT0_ADDR 0x12CC -#define H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_DATA_CNT1_ADDR 0x12D0 -#define H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_CPM5_H2C_MM_DBG_ADDR 0x12E8 -#define H2C_MM_RSVD_1_MASK GENMASK(31, 24) -#define H2C_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define H2C_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define H2C_MM_RD_STALL_MASK BIT(6) -#define H2C_MM_RRQ_FIFO_FI_MASK BIT(5) -#define H2C_MM_WR_STALL_MASK BIT(4) -#define H2C_MM_WRQ_FIFO_FI_MASK BIT(3) -#define H2C_MM_WBK_STALL_MASK BIT(2) -#define H2C_MM_DSC_FIFO_EP_MASK BIT(1) -#define H2C_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR 0x1400 -#define C2H_CRDT_COAL_CFG_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK GENMASK(17, 10) -#define C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK GENMASK(9, 0) -#define EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR 0x1404 -#define C2H_CRDT_COAL_CFG_2_RSVD_1_MASK GENMASK(31, 24) -#define C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK GENMASK(23, 16) -#define C2H_CRDT_COAL_CFG_2_RESERVED1_MASK GENMASK(15, 11) -#define C2H_CRDT_COAL_CFG_2_NT_TH_MASK GENMASK(10, 0) -#define EQDMA_CPM5_C2H_PFCH_BYP_QID_ADDR 0x1408 -#define C2H_PFCH_BYP_QID_RSVD_1_MASK GENMASK(31, 12) -#define C2H_PFCH_BYP_QID_MASK GENMASK(11, 0) -#define EQDMA_CPM5_C2H_PFCH_BYP_TAG_ADDR 0x140C -#define C2H_PFCH_BYP_TAG_RSVD_1_MASK GENMASK(31, 20) -#define C2H_PFCH_BYP_TAG_BYP_QID_MASK GENMASK(19, 8) -#define C2H_PFCH_BYP_TAG_RSVD_2_MASK BIT(7) -#define C2H_PFCH_BYP_TAG_MASK GENMASK(6, 0) -#define EQDMA_CPM5_C2H_WATER_MARK_ADDR 0x1500 -#define C2H_WATER_MARK_HIGH_WM_MASK GENMASK(31, 16) -#define C2H_WATER_MARK_LOW_WM_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_NOTIFY_EMPTY_ADDR 0x1800 -#define C2H_NOTIFY_EMPTY_RSVD_1_MASK GENMASK(31, 16) -#define C2H_NOTIFY_EMPTY_NOE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_C2H_ACCEPTED_1_ADDR 0x1804 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_1_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_WRB_ACCEPTED_1_ADDR 0x1808 -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_1_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_ADDR 0x180C -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_AXIS_PKG_CMP_1_ADDR 0x1810 -#define C2H_STAT_AXIS_PKG_CMP_1_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_WRB_ACCEPTED_2_ADDR 0x1814 -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_2_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_ST_PLD_FIFO_DEPTH_ADDR 0x1818 -#define C2H_ST_PLD_FIFO_DEPTH_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK GENMASK(31, 11) -#define SW_IND_CTXT_DATA_W5_PASID_EN_MASK BIT(10) -#define SW_IND_CTXT_DATA_W5_PASID_H_MASK GENMASK(9, 0) -#define SW_IND_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 20) -#define SW_IND_CTXT_DATA_W4_HOST_ID_MASK GENMASK(19, 16) -#define SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK BIT(15) -#define SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK BIT(14) -#define SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK BIT(13) -#define SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(12) -#define SW_IND_CTXT_DATA_W4_INT_AGGR_MASK BIT(11) -#define SW_IND_CTXT_DATA_W4_VEC_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W3_DSC_BASE_H_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W2_DSC_BASE_L_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W1_IS_MM_MASK BIT(31) -#define SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK BIT(30) -#define SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK BIT(29) -#define SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK BIT(28) -#define SW_IND_CTXT_DATA_W1_ERR_MASK GENMASK(27, 26) -#define SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK BIT(25) -#define SW_IND_CTXT_DATA_W1_PORT_ID_MASK GENMASK(24, 22) -#define SW_IND_CTXT_DATA_W1_IRQ_EN_MASK BIT(21) -#define SW_IND_CTXT_DATA_W1_WBK_EN_MASK BIT(20) -#define SW_IND_CTXT_DATA_W1_MM_CHN_MASK BIT(19) -#define SW_IND_CTXT_DATA_W1_BYPASS_MASK BIT(18) -#define SW_IND_CTXT_DATA_W1_DSC_SZ_MASK GENMASK(17, 16) -#define SW_IND_CTXT_DATA_W1_RNG_SZ_MASK GENMASK(15, 12) -#define SW_IND_CTXT_DATA_W1_RSVD_1_MASK GENMASK(11, 9) -#define SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK GENMASK(8, 5) -#define SW_IND_CTXT_DATA_W1_AT_MASK BIT(4) -#define SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK BIT(3) -#define SW_IND_CTXT_DATA_W1_WBI_CHK_MASK BIT(2) -#define SW_IND_CTXT_DATA_W1_FCRD_EN_MASK BIT(1) -#define SW_IND_CTXT_DATA_W1_QEN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W0_RSV_MASK GENMASK(31, 29) -#define SW_IND_CTXT_DATA_W0_FNC_MASK GENMASK(28, 17) -#define SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK BIT(16) -#define SW_IND_CTXT_DATA_W0_PIDX_MASK GENMASK(15, 0) -#define HW_IND_CTXT_DATA_W1_RSVD_1_MASK BIT(15) -#define HW_IND_CTXT_DATA_W1_FETCH_PND_MASK GENMASK(14, 11) -#define HW_IND_CTXT_DATA_W1_EVT_PND_MASK BIT(10) -#define HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK BIT(9) -#define HW_IND_CTXT_DATA_W1_DSC_PND_MASK BIT(8) -#define HW_IND_CTXT_DATA_W1_RSVD_2_MASK GENMASK(7, 0) -#define HW_IND_CTXT_DATA_W0_CRD_USE_MASK GENMASK(31, 16) -#define HW_IND_CTXT_DATA_W0_CIDX_MASK GENMASK(15, 0) -#define CRED_CTXT_DATA_W0_RSVD_1_MASK GENMASK(31, 16) -#define CRED_CTXT_DATA_W0_CREDT_MASK GENMASK(15, 0) -#define PREFETCH_CTXT_DATA_W1_VALID_MASK BIT(13) -#define PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define PREFETCH_CTXT_DATA_W0_PFCH_MASK BIT(28) -#define PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK BIT(27) -#define PREFETCH_CTXT_DATA_W0_ERR_MASK BIT(26) -#define PREFETCH_CTXT_DATA_W0_RSVD_MASK GENMASK(25, 22) -#define PREFETCH_CTXT_DATA_W0_PFCH_NEED_MASK GENMASK(21, 16) -#define PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK GENMASK(15, 10) -#define PREFETCH_CTXT_DATA_W0_VIRTIO_MASK BIT(9) -#define PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK BIT(8) -#define PREFETCH_CTXT_DATA_W0_PORT_ID_MASK GENMASK(7, 5) -#define PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK GENMASK(4, 1) -#define PREFETCH_CTXT_DATA_W0_BYPASS_MASK BIT(0) -#define CMPL_CTXT_DATA_W6_RSVD_1_H_MASK GENMASK(7, 0) -#define CMPL_CTXT_DATA_W5_RSVD_1_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W5_PORT_ID_MASK GENMASK(22, 20) -#define CMPL_CTXT_DATA_W5_SH_CMPT_MASK BIT(19) -#define CMPL_CTXT_DATA_W5_VIO_EOP_MASK BIT(18) -#define CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK GENMASK(17, 14) -#define CMPL_CTXT_DATA_W5_PASID_EN_MASK BIT(13) -#define CMPL_CTXT_DATA_W5_PASID_H_MASK GENMASK(12, 0) -#define CMPL_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W4_HOST_ID_MASK GENMASK(22, 19) -#define CMPL_CTXT_DATA_W4_DIR_C2H_MASK BIT(18) -#define CMPL_CTXT_DATA_W4_VIO_MASK BIT(17) -#define CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(16) -#define CMPL_CTXT_DATA_W4_INT_AGGR_MASK BIT(15) -#define CMPL_CTXT_DATA_W4_VEC_MASK GENMASK(14, 4) -#define CMPL_CTXT_DATA_W4_AT_MASK BIT(3) -#define CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK BIT(2) -#define CMPL_CTXT_DATA_W4_FULL_UPD_MASK BIT(1) -#define CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK BIT(0) -#define CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK BIT(31) -#define CMPL_CTXT_DATA_W3_ERR_MASK GENMASK(30, 29) -#define CMPL_CTXT_DATA_W3_VALID_MASK BIT(28) -#define CMPL_CTXT_DATA_W3_CIDX_MASK GENMASK(27, 12) -#define CMPL_CTXT_DATA_W3_PIDX_H_MASK GENMASK(11, 0) -#define CMPL_CTXT_DATA_W2_PIDX_L_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W2_DESC_SIZE_MASK GENMASK(27, 26) -#define CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK GENMASK(25, 0) -#define CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK GENMASK(31, 0) -#define CMPL_CTXT_DATA_W0_QSIZE_IX_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W0_COLOR_MASK BIT(27) -#define CMPL_CTXT_DATA_W0_INT_ST_MASK GENMASK(26, 25) -#define CMPL_CTXT_DATA_W0_TIMER_IX_MASK GENMASK(24, 21) -#define CMPL_CTXT_DATA_W0_CNTER_IX_MASK GENMASK(20, 17) -#define CMPL_CTXT_DATA_W0_FNC_ID_MASK GENMASK(16, 5) -#define CMPL_CTXT_DATA_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define CMPL_CTXT_DATA_W0_EN_INT_MASK BIT(1) -#define CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK BIT(0) -#define INTR_CTXT_DATA_W3_FUNC_MASK GENMASK(29, 18) -#define INTR_CTXT_DATA_W3_RSVD_MASK GENMASK(17, 14) -#define INTR_CTXT_DATA_W3_PASID_EN_MASK BIT(13) -#define INTR_CTXT_DATA_W3_PASID_H_MASK GENMASK(12, 0) -#define INTR_CTXT_DATA_W2_PASID_L_MASK GENMASK(31, 23) -#define INTR_CTXT_DATA_W2_HOST_ID_MASK GENMASK(22, 19) -#define INTR_CTXT_DATA_W2_AT_MASK BIT(18) -#define INTR_CTXT_DATA_W2_PIDX_MASK GENMASK(17, 6) -#define INTR_CTXT_DATA_W2_PAGE_SIZE_MASK GENMASK(5, 3) -#define INTR_CTXT_DATA_W2_BADDR_4K_H_MASK GENMASK(2, 0) -#define INTR_CTXT_DATA_W1_BADDR_4K_M_MASK GENMASK(31, 0) -#define INTR_CTXT_DATA_W0_BADDR_4K_L_MASK GENMASK(31, 15) -#define INTR_CTXT_DATA_W0_COLOR_MASK BIT(14) -#define INTR_CTXT_DATA_W0_INT_ST_MASK BIT(13) -#define INTR_CTXT_DATA_W0_RSVD1_MASK BIT(12) -#define INTR_CTXT_DATA_W0_VEC_MASK GENMASK(11, 1) -#define INTR_CTXT_DATA_W0_VALID_MASK BIT(0) -#define HOSTID_TABLE_W6_SMID_MASK GENMASK(9, 0) -#define HOSTID_TABLE_W5_H2C_MM_AWPROT_MASK GENMASK(27, 26) -#define HOSTID_TABLE_W5_H2C_MM_AWCACHE_MASK GENMASK(25, 22) -#define HOSTID_TABLE_W5_H2C_MM_AWSTEERING_MASK GENMASK(20, 18) -#define HOSTID_TABLE_W5_DSC_AWPROT_MASK GENMASK(17, 16) -#define HOSTID_TABLE_W5_DSC_AWCACHE_MASK GENMASK(15, 12) -#define HOSTID_TABLE_W5_DSC_AWSTEERING_MASK GENMASK(11, 8) -#define HOSTID_TABLE_W5_INT_MSG_AWPROT_MASK GENMASK(7, 6) -#define HOSTID_TABLE_W5_INT_MSG_AWCACHE_MASK GENMASK(5, 2) -#define HOSTID_TABLE_W5_INT_MSG_AWSTEERING_H_MASK GENMASK(0, 0) -#define HOSTID_TABLE_W4_INT_MSG_AWSTEERING_L_MASK GENMASK(31, 30) -#define HOSTID_TABLE_W4_INT_AGGR_AWPROT_MASK GENMASK(29, 28) -#define HOSTID_TABLE_W4_INT_AGGR_AWCACHE_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W4_INT_AGGR_AWSTEERING_MASK GENMASK(22, 20) -#define HOSTID_TABLE_W4_CMPT_AWPROT_MASK GENMASK(19, 18) -#define HOSTID_TABLE_W4_CMPT_AWCACHE_MASK GENMASK(17, 14) -#define HOSTID_TABLE_W4_CMPT_AWSTEERING_MASK GENMASK(12, 10) -#define HOSTID_TABLE_W4_C2H_PLD_AWPROT_MASK GENMASK(9, 8) -#define HOSTID_TABLE_W4_C2H_PLD_AWCACHE_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W4_C2H_PLD_AWSTEERING_MASK GENMASK(2, 0) -#define HOSTID_TABLE_W3_C2H_MM_ARPROT_MASK GENMASK(7, 6) -#define HOSTID_TABLE_W3_C2H_MM_ARCACHE_MASK GENMASK(5, 2) -#define HOSTID_TABLE_W3_C2H_MM_ARSTEERING_H_MASK GENMASK(0, 0) -#define HOSTID_TABLE_W2_C2H_MM_ARSTEERING_L_MASK GENMASK(31, 30) -#define HOSTID_TABLE_W2_H2C_MM_ARPROT_MASK GENMASK(29, 28) -#define HOSTID_TABLE_W2_H2C_MM_ARCACHE_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W2_H2C_MM_ARSTEERING_MASK GENMASK(22, 20) -#define HOSTID_TABLE_W2_H2C_ST_ARPROT_MASK GENMASK(19, 18) -#define HOSTID_TABLE_W2_H2C_ST_ARCACHE_MASK GENMASK(17, 14) -#define HOSTID_TABLE_W2_H2C_ST_ARSTEERING_MASK GENMASK(12, 10) -#define HOSTID_TABLE_W2_DSC_ARPOT_MASK GENMASK(9, 8) -#define HOSTID_TABLE_W2_DSC_ARCACHE_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W2_DSC_ARSTEERING_MASK GENMASK(2, 0) -#define HOSTID_TABLE_W0_VCH_H2C_MM_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W0_VCH_H2C_ST_MASK GENMASK(23, 20) -#define HOSTID_TABLE_W0_VCH_DSC_MASK GENMASK(19, 16) -#define HOSTID_TABLE_W0_VCH_INT_MSG_MASK GENMASK(15, 12) -#define HOSTID_TABLE_W0_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define HOSTID_TABLE_W0_VCH_CMPT_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W0_VCH_H2C_PLD_MASK GENMASK(3, 0) -#define CTXT_SELC_FNC_STS_W0_MSIX_MASK GENMASK(3, 3) -#define CTXT_SELC_FNC_STS_W0_MSIX_ENABLE_MASK GENMASK(2, 2) -#define CTXT_SELC_FNC_STS_W0_MEM_SPACE_ENABLE_MASK GENMASK(1, 1) -#define CTXT_SELC_FNC_STS_W0_BUS_MASTER_ENABLE_MASK GENMASK(0, 0) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c deleted file mode 100755 index af9a175..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c +++ /dev/null @@ -1,4025 +0,0 @@ -/* - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "eqdma_cpm5_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_cpm5_reg_dump.tmh" -#endif - - -static struct regfield_info - cfg_blk_identifier_field_info[] = { - {"CFG_BLK_IDENTIFIER", - CFG_BLK_IDENTIFIER_MASK}, - {"CFG_BLK_IDENTIFIER_1", - CFG_BLK_IDENTIFIER_1_MASK}, - {"CFG_BLK_IDENTIFIER_RSVD_1", - CFG_BLK_IDENTIFIER_RSVD_1_MASK}, - {"CFG_BLK_IDENTIFIER_VERSION", - CFG_BLK_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_pld_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_PROG", - CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_read_req_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_system_id_field_info[] = { - {"CFG_BLK_SYSTEM_ID_RSVD_1", - CFG_BLK_SYSTEM_ID_RSVD_1_MASK}, - {"CFG_BLK_SYSTEM_ID_INST_TYPE", - CFG_BLK_SYSTEM_ID_INST_TYPE_MASK}, - {"CFG_BLK_SYSTEM_ID", - CFG_BLK_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - cfg_blk_msix_enable_field_info[] = { - {"CFG_BLK_MSIX_ENABLE", - CFG_BLK_MSIX_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_pcie_data_width_field_info[] = { - {"CFG_PCIE_DATA_WIDTH_RSVD_1", - CFG_PCIE_DATA_WIDTH_RSVD_1_MASK}, - {"CFG_PCIE_DATA_WIDTH_DATAPATH", - CFG_PCIE_DATA_WIDTH_DATAPATH_MASK}, -}; - - -static struct regfield_info - cfg_pcie_ctl_field_info[] = { - {"CFG_PCIE_CTL_RSVD_1", - CFG_PCIE_CTL_RSVD_1_MASK}, - {"CFG_PCIE_CTL_MGMT_AXIL_CTRL", - CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK}, - {"CFG_PCIE_CTL_RSVD_2", - CFG_PCIE_CTL_RSVD_2_MASK}, - {"CFG_PCIE_CTL_RRQ_DISABLE", - CFG_PCIE_CTL_RRQ_DISABLE_MASK}, - {"CFG_PCIE_CTL_RELAXED_ORDERING", - CFG_PCIE_CTL_RELAXED_ORDERING_MASK}, -}; - - -static struct regfield_info - cfg_blk_msi_enable_field_info[] = { - {"CFG_BLK_MSI_ENABLE", - CFG_BLK_MSI_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_pld_size_field_info[] = { - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_ISSUED", - CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_PROG", - CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_read_req_size_field_info[] = { - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK}, -}; - - -static struct regfield_info - cfg_blk_misc_ctl_field_info[] = { - {"CFG_BLK_MISC_CTL_RSVD_1", - CFG_BLK_MISC_CTL_RSVD_1_MASK}, - {"CFG_BLK_MISC_CTL_10B_TAG_EN", - CFG_BLK_MISC_CTL_10B_TAG_EN_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_2", - CFG_BLK_MISC_CTL_RSVD_2_MASK}, - {"CFG_BLK_MISC_CTL_AXI_WBK", - CFG_BLK_MISC_CTL_AXI_WBK_MASK}, - {"CFG_BLK_MISC_CTL_AXI_DSC", - CFG_BLK_MISC_CTL_AXI_DSC_MASK}, - {"CFG_BLK_MISC_CTL_NUM_TAG", - CFG_BLK_MISC_CTL_NUM_TAG_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_3", - CFG_BLK_MISC_CTL_RSVD_3_MASK}, - {"CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER", - CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK}, -}; - - -static struct regfield_info - cfg_pl_cred_ctl_field_info[] = { - {"CFG_PL_CRED_CTL_RSVD_1", - CFG_PL_CRED_CTL_RSVD_1_MASK}, - {"CFG_PL_CRED_CTL_SLAVE_CRD_RLS", - CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK}, - {"CFG_PL_CRED_CTL_RSVD_2", - CFG_PL_CRED_CTL_RSVD_2_MASK}, - {"CFG_PL_CRED_CTL_MASTER_CRD_RST", - CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_field_info[] = { - {"CFG_BLK_SCRATCH", - CFG_BLK_SCRATCH_MASK}, -}; - - -static struct regfield_info - cfg_gic_field_info[] = { - {"CFG_GIC_RSVD_1", - CFG_GIC_RSVD_1_MASK}, - {"CFG_GIC_GIC_IRQ", - CFG_GIC_GIC_IRQ_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_1_a_field_info[] = { - {"RAM_SBE_MSK_1_A", - RAM_SBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_1_a_field_info[] = { - {"RAM_SBE_STS_1_A_RSVD", - RAM_SBE_STS_1_A_RSVD_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_SBE_STS_1_A_TAG_EVEN_RAM", - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_SBE_STS_1_A_TAG_ODD_RAM", - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_1_a_field_info[] = { - {"RAM_DBE_MSK_1_A", - RAM_DBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_1_a_field_info[] = { - {"RAM_DBE_STS_1_A_RSVD", - RAM_DBE_STS_1_A_RSVD_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_DBE_STS_1_A_TAG_EVEN_RAM", - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_DBE_STS_1_A_TAG_ODD_RAM", - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_a_field_info[] = { - {"RAM_SBE_MSK_A", - RAM_SBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_a_field_info[] = { - {"RAM_SBE_STS_A_RC_RRQ_ODD_RAM", - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_SBE_STS_A_PEND_FIFO_RAM", - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_LL_RAM", - RAM_SBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_CTXT_RAM", - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_CTXT_RAM", - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_INT_CTXT_RAM", - RAM_SBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_COAL_DATA_RAM", - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_SBE_STS_A_QID_FIFO_RAM", - RAM_SBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_TIMER_FIFO_RAM", - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_DSC_CPLD", - RAM_SBE_STS_A_DSC_CPLD_MASK}, - {"RAM_SBE_STS_A_DSC_CPLI", - RAM_SBE_STS_A_DSC_CPLI_MASK}, - {"RAM_SBE_STS_A_DSC_SW_CTXT", - RAM_SBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_SBE_STS_A_DSC_CRD_RCV", - RAM_SBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_SBE_STS_A_DSC_HW_CTXT", - RAM_SBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_SBE_STS_A_FUNC_MAP", - RAM_SBE_STS_A_FUNC_MAP_MASK}, - {"RAM_SBE_STS_A_C2H_WR_BRG_DAT", - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_C2H_RD_BRG_DAT", - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_WR_BRG_DAT", - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_RD_BRG_DAT", - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H3_DAT", - RAM_SBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H2_DAT", - RAM_SBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H1_DAT", - RAM_SBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H0_DAT", - RAM_SBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C3_DAT", - RAM_SBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C2_DAT", - RAM_SBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C1_DAT", - RAM_SBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C0_DAT", - RAM_SBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_a_field_info[] = { - {"RAM_DBE_MSK_A", - RAM_DBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_a_field_info[] = { - {"RAM_DBE_STS_A_RC_RRQ_ODD_RAM", - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_DBE_STS_A_PEND_FIFO_RAM", - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_LL_RAM", - RAM_DBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_CTXT_RAM", - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_CTXT_RAM", - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_INT_CTXT_RAM", - RAM_DBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_COAL_DATA_RAM", - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_DBE_STS_A_QID_FIFO_RAM", - RAM_DBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_TIMER_FIFO_RAM", - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_DSC_CPLD", - RAM_DBE_STS_A_DSC_CPLD_MASK}, - {"RAM_DBE_STS_A_DSC_CPLI", - RAM_DBE_STS_A_DSC_CPLI_MASK}, - {"RAM_DBE_STS_A_DSC_SW_CTXT", - RAM_DBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_DBE_STS_A_DSC_CRD_RCV", - RAM_DBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_DBE_STS_A_DSC_HW_CTXT", - RAM_DBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_DBE_STS_A_FUNC_MAP", - RAM_DBE_STS_A_FUNC_MAP_MASK}, - {"RAM_DBE_STS_A_C2H_WR_BRG_DAT", - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_C2H_RD_BRG_DAT", - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_WR_BRG_DAT", - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_RD_BRG_DAT", - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H3_DAT", - RAM_DBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H2_DAT", - RAM_DBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H1_DAT", - RAM_DBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H0_DAT", - RAM_DBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C3_DAT", - RAM_DBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C2_DAT", - RAM_DBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C1_DAT", - RAM_DBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C0_DAT", - RAM_DBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_identifier_field_info[] = { - {"GLBL2_IDENTIFIER", - GLBL2_IDENTIFIER_MASK}, - {"GLBL2_IDENTIFIER_VERSION", - GLBL2_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - glbl2_channel_inst_field_info[] = { - {"GLBL2_CHANNEL_INST_RSVD_1", - GLBL2_CHANNEL_INST_RSVD_1_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ST", - GLBL2_CHANNEL_INST_C2H_ST_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ST", - GLBL2_CHANNEL_INST_H2C_ST_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_2", - GLBL2_CHANNEL_INST_RSVD_2_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ENG", - GLBL2_CHANNEL_INST_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_3", - GLBL2_CHANNEL_INST_RSVD_3_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ENG", - GLBL2_CHANNEL_INST_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_mdma_field_info[] = { - {"GLBL2_CHANNEL_MDMA_RSVD_1", - GLBL2_CHANNEL_MDMA_RSVD_1_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ST", - GLBL2_CHANNEL_MDMA_C2H_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ST", - GLBL2_CHANNEL_MDMA_H2C_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_2", - GLBL2_CHANNEL_MDMA_RSVD_2_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ENG", - GLBL2_CHANNEL_MDMA_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_3", - GLBL2_CHANNEL_MDMA_RSVD_3_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ENG", - GLBL2_CHANNEL_MDMA_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_strm_field_info[] = { - {"GLBL2_CHANNEL_STRM_RSVD_1", - GLBL2_CHANNEL_STRM_RSVD_1_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ST", - GLBL2_CHANNEL_STRM_C2H_ST_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ST", - GLBL2_CHANNEL_STRM_H2C_ST_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_2", - GLBL2_CHANNEL_STRM_RSVD_2_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ENG", - GLBL2_CHANNEL_STRM_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_3", - GLBL2_CHANNEL_STRM_RSVD_3_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ENG", - GLBL2_CHANNEL_STRM_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_cap_field_info[] = { - {"GLBL2_CHANNEL_CAP_RSVD_1", - GLBL2_CHANNEL_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_CAP_MULTIQ_MAX", - GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK}, -}; - - -static struct regfield_info - glbl2_channel_pasid_cap_field_info[] = { - {"GLBL2_CHANNEL_PASID_CAP_RSVD_1", - GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEEN", - GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_DMAEN", - GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK}, -}; - - -static struct regfield_info - glbl2_system_id_field_info[] = { - {"GLBL2_SYSTEM_ID_RSVD_1", - GLBL2_SYSTEM_ID_RSVD_1_MASK}, - {"GLBL2_SYSTEM_ID", - GLBL2_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - glbl2_misc_cap_field_info[] = { - {"GLBL2_MISC_CAP", - GLBL2_MISC_CAP_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq0_field_info[] = { - {"GLBL2_PCIE_RQ0_NPH_AVL", - GLBL2_PCIE_RQ0_NPH_AVL_MASK}, - {"GLBL2_PCIE_RQ0_RCB_AVL", - GLBL2_PCIE_RQ0_RCB_AVL_MASK}, - {"GLBL2_PCIE_RQ0_SLV_RD_CREDS", - GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK}, - {"GLBL2_PCIE_RQ0_TAG_EP", - GLBL2_PCIE_RQ0_TAG_EP_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq1_field_info[] = { - {"GLBL2_PCIE_RQ1_RSVD_1", - GLBL2_PCIE_RQ1_RSVD_1_MASK}, - {"GLBL2_PCIE_RQ1_TAG_FL", - GLBL2_PCIE_RQ1_TAG_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_EP", - GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_FL", - GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM", - GLBL2_PCIE_RQ1_TLPSM_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM512", - GLBL2_PCIE_RQ1_TLPSM512_MASK}, - {"GLBL2_PCIE_RQ1_RREQ_RCB_OK", - GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_SLV", - GLBL2_PCIE_RQ1_RREQ0_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_VLD", - GLBL2_PCIE_RQ1_RREQ0_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_RDY", - GLBL2_PCIE_RQ1_RREQ0_RDY_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_SLV", - GLBL2_PCIE_RQ1_RREQ1_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_VLD", - GLBL2_PCIE_RQ1_RREQ1_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_RDY", - GLBL2_PCIE_RQ1_RREQ1_RDY_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_REQ", - GLBL2_PCIE_RQ1_WTLP_REQ_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_STRADDLE", - GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr0_field_info[] = { - {"GLBL2_AXIMM_WR0_RSVD_1", - GLBL2_AXIMM_WR0_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR0_WR_REQ", - GLBL2_AXIMM_WR0_WR_REQ_MASK}, - {"GLBL2_AXIMM_WR0_WR_CHN", - GLBL2_AXIMM_WR0_WR_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP", - GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_WPL_FIFO_EP", - GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN", - GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WRREQ_CNT", - GLBL2_AXIMM_WR0_WRREQ_CNT_MASK}, - {"GLBL2_AXIMM_WR0_BID", - GLBL2_AXIMM_WR0_BID_MASK}, - {"GLBL2_AXIMM_WR0_BVALID", - GLBL2_AXIMM_WR0_BVALID_MASK}, - {"GLBL2_AXIMM_WR0_BREADY", - GLBL2_AXIMM_WR0_BREADY_MASK}, - {"GLBL2_AXIMM_WR0_WVALID", - GLBL2_AXIMM_WR0_WVALID_MASK}, - {"GLBL2_AXIMM_WR0_WREADY", - GLBL2_AXIMM_WR0_WREADY_MASK}, - {"GLBL2_AXIMM_WR0_AWID", - GLBL2_AXIMM_WR0_AWID_MASK}, - {"GLBL2_AXIMM_WR0_AWVALID", - GLBL2_AXIMM_WR0_AWVALID_MASK}, - {"GLBL2_AXIMM_WR0_AWREADY", - GLBL2_AXIMM_WR0_AWREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr1_field_info[] = { - {"GLBL2_AXIMM_WR1_RSVD_1", - GLBL2_AXIMM_WR1_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT4", - GLBL2_AXIMM_WR1_BRSP_CNT4_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT3", - GLBL2_AXIMM_WR1_BRSP_CNT3_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT2", - GLBL2_AXIMM_WR1_BRSP_CNT2_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT1", - GLBL2_AXIMM_WR1_BRSP_CNT1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT0", - GLBL2_AXIMM_WR1_BRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd0_field_info[] = { - {"GLBL2_AXIMM_RD0_RSVD_1", - GLBL2_AXIMM_RD0_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD0_PND_CNT", - GLBL2_AXIMM_RD0_PND_CNT_MASK}, - {"GLBL2_AXIMM_RD0_RD_REQ", - GLBL2_AXIMM_RD0_RD_REQ_MASK}, - {"GLBL2_AXIMM_RD0_RD_CHNL", - GLBL2_AXIMM_RD0_RD_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL", - GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RID", - GLBL2_AXIMM_RD0_RID_MASK}, - {"GLBL2_AXIMM_RD0_RVALID", - GLBL2_AXIMM_RD0_RVALID_MASK}, - {"GLBL2_AXIMM_RD0_RREADY", - GLBL2_AXIMM_RD0_RREADY_MASK}, - {"GLBL2_AXIMM_RD0_ARID", - GLBL2_AXIMM_RD0_ARID_MASK}, - {"GLBL2_AXIMM_RD0_ARVALID", - GLBL2_AXIMM_RD0_ARVALID_MASK}, - {"GLBL2_AXIMM_RD0_ARREADY", - GLBL2_AXIMM_RD0_ARREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd1_field_info[] = { - {"GLBL2_AXIMM_RD1_RSVD_1", - GLBL2_AXIMM_RD1_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT4", - GLBL2_AXIMM_RD1_RRSP_CNT4_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT3", - GLBL2_AXIMM_RD1_RRSP_CNT3_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT2", - GLBL2_AXIMM_RD1_RRSP_CNT2_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT1", - GLBL2_AXIMM_RD1_RRSP_CNT1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT0", - GLBL2_AXIMM_RD1_RRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab0_field_info[] = { - {"GLBL2_FAB0_H2C_INB_CONV_IN_VLD", - GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_INB_CONV_IN_RDY", - GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_VLD", - GLBL2_FAB0_H2C_SEG_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_RDY", - GLBL2_FAB0_H2C_SEG_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_VLD", - GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_RDY", - GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_H2C_MST_CRDT_STAT", - GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_FULL", - GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY", - GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_VLD", - GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_RDY", - GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_VLD", - GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_RDY", - GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD", - GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY", - GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_FULL", - GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY", - GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY", - GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab1_field_info[] = { - {"GLBL2_FAB1_BYP_OUT_CRDT_STAT", - GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK}, - {"GLBL2_FAB1_TM_DSC_STS_CRDT_STAT", - GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_FULL", - GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_1", - GLBL2_FAB1_RSVD_1_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_2", - GLBL2_FAB1_RSVD_2_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_3", - GLBL2_FAB1_RSVD_3_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_4", - GLBL2_FAB1_RSVD_4_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_sel_field_info[] = { - {"GLBL2_MATCH_SEL_RSV", - GLBL2_MATCH_SEL_RSV_MASK}, - {"GLBL2_MATCH_SEL_CSR_SEL", - GLBL2_MATCH_SEL_CSR_SEL_MASK}, - {"GLBL2_MATCH_SEL_CSR_EN", - GLBL2_MATCH_SEL_CSR_EN_MASK}, - {"GLBL2_MATCH_SEL_ROTATE1", - GLBL2_MATCH_SEL_ROTATE1_MASK}, - {"GLBL2_MATCH_SEL_ROTATE0", - GLBL2_MATCH_SEL_ROTATE0_MASK}, - {"GLBL2_MATCH_SEL_SEL", - GLBL2_MATCH_SEL_SEL_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_msk_field_info[] = { - {"GLBL2_MATCH_MSK", - GLBL2_MATCH_MSK_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_pat_field_info[] = { - {"GLBL2_MATCH_PAT_PATTERN", - GLBL2_MATCH_PAT_PATTERN_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_1_field_info[] = { - {"GLBL_RNG_SZ_1_RSVD_1", - GLBL_RNG_SZ_1_RSVD_1_MASK}, - {"GLBL_RNG_SZ_1_RING_SIZE", - GLBL_RNG_SZ_1_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_2_field_info[] = { - {"GLBL_RNG_SZ_2_RSVD_1", - GLBL_RNG_SZ_2_RSVD_1_MASK}, - {"GLBL_RNG_SZ_2_RING_SIZE", - GLBL_RNG_SZ_2_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_3_field_info[] = { - {"GLBL_RNG_SZ_3_RSVD_1", - GLBL_RNG_SZ_3_RSVD_1_MASK}, - {"GLBL_RNG_SZ_3_RING_SIZE", - GLBL_RNG_SZ_3_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_4_field_info[] = { - {"GLBL_RNG_SZ_4_RSVD_1", - GLBL_RNG_SZ_4_RSVD_1_MASK}, - {"GLBL_RNG_SZ_4_RING_SIZE", - GLBL_RNG_SZ_4_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_5_field_info[] = { - {"GLBL_RNG_SZ_5_RSVD_1", - GLBL_RNG_SZ_5_RSVD_1_MASK}, - {"GLBL_RNG_SZ_5_RING_SIZE", - GLBL_RNG_SZ_5_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_6_field_info[] = { - {"GLBL_RNG_SZ_6_RSVD_1", - GLBL_RNG_SZ_6_RSVD_1_MASK}, - {"GLBL_RNG_SZ_6_RING_SIZE", - GLBL_RNG_SZ_6_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_7_field_info[] = { - {"GLBL_RNG_SZ_7_RSVD_1", - GLBL_RNG_SZ_7_RSVD_1_MASK}, - {"GLBL_RNG_SZ_7_RING_SIZE", - GLBL_RNG_SZ_7_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_8_field_info[] = { - {"GLBL_RNG_SZ_8_RSVD_1", - GLBL_RNG_SZ_8_RSVD_1_MASK}, - {"GLBL_RNG_SZ_8_RING_SIZE", - GLBL_RNG_SZ_8_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_9_field_info[] = { - {"GLBL_RNG_SZ_9_RSVD_1", - GLBL_RNG_SZ_9_RSVD_1_MASK}, - {"GLBL_RNG_SZ_9_RING_SIZE", - GLBL_RNG_SZ_9_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_a_field_info[] = { - {"GLBL_RNG_SZ_A_RSVD_1", - GLBL_RNG_SZ_A_RSVD_1_MASK}, - {"GLBL_RNG_SZ_A_RING_SIZE", - GLBL_RNG_SZ_A_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_b_field_info[] = { - {"GLBL_RNG_SZ_B_RSVD_1", - GLBL_RNG_SZ_B_RSVD_1_MASK}, - {"GLBL_RNG_SZ_B_RING_SIZE", - GLBL_RNG_SZ_B_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_c_field_info[] = { - {"GLBL_RNG_SZ_C_RSVD_1", - GLBL_RNG_SZ_C_RSVD_1_MASK}, - {"GLBL_RNG_SZ_C_RING_SIZE", - GLBL_RNG_SZ_C_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_d_field_info[] = { - {"GLBL_RNG_SZ_D_RSVD_1", - GLBL_RNG_SZ_D_RSVD_1_MASK}, - {"GLBL_RNG_SZ_D_RING_SIZE", - GLBL_RNG_SZ_D_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_e_field_info[] = { - {"GLBL_RNG_SZ_E_RSVD_1", - GLBL_RNG_SZ_E_RSVD_1_MASK}, - {"GLBL_RNG_SZ_E_RING_SIZE", - GLBL_RNG_SZ_E_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_f_field_info[] = { - {"GLBL_RNG_SZ_F_RSVD_1", - GLBL_RNG_SZ_F_RSVD_1_MASK}, - {"GLBL_RNG_SZ_F_RING_SIZE", - GLBL_RNG_SZ_F_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_10_field_info[] = { - {"GLBL_RNG_SZ_10_RSVD_1", - GLBL_RNG_SZ_10_RSVD_1_MASK}, - {"GLBL_RNG_SZ_10_RING_SIZE", - GLBL_RNG_SZ_10_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_err_stat_field_info[] = { - {"GLBL_ERR_STAT_RSVD_1", - GLBL_ERR_STAT_RSVD_1_MASK}, - {"GLBL_ERR_STAT_ERR_FAB", - GLBL_ERR_STAT_ERR_FAB_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_ST", - GLBL_ERR_STAT_ERR_H2C_ST_MASK}, - {"GLBL_ERR_STAT_ERR_BDG", - GLBL_ERR_STAT_ERR_BDG_MASK}, - {"GLBL_ERR_STAT_IND_CTXT_CMD_ERR", - GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_ST", - GLBL_ERR_STAT_ERR_C2H_ST_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_1", - GLBL_ERR_STAT_ERR_C2H_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_0", - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_1", - GLBL_ERR_STAT_ERR_H2C_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_0", - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_TRQ", - GLBL_ERR_STAT_ERR_TRQ_MASK}, - {"GLBL_ERR_STAT_ERR_DSC", - GLBL_ERR_STAT_ERR_DSC_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_DBE", - GLBL_ERR_STAT_ERR_RAM_DBE_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_SBE", - GLBL_ERR_STAT_ERR_RAM_SBE_MASK}, -}; - - -static struct regfield_info - glbl_err_mask_field_info[] = { - {"GLBL_ERR", - GLBL_ERR_MASK}, -}; - - -static struct regfield_info - glbl_dsc_cfg_field_info[] = { - {"GLBL_DSC_CFG_RSVD_1", - GLBL_DSC_CFG_RSVD_1_MASK}, - {"GLBL_DSC_CFG_UNC_OVR_COR", - GLBL_DSC_CFG_UNC_OVR_COR_MASK}, - {"GLBL_DSC_CFG_CTXT_FER_DIS", - GLBL_DSC_CFG_CTXT_FER_DIS_MASK}, - {"GLBL_DSC_CFG_RSVD_2", - GLBL_DSC_CFG_RSVD_2_MASK}, - {"GLBL_DSC_CFG_MAXFETCH", - GLBL_DSC_CFG_MAXFETCH_MASK}, - {"GLBL_DSC_CFG_WB_ACC_INT", - GLBL_DSC_CFG_WB_ACC_INT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_sts_field_info[] = { - {"GLBL_DSC_ERR_STS_RSVD_1", - GLBL_DSC_ERR_STS_RSVD_1_MASK}, - {"GLBL_DSC_ERR_STS_PORT_ID", - GLBL_DSC_ERR_STS_PORT_ID_MASK}, - {"GLBL_DSC_ERR_STS_SBE", - GLBL_DSC_ERR_STS_SBE_MASK}, - {"GLBL_DSC_ERR_STS_DBE", - GLBL_DSC_ERR_STS_DBE_MASK}, - {"GLBL_DSC_ERR_STS_RQ_CANCEL", - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_DSC", - GLBL_DSC_ERR_STS_DSC_MASK}, - {"GLBL_DSC_ERR_STS_DMA", - GLBL_DSC_ERR_STS_DMA_MASK}, - {"GLBL_DSC_ERR_STS_FLR_CANCEL", - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_RSVD_2", - GLBL_DSC_ERR_STS_RSVD_2_MASK}, - {"GLBL_DSC_ERR_STS_DAT_POISON", - GLBL_DSC_ERR_STS_DAT_POISON_MASK}, - {"GLBL_DSC_ERR_STS_TIMEOUT", - GLBL_DSC_ERR_STS_TIMEOUT_MASK}, - {"GLBL_DSC_ERR_STS_FLR", - GLBL_DSC_ERR_STS_FLR_MASK}, - {"GLBL_DSC_ERR_STS_TAG", - GLBL_DSC_ERR_STS_TAG_MASK}, - {"GLBL_DSC_ERR_STS_ADDR", - GLBL_DSC_ERR_STS_ADDR_MASK}, - {"GLBL_DSC_ERR_STS_PARAM", - GLBL_DSC_ERR_STS_PARAM_MASK}, - {"GLBL_DSC_ERR_STS_BCNT", - GLBL_DSC_ERR_STS_BCNT_MASK}, - {"GLBL_DSC_ERR_STS_UR_CA", - GLBL_DSC_ERR_STS_UR_CA_MASK}, - {"GLBL_DSC_ERR_STS_POISON", - GLBL_DSC_ERR_STS_POISON_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_msk_field_info[] = { - {"GLBL_DSC_ERR_MSK", - GLBL_DSC_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log0_field_info[] = { - {"GLBL_DSC_ERR_LOG0_VALID", - GLBL_DSC_ERR_LOG0_VALID_MASK}, - {"GLBL_DSC_ERR_LOG0_SEL", - GLBL_DSC_ERR_LOG0_SEL_MASK}, - {"GLBL_DSC_ERR_LOG0_RSVD_1", - GLBL_DSC_ERR_LOG0_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG0_QID", - GLBL_DSC_ERR_LOG0_QID_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log1_field_info[] = { - {"GLBL_DSC_ERR_LOG1_RSVD_1", - GLBL_DSC_ERR_LOG1_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG1_CIDX", - GLBL_DSC_ERR_LOG1_CIDX_MASK}, - {"GLBL_DSC_ERR_LOG1_RSVD_2", - GLBL_DSC_ERR_LOG1_RSVD_2_MASK}, - {"GLBL_DSC_ERR_LOG1_SUB_TYPE", - GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK}, - {"GLBL_DSC_ERR_LOG1_ERR_TYPE", - GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_sts_field_info[] = { - {"GLBL_TRQ_ERR_STS_RSVD_1", - GLBL_TRQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_2", - GLBL_TRQ_ERR_STS_RSVD_2_MASK}, - {"GLBL_TRQ_ERR_STS_QID_RANGE", - GLBL_TRQ_ERR_STS_QID_RANGE_MASK}, - {"GLBL_TRQ_ERR_STS_QSPC_UNMAPPED", - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_3", - GLBL_TRQ_ERR_STS_RSVD_3_MASK}, - {"GLBL_TRQ_ERR_STS_VF_ACCESS_ERR", - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK}, - {"GLBL_TRQ_ERR_STS_CSR_UNMAPPED", - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_msk_field_info[] = { - {"GLBL_TRQ_ERR_MSK", - GLBL_TRQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_log_field_info[] = { - {"GLBL_TRQ_ERR_LOG_SRC", - GLBL_TRQ_ERR_LOG_SRC_MASK}, - {"GLBL_TRQ_ERR_LOG_TARGET", - GLBL_TRQ_ERR_LOG_TARGET_MASK}, - {"GLBL_TRQ_ERR_LOG_FUNC", - GLBL_TRQ_ERR_LOG_FUNC_MASK}, - {"GLBL_TRQ_ERR_LOG_ADDRESS", - GLBL_TRQ_ERR_LOG_ADDRESS_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat0_field_info[] = { - {"GLBL_DSC_DAT0_RSVD_1", - GLBL_DSC_DAT0_RSVD_1_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_DIR", - GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_QID", - GLBL_DSC_DAT0_CTXT_ARB_QID_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_REQ", - GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK}, - {"GLBL_DSC_DAT0_IRQ_FIFO_FL", - GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK}, - {"GLBL_DSC_DAT0_TMSTALL", - GLBL_DSC_DAT0_TMSTALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_STALL", - GLBL_DSC_DAT0_RRQ_STALL_MASK}, - {"GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL", - GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK}, - {"GLBL_DSC_DAT0_DSC_OUT_STALL", - GLBL_DSC_DAT0_DSC_OUT_STALL_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat1_field_info[] = { - {"GLBL_DSC_DAT1_RSVD_1", - GLBL_DSC_DAT1_RSVD_1_MASK}, - {"GLBL_DSC_DAT1_EVT_SPC_C2H", - GLBL_DSC_DAT1_EVT_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_EVT_SP_H2C", - GLBL_DSC_DAT1_EVT_SP_H2C_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_C2H", - GLBL_DSC_DAT1_DSC_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_H2C", - GLBL_DSC_DAT1_DSC_SPC_H2C_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_ctl_field_info[] = { - {"GLBL_DSC_CTL_RSVD_1", - GLBL_DSC_CTL_RSVD_1_MASK}, - {"GLBL_DSC_CTL_SELECT", - GLBL_DSC_CTL_SELECT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log2_field_info[] = { - {"GLBL_DSC_ERR_LOG2_OLD_PIDX", - GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK}, - {"GLBL_DSC_ERR_LOG2_NEW_PIDX", - GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK}, -}; - - -static struct regfield_info - glbl_glbl_interrupt_cfg_field_info[] = { - {"GLBL_GLBL_INTERRUPT_CFG_RSVD_1", - GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING", - GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR", - GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK}, -}; - - -static struct regfield_info - glbl_vch_host_profile_field_info[] = { - {"GLBL_VCH_HOST_PROFILE_RSVD_1", - GLBL_VCH_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_MM", - GLBL_VCH_HOST_PROFILE_2C_MM_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_ST", - GLBL_VCH_HOST_PROFILE_2C_ST_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_DSC", - GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_MSG", - GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR", - GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_CMPT", - GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD", - GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK}, -}; - - -static struct regfield_info - glbl_bridge_host_profile_field_info[] = { - {"GLBL_BRIDGE_HOST_PROFILE_RSVD_1", - GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_BRIDGE_HOST_PROFILE_BDGID", - GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK}, -}; - - -static struct regfield_info - aximm_irq_dest_addr_field_info[] = { - {"AXIMM_IRQ_DEST_ADDR_ADDR", - AXIMM_IRQ_DEST_ADDR_ADDR_MASK}, -}; - - -static struct regfield_info - fab_err_log_field_info[] = { - {"FAB_ERR_LOG_RSVD_1", - FAB_ERR_LOG_RSVD_1_MASK}, - {"FAB_ERR_LOG_SRC", - FAB_ERR_LOG_SRC_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_field_info[] = { - {"IND_CTXT_DATA_DATA", - IND_CTXT_DATA_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_mask_field_info[] = { - {"IND_CTXT", - IND_CTXT_MASK}, -}; - - -static struct regfield_info - ind_ctxt_cmd_field_info[] = { - {"IND_CTXT_CMD_RSVD_1", - IND_CTXT_CMD_RSVD_1_MASK}, - {"IND_CTXT_CMD_QID", - IND_CTXT_CMD_QID_MASK}, - {"IND_CTXT_CMD_OP", - IND_CTXT_CMD_OP_MASK}, - {"IND_CTXT_CMD_SEL", - IND_CTXT_CMD_SEL_MASK}, - {"IND_CTXT_CMD_BUSY", - IND_CTXT_CMD_BUSY_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_field_info[] = { - {"C2H_TIMER_CNT_RSVD_1", - C2H_TIMER_CNT_RSVD_1_MASK}, - {"C2H_TIMER_CNT", - C2H_TIMER_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_field_info[] = { - {"C2H_CNT_TH_RSVD_1", - C2H_CNT_TH_RSVD_1_MASK}, - {"C2H_CNT_TH_THESHOLD_CNT", - C2H_CNT_TH_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED_RSVD_1", - C2H_STAT_S_AXIS_C2H_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_RSVD_1", - C2H_STAT_S_AXIS_WRB_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_S_AXIS_WRB_ACCEPTED", - C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_RSVD_1", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP_RSVD_1", - C2H_STAT_AXIS_PKG_CMP_RSVD_1_MASK}, - {"C2H_STAT_AXIS_PKG_CMP", - C2H_STAT_AXIS_PKG_CMP_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ACCEPTED_RSVD_1", - C2H_STAT_DESC_RSP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_ACCEPTED_D", - C2H_STAT_DESC_RSP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_cmp_field_info[] = { - {"C2H_STAT_DESC_RSP_CMP_RSVD_1", - C2H_STAT_DESC_RSP_CMP_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_CMP_D", - C2H_STAT_DESC_RSP_CMP_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_wrq_out_field_info[] = { - {"C2H_STAT_WRQ_OUT_RSVD_1", - C2H_STAT_WRQ_OUT_RSVD_1_MASK}, - {"C2H_STAT_WRQ_OUT", - C2H_STAT_WRQ_OUT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wpl_ren_accepted_field_info[] = { - {"C2H_STAT_WPL_REN_ACCEPTED_RSVD_1", - C2H_STAT_WPL_REN_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_WPL_REN_ACCEPTED", - C2H_STAT_WPL_REN_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wrq_len_field_info[] = { - {"C2H_STAT_TOTAL_WRQ_LEN_RSVD_1", - C2H_STAT_TOTAL_WRQ_LEN_RSVD_1_MASK}, - {"C2H_STAT_TOTAL_WRQ_LEN", - C2H_STAT_TOTAL_WRQ_LEN_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wpl_len_field_info[] = { - {"C2H_STAT_TOTAL_WPL_LEN_RSVD_1", - C2H_STAT_TOTAL_WPL_LEN_RSVD_1_MASK}, - {"C2H_STAT_TOTAL_WPL_LEN", - C2H_STAT_TOTAL_WPL_LEN_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_field_info[] = { - {"C2H_BUF_SZ_IZE", - C2H_BUF_SZ_IZE_MASK}, -}; - - -static struct regfield_info - c2h_err_stat_field_info[] = { - {"C2H_ERR_STAT_RSVD_1", - C2H_ERR_STAT_RSVD_1_MASK}, - {"C2H_ERR_STAT_WRB_PORT_ID_ERR", - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK}, - {"C2H_ERR_STAT_HDR_PAR_ERR", - C2H_ERR_STAT_HDR_PAR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_COR_ERR", - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_ERR_STAT_AVL_RING_DSC_ERR", - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK}, - {"C2H_ERR_STAT_WRB_PRTY_ERR", - C2H_ERR_STAT_WRB_PRTY_ERR_MASK}, - {"C2H_ERR_STAT_WRB_CIDX_ERR", - C2H_ERR_STAT_WRB_CIDX_ERR_MASK}, - {"C2H_ERR_STAT_WRB_QFULL_ERR", - C2H_ERR_STAT_WRB_QFULL_ERR_MASK}, - {"C2H_ERR_STAT_WRB_INV_Q_ERR", - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_2", - C2H_ERR_STAT_RSVD_2_MASK}, - {"C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH", - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK}, - {"C2H_ERR_STAT_ERR_DESC_CNT", - C2H_ERR_STAT_ERR_DESC_CNT_MASK}, - {"C2H_ERR_STAT_RSVD_3", - C2H_ERR_STAT_RSVD_3_MASK}, - {"C2H_ERR_STAT_MSI_INT_FAIL", - C2H_ERR_STAT_MSI_INT_FAIL_MASK}, - {"C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR", - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_4", - C2H_ERR_STAT_RSVD_4_MASK}, - {"C2H_ERR_STAT_DESC_RSP_ERR", - C2H_ERR_STAT_DESC_RSP_ERR_MASK}, - {"C2H_ERR_STAT_QID_MISMATCH", - C2H_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_ERR_STAT_SH_CMPT_DSC_ERR", - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK}, - {"C2H_ERR_STAT_LEN_MISMATCH", - C2H_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_ERR_STAT_MTY_MISMATCH", - C2H_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_err_mask_field_info[] = { - {"C2H_ERR_EN", - C2H_ERR_EN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_stat_field_info[] = { - {"C2H_FATAL_ERR_STAT_RSVD_1", - C2H_FATAL_ERR_STAT_RSVD_1_MASK}, - {"C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR", - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED2", - C2H_FATAL_ERR_STAT_RESERVED2_MASK}, - {"C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_MISMATCH", - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED1", - C2H_FATAL_ERR_STAT_RESERVED1_MASK}, - {"C2H_FATAL_ERR_STAT_LEN_MISMATCH", - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_MTY_MISMATCH", - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_mask_field_info[] = { - {"C2H_FATAL_ERR_C2HEN", - C2H_FATAL_ERR_C2HEN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_enable_field_info[] = { - {"C2H_FATAL_ERR_ENABLE_RSVD_1", - C2H_FATAL_ERR_ENABLE_RSVD_1_MASK}, - {"C2H_FATAL_ERR_ENABLE_WPL_PAR_INV", - C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK}, - {"C2H_FATAL_ERR_ENABLE_WRQ_DIS", - C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK}, -}; - - -static struct regfield_info - glbl_err_int_field_info[] = { - {"GLBL_ERR_INT_RSVD_1", - GLBL_ERR_INT_RSVD_1_MASK}, - {"GLBL_ERR_INT_HOST_ID", - GLBL_ERR_INT_HOST_ID_MASK}, - {"GLBL_ERR_INT_DIS_INTR_ON_VF", - GLBL_ERR_INT_DIS_INTR_ON_VF_MASK}, - {"GLBL_ERR_INT_ARM", - GLBL_ERR_INT_ARM_MASK}, - {"GLBL_ERR_INT_EN_COAL", - GLBL_ERR_INT_EN_COAL_MASK}, - {"GLBL_ERR_INT_VEC", - GLBL_ERR_INT_VEC_MASK}, - {"GLBL_ERR_INT_FUNC", - GLBL_ERR_INT_FUNC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_field_info[] = { - {"C2H_PFCH_CFG_EVTFL_TH", - C2H_PFCH_CFG_EVTFL_TH_MASK}, - {"C2H_PFCH_CFG_FL_TH", - C2H_PFCH_CFG_FL_TH_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_1_field_info[] = { - {"C2H_PFCH_CFG_1_EVT_QCNT_TH", - C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK}, - {"C2H_PFCH_CFG_1_QCNT", - C2H_PFCH_CFG_1_QCNT_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_2_field_info[] = { - {"C2H_PFCH_CFG_2_FENCE", - C2H_PFCH_CFG_2_FENCE_MASK}, - {"C2H_PFCH_CFG_2_RSVD", - C2H_PFCH_CFG_2_RSVD_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NO_DROP", - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK}, - {"C2H_PFCH_CFG_2_LL_SZ_TH", - C2H_PFCH_CFG_2_LL_SZ_TH_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NUM", - C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK}, - {"C2H_PFCH_CFG_2_NUM", - C2H_PFCH_CFG_2_NUM_MASK}, -}; - - -static struct regfield_info - c2h_int_timer_tick_field_info[] = { - {"C2H_INT_TIMER_TICK", - C2H_INT_TIMER_TICK_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_drop_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_RSVD_1", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_D", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_err_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_RSVD_1", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_D", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_req_field_info[] = { - {"C2H_STAT_DESC_REQ_RSVD_1", - C2H_STAT_DESC_REQ_RSVD_1_MASK}, - {"C2H_STAT_DESC_REQ", - C2H_STAT_DESC_REQ_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_0_field_info[] = { - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_SM_CS", - C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK}, - {"C2H_STAT_DMA_ENG_0_MAIN_SM_CS", - C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_1_field_info[] = { - {"C2H_STAT_DMA_ENG_1_RSVD_1", - C2H_STAT_DMA_ENG_1_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT", - C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_2_field_info[] = { - {"C2H_STAT_DMA_ENG_2_RSVD_1", - C2H_STAT_DMA_ENG_2_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT", - C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_3_field_info[] = { - {"C2H_STAT_DMA_ENG_3_RSVD_1", - C2H_STAT_DMA_ENG_3_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0", - C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_VLD", - C2H_STAT_DMA_ENG_3_WRQ_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_RDY", - C2H_STAT_DMA_ENG_3_WRQ_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR_MASK}, - {"C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_err_ctxt_field_info[] = { - {"C2H_PFCH_ERR_CTXT_RSVD_1", - C2H_PFCH_ERR_CTXT_RSVD_1_MASK}, - {"C2H_PFCH_ERR_CTXT_ERR_STAT", - C2H_PFCH_ERR_CTXT_ERR_STAT_MASK}, - {"C2H_PFCH_ERR_CTXT_CMD_WR", - C2H_PFCH_ERR_CTXT_CMD_WR_MASK}, - {"C2H_PFCH_ERR_CTXT_QID", - C2H_PFCH_ERR_CTXT_QID_MASK}, - {"C2H_PFCH_ERR_CTXT_DONE", - C2H_PFCH_ERR_CTXT_DONE_MASK}, -}; - - -static struct regfield_info - c2h_first_err_qid_field_info[] = { - {"C2H_FIRST_ERR_QID_RSVD_1", - C2H_FIRST_ERR_QID_RSVD_1_MASK}, - {"C2H_FIRST_ERR_QID_ERR_TYPE", - C2H_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"C2H_FIRST_ERR_QID_RSVD", - C2H_FIRST_ERR_QID_RSVD_MASK}, - {"C2H_FIRST_ERR_QID_QID", - C2H_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_in_field_info[] = { - {"STAT_NUM_WRB_IN_RSVD_1", - STAT_NUM_WRB_IN_RSVD_1_MASK}, - {"STAT_NUM_WRB_IN_WRB_CNT", - STAT_NUM_WRB_IN_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_out_field_info[] = { - {"STAT_NUM_WRB_OUT_RSVD_1", - STAT_NUM_WRB_OUT_RSVD_1_MASK}, - {"STAT_NUM_WRB_OUT_WRB_CNT", - STAT_NUM_WRB_OUT_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_drp_field_info[] = { - {"STAT_NUM_WRB_DRP_RSVD_1", - STAT_NUM_WRB_DRP_RSVD_1_MASK}, - {"STAT_NUM_WRB_DRP_WRB_CNT", - STAT_NUM_WRB_DRP_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_stat_desc_out_field_info[] = { - {"STAT_NUM_STAT_DESC_OUT_RSVD_1", - STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK}, - {"STAT_NUM_STAT_DESC_OUT_CNT", - STAT_NUM_STAT_DESC_OUT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_dsc_crdt_sent_field_info[] = { - {"STAT_NUM_DSC_CRDT_SENT_RSVD_1", - STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK}, - {"STAT_NUM_DSC_CRDT_SENT_CNT", - STAT_NUM_DSC_CRDT_SENT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_fch_dsc_rcvd_field_info[] = { - {"STAT_NUM_FCH_DSC_RCVD_RSVD_1", - STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_FCH_DSC_RCVD_DSC_CNT", - STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_byp_dsc_rcvd_field_info[] = { - {"STAT_NUM_BYP_DSC_RCVD_RSVD_1", - STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_BYP_DSC_RCVD_DSC_CNT", - STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_cfg_field_info[] = { - {"C2H_WRB_COAL_CFG_MAX_BUF_SZ", - C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK}, - {"C2H_WRB_COAL_CFG_TICK_VAL", - C2H_WRB_COAL_CFG_TICK_VAL_MASK}, - {"C2H_WRB_COAL_CFG_TICK_CNT", - C2H_WRB_COAL_CFG_TICK_CNT_MASK}, - {"C2H_WRB_COAL_CFG_SET_GLB_FLUSH", - C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK}, - {"C2H_WRB_COAL_CFG_DONE_GLB_FLUSH", - C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_req_field_info[] = { - {"C2H_INTR_H2C_REQ_RSVD_1", - C2H_INTR_H2C_REQ_RSVD_1_MASK}, - {"C2H_INTR_H2C_REQ_CNT", - C2H_INTR_H2C_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_mm_req_field_info[] = { - {"C2H_INTR_C2H_MM_REQ_RSVD_1", - C2H_INTR_C2H_MM_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_MM_REQ_CNT", - C2H_INTR_C2H_MM_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_err_int_req_field_info[] = { - {"C2H_INTR_ERR_INT_REQ_RSVD_1", - C2H_INTR_ERR_INT_REQ_RSVD_1_MASK}, - {"C2H_INTR_ERR_INT_REQ_CNT", - C2H_INTR_ERR_INT_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_req_field_info[] = { - {"C2H_INTR_C2H_ST_REQ_RSVD_1", - C2H_INTR_C2H_ST_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_REQ_CNT", - C2H_INTR_C2H_ST_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_ack_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1", - C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_ACK_CNT", - C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_fail_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1", - C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_FAIL_CNT", - C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_no_msix_field_info[] = { - {"C2H_INTR_C2H_ST_NO_MSIX_RSVD_1", - C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_NO_MSIX_CNT", - C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_ctxt_inval_field_info[] = { - {"C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1", - C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_CTXT_INVAL_CNT", - C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wr_cmp_field_info[] = { - {"C2H_STAT_WR_CMP_RSVD_1", - C2H_STAT_WR_CMP_RSVD_1_MASK}, - {"C2H_STAT_WR_CMP_CNT", - C2H_STAT_WR_CMP_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_4_field_info[] = { - {"C2H_STAT_DMA_ENG_4_RSVD_1", - C2H_STAT_DMA_ENG_4_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0", - C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_VLD", - C2H_STAT_DMA_ENG_4_WRQ_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_RDY", - C2H_STAT_DMA_ENG_4_WRQ_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY", - C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR_MASK}, - {"C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_5_field_info[] = { - {"C2H_STAT_DMA_ENG_5_RSVD_1", - C2H_STAT_DMA_ENG_5_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH", - C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ", - C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_qid_field_info[] = { - {"C2H_PFCH_QID_RSVD_1", - C2H_PFCH_QID_RSVD_1_MASK}, - {"C2H_PFCH_QID_ERR_CTXT", - C2H_PFCH_QID_ERR_CTXT_MASK}, - {"C2H_PFCH_QID_TARGET", - C2H_PFCH_QID_TARGET_MASK}, - {"C2H_PFCH_QID_QID_OR_TAG", - C2H_PFCH_QID_QID_OR_TAG_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_field_info[] = { - {"C2H_PFCH_DATA", - C2H_PFCH_DATA_MASK}, -}; - - -static struct regfield_info - c2h_int_dbg_field_info[] = { - {"C2H_INT_RSVD_1", - C2H_INT_RSVD_1_MASK}, - {"C2H_INT_INT_COAL_SM", - C2H_INT_INT_COAL_SM_MASK}, - {"C2H_INT_INT_SM", - C2H_INT_INT_SM_MASK}, -}; - - -static struct regfield_info - c2h_stat_imm_accepted_field_info[] = { - {"C2H_STAT_IMM_ACCEPTED_RSVD_1", - C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_IMM_ACCEPTED_CNT", - C2H_STAT_IMM_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_marker_accepted_field_info[] = { - {"C2H_STAT_MARKER_ACCEPTED_RSVD_1", - C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_MARKER_ACCEPTED_CNT", - C2H_STAT_MARKER_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_disable_cmp_accepted_field_info[] = { - {"C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1", - C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED_CNT", - C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_crdt_cnt_field_info[] = { - {"C2H_PLD_FIFO_CRDT_CNT_RSVD_1", - C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK}, - {"C2H_PLD_FIFO_CRDT_CNT_CNT", - C2H_PLD_FIFO_CRDT_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_req_field_info[] = { - {"C2H_INTR_DYN_REQ_RSVD_1", - C2H_INTR_DYN_REQ_RSVD_1_MASK}, - {"C2H_INTR_DYN_REQ_CNT", - C2H_INTR_DYN_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_misc_field_info[] = { - {"C2H_INTR_DYN_MISC_RSVD_1", - C2H_INTR_DYN_MISC_RSVD_1_MASK}, - {"C2H_INTR_DYN_MISC_CNT", - C2H_INTR_DYN_MISC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_len_mismatch_field_info[] = { - {"C2H_DROP_LEN_MISMATCH_RSVD_1", - C2H_DROP_LEN_MISMATCH_RSVD_1_MASK}, - {"C2H_DROP_LEN_MISMATCH_CNT", - C2H_DROP_LEN_MISMATCH_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_desc_rsp_len_field_info[] = { - {"C2H_DROP_DESC_RSP_LEN_RSVD_1", - C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK}, - {"C2H_DROP_DESC_RSP_LEN_CNT", - C2H_DROP_DESC_RSP_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_qid_fifo_len_field_info[] = { - {"C2H_DROP_QID_FIFO_LEN_RSVD_1", - C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK}, - {"C2H_DROP_QID_FIFO_LEN_CNT", - C2H_DROP_QID_FIFO_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_field_info[] = { - {"C2H_DROP_PLD_CNT_RSVD_1", - C2H_DROP_PLD_CNT_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_CNT", - C2H_DROP_PLD_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_0_field_info[] = { - {"C2H_CMPT_FORMAT_0_DESC_ERR_LOC", - C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_0_COLOR_LOC", - C2H_CMPT_FORMAT_0_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_1_field_info[] = { - {"C2H_CMPT_FORMAT_1_DESC_ERR_LOC", - C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_1_COLOR_LOC", - C2H_CMPT_FORMAT_1_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_2_field_info[] = { - {"C2H_CMPT_FORMAT_2_DESC_ERR_LOC", - C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_2_COLOR_LOC", - C2H_CMPT_FORMAT_2_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_3_field_info[] = { - {"C2H_CMPT_FORMAT_3_DESC_ERR_LOC", - C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_3_COLOR_LOC", - C2H_CMPT_FORMAT_3_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_4_field_info[] = { - {"C2H_CMPT_FORMAT_4_DESC_ERR_LOC", - C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_4_COLOR_LOC", - C2H_CMPT_FORMAT_4_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_5_field_info[] = { - {"C2H_CMPT_FORMAT_5_DESC_ERR_LOC", - C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_5_COLOR_LOC", - C2H_CMPT_FORMAT_5_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_6_field_info[] = { - {"C2H_CMPT_FORMAT_6_DESC_ERR_LOC", - C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_6_COLOR_LOC", - C2H_CMPT_FORMAT_6_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cache_depth_field_info[] = { - {"C2H_PFCH_CACHE_DEPTH_MAX_STBUF", - C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK}, - {"C2H_PFCH_CACHE_DEPTH", - C2H_PFCH_CACHE_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_buf_depth_field_info[] = { - {"C2H_WRB_COAL_BUF_DEPTH_RSVD_1", - C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK}, - {"C2H_WRB_COAL_BUF_DEPTH_BUFFER", - C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK}, -}; - - -static struct regfield_info - c2h_pfch_crdt_field_info[] = { - {"C2H_PFCH_CRDT_RSVD_1", - C2H_PFCH_CRDT_RSVD_1_MASK}, - {"C2H_PFCH_CRDT_RSVD_2", - C2H_PFCH_CRDT_RSVD_2_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_cmpt_accepted_field_info[] = { - {"C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1", - C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_CMPT_ACCEPTED_CNT", - C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_pld_accepted_field_info[] = { - {"C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1", - C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_PLD_ACCEPTED_CNT", - C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_field_info[] = { - {"C2H_PLD_PKT_ID_CMPT_WAIT", - C2H_PLD_PKT_ID_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_DATA", - C2H_PLD_PKT_ID_DATA_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_1_field_info[] = { - {"C2H_PLD_PKT_ID_1_CMPT_WAIT", - C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_1_DATA", - C2H_PLD_PKT_ID_1_DATA_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_1_field_info[] = { - {"C2H_DROP_PLD_CNT_1_RSVD_1", - C2H_DROP_PLD_CNT_1_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_1_CNT", - C2H_DROP_PLD_CNT_1_CNT_MASK}, -}; - - -static struct regfield_info - h2c_err_stat_field_info[] = { - {"H2C_ERR_STAT_RSVD_1", - H2C_ERR_STAT_RSVD_1_MASK}, - {"H2C_ERR_STAT_PAR_ERR", - H2C_ERR_STAT_PAR_ERR_MASK}, - {"H2C_ERR_STAT_SBE", - H2C_ERR_STAT_SBE_MASK}, - {"H2C_ERR_STAT_DBE", - H2C_ERR_STAT_DBE_MASK}, - {"H2C_ERR_STAT_NO_DMA_DS", - H2C_ERR_STAT_NO_DMA_DS_MASK}, - {"H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR", - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK}, - {"H2C_ERR_STAT_ZERO_LEN_DS", - H2C_ERR_STAT_ZERO_LEN_DS_MASK}, -}; - - -static struct regfield_info - h2c_err_mask_field_info[] = { - {"H2C_ERR_EN", - H2C_ERR_EN_MASK}, -}; - - -static struct regfield_info - h2c_first_err_qid_field_info[] = { - {"H2C_FIRST_ERR_QID_RSVD_1", - H2C_FIRST_ERR_QID_RSVD_1_MASK}, - {"H2C_FIRST_ERR_QID_ERR_TYPE", - H2C_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"H2C_FIRST_ERR_QID_RSVD_2", - H2C_FIRST_ERR_QID_RSVD_2_MASK}, - {"H2C_FIRST_ERR_QID_QID", - H2C_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg0_field_info[] = { - {"H2C_REG0_NUM_DSC_RCVD", - H2C_REG0_NUM_DSC_RCVD_MASK}, - {"H2C_REG0_NUM_WRB_SENT", - H2C_REG0_NUM_WRB_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg1_field_info[] = { - {"H2C_REG1_NUM_REQ_SENT", - H2C_REG1_NUM_REQ_SENT_MASK}, - {"H2C_REG1_NUM_CMP_SENT", - H2C_REG1_NUM_CMP_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg2_field_info[] = { - {"H2C_REG2_RSVD_1", - H2C_REG2_RSVD_1_MASK}, - {"H2C_REG2_NUM_ERR_DSC_RCVD", - H2C_REG2_NUM_ERR_DSC_RCVD_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg3_field_info[] = { - {"H2C_REG3_RSVD_1", - H2C_REG3_RSVD_1_MASK}, - {"H2C_REG3_DSCO_FIFO_EMPTY", - H2C_REG3_DSCO_FIFO_EMPTY_MASK}, - {"H2C_REG3_DSCO_FIFO_FULL", - H2C_REG3_DSCO_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RC_STATE", - H2C_REG3_CUR_RC_STATE_MASK}, - {"H2C_REG3_RDREQ_LINES", - H2C_REG3_RDREQ_LINES_MASK}, - {"H2C_REG3_RDATA_LINES_AVAIL", - H2C_REG3_RDATA_LINES_AVAIL_MASK}, - {"H2C_REG3_PEND_FIFO_EMPTY", - H2C_REG3_PEND_FIFO_EMPTY_MASK}, - {"H2C_REG3_PEND_FIFO_FULL", - H2C_REG3_PEND_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RQ_STATE", - H2C_REG3_CUR_RQ_STATE_MASK}, - {"H2C_REG3_DSCI_FIFO_FULL", - H2C_REG3_DSCI_FIFO_FULL_MASK}, - {"H2C_REG3_DSCI_FIFO_EMPTY", - H2C_REG3_DSCI_FIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg4_field_info[] = { - {"H2C_REG4_RDREQ_ADDR", - H2C_REG4_RDREQ_ADDR_MASK}, -}; - - -static struct regfield_info - h2c_fatal_err_en_field_info[] = { - {"H2C_FATAL_ERR_EN_RSVD_1", - H2C_FATAL_ERR_EN_RSVD_1_MASK}, - {"H2C_FATAL_ERR_EN_H2C", - H2C_FATAL_ERR_EN_H2C_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_pcie_field_info[] = { - {"H2C_REQ_THROT_PCIE_EN_REQ", - H2C_REQ_THROT_PCIE_EN_REQ_MASK}, - {"H2C_REQ_THROT_PCIE", - H2C_REQ_THROT_PCIE_MASK}, - {"H2C_REQ_THROT_PCIE_EN_DATA", - H2C_REQ_THROT_PCIE_EN_DATA_MASK}, - {"H2C_REQ_THROT_PCIE_DATA_THRESH", - H2C_REQ_THROT_PCIE_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - h2c_aln_dbg_reg0_field_info[] = { - {"H2C_ALN_REG0_NUM_PKT_SENT", - H2C_ALN_REG0_NUM_PKT_SENT_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_aximm_field_info[] = { - {"H2C_REQ_THROT_AXIMM_EN_REQ", - H2C_REQ_THROT_AXIMM_EN_REQ_MASK}, - {"H2C_REQ_THROT_AXIMM", - H2C_REQ_THROT_AXIMM_MASK}, - {"H2C_REQ_THROT_AXIMM_EN_DATA", - H2C_REQ_THROT_AXIMM_EN_DATA_MASK}, - {"H2C_REQ_THROT_AXIMM_DATA_THRESH", - H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - c2h_mm_ctl_field_info[] = { - {"C2H_MM_CTL_RESERVED1", - C2H_MM_CTL_RESERVED1_MASK}, - {"C2H_MM_CTL_ERRC_EN", - C2H_MM_CTL_ERRC_EN_MASK}, - {"C2H_MM_CTL_RESERVED0", - C2H_MM_CTL_RESERVED0_MASK}, - {"C2H_MM_CTL_RUN", - C2H_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_status_field_info[] = { - {"C2H_MM_STATUS_RSVD_1", - C2H_MM_STATUS_RSVD_1_MASK}, - {"C2H_MM_STATUS_RUN", - C2H_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_cmpl_desc_cnt_field_info[] = { - {"C2H_MM_CMPL_DESC_CNT_C2H_CO", - C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_enable_mask_field_info[] = { - {"C2H_MM_ERR_CODE_ENABLE_RESERVED1", - C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM", - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UR", - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_FLR", - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RESERVED0", - C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_field_info[] = { - {"C2H_MM_ERR_CODE_RESERVED1", - C2H_MM_ERR_CODE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_CIDX", - C2H_MM_ERR_CODE_CIDX_MASK}, - {"C2H_MM_ERR_CODE_RESERVED0", - C2H_MM_ERR_CODE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_SUB_TYPE", - C2H_MM_ERR_CODE_SUB_TYPE_MASK}, - {"C2H_MM_ERR_CODE", - C2H_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_info_field_info[] = { - {"C2H_MM_ERR_INFO_VALID", - C2H_MM_ERR_INFO_VALID_MASK}, - {"C2H_MM_ERR_INFO_SEL", - C2H_MM_ERR_INFO_SEL_MASK}, - {"C2H_MM_ERR_INFO_RSVD_1", - C2H_MM_ERR_INFO_RSVD_1_MASK}, - {"C2H_MM_ERR_INFO_QID", - C2H_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_ctl_field_info[] = { - {"C2H_MM_PERF_MON_CTL_RSVD_1", - C2H_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_START", - C2H_MM_PERF_MON_CTL_IMM_START_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_START", - C2H_MM_PERF_MON_CTL_RUN_START_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_CLEAR", - C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_CLEAR", - C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT0_DCNT", - C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT1_RSVD_1", - C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_DATA_CNT1_DCNT", - C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_dbg_field_info[] = { - {"C2H_MM_RSVD_1", - C2H_MM_RSVD_1_MASK}, - {"C2H_MM_RRQ_ENTRIES", - C2H_MM_RRQ_ENTRIES_MASK}, - {"C2H_MM_DAT_FIFO_SPC", - C2H_MM_DAT_FIFO_SPC_MASK}, - {"C2H_MM_RD_STALL", - C2H_MM_RD_STALL_MASK}, - {"C2H_MM_RRQ_FIFO_FI", - C2H_MM_RRQ_FIFO_FI_MASK}, - {"C2H_MM_WR_STALL", - C2H_MM_WR_STALL_MASK}, - {"C2H_MM_WRQ_FIFO_FI", - C2H_MM_WRQ_FIFO_FI_MASK}, - {"C2H_MM_WBK_STALL", - C2H_MM_WBK_STALL_MASK}, - {"C2H_MM_DSC_FIFO_EP", - C2H_MM_DSC_FIFO_EP_MASK}, - {"C2H_MM_DSC_FIFO_FL", - C2H_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_mm_ctl_field_info[] = { - {"H2C_MM_CTL_RESERVED1", - H2C_MM_CTL_RESERVED1_MASK}, - {"H2C_MM_CTL_ERRC_EN", - H2C_MM_CTL_ERRC_EN_MASK}, - {"H2C_MM_CTL_RESERVED0", - H2C_MM_CTL_RESERVED0_MASK}, - {"H2C_MM_CTL_RUN", - H2C_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_status_field_info[] = { - {"H2C_MM_STATUS_RSVD_1", - H2C_MM_STATUS_RSVD_1_MASK}, - {"H2C_MM_STATUS_RUN", - H2C_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_cmpl_desc_cnt_field_info[] = { - {"H2C_MM_CMPL_DESC_CNT_H2C_CO", - H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_enable_mask_field_info[] = { - {"H2C_MM_ERR_CODE_ENABLE_RESERVED5", - H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED4", - H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED3", - H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED2", - H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED1", - H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_UR_CA", - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED0", - H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_field_info[] = { - {"H2C_MM_ERR_CODE_RSVD_1", - H2C_MM_ERR_CODE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_CIDX", - H2C_MM_ERR_CODE_CIDX_MASK}, - {"H2C_MM_ERR_CODE_RESERVED0", - H2C_MM_ERR_CODE_RESERVED0_MASK}, - {"H2C_MM_ERR_CODE_SUB_TYPE", - H2C_MM_ERR_CODE_SUB_TYPE_MASK}, - {"H2C_MM_ERR_CODE", - H2C_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_info_field_info[] = { - {"H2C_MM_ERR_INFO_VALID", - H2C_MM_ERR_INFO_VALID_MASK}, - {"H2C_MM_ERR_INFO_SEL", - H2C_MM_ERR_INFO_SEL_MASK}, - {"H2C_MM_ERR_INFO_RSVD_1", - H2C_MM_ERR_INFO_RSVD_1_MASK}, - {"H2C_MM_ERR_INFO_QID", - H2C_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_ctl_field_info[] = { - {"H2C_MM_PERF_MON_CTL_RSVD_1", - H2C_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_START", - H2C_MM_PERF_MON_CTL_IMM_START_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_START", - H2C_MM_PERF_MON_CTL_RUN_START_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_CLEAR", - H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_CLEAR", - H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT0_DCNT", - H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT1_RSVD_1", - H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_DATA_CNT1_DCNT", - H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_dbg_field_info[] = { - {"H2C_MM_RSVD_1", - H2C_MM_RSVD_1_MASK}, - {"H2C_MM_RRQ_ENTRIES", - H2C_MM_RRQ_ENTRIES_MASK}, - {"H2C_MM_DAT_FIFO_SPC", - H2C_MM_DAT_FIFO_SPC_MASK}, - {"H2C_MM_RD_STALL", - H2C_MM_RD_STALL_MASK}, - {"H2C_MM_RRQ_FIFO_FI", - H2C_MM_RRQ_FIFO_FI_MASK}, - {"H2C_MM_WR_STALL", - H2C_MM_WR_STALL_MASK}, - {"H2C_MM_WRQ_FIFO_FI", - H2C_MM_WRQ_FIFO_FI_MASK}, - {"H2C_MM_WBK_STALL", - H2C_MM_WBK_STALL_MASK}, - {"H2C_MM_DSC_FIFO_EP", - H2C_MM_DSC_FIFO_EP_MASK}, - {"H2C_MM_DSC_FIFO_FL", - H2C_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_1_field_info[] = { - {"C2H_CRDT_COAL_CFG_1_RSVD_1", - C2H_CRDT_COAL_CFG_1_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH", - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_1_TIMER_TH", - C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_2_field_info[] = { - {"C2H_CRDT_COAL_CFG_2_RSVD_1", - C2H_CRDT_COAL_CFG_2_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_2_FIFO_TH", - C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_2_RESERVED1", - C2H_CRDT_COAL_CFG_2_RESERVED1_MASK}, - {"C2H_CRDT_COAL_CFG_2_NT_TH", - C2H_CRDT_COAL_CFG_2_NT_TH_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_qid_field_info[] = { - {"C2H_PFCH_BYP_QID_RSVD_1", - C2H_PFCH_BYP_QID_RSVD_1_MASK}, - {"C2H_PFCH_BYP_QID", - C2H_PFCH_BYP_QID_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_tag_field_info[] = { - {"C2H_PFCH_BYP_TAG_RSVD_1", - C2H_PFCH_BYP_TAG_RSVD_1_MASK}, - {"C2H_PFCH_BYP_TAG_BYP_QID", - C2H_PFCH_BYP_TAG_BYP_QID_MASK}, - {"C2H_PFCH_BYP_TAG_RSVD_2", - C2H_PFCH_BYP_TAG_RSVD_2_MASK}, - {"C2H_PFCH_BYP_TAG", - C2H_PFCH_BYP_TAG_MASK}, -}; - - -static struct regfield_info - c2h_water_mark_field_info[] = { - {"C2H_WATER_MARK_HIGH_WM", - C2H_WATER_MARK_HIGH_WM_MASK}, - {"C2H_WATER_MARK_LOW_WM", - C2H_WATER_MARK_LOW_WM_MASK}, -}; - - -static struct regfield_info - c2h_notify_empty_field_info[] = { - {"C2H_NOTIFY_EMPTY_RSVD_1", - C2H_NOTIFY_EMPTY_RSVD_1_MASK}, - {"C2H_NOTIFY_EMPTY_NOE", - C2H_NOTIFY_EMPTY_NOE_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_1_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED_1", - C2H_STAT_S_AXIS_C2H_ACCEPTED_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_1_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_1", - C2H_STAT_S_AXIS_WRB_ACCEPTED_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_1_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_1_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP_1", - C2H_STAT_AXIS_PKG_CMP_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_2_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_2", - C2H_STAT_S_AXIS_WRB_ACCEPTED_2_MASK}, -}; - - -static struct regfield_info - c2h_st_pld_fifo_depth_field_info[] = { - {"C2H_ST_PLD_FIFO_DEPTH", - C2H_ST_PLD_FIFO_DEPTH_MASK}, -}; - -static struct xreg_info eqdma_cpm5_config_regs[] = { -{"CFG_BLK_IDENTIFIER", 0x00, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_identifier_field_info), - cfg_blk_identifier_field_info -}, -{"CFG_BLK_PCIE_MAX_PLD_SIZE", 0x08, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_pld_size_field_info), - cfg_blk_pcie_max_pld_size_field_info -}, -{"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", 0x0c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_read_req_size_field_info), - cfg_blk_pcie_max_read_req_size_field_info -}, -{"CFG_BLK_SYSTEM_ID", 0x10, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_system_id_field_info), - cfg_blk_system_id_field_info -}, -{"CFG_BLK_MSIX_ENABLE", 0x014, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msix_enable_field_info), - cfg_blk_msix_enable_field_info -}, -{"CFG_PCIE_DATA_WIDTH", 0x18, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_data_width_field_info), - cfg_pcie_data_width_field_info -}, -{"CFG_PCIE_CTL", 0x1c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_ctl_field_info), - cfg_pcie_ctl_field_info -}, -{"CFG_BLK_MSI_ENABLE", 0x20, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msi_enable_field_info), - cfg_blk_msi_enable_field_info -}, -{"CFG_AXI_USER_MAX_PLD_SIZE", 0x40, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_pld_size_field_info), - cfg_axi_user_max_pld_size_field_info -}, -{"CFG_AXI_USER_MAX_READ_REQ_SIZE", 0x44, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_read_req_size_field_info), - cfg_axi_user_max_read_req_size_field_info -}, -{"CFG_BLK_MISC_CTL", 0x4c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_misc_ctl_field_info), - cfg_blk_misc_ctl_field_info -}, -{"CFG_PL_CRED_CTL", 0x68, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pl_cred_ctl_field_info), - cfg_pl_cred_ctl_field_info -}, -{"CFG_BLK_SCRATCH", 0x80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_field_info), - cfg_blk_scratch_field_info -}, -{"CFG_GIC", 0xa0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_gic_field_info), - cfg_gic_field_info -}, -{"RAM_SBE_MSK_1_A", 0xe0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_1_a_field_info), - ram_sbe_msk_1_a_field_info -}, -{"RAM_SBE_STS_1_A", 0xe4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_1_a_field_info), - ram_sbe_sts_1_a_field_info -}, -{"RAM_DBE_MSK_1_A", 0xe8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_1_a_field_info), - ram_dbe_msk_1_a_field_info -}, -{"RAM_DBE_STS_1_A", 0xec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_1_a_field_info), - ram_dbe_sts_1_a_field_info -}, -{"RAM_SBE_MSK_A", 0xf0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_a_field_info), - ram_sbe_msk_a_field_info -}, -{"RAM_SBE_STS_A", 0xf4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_a_field_info), - ram_sbe_sts_a_field_info -}, -{"RAM_DBE_MSK_A", 0xf8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_a_field_info), - ram_dbe_msk_a_field_info -}, -{"RAM_DBE_STS_A", 0xfc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_a_field_info), - ram_dbe_sts_a_field_info -}, -{"GLBL2_IDENTIFIER", 0x100, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_identifier_field_info), - glbl2_identifier_field_info -}, -{"GLBL2_CHANNEL_INST", 0x114, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_inst_field_info), - glbl2_channel_inst_field_info -}, -{"GLBL2_CHANNEL_MDMA", 0x118, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_mdma_field_info), - glbl2_channel_mdma_field_info -}, -{"GLBL2_CHANNEL_STRM", 0x11c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_strm_field_info), - glbl2_channel_strm_field_info -}, -{"GLBL2_CHANNEL_CAP", 0x120, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_cap_field_info), - glbl2_channel_cap_field_info -}, -{"GLBL2_CHANNEL_PASID_CAP", 0x128, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_pasid_cap_field_info), - glbl2_channel_pasid_cap_field_info -}, -{"GLBL2_SYSTEM_ID", 0x130, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_system_id_field_info), - glbl2_system_id_field_info -}, -{"GLBL2_MISC_CAP", 0x134, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_misc_cap_field_info), - glbl2_misc_cap_field_info -}, -{"GLBL2_DBG_PCIE_RQ0", 0x1b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq0_field_info), - glbl2_dbg_pcie_rq0_field_info -}, -{"GLBL2_DBG_PCIE_RQ1", 0x1bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq1_field_info), - glbl2_dbg_pcie_rq1_field_info -}, -{"GLBL2_DBG_AXIMM_WR0", 0x1c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr0_field_info), - glbl2_dbg_aximm_wr0_field_info -}, -{"GLBL2_DBG_AXIMM_WR1", 0x1c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr1_field_info), - glbl2_dbg_aximm_wr1_field_info -}, -{"GLBL2_DBG_AXIMM_RD0", 0x1c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd0_field_info), - glbl2_dbg_aximm_rd0_field_info -}, -{"GLBL2_DBG_AXIMM_RD1", 0x1cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd1_field_info), - glbl2_dbg_aximm_rd1_field_info -}, -{"GLBL2_DBG_FAB0", 0x1d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab0_field_info), - glbl2_dbg_fab0_field_info -}, -{"GLBL2_DBG_FAB1", 0x1d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab1_field_info), - glbl2_dbg_fab1_field_info -}, -{"GLBL2_DBG_MATCH_SEL", 0x1f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_sel_field_info), - glbl2_dbg_match_sel_field_info -}, -{"GLBL2_DBG_MATCH_MSK", 0x1f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_msk_field_info), - glbl2_dbg_match_msk_field_info -}, -{"GLBL2_DBG_MATCH_PAT", 0x1fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_pat_field_info), - glbl2_dbg_match_pat_field_info -}, -{"GLBL_RNG_SZ_1", 0x204, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_1_field_info), - glbl_rng_sz_1_field_info -}, -{"GLBL_RNG_SZ_2", 0x208, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_2_field_info), - glbl_rng_sz_2_field_info -}, -{"GLBL_RNG_SZ_3", 0x20c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_3_field_info), - glbl_rng_sz_3_field_info -}, -{"GLBL_RNG_SZ_4", 0x210, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_4_field_info), - glbl_rng_sz_4_field_info -}, -{"GLBL_RNG_SZ_5", 0x214, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_5_field_info), - glbl_rng_sz_5_field_info -}, -{"GLBL_RNG_SZ_6", 0x218, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_6_field_info), - glbl_rng_sz_6_field_info -}, -{"GLBL_RNG_SZ_7", 0x21c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_7_field_info), - glbl_rng_sz_7_field_info -}, -{"GLBL_RNG_SZ_8", 0x220, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_8_field_info), - glbl_rng_sz_8_field_info -}, -{"GLBL_RNG_SZ_9", 0x224, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_9_field_info), - glbl_rng_sz_9_field_info -}, -{"GLBL_RNG_SZ_A", 0x228, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_a_field_info), - glbl_rng_sz_a_field_info -}, -{"GLBL_RNG_SZ_B", 0x22c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_b_field_info), - glbl_rng_sz_b_field_info -}, -{"GLBL_RNG_SZ_C", 0x230, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_c_field_info), - glbl_rng_sz_c_field_info -}, -{"GLBL_RNG_SZ_D", 0x234, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_d_field_info), - glbl_rng_sz_d_field_info -}, -{"GLBL_RNG_SZ_E", 0x238, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_e_field_info), - glbl_rng_sz_e_field_info -}, -{"GLBL_RNG_SZ_F", 0x23c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_f_field_info), - glbl_rng_sz_f_field_info -}, -{"GLBL_RNG_SZ_10", 0x240, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_10_field_info), - glbl_rng_sz_10_field_info -}, -{"GLBL_ERR_STAT", 0x248, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_stat_field_info), - glbl_err_stat_field_info -}, -{"GLBL_ERR_MASK", 0x24c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_mask_field_info), - glbl_err_mask_field_info -}, -{"GLBL_DSC_CFG", 0x250, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_cfg_field_info), - glbl_dsc_cfg_field_info -}, -{"GLBL_DSC_ERR_STS", 0x254, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_sts_field_info), - glbl_dsc_err_sts_field_info -}, -{"GLBL_DSC_ERR_MSK", 0x258, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_msk_field_info), - glbl_dsc_err_msk_field_info -}, -{"GLBL_DSC_ERR_LOG0", 0x25c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log0_field_info), - glbl_dsc_err_log0_field_info -}, -{"GLBL_DSC_ERR_LOG1", 0x260, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log1_field_info), - glbl_dsc_err_log1_field_info -}, -{"GLBL_TRQ_ERR_STS", 0x264, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_sts_field_info), - glbl_trq_err_sts_field_info -}, -{"GLBL_TRQ_ERR_MSK", 0x268, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_msk_field_info), - glbl_trq_err_msk_field_info -}, -{"GLBL_TRQ_ERR_LOG", 0x26c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_log_field_info), - glbl_trq_err_log_field_info -}, -{"GLBL_DSC_DBG_DAT0", 0x270, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat0_field_info), - glbl_dsc_dbg_dat0_field_info -}, -{"GLBL_DSC_DBG_DAT1", 0x274, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat1_field_info), - glbl_dsc_dbg_dat1_field_info -}, -{"GLBL_DSC_DBG_CTL", 0x278, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_ctl_field_info), - glbl_dsc_dbg_ctl_field_info -}, -{"GLBL_DSC_ERR_LOG2", 0x27c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log2_field_info), - glbl_dsc_err_log2_field_info -}, -{"GLBL_GLBL_INTERRUPT_CFG", 0x2c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_glbl_interrupt_cfg_field_info), - glbl_glbl_interrupt_cfg_field_info -}, -{"GLBL_VCH_HOST_PROFILE", 0x2c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_vch_host_profile_field_info), - glbl_vch_host_profile_field_info -}, -{"GLBL_BRIDGE_HOST_PROFILE", 0x308, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_bridge_host_profile_field_info), - glbl_bridge_host_profile_field_info -}, -{"AXIMM_IRQ_DEST_ADDR", 0x30c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(aximm_irq_dest_addr_field_info), - aximm_irq_dest_addr_field_info -}, -{"FAB_ERR_LOG", 0x314, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(fab_err_log_field_info), - fab_err_log_field_info -}, -{"IND_CTXT_DATA", 0x804, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_field_info), - ind_ctxt_data_field_info -}, -{"IND_CTXT_MASK", 0x824, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_mask_field_info), - ind_ctxt_mask_field_info -}, -{"IND_CTXT_CMD", 0x844, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_cmd_field_info), - ind_ctxt_cmd_field_info -}, -{"C2H_TIMER_CNT", 0xa00, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_field_info), - c2h_timer_cnt_field_info -}, -{"C2H_CNT_TH", 0xa40, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_field_info), - c2h_cnt_th_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xa88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_field_info), - c2h_stat_s_axis_c2h_accepted_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED", 0xa8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_field_info), - c2h_stat_s_axis_wrb_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xa90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_field_info), - c2h_stat_desc_rsp_pkt_accepted_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP", 0xa94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_field_info), - c2h_stat_axis_pkg_cmp_field_info -}, -{"C2H_STAT_DESC_RSP_ACCEPTED", 0xa98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_accepted_field_info), - c2h_stat_desc_rsp_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_CMP", 0xa9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_cmp_field_info), - c2h_stat_desc_rsp_cmp_field_info -}, -{"C2H_STAT_WRQ_OUT", 0xaa0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wrq_out_field_info), - c2h_stat_wrq_out_field_info -}, -{"C2H_STAT_WPL_REN_ACCEPTED", 0xaa4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wpl_ren_accepted_field_info), - c2h_stat_wpl_ren_accepted_field_info -}, -{"C2H_STAT_TOTAL_WRQ_LEN", 0xaa8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wrq_len_field_info), - c2h_stat_total_wrq_len_field_info -}, -{"C2H_STAT_TOTAL_WPL_LEN", 0xaac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wpl_len_field_info), - c2h_stat_total_wpl_len_field_info -}, -{"C2H_BUF_SZ", 0xab0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_field_info), - c2h_buf_sz_field_info -}, -{"C2H_ERR_STAT", 0xaf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_stat_field_info), - c2h_err_stat_field_info -}, -{"C2H_ERR_MASK", 0xaf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_mask_field_info), - c2h_err_mask_field_info -}, -{"C2H_FATAL_ERR_STAT", 0xaf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_stat_field_info), - c2h_fatal_err_stat_field_info -}, -{"C2H_FATAL_ERR_MASK", 0xafc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_mask_field_info), - c2h_fatal_err_mask_field_info -}, -{"C2H_FATAL_ERR_ENABLE", 0xb00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_enable_field_info), - c2h_fatal_err_enable_field_info -}, -{"GLBL_ERR_INT", 0xb04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_int_field_info), - glbl_err_int_field_info -}, -{"C2H_PFCH_CFG", 0xb08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_field_info), - c2h_pfch_cfg_field_info -}, -{"C2H_PFCH_CFG_1", 0xa80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_pfch_cfg_1_field_info), - c2h_pfch_cfg_1_field_info -}, -{"C2H_PFCH_CFG_2", 0xa84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_pfch_cfg_2_field_info), - c2h_pfch_cfg_2_field_info -}, -{"C2H_INT_TIMER_TICK", 0xb0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_timer_tick_field_info), - c2h_int_timer_tick_field_info -}, -{"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xb10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_drop_accepted_field_info), - c2h_stat_desc_rsp_drop_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xb14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_err_accepted_field_info), - c2h_stat_desc_rsp_err_accepted_field_info -}, -{"C2H_STAT_DESC_REQ", 0xb18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_req_field_info), - c2h_stat_desc_req_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_0", 0xb1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_0_field_info), - c2h_stat_dbg_dma_eng_0_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_1", 0xb20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_1_field_info), - c2h_stat_dbg_dma_eng_1_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_2", 0xb24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_2_field_info), - c2h_stat_dbg_dma_eng_2_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_3", 0xb28, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_3_field_info), - c2h_stat_dbg_dma_eng_3_field_info -}, -{"C2H_DBG_PFCH_ERR_CTXT", 0xb2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_err_ctxt_field_info), - c2h_dbg_pfch_err_ctxt_field_info -}, -{"C2H_FIRST_ERR_QID", 0xb30, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_first_err_qid_field_info), - c2h_first_err_qid_field_info -}, -{"STAT_NUM_WRB_IN", 0xb34, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_in_field_info), - stat_num_wrb_in_field_info -}, -{"STAT_NUM_WRB_OUT", 0xb38, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_out_field_info), - stat_num_wrb_out_field_info -}, -{"STAT_NUM_WRB_DRP", 0xb3c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_drp_field_info), - stat_num_wrb_drp_field_info -}, -{"STAT_NUM_STAT_DESC_OUT", 0xb40, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_stat_desc_out_field_info), - stat_num_stat_desc_out_field_info -}, -{"STAT_NUM_DSC_CRDT_SENT", 0xb44, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_dsc_crdt_sent_field_info), - stat_num_dsc_crdt_sent_field_info -}, -{"STAT_NUM_FCH_DSC_RCVD", 0xb48, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_fch_dsc_rcvd_field_info), - stat_num_fch_dsc_rcvd_field_info -}, -{"STAT_NUM_BYP_DSC_RCVD", 0xb4c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_byp_dsc_rcvd_field_info), - stat_num_byp_dsc_rcvd_field_info -}, -{"C2H_WRB_COAL_CFG", 0xb50, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_cfg_field_info), - c2h_wrb_coal_cfg_field_info -}, -{"C2H_INTR_H2C_REQ", 0xb54, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_h2c_req_field_info), - c2h_intr_h2c_req_field_info -}, -{"C2H_INTR_C2H_MM_REQ", 0xb58, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_mm_req_field_info), - c2h_intr_c2h_mm_req_field_info -}, -{"C2H_INTR_ERR_INT_REQ", 0xb5c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_err_int_req_field_info), - c2h_intr_err_int_req_field_info -}, -{"C2H_INTR_C2H_ST_REQ", 0xb60, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_req_field_info), - c2h_intr_c2h_st_req_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK", 0xb64, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_ack_field_info), - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL", 0xb68, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_fail_field_info), - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX", 0xb6c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info), - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL", 0xb70, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info), - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_ACK", 0xb74, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_ack_field_info), - c2h_intr_c2h_st_msix_ack_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_FAIL", 0xb78, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_fail_field_info), - c2h_intr_c2h_st_msix_fail_field_info -}, -{"C2H_INTR_C2H_ST_NO_MSIX", 0xb7c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_no_msix_field_info), - c2h_intr_c2h_st_no_msix_field_info -}, -{"C2H_INTR_C2H_ST_CTXT_INVAL", 0xb80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_ctxt_inval_field_info), - c2h_intr_c2h_st_ctxt_inval_field_info -}, -{"C2H_STAT_WR_CMP", 0xb84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wr_cmp_field_info), - c2h_stat_wr_cmp_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_4", 0xb88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_4_field_info), - c2h_stat_dbg_dma_eng_4_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_5", 0xb8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_5_field_info), - c2h_stat_dbg_dma_eng_5_field_info -}, -{"C2H_DBG_PFCH_QID", 0xb90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_qid_field_info), - c2h_dbg_pfch_qid_field_info -}, -{"C2H_DBG_PFCH", 0xb94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_field_info), - c2h_dbg_pfch_field_info -}, -{"C2H_INT_DBG", 0xb98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_dbg_field_info), - c2h_int_dbg_field_info -}, -{"C2H_STAT_IMM_ACCEPTED", 0xb9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_imm_accepted_field_info), - c2h_stat_imm_accepted_field_info -}, -{"C2H_STAT_MARKER_ACCEPTED", 0xba0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_marker_accepted_field_info), - c2h_stat_marker_accepted_field_info -}, -{"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xba4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_disable_cmp_accepted_field_info), - c2h_stat_disable_cmp_accepted_field_info -}, -{"C2H_PLD_FIFO_CRDT_CNT", 0xba8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_crdt_cnt_field_info), - c2h_pld_fifo_crdt_cnt_field_info -}, -{"C2H_INTR_DYN_REQ", 0xbac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_req_field_info), - c2h_intr_dyn_req_field_info -}, -{"C2H_INTR_DYN_MISC", 0xbb0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_misc_field_info), - c2h_intr_dyn_misc_field_info -}, -{"C2H_DROP_LEN_MISMATCH", 0xbb4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_len_mismatch_field_info), - c2h_drop_len_mismatch_field_info -}, -{"C2H_DROP_DESC_RSP_LEN", 0xbb8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_desc_rsp_len_field_info), - c2h_drop_desc_rsp_len_field_info -}, -{"C2H_DROP_QID_FIFO_LEN", 0xbbc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_qid_fifo_len_field_info), - c2h_drop_qid_fifo_len_field_info -}, -{"C2H_DROP_PLD_CNT", 0xbc0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_field_info), - c2h_drop_pld_cnt_field_info -}, -{"C2H_CMPT_FORMAT_0", 0xbc4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_0_field_info), - c2h_cmpt_format_0_field_info -}, -{"C2H_CMPT_FORMAT_1", 0xbc8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_1_field_info), - c2h_cmpt_format_1_field_info -}, -{"C2H_CMPT_FORMAT_2", 0xbcc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_2_field_info), - c2h_cmpt_format_2_field_info -}, -{"C2H_CMPT_FORMAT_3", 0xbd0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_3_field_info), - c2h_cmpt_format_3_field_info -}, -{"C2H_CMPT_FORMAT_4", 0xbd4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_4_field_info), - c2h_cmpt_format_4_field_info -}, -{"C2H_CMPT_FORMAT_5", 0xbd8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_5_field_info), - c2h_cmpt_format_5_field_info -}, -{"C2H_CMPT_FORMAT_6", 0xbdc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_6_field_info), - c2h_cmpt_format_6_field_info -}, -{"C2H_PFCH_CACHE_DEPTH", 0xbe0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cache_depth_field_info), - c2h_pfch_cache_depth_field_info -}, -{"C2H_WRB_COAL_BUF_DEPTH", 0xbe4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_buf_depth_field_info), - c2h_wrb_coal_buf_depth_field_info -}, -{"C2H_PFCH_CRDT", 0xbe8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_crdt_field_info), - c2h_pfch_crdt_field_info -}, -{"C2H_STAT_HAS_CMPT_ACCEPTED", 0xbec, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_cmpt_accepted_field_info), - c2h_stat_has_cmpt_accepted_field_info -}, -{"C2H_STAT_HAS_PLD_ACCEPTED", 0xbf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_pld_accepted_field_info), - c2h_stat_has_pld_accepted_field_info -}, -{"C2H_PLD_PKT_ID", 0xbf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_field_info), - c2h_pld_pkt_id_field_info -}, -{"C2H_PLD_PKT_ID_1", 0xbf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_1_field_info), - c2h_pld_pkt_id_1_field_info -}, -{"C2H_DROP_PLD_CNT_1", 0xbfc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_1_field_info), - c2h_drop_pld_cnt_1_field_info -}, -{"H2C_ERR_STAT", 0xe00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_stat_field_info), - h2c_err_stat_field_info -}, -{"H2C_ERR_MASK", 0xe04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_mask_field_info), - h2c_err_mask_field_info -}, -{"H2C_FIRST_ERR_QID", 0xe08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_first_err_qid_field_info), - h2c_first_err_qid_field_info -}, -{"H2C_DBG_REG0", 0xe0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg0_field_info), - h2c_dbg_reg0_field_info -}, -{"H2C_DBG_REG1", 0xe10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg1_field_info), - h2c_dbg_reg1_field_info -}, -{"H2C_DBG_REG2", 0xe14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg2_field_info), - h2c_dbg_reg2_field_info -}, -{"H2C_DBG_REG3", 0xe18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg3_field_info), - h2c_dbg_reg3_field_info -}, -{"H2C_DBG_REG4", 0xe1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg4_field_info), - h2c_dbg_reg4_field_info -}, -{"H2C_FATAL_ERR_EN", 0xe20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_fatal_err_en_field_info), - h2c_fatal_err_en_field_info -}, -{"H2C_REQ_THROT_PCIE", 0xe24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_pcie_field_info), - h2c_req_throt_pcie_field_info -}, -{"H2C_ALN_DBG_REG0", 0xe28, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_aln_dbg_reg0_field_info), - h2c_aln_dbg_reg0_field_info -}, -{"H2C_REQ_THROT_AXIMM", 0xe2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_aximm_field_info), - h2c_req_throt_aximm_field_info -}, -{"C2H_MM_CTL", 0x1004, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_ctl_field_info), - c2h_mm_ctl_field_info -}, -{"C2H_MM_STATUS", 0x1040, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_status_field_info), - c2h_mm_status_field_info -}, -{"C2H_MM_CMPL_DESC_CNT", 0x1048, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_cmpl_desc_cnt_field_info), - c2h_mm_cmpl_desc_cnt_field_info -}, -{"C2H_MM_ERR_CODE_ENABLE_MASK", 0x1054, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_enable_mask_field_info), - c2h_mm_err_code_enable_mask_field_info -}, -{"C2H_MM_ERR_CODE", 0x1058, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_field_info), - c2h_mm_err_code_field_info -}, -{"C2H_MM_ERR_INFO", 0x105c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_info_field_info), - c2h_mm_err_info_field_info -}, -{"C2H_MM_PERF_MON_CTL", 0x10c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_ctl_field_info), - c2h_mm_perf_mon_ctl_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT0", 0x10c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt0_field_info), - c2h_mm_perf_mon_cycle_cnt0_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT1", 0x10c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt1_field_info), - c2h_mm_perf_mon_cycle_cnt1_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT0", 0x10cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt0_field_info), - c2h_mm_perf_mon_data_cnt0_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT1", 0x10d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt1_field_info), - c2h_mm_perf_mon_data_cnt1_field_info -}, -{"C2H_MM_DBG", 0x10e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_dbg_field_info), - c2h_mm_dbg_field_info -}, -{"H2C_MM_CTL", 0x1204, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_ctl_field_info), - h2c_mm_ctl_field_info -}, -{"H2C_MM_STATUS", 0x1240, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_status_field_info), - h2c_mm_status_field_info -}, -{"H2C_MM_CMPL_DESC_CNT", 0x1248, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_cmpl_desc_cnt_field_info), - h2c_mm_cmpl_desc_cnt_field_info -}, -{"H2C_MM_ERR_CODE_ENABLE_MASK", 0x1254, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_enable_mask_field_info), - h2c_mm_err_code_enable_mask_field_info -}, -{"H2C_MM_ERR_CODE", 0x1258, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_field_info), - h2c_mm_err_code_field_info -}, -{"H2C_MM_ERR_INFO", 0x125c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_info_field_info), - h2c_mm_err_info_field_info -}, -{"H2C_MM_PERF_MON_CTL", 0x12c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_ctl_field_info), - h2c_mm_perf_mon_ctl_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT0", 0x12c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt0_field_info), - h2c_mm_perf_mon_cycle_cnt0_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT1", 0x12c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt1_field_info), - h2c_mm_perf_mon_cycle_cnt1_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT0", 0x12cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt0_field_info), - h2c_mm_perf_mon_data_cnt0_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT1", 0x12d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt1_field_info), - h2c_mm_perf_mon_data_cnt1_field_info -}, -{"H2C_MM_DBG", 0x12e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_dbg_field_info), - h2c_mm_dbg_field_info -}, -{"C2H_CRDT_COAL_CFG_1", 0x1400, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_1_field_info), - c2h_crdt_coal_cfg_1_field_info -}, -{"C2H_CRDT_COAL_CFG_2", 0x1404, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_2_field_info), - c2h_crdt_coal_cfg_2_field_info -}, -{"C2H_PFCH_BYP_QID", 0x1408, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_qid_field_info), - c2h_pfch_byp_qid_field_info -}, -{"C2H_PFCH_BYP_TAG", 0x140c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_tag_field_info), - c2h_pfch_byp_tag_field_info -}, -{"C2H_WATER_MARK", 0x1500, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_water_mark_field_info), - c2h_water_mark_field_info -}, -{"C2H_NOTIFY_EMPTY", 0x1800, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_notify_empty_field_info), - c2h_notify_empty_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED_1", 0x1804, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_1_field_info), - c2h_stat_s_axis_c2h_accepted_1_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED_1", 0x1808, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_1_field_info), - c2h_stat_s_axis_wrb_accepted_1_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED_1", 0x180c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_1_field_info), - c2h_stat_desc_rsp_pkt_accepted_1_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP_1", 0x1810, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_1_field_info), - c2h_stat_axis_pkg_cmp_1_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED_2", 0x1814, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_2_field_info), - c2h_stat_s_axis_wrb_accepted_2_field_info -}, -{"C2H_ST_PLD_FIFO_DEPTH", 0x1818, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_st_pld_fifo_depth_field_info), - c2h_st_pld_fifo_depth_field_info -}, - -}; - -uint32_t eqdma_cpm5_config_num_regs_get(void) -{ - return (sizeof(eqdma_cpm5_config_regs)/ - sizeof(eqdma_cpm5_config_regs[0])); -} - -struct xreg_info *eqdma_cpm5_config_regs_get(void) -{ - return eqdma_cpm5_config_regs; -} - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_access.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_access.c deleted file mode 100755 index 0332479..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_access.c +++ /dev/null @@ -1,6833 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "eqdma_soft_access.h" -#include "eqdma_soft_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_soft_access.tmh" -#endif - -/** EQDMA Context array size */ -#define EQDMA_FMAP_NUM_WORDS 2 -#define EQDMA_SW_CONTEXT_NUM_WORDS 8 -#define EQDMA_HW_CONTEXT_NUM_WORDS 2 -#define EQDMA_PFETCH_CONTEXT_NUM_WORDS 2 -#define EQDMA_CR_CONTEXT_NUM_WORDS 1 -#define EQDMA_CMPT_CONTEXT_NUM_WORDS 6 -#define EQDMA_IND_INTR_CONTEXT_NUM_WORDS 4 - -#define EQDMA_VF_USER_BAR_ID 2 - -#define EQDMA_REG_GROUP_1_START_ADDR 0x000 -#define EQDMA_REG_GROUP_2_START_ADDR 0x804 -#define EQDMA_REG_GROUP_3_START_ADDR 0xB00 -#define EQDMA_REG_GROUP_4_START_ADDR 0x5014 - -#define EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS 11 -#define EQDMA_GLBL_TRQ_ERR_ALL_MASK 0XB3 -#define EQDMA_GLBL_DSC_ERR_ALL_MASK 0X1F9037E -#define EQDMA_C2H_ERR_ALL_MASK 0X3F6DF -#define EQDMA_C2H_FATAL_ERR_ALL_MASK 0X1FDF1B -#define EQDMA_H2C_ERR_ALL_MASK 0X3F -#define EQDMA_SBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_DBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_MM_C2H_ERR_ALL_MASK 0X70000003 -#define EQDMA_MM_H2C0_ERR_ALL_MASK 0X3041013E - - - - -/* H2C Throttle settings for QDMA 4.0 */ -#define EQDMA_H2C_THROT_DATA_THRESH 0x5000 -#define EQDMA_THROT_EN_DATA 1 -#define EQDMA_THROT_EN_REQ 0 -#define EQDMA_H2C_THROT_REQ_THRESH 0xC0 - -/* H2C Throttle settings for QDMA 5.0 */ -#define EQDMA5_H2C_THROT_DATA_THRESH 0x5000 -#define EQDMA5_THROT_EN_DATA 1 -#define EQDMA5_THROT_EN_REQ 1 -#define EQDMA5_H2C_THROT_REQ_THRESH 0xC0 - -/* CSR Default values for QDMA 5.0 */ -#define EQDMA5_DEFAULT_C2H_UODSC_LIMIT 5 -#define EQDMA5_DEFAULT_H2C_UODSC_LIMIT 8 -#define EQDMA5_DEFAULT_MAX_DSC_FETCH 5 -#define EQDMA5_DEFAULT_WRB_INT QDMA_WRB_INTERVAL_128 - -/* C2H prefetch Throttle configuration. */ -#define EQDMA5_DEFAULT_C2H_EVT_QCNT_TH 0x38 -#define EQDMA5_DEFAULT_C2H_PFCH_QCNT 0x3c - -/** Auxillary Bitmasks for fields spanning multiple words */ -#define EQDMA_SW_CTXT_PASID_GET_H_MASK GENMASK(21, 12) -#define EQDMA_SW_CTXT_PASID_GET_L_MASK GENMASK(11, 0) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK GENMASK_ULL(63, 53) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK GENMASK_ULL(52, 21) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK GENMASK_ULL(20, 0) -#define EQDMA_CMPL_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_CMPL_CTXT_PASID_GET_L_MASK GENMASK(8, 0) -#define EQDMA_INTR_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_INTR_CTXT_PASID_GET_L_MASK GENMASK(8, 0) - - -#define EQDMA_OFFSET_GLBL2_PF_BARLITE_EXT 0x10C - -#define QDMA_OFFSET_GLBL2_PF_BARLITE_INT 0x104 -#define QDMA_GLBL2_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define QDMA_GLBL2_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define QDMA_GLBL2_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define QDMA_GLBL2_PF0_BAR_MAP_MASK GENMASK(5, 0) - -#define EQDMA_GLBL2_DBG_MODE_EN_MASK BIT(4) -#define EQDMA_GLBL2_DESC_ENG_MODE_MASK GENMASK(3, 2) -#define EQDMA_GLBL2_FLR_PRESENT_MASK BIT(1) -#define EQDMA_GLBL2_MAILBOX_EN_MASK BIT(0) - -/** EQDMA_IND_REG_SEL_FMAP */ -#define EQDMA_FMAP_CTXT_W1_QID_MAX_MASK GENMASK(11, 0) -#define EQDMA_FMAP_CTXT_W0_QID_MASK GENMASK(10, 0) - -#define EQDMA_GLBL2_IP_VERSION_MASK GENMASK(23, 20) -#define EQDMA_GLBL2_VF_IP_VERSION_MASK GENMASK(7, 4) - -static void eqdma_hw_st_h2c_err_process(void *dev_hndl); -static void eqdma_hw_st_c2h_err_process(void *dev_hndl); -static void eqdma_hw_desc_err_process(void *dev_hndl); -static void eqdma_hw_trq_err_process(void *dev_hndl); -static void eqdma_hw_ram_sbe_err_process(void *dev_hndl); -static void eqdma_hw_ram_dbe_err_process(void *dev_hndl); -static void eqdma_mm_h2c0_err_process(void *dev_hndl); -static void eqdma_mm_c2h0_err_process(void *dev_hndl); - -static struct eqdma_hw_err_info eqdma_err_info[EQDMA_ERRS_ALL] = { - /* Descriptor errors */ - { - EQDMA_DSC_ERR_POISON, - "Poison error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_UR_CA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_BCNT, - "Unexpected Byte count in completion error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_BCNT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_PARAM, - "Parameter mismatch error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PARAM_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_ADDR, - "Address mismatch error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_ADDR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_TAG, - "Unexpected tag error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TAG_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_FLR, - "FLR error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_TIMEOUT, - "Timed out error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DAT_POISON, - "Poison data error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DAT_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DMA, - "DMA engine error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DMA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DSC, - "Invalid PIDX update error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DSC_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_SBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_PORT_ID, - "Port ID Error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PORT_ID_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_ALL, - "All Descriptor errors", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - EQDMA_GLBL_DSC_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - - /* TRQ errors */ - { - EQDMA_TRQ_ERR_CSR_UNMAPPED, - "Access targeted unmapped register space via CSR pathway error", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_VF_ACCESS, - "VF attempted to access Global register space or Function map", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_TCP_CSR_TIMEOUT, - "Timeout on request to dma internal csr register", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_QSPC_UNMAPPED, - "Access targeted unmapped register via queue space pathway", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_QID_RANGE, - "Qid range error", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QID_RANGE_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_TCP_QSPC_TIMEOUT, - "Timeout on request to dma internal queue space register", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_ALL, - "All TRQ errors", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_GLBL_TRQ_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - - /* C2H Errors*/ - { - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_SH_CMPT_DSC, - "A Shared CMPT queue has encountered a descriptor error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_DESC_RSP_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MSI_INT_FAIL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ERR_DESC_CNT_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - "Writeback on invalid queue error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - "Completion queue gets full error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_QFULL_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - "Bad CIDX update by the software error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_CIDX_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - "C2H completion Parity error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PRTY_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_AVL_RING_DSC, - "Available ring fetch returns descriptor with error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_HDR_ECC_UNC, - "multi-bit ecc error on c2h packet header", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_HDR_ECC_COR, - "single-bit ecc error on c2h packet header", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_WRB_PORT_ID_ERR, - "Port ID error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ALL, - "All C2h errors", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - EQDMA_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_WPL_DATA_PAR, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_HDR_ECC_UNC, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_ALL, - "All fatal errors", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_C2H_FATAL_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - "Zero length descriptor error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_ZERO_LEN_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - "A non-EOP descriptor received", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_NO_DMA_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_DBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_PAR, - "Internal data parity error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_ALL, - "All H2C errors", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - EQDMA_H2C_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Even RAM single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM 1 single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_ALL, - "All SBE Errors.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - EQDMA_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, -{ - EQDMA_SBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slavle FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM single bit ECC error.", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_ALL, - "All SBE errors", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - EQDMA_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - - - /* DBE errors */ - { - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_ALL, - "All DBE errors", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - EQDMA_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_FUNC_MAP, - "Function map RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slave FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_ALL, - "All DBE errors", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - EQDMA_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - /* MM C2H Engine 0 errors */ - { - EQDMA_MM_C2H_WR_SLR_ERR, - "MM C2H0 WR SLV Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_RD_SLR_ERR, - "MM C2H0 RD SLV Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_WR_FLR_ERR, - "MM C2H0 WR FLR Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_UR_ERR, - "MM C2H0 Unsupported Request Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_WR_UC_RAM_ERR, - "MM C2H0 Write Uncorrectable RAM Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_ERR_ALL, - "All MM C2H Errors", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - EQDMA_MM_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - /* MM H2C Engine 0 Errors */ - { - EQDMA_MM_H2C0_RD_HDR_POISON_ERR, - "MM H2C0 Read cmpt header pison Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_UR_CA_ERR, - "MM H2C0 Read cmpt unsupported request Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_HDR_BYTE_ERR, - "MM H2C0 Read cmpt hdr byte cnt Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_HDR_PARAM_ERR, - "MM H2C0 Read cmpt hdr param mismatch Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_HDR_ADR_ERR, - "MM H2C0 Read cmpt hdr address mismatch Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_FLR_ERR, - "MM H2C0 Read flr Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_DAT_POISON_ERR, - "MM H2C0 Read data poison Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_RQ_DIS_ERR, - "MM H2C0 Read request disable Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_WR_DEC_ERR, - "MM H2C0 Write desc Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_WR_SLV_ERR, - "MM H2C0 Write slv Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_ERR_ALL, - "All MM H2C Errors", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - EQDMA_MM_H2C0_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - -}; - -static int32_t all_eqdma_hw_errs[EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS] = { - - EQDMA_DSC_ERR_ALL, - EQDMA_TRQ_ERR_ALL, - EQDMA_ST_C2H_ERR_ALL, - EQDMA_ST_FATAL_ERR_ALL, - EQDMA_ST_H2C_ERR_ALL, - EQDMA_SBE_1_ERR_ALL, - EQDMA_SBE_ERR_ALL, - EQDMA_DBE_1_ERR_ALL, - EQDMA_DBE_ERR_ALL, - EQDMA_MM_C2H_ERR_ALL, - EQDMA_MM_H2C0_ERR_ALL -}; - -static struct qctx_entry eqdma_sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Function Id", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Address Translation", 0}, - {"Fetch Max", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Interrupt with VF", 0}, - {"Pack descriptor output interface", 0}, - {"Irq Bypass", 0}, -}; - -static struct qctx_entry eqdma_hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry eqdma_credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry eqdma_fmap_ctxt_entries[] = { - {"Queue Base", 0}, - {"Queue Max", 0}, -}; - -static struct qctx_entry eqdma_cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Addr High (L)[37:6]", 0}, - {"Base Addr High(H)[63:38]", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, - {"Over Flow Check Disable", 0}, - {"Address Translation", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Insterrupt with VF", 0}, - {"c2h Direction", 0}, - {"Base Addr Low[5:2]", 0}, - {"Shared Completion Queue", 0}, -}; - -static struct qctx_entry eqdma_c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Variable Descriptor", 0}, - {"Number of descriptors prefetched", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry eqdma_ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, - {"at", 0}, - {"Function Id", 0}, -}; - -static int eqdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int eqdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - -uint32_t eqdma_get_config_num_regs(void) -{ - return eqdma_config_num_regs_get(); -} - -struct xreg_info *eqdma_get_config_regs(void) -{ - return eqdma_config_regs_get(); -} - -uint32_t eqdma_reg_dump_buf_len(void) -{ - uint32_t length = (eqdma_config_num_regs_get() + 1) - * REG_DUMP_SIZE_PER_LINE; - return length; -} - -int eqdma_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - int len = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(eqdma_cmpt_ctxt_entries) / - sizeof(eqdma_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(eqdma_sw_ctxt_entries) / - sizeof(eqdma_sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_hw_ctxt_entries) / - sizeof(eqdma_hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_credit_ctxt_entries) / - sizeof(eqdma_credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_fmap_ctxt_entries) / - sizeof(eqdma_fmap_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(eqdma_cmpt_ctxt_entries) / - sizeof(eqdma_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_c2h_pftch_ctxt_entries) / - sizeof(eqdma_c2h_pftch_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } - } - - *buflen = len; - return 0; -} - - -static uint32_t eqdma_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(eqdma_ind_intr_ctxt_entries) / - sizeof(eqdma_ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - - -static void eqdma_set_perf_opt(void *dev_hndl) -{ - uint32_t reg_val = 0, data_th = 0, pfch_cache_dpth = 0; - /**** - * TODO: All the below settings are for QDMA5.0 - * Need to add the QDMA4.0 settings - */ -#define EQDMA_PFTCH_CACHE_DEPTH 64 -#define GLBL_DSC_CFG_RSVD_1_DFLT 0 -#define EQDMA_GLBL_DSC_CFG_C2H_UODSC_LIMIT 5 -#define EQDMA_GLBL_DSC_CFG_H2C_UODSC_LIMIT 8 -#define GLBL_DSC_CFG_UNC_OVR_COR_DFLT 0 -#define GLBL_DSC_CFG_CTXT_FER_DIS_DFLT 0 -#define GLBL_DSC_CFG_RSVD_2_DFLT 0 -#define EQDMA_GLBL_DSC_CFG_MAXFETCH 2 -#define EQDMA_GLBL_DSC_CFG_WB_ACC_INT 5 - - reg_val = - FIELD_SET(GLBL_DSC_CFG_RSVD_1_MASK, GLBL_DSC_CFG_RSVD_1_DFLT) | - FIELD_SET(GLBL_DSC_CFG_C2H_UODSC_LIMIT_MASK, - EQDMA_GLBL_DSC_CFG_C2H_UODSC_LIMIT) | - FIELD_SET(GLBL_DSC_CFG_H2C_UODSC_LIMIT_MASK, - EQDMA_GLBL_DSC_CFG_H2C_UODSC_LIMIT) | - FIELD_SET(GLBL_DSC_CFG_UNC_OVR_COR_MASK, - GLBL_DSC_CFG_UNC_OVR_COR_DFLT) | - FIELD_SET(GLBL_DSC_CFG_CTXT_FER_DIS_MASK, - GLBL_DSC_CFG_CTXT_FER_DIS_DFLT) | - FIELD_SET(GLBL_DSC_CFG_RSVD_2_MASK, GLBL_DSC_CFG_RSVD_2_DFLT) | - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - EQDMA_GLBL_DSC_CFG_MAXFETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - EQDMA_GLBL_DSC_CFG_WB_ACC_INT); - qdma_reg_write(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL_DSC_CFG_ADDR, reg_val); - -#define CFG_BLK_MISC_CTL_RSVD_1_DFLT 0 -#define CFG_BLK_MISC_CTL_10B_TAG_DFLT 0 -#define CFG_BLK_MISC_CTL_RSVD_2_DFLT 0 -#define CFG_BLK_MISC_CTL_AXI_WBK_DFLT 0 -#define CFG_BLK_MISC_CTL_AXI_DSC_DFLT 0 -#define CFG_BLK_MISC_CTL_NUM_TAG_DFLT 256 -#define CFG_BLK_MISC_CTL_RSVD_3_DFLT 0 -#define EQDMA_CFG_BLK_MISC_CTL_RQ_METERING_MUL 9 - - - reg_val = - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_1_MASK, - CFG_BLK_MISC_CTL_RSVD_1_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_10B_TAG_EN_MASK, - CFG_BLK_MISC_CTL_10B_TAG_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_2_MASK, - CFG_BLK_MISC_CTL_RSVD_2_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_AXI_WBK_MASK, - CFG_BLK_MISC_CTL_AXI_WBK_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_AXI_DSC_MASK, - CFG_BLK_MISC_CTL_AXI_DSC_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_NUM_TAG_MASK, - CFG_BLK_MISC_CTL_NUM_TAG_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_3_MASK, - CFG_BLK_MISC_CTL_RSVD_3_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK, - EQDMA_CFG_BLK_MISC_CTL_RQ_METERING_MUL); - qdma_reg_write(dev_hndl, EQDMA_CFG_BLK_MISC_CTL_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CFG_BLK_MISC_CTL_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CFG_BLK_MISC_CTL_ADDR, reg_val); - -#define EQDMA_PFTCH_CFG_EVT_PFTH_FL_TH 256 -#define C2H_PFCH_CFG_FL_TH_DFLT 256 - - reg_val = - FIELD_SET(C2H_PFCH_CFG_EVTFL_TH_MASK, - EQDMA_PFTCH_CFG_EVT_PFTH_FL_TH) | - FIELD_SET(C2H_PFCH_CFG_FL_TH_MASK, C2H_PFCH_CFG_FL_TH_DFLT); - - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_PFCH_CFG_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_PFCH_CFG_ADDR, reg_val); - -#define EQDMA_C2H_PFCH_CFG_1_QCNT_MASK (EQDMA_PFTCH_CACHE_DEPTH - 4) -#define EQDMA_C2H_PFCH_CFG_1_EVNT_QCNT_TH EQDMA_C2H_PFCH_CFG_1_QCNT_MASK - pfch_cache_dpth = qdma_reg_read(dev_hndl, - EQDMA_C2H_PFCH_CACHE_DEPTH_ADDR); - - reg_val = - FIELD_SET(C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK, - (pfch_cache_dpth - 4)) | - FIELD_SET(C2H_PFCH_CFG_1_QCNT_MASK, (pfch_cache_dpth - 4)); - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_1_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_PFCH_CFG_1_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_PFCH_CFG_1_ADDR, reg_val); - -#define EQDMA_C2H_PFCH_CFG_2_FENCE_EN 1 -#define C2H_PFCH_CFG_2_RSVD_DFLT 0 -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_DFLT 0 -#define C2H_PFCH_CFG_2_LL_SZ_TH_DFLT 1024 -#define C2H_PFCH_CFG_2_VAR_DESC_NUM 15 -#define C2H_PFCH_CFG_2_NUM_DFLT 8 - - reg_val = - FIELD_SET(C2H_PFCH_CFG_2_FENCE_MASK, - EQDMA_C2H_PFCH_CFG_2_FENCE_EN) | - FIELD_SET(C2H_PFCH_CFG_2_RSVD_MASK, C2H_PFCH_CFG_2_RSVD_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK, - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_LL_SZ_TH_MASK, - C2H_PFCH_CFG_2_LL_SZ_TH_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK, - C2H_PFCH_CFG_2_VAR_DESC_NUM) | - FIELD_SET(C2H_PFCH_CFG_2_NUM_MASK, C2H_PFCH_CFG_2_NUM_DFLT); - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_2_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_PFCH_CFG_2_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_PFCH_CFG_2_ADDR, reg_val); -#define PFCH_CFG_3_RSVD_DFLT 0 -#define PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_DFLT 256 -#define PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_DFLT 0 - - - reg_val = - FIELD_SET(PFCH_CFG_3_RSVD_MASK, PFCH_CFG_3_RSVD_DFLT) | - FIELD_SET(PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_MASK, - PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_DFLT) | - FIELD_SET(PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_MASK, - PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_DFLT); - qdma_reg_write(dev_hndl, EQDMA_PFCH_CFG_3_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_PFCH_CFG_3_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_PFCH_CFG_2_ADDR, reg_val); -#define EQDMA_PFCH_CFG_4_GLB_EVT_TIMER_TICK 64 -#define PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_DFLT 0 -#define EQDMA_PFCH_CFG_4_EVT_TIMER_TICK 400 -#define PFCH_CFG_4_DISABLE_EVT_TIMER_DFLT 0 - - - reg_val = - FIELD_SET(PFCH_CFG_4_GLB_EVT_TIMER_TICK_MASK, - EQDMA_PFCH_CFG_4_GLB_EVT_TIMER_TICK) | - FIELD_SET(PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_MASK, - PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_DFLT) | - FIELD_SET(PFCH_CFG_4_EVT_TIMER_TICK_MASK, - EQDMA_PFCH_CFG_4_EVT_TIMER_TICK) | - FIELD_SET(PFCH_CFG_4_DISABLE_EVT_TIMER_MASK, - PFCH_CFG_4_DISABLE_EVT_TIMER_DFLT); - qdma_reg_write(dev_hndl, EQDMA_PFCH_CFG_4_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_PFCH_CFG_4_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_PFCH_CFG_4_ADDR, reg_val); -/**************** SET_2 *******************/ -#define C2H_CRDT_COAL_CFG_1_RSVD_1_DFLT 0 -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_DFLT 16 -#define EQDMA_C2H_CRDT_COAL_CFG_1_TIMER_TH 16 //64 - - - reg_val = - FIELD_SET(C2H_CRDT_COAL_CFG_1_RSVD_1_MASK, - C2H_CRDT_COAL_CFG_1_RSVD_1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK, - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK, - EQDMA_C2H_CRDT_COAL_CFG_1_TIMER_TH); - qdma_reg_write(dev_hndl, EQDMA_C2H_CRDT_COAL_CFG_1_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_CRDT_COAL_CFG_1_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_CRDT_COAL_CFG_1_ADDR, reg_val); -#define C2H_CRDT_COAL_CFG_2_RSVD_1_DFLT 0 -#define EQDMA_C2H_CRDT_COAL_CFG_2_FIFO_TH (EQDMA_PFTCH_CACHE_DEPTH - 8) -#define C2H_CRDT_COAL_CFG_2_RESERVED1_DFLT 0 -#define EQDMA_C2H_CRDT_COAL_CFG_2_CRDT_TH 96 - - reg_val = - FIELD_SET(C2H_CRDT_COAL_CFG_2_RSVD_1_MASK, - C2H_CRDT_COAL_CFG_2_RSVD_1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK, - (pfch_cache_dpth - 8)) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_RESERVED1_MASK, - C2H_CRDT_COAL_CFG_2_RESERVED1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_NT_TH_MASK, - EQDMA_C2H_CRDT_COAL_CFG_2_CRDT_TH); - qdma_reg_write(dev_hndl, EQDMA_C2H_CRDT_COAL_CFG_2_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_CRDT_COAL_CFG_2_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_CRDT_COAL_CFG_2_ADDR, reg_val); - -/**************** SET_3 *******************/ -#define EQDMA_GLBL2_RRQ_PCIE_THROT_REQ_EN 0 -#define GLBL2_RRQ_PCIE_THROT_REQ_DFLT 192 -#define GLBL2_RRQ_PCIE_THROT_DAT_EN_DFLT 1 -#define GLBL2_RRQ_PCIE_THROT_DAT_DFLT 20480 - - - reg_val = - FIELD_SET(GLBL2_RRQ_PCIE_THROT_REQ_EN_MASK, - EQDMA_GLBL2_RRQ_PCIE_THROT_REQ_EN) | - FIELD_SET(GLBL2_RRQ_PCIE_THROT_REQ_MASK, - GLBL2_RRQ_PCIE_THROT_REQ_DFLT) | - FIELD_SET(GLBL2_RRQ_PCIE_THROT_DAT_EN_MASK, - GLBL2_RRQ_PCIE_THROT_DAT_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_PCIE_THROT_DAT_MASK, - GLBL2_RRQ_PCIE_THROT_DAT_DFLT); - qdma_reg_write(dev_hndl, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR, reg_val); -#define GLBL2_RRQ_AXIMM_THROT_REQ_EN_DFLT 0 -#define GLBL2_RRQ_AXIMM_THROT_REQ_DFLT 0 -#define GLBL2_RRQ_AXIMM_THROT_DAT_EN_DFLT 0 -#define GLBL2_RRQ_AXIMM_THROT_DAT_DFLT 0 - - reg_val = - FIELD_SET(GLBL2_RRQ_AXIMM_THROT_REQ_EN_MASK, - GLBL2_RRQ_AXIMM_THROT_REQ_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_AXIMM_THROT_REQ_MASK, - GLBL2_RRQ_AXIMM_THROT_REQ_DFLT) | - FIELD_SET(GLBL2_RRQ_AXIMM_THROT_DAT_EN_MASK, - GLBL2_RRQ_AXIMM_THROT_DAT_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_AXIMM_THROT_DAT_MASK, - GLBL2_RRQ_AXIMM_THROT_DAT_DFLT); - qdma_reg_write(dev_hndl, EQDMA_GLBL2_RRQ_AXIMM_THROT_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_RRQ_AXIMM_THROT_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL2_RRQ_AXIMM_THROT_ADDR, reg_val); -#define GLBL2_RRQ_BRG_THROT_REQ_EN_DFLT 1 -#define GLBL2_RRQ_BRG_THROT_REQ_DFLT GLBL2_RRQ_PCIE_THROT_REQ_DFLT -#define GLBL2_RRQ_BRG_THROT_DAT_EN_DFLT 1 - - - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR); - qdma_log_info("%s: BF reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR, reg_val); - data_th = FIELD_GET(GLBL2_RRQ_PCIE_THROT_DAT_MASK, reg_val); - - reg_val = - FIELD_SET(GLBL2_RRQ_BRG_THROT_REQ_EN_MASK, - GLBL2_RRQ_BRG_THROT_REQ_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_BRG_THROT_REQ_MASK, - GLBL2_RRQ_BRG_THROT_REQ_DFLT) | - FIELD_SET(GLBL2_RRQ_BRG_THROT_DAT_EN_MASK, - GLBL2_RRQ_BRG_THROT_DAT_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_BRG_THROT_DAT_MASK, data_th); - qdma_reg_write(dev_hndl, EQDMA_GLBL2_RRQ_BRG_THROT_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_RRQ_BRG_THROT_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL2_RRQ_BRG_THROT_ADDR, reg_val); - -/******************* SET_4 *************************/ -#define EQDMA_H2C_REQ_THROT_PCIE_EN_REQ 1 -#define EQDMA_H2C_REQ_THROT_PCIE_REQ_TH GLBL2_RRQ_PCIE_THROT_REQ_DFLT -#define EQDMA_H2C_REQ_THROT_PCIE_EN_DATA 1 -#define EQDMA_H2C_REQ_THROT_PCIE_DATA_TH 24576 - - reg_val = - FIELD_SET(H2C_REQ_THROT_PCIE_EN_REQ_MASK, - EQDMA_H2C_REQ_THROT_PCIE_EN_REQ) | - FIELD_SET(H2C_REQ_THROT_PCIE_MASK, - EQDMA_H2C_REQ_THROT_PCIE_REQ_TH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_DATA_MASK, - EQDMA_H2C_REQ_THROT_PCIE_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_PCIE_DATA_THRESH_MASK, - EQDMA_H2C_REQ_THROT_PCIE_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_H2C_REQ_THROT_PCIE_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_H2C_REQ_THROT_PCIE_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_H2C_REQ_THROT_PCIE_ADDR, reg_val); -#define EQDMA_H2C_REQ_THROT_AXIMM_EN_REQ 1 -#define EQDMA_H2C_REQ_THROT_AXIMM_REQ_TH 64 -#define EQDMA_H2C_REQ_THROT_AXIMM_EN_DATA 1 -#define EQDMA_H2C_REQ_THROT_AXIMM_DATA_TH 16384 - - reg_val = - FIELD_SET(H2C_REQ_THROT_AXIMM_EN_REQ_MASK, - EQDMA_H2C_REQ_THROT_AXIMM_EN_REQ) | - FIELD_SET(H2C_REQ_THROT_AXIMM_MASK, - EQDMA_H2C_REQ_THROT_AXIMM_REQ_TH) | - FIELD_SET(H2C_REQ_THROT_AXIMM_EN_DATA_MASK, - EQDMA_H2C_REQ_THROT_AXIMM_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK, - EQDMA_H2C_REQ_THROT_AXIMM_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_H2C_REQ_THROT_AXIMM_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_H2C_REQ_THROT_AXIMM_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_H2C_REQ_THROT_AXIMM_ADDR, reg_val); - -#define H2C_MM_DATA_THROTTLE_RSVD_1_DFLT 0 -#define EQDMA_H2C_MM_DATA_TH_EN GLBL2_RRQ_PCIE_THROT_DAT_EN_DFLT -#define EQDMA_H2C_MM_DATA_TH GLBL2_RRQ_PCIE_THROT_DAT_DFLT - - reg_val = - FIELD_SET(H2C_MM_DATA_THROTTLE_RSVD_1_MASK, - H2C_MM_DATA_THROTTLE_RSVD_1_DFLT) | - FIELD_SET(H2C_MM_DATA_THROTTLE_DAT_EN_MASK, - EQDMA_H2C_MM_DATA_TH_EN) | - FIELD_SET(H2C_MM_DATA_THROTTLE_DAT_MASK, EQDMA_H2C_MM_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_H2C_MM_DATA_THROTTLE_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_H2C_MM_DATA_THROTTLE_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_H2C_MM_DATA_THROTTLE_ADDR, reg_val); - -} - - -/* - * eqdma_indirect_reg_invalidate() - helper function to invalidate indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = EQDMA_IND_CTXT_DATA_ADDR; - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_IND_CTXT_DATA_NUM_REGS; index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = EQDMA_IND_CTXT_DATA_ADDR; - - for (index = 0; index < ((2 * QDMA_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -int eqdma_get_ip_version(void *dev_hndl, uint8_t is_vf, - uint32_t *ip_version) -{ - uint32_t ver_reg_val = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_OFFSET_VF_VERSION : - EQDMA_GLBL2_MISC_CAP_ADDR; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - ver_reg_val = qdma_reg_read(dev_hndl, reg_addr); - - if (!is_vf) { - *ip_version = - FIELD_GET(EQDMA_GLBL2_IP_VERSION_MASK, - ver_reg_val); - } else { - *ip_version = - FIELD_GET(EQDMA_GLBL2_VF_IP_VERSION_MASK, - ver_reg_val); - } - - return QDMA_SUCCESS; -} - -/* - * eqdma_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void eqdma_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - int i = 0; - - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->pidx; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_arm; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->fnc_id; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->qen; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->frcd_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbi_chk; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbi_intvl_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->at; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->fetch_max; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->rngsz_idx; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->desc_sz; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->bypass; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->mm_chn; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbk_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->port_id; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_no_last; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->err; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->err_wb_sent; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_req; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->mrkr_dis; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->is_mm; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - eqdma_sw_ctxt_entries[i++].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->vec; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->intr_aggr; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->dis_intr_on_vf; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->pack_byp_out; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_byp; - -} - -/* - * eqdma_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void eqdma_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - int i = 0; - - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_stat_desc; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_int; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->trig_mode; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->fnc_id; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->counter_idx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_idx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->in_st; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->color; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ringsz_idx; - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->desc_sz; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->pidx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->cidx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->valid; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->err; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->user_trig_pend; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_running; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->full_upd; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ovf_chk_dis; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->at; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->vec; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->int_aggr; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dis_intr_on_vf; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dir_c2h; - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->sh_cmpt; -} - -/* - * eqdma_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void eqdma_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - int i = 0; - - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->cidx; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->crd_use; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->dsc_pend; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->idl_stp_b; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->evt_pnd; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->fetch_pnd; -} - -/* - * eqdma_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void eqdma_fill_credit_ctxt(struct qdma_descq_credit_ctxt *cr_ctxt) -{ - eqdma_credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * eqdma_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void eqdma_fill_pfetch_ctxt(struct qdma_descq_prefetch_ctxt - *pfetch_ctxt) -{ - int i = 0; - - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->bypass; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->bufsz_idx; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->port_id; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->var_desc; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->num_pftch; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->err; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch_en; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->sw_crdt; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->valid; -} - -/* - * eqdma_fill_fmap_ctxt() - Helper function to fill fmap context - * into structure - * - */ -static void eqdma_fill_fmap_ctxt(struct qdma_fmap_cfg *fmap_ctxt) -{ - eqdma_fmap_ctxt_entries[0].value = fmap_ctxt->qbase; - eqdma_fmap_ctxt_entries[1].value = fmap_ctxt->qmax; -} - -/* - * eqdma_fill_intr_ctxt() - Helper function to fill interrupt context - * into structure - * - */ -static void eqdma_fill_intr_ctxt(struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - int i = 0; - - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->valid; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->vec; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->int_st; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->color; - eqdma_ind_intr_ctxt_entries[i++].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - eqdma_ind_intr_ctxt_entries[i++].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->page_size; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->pidx; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->at; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->func_id; -} - -/*****************************************************************************/ -/** - * eqdma_set_default_global_csr() - function to set the global CSR register to - * default values. The value can be modified later by using the set/get csr - * functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_set_default_global_csr(void *dev_hndl) -{ - int rv = QDMA_SUCCESS; - - /* Default values */ - uint32_t cfg_val = 0, reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, 385, - 513, 769, 1025, 1537, 3073, 4097, 6145, 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, 32, 48, 64, - 80, 96, 112, 128, 144, 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 8192, - 9018, 16384}; - struct qdma_dev_attributes dev_cap; - uint32_t eqdma_ip_version; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - rv = eqdma_get_ip_version(dev_hndl, 0, &eqdma_ip_version); - if (rv != QDMA_SUCCESS) - return rv; - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_TIMER_CNT_ADDR, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - /* Writeback Interval */ - if (eqdma_ip_version == EQDMA_IP_VERSION_4) { - reg_val = - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - - qdma_reg_write(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR, - reg_val); - } - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - if (eqdma_ip_version == EQDMA_IP_VERSION_4) { - reg_val = qdma_reg_read(dev_hndl, - EQDMA_C2H_PFCH_CACHE_DEPTH_ADDR); - cfg_val = FIELD_GET(C2H_PFCH_CACHE_DEPTH_MASK, reg_val); - reg_val = FIELD_SET(C2H_PFCH_CFG_1_QCNT_MASK, - (cfg_val >> 2)) | - FIELD_SET(C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK, - ((cfg_val >> 2) - 4)); - - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_1_ADDR, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_C2H_PFCH_CFG_2_ADDR); - reg_val |= FIELD_SET(C2H_PFCH_CFG_2_FENCE_MASK, 1); - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_2_ADDR, - reg_val); - } - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, EQDMA_C2H_INT_TIMER_TICK_ADDR, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - EQDMA_C2H_WRB_COAL_BUF_DEPTH_ADDR); - reg_val = - FIELD_SET(C2H_WRB_COAL_CFG_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(C2H_WRB_COAL_CFG_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK, cfg_val); - qdma_reg_write(dev_hndl, EQDMA_C2H_WRB_COAL_CFG_ADDR, reg_val); - - /* H2C throttle Configuration*/ - if (eqdma_ip_version == EQDMA_IP_VERSION_4) { - reg_val = - FIELD_SET(H2C_REQ_THROT_PCIE_DATA_THRESH_MASK, - EQDMA_H2C_THROT_DATA_THRESH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_DATA_MASK, - EQDMA_THROT_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_PCIE_MASK, - EQDMA_H2C_THROT_REQ_THRESH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_REQ_MASK, - EQDMA_THROT_EN_REQ); - - qdma_reg_write(dev_hndl, EQDMA_H2C_REQ_THROT_PCIE_ADDR, - reg_val); - } - } - - if (eqdma_ip_version == EQDMA_IP_VERSION_5) - eqdma_set_perf_opt(dev_hndl); - return QDMA_SUCCESS; -} - -/* - * dump_eqdma_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - eqdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_H2C) { - eqdma_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_fill_credit_ctxt(&queue_context->cr_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_C2H) { - eqdma_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_fill_credit_ctxt(&queue_context->cr_ctxt); - if (st) { - eqdma_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - eqdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - } - - eqdma_fill_fmap_ctxt(&queue_context->fmap); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* SW context dump */ - n = sizeof(eqdma_sw_ctxt_entries) / - sizeof((eqdma_sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[i].name, - eqdma_sw_ctxt_entries[i].value, - eqdma_sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(eqdma_hw_ctxt_entries) / - sizeof((eqdma_hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_hw_ctxt_entries[i].name, - eqdma_hw_ctxt_entries[i].value, - eqdma_hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(eqdma_credit_ctxt_entries) / - sizeof((eqdma_credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_credit_ctxt_entries[i].name, - eqdma_credit_ctxt_entries[i].value, - eqdma_credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(eqdma_cmpt_ctxt_entries) / - sizeof((eqdma_cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[i].name, - eqdma_cmpt_ctxt_entries[i].value, - eqdma_cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(eqdma_c2h_pftch_ctxt_entries) / - sizeof(eqdma_c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_c2h_pftch_ctxt_entries[i].name, - eqdma_c2h_pftch_ctxt_entries[i].value, - eqdma_c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* FMAP context dump */ - n = sizeof(eqdma_fmap_ctxt_entries) / - sizeof((eqdma_fmap_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "FMAP Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_fmap_ctxt_entries[i].name, - eqdma_fmap_ctxt_entries[i].value, - eqdma_fmap_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * dump_eqdma_intr_context() - Helper function to dump interrupt context into - * string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - eqdma_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(eqdma_ind_intr_ctxt_entries) / - sizeof((eqdma_ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_ind_intr_ctxt_entries[i].name, - eqdma_ind_intr_ctxt_entries[i].value, - eqdma_ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/*****************************************************************************/ -/** - * eqdma_get_version() - Function to get the eqdma version - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @version_info: pointer to hold the version info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_OFFSET_VF_VERSION : - EQDMA_GLBL2_MISC_CAP_ADDR; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - qdma_fetch_version_details(dev_hndl, is_vf, reg_val, version_info); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[EQDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - pasid_l = - FIELD_GET(EQDMA_SW_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_SW_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - virtio_desc_base_l = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_m = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_h = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - ctxt->virtio_dsc_base); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W0_PIDX_MASK, ctxt->pidx) | - FIELD_SET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, ctxt->irq_arm) | - FIELD_SET(SW_IND_CTXT_DATA_W0_FNC_MASK, ctxt->fnc_id); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x\n", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - ctxt->wbi_intvl_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_AT_MASK, ctxt->at) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, ctxt->fetch_max) | - FIELD_SET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - ctxt->irq_no_last) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_MASK, ctxt->err) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - ctxt->err_wb_sent) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, ctxt->is_mm); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,err=%x", - __func__, ctxt->port_id, ctxt->irq_no_last, ctxt->err); - qdma_log_debug(", err_wb_sent=%x\n", ctxt->err_wb_sent); - - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->intr_aggr) | - FIELD_SET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - ctxt->virtio_en) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - ctxt->pack_byp_out) | - FIELD_SET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, ctxt->irq_byp) | - FIELD_SET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - virtio_desc_base_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - virtio_desc_base_m); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - virtio_desc_base_h); - - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t sw_ctxt[EQDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(SW_IND_CTXT_DATA_W0_PIDX_MASK, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, - sw_ctxt[0])); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_FNC_MASK, - sw_ctxt[0])); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - ctxt->qen = FIELD_GET(SW_IND_CTXT_DATA_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, sw_ctxt[1]); - ctxt->at = FIELD_GET(SW_IND_CTXT_DATA_W1_AT_MASK, sw_ctxt[1]); - ctxt->fetch_max = - (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, - sw_ctxt[1]); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, - sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, - sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, - sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, - sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, - sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, - sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, - sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, - sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, - sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, - sw_ctxt[1])); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,", - __func__, ctxt->port_id, ctxt->irq_no_last); - qdma_log_debug(" err=%x, err_wb_sent=%x\n", - ctxt->err, ctxt->err_wb_sent); - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - ctxt->vec = FIELD_GET(SW_IND_CTXT_DATA_W4_VEC_MASK, sw_ctxt[4]); - ctxt->intr_aggr = (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, - sw_ctxt[4])); - ctxt->dis_intr_on_vf = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - sw_ctxt[4])); - ctxt->virtio_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - sw_ctxt[4])); - ctxt->pack_byp_out = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - sw_ctxt[4])); - ctxt->irq_byp = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, - sw_ctxt[4])); - ctxt->host_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, - sw_ctxt[4])); - pasid_l = FIELD_GET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, sw_ctxt[4]); - - pasid_h = FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, sw_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, - sw_ctxt[5]); - virtio_desc_base_l = - FIELD_GET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - sw_ctxt[5]); - virtio_desc_base_m = - FIELD_GET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - sw_ctxt[6]); - - virtio_desc_base_h = - FIELD_GET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - sw_ctxt[6]); - - ctxt->pasid = - FIELD_SET(EQDMA_SW_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_SW_CTXT_PASID_GET_H_MASK, pasid_h); - - ctxt->virtio_dsc_base = - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - (uint64_t)virtio_desc_base_l) | - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - (uint64_t)virtio_desc_base_m) | - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - (uint64_t)virtio_desc_base_h); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_sw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_sw_context_write(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_sw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[EQDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, - ctxt->num_pftch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - ctxt->var_desc) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_ERR_MASK, ctxt->err) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, ctxt->pfch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, sw_crdt_l); - - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(PREFETCH_CTXT_DATA_W1_VALID_MASK, ctxt->valid); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t pfetch_ctxt[EQDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, pfetch_ctxt[0]); - ctxt->bufsz_idx = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - pfetch_ctxt[0]); - ctxt->num_pftch = (uint16_t) FIELD_GET( - PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, pfetch_ctxt[0]); - ctxt->port_id = - FIELD_GET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, pfetch_ctxt[0]); - ctxt->var_desc = (uint8_t) - FIELD_GET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - pfetch_ctxt[0]); - ctxt->err = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - FIELD_GET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, pfetch_ctxt[0]); - - sw_crdt_h = - FIELD_GET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_pfetch_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_pfetch_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_pfetch_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[EQDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr4_high_l, baddr4_high_h, - baddr4_low, pidx_l, pidx_h, pasid_l, pasid_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR) { - qdma_log_error("%s: trig_mode(%d) > (%d) is invalid, err:%d\n", - __func__, - ctxt->trig_mode, - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr4_high_l = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - ctxt->bs_addr); - baddr4_high_h = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - ctxt->bs_addr); - baddr4_low = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - ctxt->bs_addr); - - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, ctxt->pidx); - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, ctxt->pidx); - - pasid_l = - FIELD_GET(EQDMA_CMPL_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CMPL_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(CMPL_CTXT_DATA_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - ctxt->counter_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, ctxt->timer_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_INT_ST_MASK, ctxt->in_st) | - FIELD_SET(CMPL_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, ctxt->ringsz_idx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, baddr4_high_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, baddr4_high_h) | - FIELD_SET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, ctxt->desc_sz) | - FIELD_SET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, pidx_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, pidx_h) | - FIELD_SET(CMPL_CTXT_DATA_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(CMPL_CTXT_DATA_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(CMPL_CTXT_DATA_W3_ERR_MASK, ctxt->err) | - FIELD_SET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - ctxt->user_trig_pend); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, - ctxt->timer_running) | - FIELD_SET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, ctxt->full_upd) | - FIELD_SET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, - ctxt->ovf_chk_dis) | - FIELD_SET(CMPL_CTXT_DATA_W4_AT_MASK, ctxt->at) | - FIELD_SET(CMPL_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->int_aggr) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(CMPL_CTXT_DATA_W4_VIO_MASK, ctxt->vio) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, ctxt->dir_c2h) | - FIELD_SET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(CMPL_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - ctxt->pasid_en) | - FIELD_SET(CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, - baddr4_low) | - FIELD_SET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, ctxt->vio_eop) | - FIELD_SET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, ctxt->sh_cmpt); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cmpt_ctxt[EQDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr4_high_l, baddr4_high_h, baddr4_low, - pidx_l, pidx_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(CMPL_CTXT_DATA_W0_EN_INT_MASK, cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, - cmpt_ctxt[0])); - - baddr4_high_l = FIELD_GET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, - cmpt_ctxt[1]); - - baddr4_high_h = FIELD_GET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, - cmpt_ctxt[2]); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, cmpt_ctxt[2]); - - pidx_h = FIELD_GET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(CMPL_CTXT_DATA_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_ERR_MASK, - cmpt_ctxt[3])); - ctxt->user_trig_pend = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - cmpt_ctxt[3])); - - ctxt->timer_running = - FIELD_GET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, cmpt_ctxt[4]); - ctxt->full_upd = - FIELD_GET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, cmpt_ctxt[4]); - ctxt->ovf_chk_dis = - FIELD_GET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, cmpt_ctxt[4]); - ctxt->at = FIELD_GET(CMPL_CTXT_DATA_W4_AT_MASK, cmpt_ctxt[4]); - ctxt->vec = FIELD_GET(CMPL_CTXT_DATA_W4_VEC_MASK, cmpt_ctxt[4]); - ctxt->int_aggr = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, cmpt_ctxt[4])); - ctxt->dis_intr_on_vf = (uint8_t) - FIELD_GET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - cmpt_ctxt[4]); - ctxt->vio = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_VIO_MASK, - cmpt_ctxt[4]); - ctxt->dir_c2h = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, - cmpt_ctxt[4]); - ctxt->host_id = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, - cmpt_ctxt[4]); - pasid_l = FIELD_GET(CMPL_CTXT_DATA_W4_PASID_L_MASK, cmpt_ctxt[4]); - - pasid_h = (uint32_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_H_MASK, - cmpt_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - cmpt_ctxt[5]); - baddr4_low = (uint8_t)FIELD_GET( - CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, cmpt_ctxt[5]); - ctxt->vio_eop = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, - cmpt_ctxt[5]); - ctxt->sh_cmpt = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, - cmpt_ctxt[5]); - - ctxt->bs_addr = - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - (uint64_t)baddr4_high_l) | - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - (uint64_t)baddr4_high_h) | - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - (uint64_t)baddr4_low); - - ctxt->pasid = - FIELD_SET(EQDMA_CMPL_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CMPL_CTXT_PASID_GET_H_MASK, - (uint64_t)pasid_h); - - ctxt->pidx = - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, pidx_l) | - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, pidx_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cmpt_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cmpt_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cmpt_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t hw_ctxt[EQDMA_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or hw_ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(HW_IND_CTXT_DATA_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(HW_IND_CTXT_DATA_W0_CRD_USE_MASK, - hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, - hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->evt_pnd = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_EVT_PND_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = (uint8_t) - (FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, hw_ctxt[1])); - - qdma_log_debug("%s: cidx=%hu, crd_use=%hu, dsc_pend=%x\n", - __func__, ctxt->cidx, ctxt->crd_use, ctxt->dsc_pend); - qdma_log_debug("%s: idl_stp_b=%x, evt_pnd=%x, fetch_pnd=%x\n", - __func__, ctxt->idl_stp_b, ctxt->evt_pnd, - ctxt->fetch_pnd); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_hw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_hw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[EQDMA_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(CRED_CTXT_DATA_W0_CREDT_MASK, cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_credit_ctx_conf() - configure credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_credit_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_credit_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_fmap_context_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_fmap_context_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap[EQDMA_FMAP_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - fmap[num_words_count++] = - FIELD_SET(EQDMA_FMAP_CTXT_W0_QID_MASK, config->qbase); - fmap[num_words_count++] = - FIELD_SET(EQDMA_FMAP_CTXT_W1_QID_MAX_MASK, config->qmax); - - return eqdma_indirect_reg_write(dev_hndl, sel, func_id, - fmap, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_fmap_context_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_fmap_context_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - int rv = QDMA_SUCCESS; - uint32_t fmap[EQDMA_FMAP_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, func_id, - EQDMA_FMAP_NUM_WORDS, fmap); - if (rv < 0) - return rv; - - config->qbase = FIELD_GET(EQDMA_FMAP_CTXT_W0_QID_MASK, fmap[0]); - config->qmax = FIELD_GET(EQDMA_FMAP_CTXT_W1_QID_MAX_MASK, fmap[1]); - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_fmap_context_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_fmap_context_clear(void *dev_hndl, uint16_t func_id) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu\n", __func__, func_id); - return eqdma_indirect_reg_clear(dev_hndl, sel, func_id); -} - -/*****************************************************************************/ -/** - * eqdma_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_fmap_context_read(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_fmap_context_write(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_fmap_context_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_write() - create indirect interrupt context - * and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_write(void *dev_hndl, - uint16_t ring_index, const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[EQDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint32_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_m = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, - ctxt->baddr_4k); - baddr_h = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - pasid_l = - FIELD_GET(EQDMA_INTR_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_INTR_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(INTR_CTXT_DATA_W0_VEC_MASK, ctxt->vec) | - FIELD_SET(INTR_CTXT_DATA_W0_INT_ST_MASK, ctxt->int_st) | - FIELD_SET(INTR_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, baddr_m); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, baddr_h) | - FIELD_SET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, ctxt->page_size) | - FIELD_SET(INTR_CTXT_DATA_W2_PIDX_MASK, ctxt->pidx) | - FIELD_SET(INTR_CTXT_DATA_W2_AT_MASK, ctxt->at) | - FIELD_SET(INTR_CTXT_DATA_W2_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(INTR_CTXT_DATA_W2_PASID_L_MASK, pasid_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W3_PASID_H_MASK, pasid_h) | - FIELD_SET(INTR_CTXT_DATA_W3_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(INTR_CTXT_DATA_W3_FUNC_MASK, ctxt->func_id); - - return eqdma_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_read(void *dev_hndl, - uint16_t ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t intr_ctxt[EQDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, ring_index, - EQDMA_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(INTR_CTXT_DATA_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(INTR_CTXT_DATA_W0_VEC_MASK, intr_ctxt[0]); - ctxt->int_st = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_INT_ST_MASK, - intr_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_COLOR_MASK, - intr_ctxt[0])); - baddr_l = FIELD_GET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, intr_ctxt[0]); - - baddr_m = FIELD_GET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, intr_ctxt[1]); - - baddr_h = FIELD_GET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, intr_ctxt[2]); - ctxt->page_size = - FIELD_GET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, intr_ctxt[2]); - ctxt->pidx = - (uint16_t)(FIELD_GET(INTR_CTXT_DATA_W2_PIDX_MASK, - intr_ctxt[2])); - ctxt->at = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_AT_MASK, intr_ctxt[2])); - ctxt->host_id = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_HOST_ID_MASK, - intr_ctxt[2])); - pasid_l = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_PASID_L_MASK, - intr_ctxt[2])); - - pasid_h = FIELD_GET(INTR_CTXT_DATA_W3_PASID_H_MASK, intr_ctxt[3]); - ctxt->pasid_en = (uint8_t)FIELD_GET(INTR_CTXT_DATA_W3_PASID_EN_MASK, - intr_ctxt[3]); - - ctxt->func_id = (uint16_t)FIELD_GET(INTR_CTXT_DATA_W3_FUNC_MASK, - intr_ctxt[3]); - - ctxt->baddr_4k = - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, baddr_m) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - ctxt->pasid = - FIELD_SET(EQDMA_INTR_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_INTR_CTXT_PASID_GET_H_MASK, pasid_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_clear() - clear indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_clear(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_invalidate() - invalidate indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_indirect_intr_context_read(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_indirect_intr_context_write(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_indirect_intr_context_invalidate(dev_hndl, - ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < eqdma_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = eqdma_config_regs_get(); - - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s", reg_info[i].name); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm_queue_context() - Function to get qdma queue context dump - * in a buffer - * - * @dev_hndl: device handle - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @context: Queue Context - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_context(ctxt_data, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_dump_intr_context() - Function to get qdma interrupt context dump - * in a buffer - * - * @dev_hndl: device handle - * @intr_ctx: Interrupt Context - * @ring_index: Ring index - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - req_buflen = eqdma_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @func_id: function id - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = eqdma_sw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.sw_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read sw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_hw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.hw_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read hw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read credit context, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = eqdma_pfetch_ctx_conf(dev_hndl, - qid_hw, - &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read pftech context, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = eqdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read cmpt context, err = %d", - __func__, rv); - return rv; - } - } - - rv = eqdma_fmap_conf(dev_hndl, func_id, - &(context.fmap), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read fmap context, err = %d", - __func__, rv); - return rv; - } - - rv = dump_eqdma_context(&context, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_get_user_bar() - Function to get the AXI Master Lite(user bar) number - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite bar number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_OFFSET_VF_USER_BAR : - EQDMA_OFFSET_GLBL2_PF_BARLITE_EXT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: AXI Master Lite bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_hw_ram_sbe_err_process() - Function to dump SBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_ram_sbe_err_process(void *dev_hndl) -{ - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_SBE_STS_A_ADDR, - 1, NULL, 0); - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_SBE_STS_1_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_hw_ram_dbe_err_process() - Function to dump DBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_ram_dbe_err_process(void *dev_hndl) -{ - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_DBE_STS_A_ADDR, - 1, NULL, 0); - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_DBE_STS_1_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_hw_desc_err_process() - Function to dump Descriptor Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - EQDMA_GLBL_DSC_ERR_STS_ADDR, - EQDMA_GLBL_DSC_ERR_LOG0_ADDR, - EQDMA_GLBL_DSC_ERR_LOG1_ADDR, - EQDMA_GLBL_DSC_DBG_DAT0_ADDR, - EQDMA_GLBL_DSC_DBG_DAT1_ADDR, - EQDMA_GLBL_DSC_ERR_LOG2_ADDR - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_hw_trq_err_process() - Function to dump Target Access Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_GLBL_TRQ_ERR_LOG_ADDR - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_hw_err_dump_ctxt_info() - Dump the imp ctxt fields on HW error - * - * @dev_hndl: device handle - * @first_err_qid: First Error QID - * @en_st: ST Mode or MM Mode enabled - * @c2h: C2H or H2C Mode - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_err_dump_ctxt_info(void *dev_hndl, - uint32_t first_err_qid_reg, - uint8_t en_st, uint8_t c2h) -{ - uint16_t first_err_qid = 0; - struct qdma_descq_sw_ctxt sw_ctxt; - struct qdma_descq_hw_ctxt hw_ctxt; - struct qdma_descq_cmpt_ctxt cmpt_ctxt; - - first_err_qid = qdma_reg_read(dev_hndl, first_err_qid_reg); - - eqdma_sw_context_read(dev_hndl, c2h, first_err_qid, &sw_ctxt); - eqdma_hw_context_read(dev_hndl, c2h, first_err_qid, &hw_ctxt); - eqdma_fill_sw_ctxt(&sw_ctxt); - eqdma_fill_hw_ctxt(&hw_ctxt); - - if (sw_ctxt.pidx != hw_ctxt.cidx) { - qdma_log_info("\n%40s\n", "SW Context:"); - /** SW Context: PIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[0].name, - eqdma_sw_ctxt_entries[0].value, - eqdma_sw_ctxt_entries[0].value); - qdma_log_info("\n%40s\n", "HW Context:"); - /*** HW Context: CIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_hw_ctxt_entries[0].name, - eqdma_hw_ctxt_entries[0].value, - eqdma_hw_ctxt_entries[0].value); - } - - if (sw_ctxt.err != 0) { - /*** SW Context: ERR ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[17].name, - eqdma_sw_ctxt_entries[17].value, - eqdma_sw_ctxt_entries[17].value); - } - - /*** SW Context: ERR WB SENT***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[18].name, - eqdma_sw_ctxt_entries[18].value, - eqdma_sw_ctxt_entries[18].value); - - /*** SW Context: IRQ REQ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[19].name, - eqdma_sw_ctxt_entries[19].value, - eqdma_sw_ctxt_entries[19].value); - - if (en_st && c2h) { - eqdma_cmpt_context_read(dev_hndl, first_err_qid, &cmpt_ctxt); - eqdma_fill_cmpt_ctxt(&cmpt_ctxt); - - qdma_log_info("\n%40s\n", "CMPT Context:"); - - /*** CMPT Context: int_st ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[6].name, - eqdma_cmpt_ctxt_entries[6].value, - eqdma_cmpt_ctxt_entries[6].value); - - /** CMPT Context: PIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[12].name, - eqdma_cmpt_ctxt_entries[12].value, - eqdma_cmpt_ctxt_entries[12].value); - /*** CMPT Context: CIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[13].name, - eqdma_cmpt_ctxt_entries[13].value, - eqdma_cmpt_ctxt_entries[13].value); - - if (cmpt_ctxt.err != 0) { - /*** CMPT Context: ERR ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[15].name, - eqdma_cmpt_ctxt_entries[15].value, - eqdma_cmpt_ctxt_entries[15].value); - } - } -} -/*****************************************************************************/ -/** - * eqdma_hw_st_h2c_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - EQDMA_H2C_ERR_STAT_ADDR, - EQDMA_H2C_FIRST_ERR_QID_ADDR, - EQDMA_H2C_DBG_REG0_ADDR, - EQDMA_H2C_DBG_REG1_ADDR, - EQDMA_H2C_DBG_REG2_ADDR, - EQDMA_H2C_DBG_REG3_ADDR, - EQDMA_H2C_DBG_REG4_ADDR - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, st_h2c_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_H2C_FIRST_ERR_QID_ADDR, 1, 0); - -} - - -/*****************************************************************************/ -/** - * eqdma_hw_st_c2h_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - - uint32_t st_c2h_err_reg_list[] = { - EQDMA_C2H_ERR_STAT_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_C2H_FIRST_ERR_QID_ADDR, - EQDMA_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR, - EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR, - EQDMA_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR, - EQDMA_C2H_STAT_AXIS_PKG_CMP_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_0_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_1_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_2_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_3_ADDR, - EQDMA_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR, - EQDMA_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, st_c2h_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_C2H_FIRST_ERR_QID_ADDR, 1, 1); - -} - -/*****************************************************************************/ -/** - * eqdma_mm_c2h0_err_process() - Function to dump MM C2H - * Error information - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -static void eqdma_mm_c2h0_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t mm_c2h_err_reg_list[] = { - EQDMA_C2H_MM_STATUS_ADDR, - EQDMA_C2H_MM_CMPL_DESC_CNT_ADDR, - EQDMA_C2H_MM_ERR_CODE_ADDR, - EQDMA_C2H_MM_ERR_INFO_ADDR, - EQDMA_C2H_MM_DBG_ADDR - }; - int mm_c2h_err_num_regs = sizeof(mm_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < mm_c2h_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, mm_c2h_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_C2H_MM_ERR_INFO_ADDR, 0, 1); -} - -/*****************************************************************************/ -/** - * eqdma_mm_h2c0_err_process() - Function to dump MM H2C - * Error information - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -static void eqdma_mm_h2c0_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t mm_h2c_err_reg_list[] = { - EQDMA_H2C_MM_STATUS_ADDR, - EQDMA_H2C_MM_CMPL_DESC_CNT_ADDR, - EQDMA_H2C_MM_ERR_CODE_ADDR, - EQDMA_H2C_MM_ERR_INFO_ADDR, - EQDMA_H2C_MM_DBG_ADDR - }; - int mm_h2c_err_num_regs = sizeof(mm_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < mm_h2c_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, mm_h2c_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_H2C_MM_ERR_INFO_ADDR, 0, 1); -} - -/*****************************************************************************/ -/** - * eqdma_hw_get_error_name() - Function to get the error in string format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *eqdma_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= EQDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, (enum eqdma_error_idx)err_idx); - return NULL; - } - - return eqdma_err_info[(enum eqdma_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * eqdma_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t bit = 0, i = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS] = { - EQDMA_DSC_ERR_POISON, - EQDMA_TRQ_ERR_CSR_UNMAPPED, - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_SBE_ERR_MI_H2C0_DAT, - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_DBE_ERR_MI_H2C0_DAT, - EQDMA_MM_C2H_WR_SLR_ERR, - EQDMA_MM_H2C0_RD_HDR_POISON_ERR - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, EQDMA_GLBL_ERR_STAT_ADDR); - - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - - qdma_log_info("%s: Global Err Reg(0x%x) = 0x%x\n", - __func__, EQDMA_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - for (i = 0; i < EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - bit = hw_err_position[i]; - - if ((!dev_cap.st_en) && (bit == EQDMA_ST_C2H_ERR_MTY_MISMATCH || - bit == EQDMA_ST_FATAL_ERR_MTY_MISMATCH || - bit == EQDMA_ST_H2C_ERR_ZERO_LEN_DESC)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - eqdma_err_info[bit].stat_reg_addr); - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - eqdma_err_info[bit].stat_reg_addr, - err_stat); - - eqdma_err_info[bit].eqdma_hw_err_process( - dev_hndl); - for (idx = bit; idx < all_eqdma_hw_errs[i]; idx++) { - /* call the platform specific handler */ - if (err_stat & - eqdma_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s\n", - __func__, - eqdma_hw_get_error_name(idx)); - } - qdma_reg_write(dev_hndl, - eqdma_err_info[bit].stat_reg_addr, - err_stat); - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_STAT_ADDR, glbl_err_stat); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > EQDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, (enum eqdma_error_idx)err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == EQDMA_ERRS_ALL) { - for (i = 0; i < EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - - idx = all_eqdma_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == EQDMA_ST_C2H_ERR_ALL || - idx == EQDMA_ST_FATAL_ERR_ALL || - idx == EQDMA_ST_H2C_ERR_ALL) - continue; - } - - reg_val = eqdma_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - eqdma_err_info[idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_GLBL_ERR_MASK_ADDR); - reg_val |= FIELD_SET( - eqdma_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= EQDMA_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= EQDMA_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - eqdma_err_info[err_idx].mask_reg_addr); - reg_val |= FIELD_SET(eqdma_err_info[err_idx].leaf_err_mask, 1); - qdma_reg_write(dev_hndl, - eqdma_err_info[err_idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR); - reg_val |= - FIELD_SET(eqdma_err_info[err_idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_get_device_attributes() - Function to get the qdma device - * attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_PF_BARLITE_INT); - if (FIELD_GET(QDMA_GLBL2_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_CHANNEL_CAP_ADDR); - dev_info->num_qs = - FIELD_GET(GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK, reg_val); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_MISC_CAP_ADDR); - dev_info->mailbox_en = FIELD_GET(EQDMA_GLBL2_MAILBOX_EN_MASK, - reg_val); - dev_info->flr_present = FIELD_GET(EQDMA_GLBL2_FLR_PRESENT_MASK, - reg_val); - dev_info->mm_cmpt_en = 0; - dev_info->debug_mode = FIELD_GET(EQDMA_GLBL2_DBG_MODE_EN_MASK, - reg_val); - dev_info->desc_eng_mode = FIELD_GET(EQDMA_GLBL2_DESC_ENG_MODE_MASK, - reg_val); - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_CHANNEL_MDMA_ADDR); - dev_info->st_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ST_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ST_MASK, reg_val)) ? 1 : 0; - dev_info->mm_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ENG_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ENG_MASK, reg_val)) ? 1 : 0; - - /* num of mm channels */ - /* TODO : Register not yet defined for this. Hard coding it to 1.*/ - dev_info->mm_channel_max = 1; - - dev_info->qid2vec_ctx = 0; - dev_info->cmpt_ovf_chk_dis = 1; - dev_info->mailbox_intr = 1; - dev_info->sw_desc_64b = 1; - dev_info->cmpt_desc_64b = 1; - dev_info->dynamic_bar = 1; - dev_info->legacy_intr = 1; - dev_info->cmpt_trig_count_timer = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_init_ctxt_memory() - function to initialize the context memory - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - eqdma_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = eqdma_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - eqdma_indirect_reg_clear(dev_hndl, - QDMA_CTXT_SEL_FMAP, i); - -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return QDMA_SUCCESS; - -} - - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - - reg_info = eqdma_config_regs_get(); - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * eqdma_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - for (reg_count = 0; - (reg_count < total_regs);) { - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[reg_count].is_debug_reg == 1) - continue; - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; - -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - struct xreg_info *eqdma_config_regs = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_group) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = EQDMA_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = EQDMA_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = EQDMA_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = EQDMA_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid slot received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - reg_info = &eqdma_config_regs[reg_index]; - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_ring_sizes() - function to set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_ring_sizes() - function to get the global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_TIMER_CNT_ADDR, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - EQDMA_C2H_TIMER_CNT_ADDR, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_counter_threshold() - function to get the counter threshold - * values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_write() - function to set the writeback - * interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR); - reg_val |= FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - qdma_reg_write(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_read() - function to get the writeback - * interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_global_writeback_interval_write(dev_hndl, *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * eqdma_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? EQDMA_C2H_MM_CTL_ADDR : - EQDMA_H2C_MM_CTL_ADDR; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - - - return QDMA_SUCCESS; -} - -int eqdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = eqdma_config_num_regs_get(); - struct xreg_info *config_regs = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - config_regs[j].is_debug_reg == 1) - continue; - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_access.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_access.h deleted file mode 100755 index b2df4fe..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_access.h +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __EQDMA_SOFT_ACCESS_H_ -#define __EQDMA_SOFT_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum eqdma_error_idx { - /* Descriptor errors */ - EQDMA_DSC_ERR_POISON, - EQDMA_DSC_ERR_UR_CA, - EQDMA_DSC_ERR_BCNT, - EQDMA_DSC_ERR_PARAM, - EQDMA_DSC_ERR_ADDR, - EQDMA_DSC_ERR_TAG, - EQDMA_DSC_ERR_FLR, - EQDMA_DSC_ERR_TIMEOUT, - EQDMA_DSC_ERR_DAT_POISON, - EQDMA_DSC_ERR_FLR_CANCEL, - EQDMA_DSC_ERR_DMA, - EQDMA_DSC_ERR_DSC, - EQDMA_DSC_ERR_RQ_CANCEL, - EQDMA_DSC_ERR_DBE, - EQDMA_DSC_ERR_SBE, - EQDMA_DSC_ERR_PORT_ID, - EQDMA_DSC_ERR_ALL, - - /* TRQ Errors */ - EQDMA_TRQ_ERR_CSR_UNMAPPED, - EQDMA_TRQ_ERR_VF_ACCESS, - EQDMA_TRQ_ERR_TCP_CSR_TIMEOUT, - EQDMA_TRQ_ERR_QSPC_UNMAPPED, - EQDMA_TRQ_ERR_QID_RANGE, - EQDMA_TRQ_ERR_TCP_QSPC_TIMEOUT, - EQDMA_TRQ_ERR_ALL, - - /* C2H Errors */ - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_ST_C2H_ERR_LEN_MISMATCH, - EQDMA_ST_C2H_ERR_SH_CMPT_DSC, - EQDMA_ST_C2H_ERR_QID_MISMATCH, - EQDMA_ST_C2H_ERR_DESC_RSP_ERR, - EQDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - EQDMA_ST_C2H_ERR_MSI_INT_FAIL, - EQDMA_ST_C2H_ERR_ERR_DESC_CNT, - EQDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - EQDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - EQDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - EQDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - EQDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - EQDMA_ST_C2H_ERR_AVL_RING_DSC, - EQDMA_ST_C2H_ERR_HDR_ECC_UNC, - EQDMA_ST_C2H_ERR_HDR_ECC_COR, - EQDMA_ST_C2H_ERR_WRB_PORT_ID_ERR, - EQDMA_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_ST_FATAL_ERR_LEN_MISMATCH, - EQDMA_ST_FATAL_ERR_QID_MISMATCH, - EQDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_WPL_DATA_PAR, - EQDMA_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_HDR_ECC_UNC, - EQDMA_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - EQDMA_ST_H2C_ERR_NO_DMA_DSC, - EQDMA_ST_H2C_ERR_SBE, - EQDMA_ST_H2C_ERR_DBE, - EQDMA_ST_H2C_ERR_PAR, - EQDMA_ST_H2C_ERR_ALL, - - /* Single bit errors */ - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_SBE_1_ERR_TAG_ODD_RAM, - EQDMA_SBE_1_ERR_TAG_EVEN_RAM, - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_SBE_1_ERR_ALL, - - /* Single bit errors */ - EQDMA_SBE_ERR_MI_H2C0_DAT, - EQDMA_SBE_ERR_MI_H2C1_DAT, - EQDMA_SBE_ERR_MI_H2C2_DAT, - EQDMA_SBE_ERR_MI_H2C3_DAT, - EQDMA_SBE_ERR_MI_C2H0_DAT, - EQDMA_SBE_ERR_MI_C2H1_DAT, - EQDMA_SBE_ERR_MI_C2H2_DAT, - EQDMA_SBE_ERR_MI_C2H3_DAT, - EQDMA_SBE_ERR_H2C_RD_BRG_DAT, - EQDMA_SBE_ERR_H2C_WR_BRG_DAT, - EQDMA_SBE_ERR_C2H_RD_BRG_DAT, - EQDMA_SBE_ERR_C2H_WR_BRG_DAT, - EQDMA_SBE_ERR_FUNC_MAP, - EQDMA_SBE_ERR_DSC_HW_CTXT, - EQDMA_SBE_ERR_DSC_CRD_RCV, - EQDMA_SBE_ERR_DSC_SW_CTXT, - EQDMA_SBE_ERR_DSC_CPLI, - EQDMA_SBE_ERR_DSC_CPLD, - EQDMA_SBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_SBE_ERR_TIMER_FIFO_RAM, - EQDMA_SBE_ERR_QID_FIFO_RAM, - EQDMA_SBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_SBE_ERR_INT_CTXT_RAM, - EQDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_SBE_ERR_PFCH_CTXT_RAM, - EQDMA_SBE_ERR_WRB_CTXT_RAM, - EQDMA_SBE_ERR_PFCH_LL_RAM, - EQDMA_SBE_ERR_PEND_FIFO_RAM, - EQDMA_SBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_SBE_ERR_ALL, - - /* Double bit Errors */ - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_DBE_1_ERR_TAG_ODD_RAM, - EQDMA_DBE_1_ERR_TAG_EVEN_RAM, - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_DBE_1_ERR_ALL, - - /* Double bit Errors */ - EQDMA_DBE_ERR_MI_H2C0_DAT, - EQDMA_DBE_ERR_MI_H2C1_DAT, - EQDMA_DBE_ERR_MI_H2C2_DAT, - EQDMA_DBE_ERR_MI_H2C3_DAT, - EQDMA_DBE_ERR_MI_C2H0_DAT, - EQDMA_DBE_ERR_MI_C2H1_DAT, - EQDMA_DBE_ERR_MI_C2H2_DAT, - EQDMA_DBE_ERR_MI_C2H3_DAT, - EQDMA_DBE_ERR_H2C_RD_BRG_DAT, - EQDMA_DBE_ERR_H2C_WR_BRG_DAT, - EQDMA_DBE_ERR_C2H_RD_BRG_DAT, - EQDMA_DBE_ERR_C2H_WR_BRG_DAT, - EQDMA_DBE_ERR_FUNC_MAP, - EQDMA_DBE_ERR_DSC_HW_CTXT, - EQDMA_DBE_ERR_DSC_CRD_RCV, - EQDMA_DBE_ERR_DSC_SW_CTXT, - EQDMA_DBE_ERR_DSC_CPLI, - EQDMA_DBE_ERR_DSC_CPLD, - EQDMA_DBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_DBE_ERR_TIMER_FIFO_RAM, - EQDMA_DBE_ERR_QID_FIFO_RAM, - EQDMA_DBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_DBE_ERR_INT_CTXT_RAM, - EQDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_DBE_ERR_PFCH_CTXT_RAM, - EQDMA_DBE_ERR_WRB_CTXT_RAM, - EQDMA_DBE_ERR_PFCH_LL_RAM, - EQDMA_DBE_ERR_PEND_FIFO_RAM, - EQDMA_DBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_DBE_ERR_ALL, - - /* MM C2H Errors */ - EQDMA_MM_C2H_WR_SLR_ERR, - EQDMA_MM_C2H_RD_SLR_ERR, - EQDMA_MM_C2H_WR_FLR_ERR, - EQDMA_MM_C2H_UR_ERR, - EQDMA_MM_C2H_WR_UC_RAM_ERR, - EQDMA_MM_C2H_ERR_ALL, - - /* MM H2C Engine0 Errors */ - EQDMA_MM_H2C0_RD_HDR_POISON_ERR, - EQDMA_MM_H2C0_RD_UR_CA_ERR, - EQDMA_MM_H2C0_RD_HDR_BYTE_ERR, - EQDMA_MM_H2C0_RD_HDR_PARAM_ERR, - EQDMA_MM_H2C0_RD_HDR_ADR_ERR, - EQDMA_MM_H2C0_RD_FLR_ERR, - EQDMA_MM_H2C0_RD_DAT_POISON_ERR, - EQDMA_MM_H2C0_RD_RQ_DIS_ERR, - EQDMA_MM_H2C0_WR_DEC_ERR, - EQDMA_MM_H2C0_WR_SLV_ERR, - EQDMA_MM_H2C0_ERR_ALL, - - EQDMA_ERRS_ALL -}; - -struct eqdma_hw_err_info { - enum eqdma_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*eqdma_hw_err_process)(void *dev_hndl); -}; - -/* In QDMA_GLBL2_MISC_CAP(0x134) register, - * Bits [23:20] gives QDMA IP version. - * 0: QDMA3.1, 1: QDMA4.0, 2: QDMA5.0 - */ -#define EQDMA_IP_VERSION_4 1 -#define EQDMA_IP_VERSION_5 2 - -#define EQDMA_OFFSET_VF_VERSION 0x5014 -#define EQDMA_OFFSET_VF_USER_BAR 0x5018 - -#define EQDMA_OFFSET_MBOX_BASE_PF 0x22400 -#define EQDMA_OFFSET_MBOX_BASE_VF 0x5000 - -#define EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK GENMASK_ULL(63, 38) -#define EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK GENMASK_ULL(37, 6) -#define EQDMA_COMPL_CTXT_BADDR_LOW_MASK GENMASK_ULL(5, 2) - -int eqdma_init_ctxt_memory(void *dev_hndl); - -int eqdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - -int eqdma_get_ip_version(void *dev_hndl, uint8_t is_vf, - uint32_t *ip_version); - -int eqdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int eqdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int eqdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -int eqdma_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -uint32_t eqdma_reg_dump_buf_len(void); - -int eqdma_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int eqdma_hw_error_process(void *dev_hndl); -const char *eqdma_hw_get_error_name(uint32_t err_idx); -int eqdma_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int eqdma_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int eqdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -int eqdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - -int eqdma_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int eqdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int eqdma_set_default_global_csr(void *dev_hndl); - -int eqdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int eqdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int eqdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable); - -int eqdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -uint32_t eqdma_get_config_num_regs(void); - -struct xreg_info *eqdma_get_config_regs(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __EQDMA_SOFT_ACCESS_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_reg.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_reg.h deleted file mode 100755 index 4f326ea..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_reg.h +++ /dev/null @@ -1,1540 +0,0 @@ -/* - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __EQDMA_SOFT_REG_H -#define __EQDMA_SOFT_REG_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - -#define DEBGFS_LINE_SZ (81) - -#ifdef ARRAY_SIZE -#undef ARRAY_SIZE -#endif -#define ARRAY_SIZE(arr) (sizeof(arr) / \ - sizeof(arr[0])) - - -uint32_t eqdma_config_num_regs_get(void); -struct xreg_info *eqdma_config_regs_get(void); -#define EQDMA_CFG_BLK_IDENTIFIER_ADDR 0x00 -#define CFG_BLK_IDENTIFIER_MASK GENMASK(31, 20) -#define CFG_BLK_IDENTIFIER_1_MASK GENMASK(19, 16) -#define CFG_BLK_IDENTIFIER_RSVD_1_MASK GENMASK(15, 8) -#define CFG_BLK_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_CFG_BLK_PCIE_MAX_PLD_SIZE_ADDR 0x08 -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ADDR 0x0C -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_SYSTEM_ID_ADDR 0x10 -#define CFG_BLK_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 17) -#define CFG_BLK_SYSTEM_ID_INST_TYPE_MASK BIT(16) -#define CFG_BLK_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_CFG_BLK_MSIX_ENABLE_ADDR 0x014 -#define CFG_BLK_MSIX_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CFG_PCIE_DATA_WIDTH_ADDR 0x18 -#define CFG_PCIE_DATA_WIDTH_RSVD_1_MASK GENMASK(31, 3) -#define CFG_PCIE_DATA_WIDTH_DATAPATH_MASK GENMASK(2, 0) -#define EQDMA_CFG_PCIE_CTL_ADDR 0x1C -#define CFG_PCIE_CTL_RSVD_1_MASK GENMASK(31, 18) -#define CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK GENMASK(17, 16) -#define CFG_PCIE_CTL_RSVD_2_MASK GENMASK(15, 2) -#define CFG_PCIE_CTL_RRQ_DISABLE_MASK BIT(1) -#define CFG_PCIE_CTL_RELAXED_ORDERING_MASK BIT(0) -#define EQDMA_CFG_BLK_MSI_ENABLE_ADDR 0x20 -#define CFG_BLK_MSI_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CFG_AXI_USER_MAX_PLD_SIZE_ADDR 0x40 -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK GENMASK(2, 0) -#define EQDMA_CFG_AXI_USER_MAX_READ_REQ_SIZE_ADDR 0x44 -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_MISC_CTL_ADDR 0x4C -#define CFG_BLK_MISC_CTL_RSVD_1_MASK GENMASK(31, 24) -#define CFG_BLK_MISC_CTL_10B_TAG_EN_MASK BIT(23) -#define CFG_BLK_MISC_CTL_RSVD_2_MASK BIT(22) -#define CFG_BLK_MISC_CTL_AXI_WBK_MASK BIT(21) -#define CFG_BLK_MISC_CTL_AXI_DSC_MASK BIT(20) -#define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) -#define CFG_BLK_MISC_CTL_RSVD_3_MASK GENMASK(7, 5) -#define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) -#define EQDMA_CFG_PL_CRED_CTL_ADDR 0x68 -#define CFG_PL_CRED_CTL_RSVD_1_MASK GENMASK(31, 5) -#define CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK BIT(4) -#define CFG_PL_CRED_CTL_RSVD_2_MASK GENMASK(3, 1) -#define CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK BIT(0) -#define EQDMA_CFG_BLK_SCRATCH_ADDR 0x80 -#define CFG_BLK_SCRATCH_MASK GENMASK(31, 0) -#define EQDMA_CFG_GIC_ADDR 0xA0 -#define CFG_GIC_RSVD_1_MASK GENMASK(31, 1) -#define CFG_GIC_GIC_IRQ_MASK BIT(0) -#define EQDMA_RAM_SBE_MSK_1_A_ADDR 0xE0 -#define RAM_SBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_SBE_STS_1_A_ADDR 0xE4 -#define RAM_SBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_RAM_DBE_MSK_1_A_ADDR 0xE8 -#define RAM_DBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_DBE_STS_1_A_ADDR 0xEC -#define RAM_DBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_RAM_SBE_MSK_A_ADDR 0xF0 -#define RAM_SBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_SBE_STS_A_ADDR 0xF4 -#define RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_SBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_SBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_SBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_SBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_SBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_SBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_SBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_SBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_SBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_SBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_SBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_SBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_SBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_SBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_SBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_SBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_SBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_SBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_SBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_RAM_DBE_MSK_A_ADDR 0xF8 -#define RAM_DBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_DBE_STS_A_ADDR 0xFC -#define RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_DBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_DBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_DBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_DBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_DBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_DBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_DBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_DBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_DBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_DBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_DBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_DBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_DBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_DBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_DBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_DBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_DBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_DBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_DBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_GLBL2_IDENTIFIER_ADDR 0x100 -#define GLBL2_IDENTIFIER_MASK GENMASK(31, 8) -#define GLBL2_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_GLBL2_CHANNEL_INST_ADDR 0x114 -#define GLBL2_CHANNEL_INST_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_INST_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_INST_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_INST_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_INST_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_INST_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_INST_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_MDMA_ADDR 0x118 -#define GLBL2_CHANNEL_MDMA_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_MDMA_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_MDMA_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_MDMA_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_MDMA_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_MDMA_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_MDMA_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_STRM_ADDR 0x11C -#define GLBL2_CHANNEL_STRM_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_STRM_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_STRM_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_STRM_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_STRM_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_STRM_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_STRM_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_CAP_ADDR 0x120 -#define GLBL2_CHANNEL_CAP_RSVD_1_MASK GENMASK(31, 12) -#define GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK GENMASK(11, 0) -#define EQDMA_GLBL2_CHANNEL_PASID_CAP_ADDR 0x128 -#define GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK GENMASK(31, 2) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK BIT(1) -#define GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK BIT(0) -#define EQDMA_GLBL2_SYSTEM_ID_ADDR 0x130 -#define GLBL2_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_MISC_CAP_ADDR 0x134 -#define GLBL2_MISC_CAP_MASK GENMASK(31, 0) -#define EQDMA_GLBL2_RRQ_BRG_THROT_ADDR 0x158 -#define GLBL2_RRQ_BRG_THROT_REQ_EN_MASK BIT(31) -#define GLBL2_RRQ_BRG_THROT_REQ_MASK GENMASK(30, 19) -#define GLBL2_RRQ_BRG_THROT_DAT_EN_MASK BIT(18) -#define GLBL2_RRQ_BRG_THROT_DAT_MASK GENMASK(17, 0) -#define EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR 0x15C -#define GLBL2_RRQ_PCIE_THROT_REQ_EN_MASK BIT(31) -#define GLBL2_RRQ_PCIE_THROT_REQ_MASK GENMASK(30, 19) -#define GLBL2_RRQ_PCIE_THROT_DAT_EN_MASK BIT(18) -#define GLBL2_RRQ_PCIE_THROT_DAT_MASK GENMASK(17, 0) -#define EQDMA_GLBL2_RRQ_AXIMM_THROT_ADDR 0x160 -#define GLBL2_RRQ_AXIMM_THROT_REQ_EN_MASK BIT(31) -#define GLBL2_RRQ_AXIMM_THROT_REQ_MASK GENMASK(30, 19) -#define GLBL2_RRQ_AXIMM_THROT_DAT_EN_MASK BIT(18) -#define GLBL2_RRQ_AXIMM_THROT_DAT_MASK GENMASK(17, 0) -#define EQDMA_GLBL2_RRQ_PCIE_LAT0_ADDR 0x164 -#define GLBL2_RRQ_PCIE_LAT0_MAX_MASK GENMASK(31, 16) -#define GLBL2_RRQ_PCIE_LAT0_MIN_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_RRQ_PCIE_LAT1_ADDR 0x168 -#define GLBL2_RRQ_PCIE_LAT1_RSVD_MASK GENMASK(31, 17) -#define GLBL2_RRQ_PCIE_LAT1_OVFL_MASK BIT(16) -#define GLBL2_RRQ_PCIE_LAT1_AVG_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_RRQ_AXIMM_LAT0_ADDR 0x16C -#define GLBL2_RRQ_AXIMM_LAT0_MAX_MASK GENMASK(31, 16) -#define GLBL2_RRQ_AXIMM_LAT0_MIN_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_RRQ_AXIMM_LAT1_ADDR 0x170 -#define GLBL2_RRQ_AXIMM_LAT1_RSVD_MASK GENMASK(31, 17) -#define GLBL2_RRQ_AXIMM_LAT1_OVFL_MASK BIT(16) -#define GLBL2_RRQ_AXIMM_LAT1_AVG_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_DBG_PCIE_RQ0_ADDR 0x1B8 -#define GLBL2_PCIE_RQ0_NPH_AVL_MASK GENMASK(31, 20) -#define GLBL2_PCIE_RQ0_RCB_AVL_MASK GENMASK(19, 9) -#define GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK GENMASK(8, 2) -#define GLBL2_PCIE_RQ0_TAG_EP_MASK GENMASK(1, 0) -#define EQDMA_GLBL2_DBG_PCIE_RQ1_ADDR 0x1BC -#define GLBL2_PCIE_RQ1_RSVD_1_MASK GENMASK(31, 21) -#define GLBL2_PCIE_RQ1_TAG_FL_MASK GENMASK(20, 19) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK BIT(18) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK BIT(17) -#define GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK BIT(16) -#define GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK BIT(15) -#define GLBL2_PCIE_RQ1_TLPSM_MASK GENMASK(14, 12) -#define GLBL2_PCIE_RQ1_TLPSM512_MASK GENMASK(11, 9) -#define GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK BIT(8) -#define GLBL2_PCIE_RQ1_RREQ0_SLV_MASK BIT(7) -#define GLBL2_PCIE_RQ1_RREQ0_VLD_MASK BIT(6) -#define GLBL2_PCIE_RQ1_RREQ0_RDY_MASK BIT(5) -#define GLBL2_PCIE_RQ1_RREQ1_SLV_MASK BIT(4) -#define GLBL2_PCIE_RQ1_RREQ1_VLD_MASK BIT(3) -#define GLBL2_PCIE_RQ1_RREQ1_RDY_MASK BIT(2) -#define GLBL2_PCIE_RQ1_WTLP_REQ_MASK BIT(1) -#define GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_WR0_ADDR 0x1C0 -#define GLBL2_AXIMM_WR0_RSVD_1_MASK GENMASK(31, 27) -#define GLBL2_AXIMM_WR0_WR_REQ_MASK BIT(26) -#define GLBL2_AXIMM_WR0_WR_CHN_MASK GENMASK(25, 23) -#define GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK BIT(22) -#define GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK BIT(21) -#define GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK GENMASK(20, 18) -#define GLBL2_AXIMM_WR0_WRREQ_CNT_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR0_BID_MASK GENMASK(11, 9) -#define GLBL2_AXIMM_WR0_BVALID_MASK BIT(8) -#define GLBL2_AXIMM_WR0_BREADY_MASK BIT(7) -#define GLBL2_AXIMM_WR0_WVALID_MASK BIT(6) -#define GLBL2_AXIMM_WR0_WREADY_MASK BIT(5) -#define GLBL2_AXIMM_WR0_AWID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_WR0_AWVALID_MASK BIT(1) -#define GLBL2_AXIMM_WR0_AWREADY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_WR1_ADDR 0x1C4 -#define GLBL2_AXIMM_WR1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_WR1_BRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_WR1_BRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_WR1_BRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR1_BRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_WR1_BRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_GLBL2_DBG_AXIMM_RD0_ADDR 0x1C8 -#define GLBL2_AXIMM_RD0_RSVD_1_MASK GENMASK(31, 23) -#define GLBL2_AXIMM_RD0_PND_CNT_MASK GENMASK(22, 17) -#define GLBL2_AXIMM_RD0_RD_REQ_MASK BIT(16) -#define GLBL2_AXIMM_RD0_RD_CHNL_MASK GENMASK(15, 13) -#define GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK GENMASK(12, 10) -#define GLBL2_AXIMM_RD0_RID_MASK GENMASK(9, 7) -#define GLBL2_AXIMM_RD0_RVALID_MASK BIT(6) -#define GLBL2_AXIMM_RD0_RREADY_MASK BIT(5) -#define GLBL2_AXIMM_RD0_ARID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_RD0_ARVALID_MASK BIT(1) -#define GLBL2_AXIMM_RD0_ARREADY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_RD1_ADDR 0x1CC -#define GLBL2_AXIMM_RD1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_RD1_RRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_RD1_RRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_RD1_RRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_RD1_RRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_RD1_RRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_GLBL2_DBG_FAB0_ADDR 0x1D0 -#define GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK BIT(31) -#define GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK BIT(30) -#define GLBL2_FAB0_H2C_SEG_IN_VLD_MASK BIT(29) -#define GLBL2_FAB0_H2C_SEG_IN_RDY_MASK BIT(28) -#define GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK GENMASK(27, 24) -#define GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK BIT(23) -#define GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK GENMASK(22, 16) -#define GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK BIT(15) -#define GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK BIT(14) -#define GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK GENMASK(13, 10) -#define GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK BIT(9) -#define GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK BIT(8) -#define GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK BIT(7) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK BIT(6) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK BIT(5) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK BIT(3) -#define GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK BIT(2) -#define GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK BIT(1) -#define GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_FAB1_ADDR 0x1D4 -#define GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK GENMASK(31, 25) -#define GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK GENMASK(24, 18) -#define GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK BIT(17) -#define GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK BIT(16) -#define GLBL2_FAB1_RSVD_1_MASK GENMASK(15, 13) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK BIT(12) -#define GLBL2_FAB1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK BIT(8) -#define GLBL2_FAB1_RSVD_3_MASK GENMASK(7, 5) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB1_RSVD_4_MASK GENMASK(3, 1) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_MATCH_SEL_ADDR 0x1F4 -#define GLBL2_MATCH_SEL_RSV_MASK GENMASK(31, 18) -#define GLBL2_MATCH_SEL_CSR_SEL_MASK GENMASK(17, 13) -#define GLBL2_MATCH_SEL_CSR_EN_MASK BIT(12) -#define GLBL2_MATCH_SEL_ROTATE1_MASK GENMASK(11, 10) -#define GLBL2_MATCH_SEL_ROTATE0_MASK GENMASK(9, 8) -#define GLBL2_MATCH_SEL_SEL_MASK GENMASK(7, 0) -#define EQDMA_GLBL2_DBG_MATCH_MSK_ADDR 0x1F8 -#define GLBL2_MATCH_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL2_DBG_MATCH_PAT_ADDR 0x1FC -#define GLBL2_MATCH_PAT_PATTERN_MASK GENMASK(31, 0) -#define EQDMA_GLBL_RNG_SZ_1_ADDR 0x204 -#define GLBL_RNG_SZ_1_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_1_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_2_ADDR 0x208 -#define GLBL_RNG_SZ_2_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_2_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_3_ADDR 0x20C -#define GLBL_RNG_SZ_3_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_3_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_4_ADDR 0x210 -#define GLBL_RNG_SZ_4_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_4_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_5_ADDR 0x214 -#define GLBL_RNG_SZ_5_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_5_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_6_ADDR 0x218 -#define GLBL_RNG_SZ_6_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_6_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_7_ADDR 0x21C -#define GLBL_RNG_SZ_7_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_7_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_8_ADDR 0x220 -#define GLBL_RNG_SZ_8_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_8_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_9_ADDR 0x224 -#define GLBL_RNG_SZ_9_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_9_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_A_ADDR 0x228 -#define GLBL_RNG_SZ_A_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_A_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_B_ADDR 0x22C -#define GLBL_RNG_SZ_B_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_B_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_C_ADDR 0x230 -#define GLBL_RNG_SZ_C_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_C_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_D_ADDR 0x234 -#define GLBL_RNG_SZ_D_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_D_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_E_ADDR 0x238 -#define GLBL_RNG_SZ_E_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_E_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_F_ADDR 0x23C -#define GLBL_RNG_SZ_F_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_F_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_10_ADDR 0x240 -#define GLBL_RNG_SZ_10_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_10_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_ERR_STAT_ADDR 0x248 -#define GLBL_ERR_STAT_RSVD_1_MASK GENMASK(31, 18) -#define GLBL_ERR_STAT_ERR_FAB_MASK BIT(17) -#define GLBL_ERR_STAT_ERR_H2C_ST_MASK BIT(16) -#define GLBL_ERR_STAT_ERR_BDG_MASK BIT(15) -#define GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK GENMASK(14, 9) -#define GLBL_ERR_STAT_ERR_C2H_ST_MASK BIT(8) -#define GLBL_ERR_STAT_ERR_C2H_MM_1_MASK BIT(7) -#define GLBL_ERR_STAT_ERR_C2H_MM_0_MASK BIT(6) -#define GLBL_ERR_STAT_ERR_H2C_MM_1_MASK BIT(5) -#define GLBL_ERR_STAT_ERR_H2C_MM_0_MASK BIT(4) -#define GLBL_ERR_STAT_ERR_TRQ_MASK BIT(3) -#define GLBL_ERR_STAT_ERR_DSC_MASK BIT(2) -#define GLBL_ERR_STAT_ERR_RAM_DBE_MASK BIT(1) -#define GLBL_ERR_STAT_ERR_RAM_SBE_MASK BIT(0) -#define EQDMA_GLBL_ERR_MASK_ADDR 0x24C -#define GLBL_ERR_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CFG_ADDR 0x250 -#define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_CFG_C2H_UODSC_LIMIT_MASK GENMASK(29, 20) -#define GLBL_DSC_CFG_H2C_UODSC_LIMIT_MASK GENMASK(19, 10) -#define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) -#define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) -#define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) -#define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) -#define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define EQDMA_GLBL_DSC_ERR_STS_ADDR 0x254 -#define GLBL_DSC_ERR_STS_RSVD_1_MASK GENMASK(31, 26) -#define GLBL_DSC_ERR_STS_PORT_ID_MASK BIT(25) -#define GLBL_DSC_ERR_STS_SBE_MASK BIT(24) -#define GLBL_DSC_ERR_STS_DBE_MASK BIT(23) -#define GLBL_DSC_ERR_STS_RQ_CANCEL_MASK BIT(22) -#define GLBL_DSC_ERR_STS_DSC_MASK BIT(21) -#define GLBL_DSC_ERR_STS_DMA_MASK BIT(20) -#define GLBL_DSC_ERR_STS_FLR_CANCEL_MASK BIT(19) -#define GLBL_DSC_ERR_STS_RSVD_2_MASK GENMASK(18, 17) -#define GLBL_DSC_ERR_STS_DAT_POISON_MASK BIT(16) -#define GLBL_DSC_ERR_STS_TIMEOUT_MASK BIT(9) -#define GLBL_DSC_ERR_STS_FLR_MASK BIT(8) -#define GLBL_DSC_ERR_STS_TAG_MASK BIT(6) -#define GLBL_DSC_ERR_STS_ADDR_MASK BIT(5) -#define GLBL_DSC_ERR_STS_PARAM_MASK BIT(4) -#define GLBL_DSC_ERR_STS_BCNT_MASK BIT(3) -#define GLBL_DSC_ERR_STS_UR_CA_MASK BIT(2) -#define GLBL_DSC_ERR_STS_POISON_MASK BIT(1) -#define EQDMA_GLBL_DSC_ERR_MSK_ADDR 0x258 -#define GLBL_DSC_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_ERR_LOG0_ADDR 0x25C -#define GLBL_DSC_ERR_LOG0_VALID_MASK BIT(31) -#define GLBL_DSC_ERR_LOG0_SEL_MASK BIT(30) -#define GLBL_DSC_ERR_LOG0_RSVD_1_MASK GENMASK(29, 13) -#define GLBL_DSC_ERR_LOG0_QID_MASK GENMASK(12, 0) -#define EQDMA_GLBL_DSC_ERR_LOG1_ADDR 0x260 -#define GLBL_DSC_ERR_LOG1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_ERR_LOG1_CIDX_MASK GENMASK(27, 12) -#define GLBL_DSC_ERR_LOG1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK GENMASK(8, 5) -#define GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK GENMASK(4, 0) -#define EQDMA_GLBL_TRQ_ERR_STS_ADDR 0x264 -#define GLBL_TRQ_ERR_STS_RSVD_1_MASK GENMASK(31, 8) -#define GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK BIT(7) -#define GLBL_TRQ_ERR_STS_RSVD_2_MASK BIT(6) -#define GLBL_TRQ_ERR_STS_QID_RANGE_MASK BIT(5) -#define GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK BIT(4) -#define GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK BIT(3) -#define GLBL_TRQ_ERR_STS_RSVD_3_MASK BIT(2) -#define GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK BIT(1) -#define GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK BIT(0) -#define EQDMA_GLBL_TRQ_ERR_MSK_ADDR 0x268 -#define GLBL_TRQ_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL_TRQ_ERR_LOG_ADDR 0x26C -#define GLBL_TRQ_ERR_LOG_SRC_MASK BIT(31) -#define GLBL_TRQ_ERR_LOG_TARGET_MASK GENMASK(30, 27) -#define GLBL_TRQ_ERR_LOG_FUNC_MASK GENMASK(26, 17) -#define GLBL_TRQ_ERR_LOG_ADDRESS_MASK GENMASK(16, 0) -#define EQDMA_GLBL_DSC_DBG_DAT0_ADDR 0x270 -#define GLBL_DSC_DAT0_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK BIT(29) -#define GLBL_DSC_DAT0_CTXT_ARB_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK GENMASK(16, 12) -#define GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK BIT(11) -#define GLBL_DSC_DAT0_TMSTALL_MASK BIT(10) -#define GLBL_DSC_DAT0_RRQ_STALL_MASK GENMASK(9, 8) -#define GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK GENMASK(7, 6) -#define GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK GENMASK(5, 4) -#define GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK GENMASK(3, 2) -#define GLBL_DSC_DAT0_DSC_OUT_STALL_MASK GENMASK(1, 0) -#define EQDMA_GLBL_DSC_DBG_DAT1_ADDR 0x274 -#define GLBL_DSC_DAT1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_DAT1_EVT_SPC_C2H_MASK GENMASK(27, 22) -#define GLBL_DSC_DAT1_EVT_SP_H2C_MASK GENMASK(21, 16) -#define GLBL_DSC_DAT1_DSC_SPC_C2H_MASK GENMASK(15, 8) -#define GLBL_DSC_DAT1_DSC_SPC_H2C_MASK GENMASK(7, 0) -#define EQDMA_GLBL_DSC_DBG_CTL_ADDR 0x278 -#define GLBL_DSC_CTL_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_DSC_CTL_LAT_QID_MASK GENMASK(15, 4) -#define GLBL_DSC_CTL_DSC_ENG_LAT_CLR_MASK BIT(3) -#define GLBL_DSC_CTL_SELECT_MASK GENMASK(2, 0) -#define EQDMA_GLBL_DSC_ERR_LOG2_ADDR 0x27c -#define GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK GENMASK(31, 16) -#define GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK GENMASK(15, 0) -#define EQDMA_GLBL_GLBL_INTERRUPT_CFG_ADDR 0x2c4 -#define GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK GENMASK(31, 2) -#define GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK BIT(1) -#define GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK BIT(0) -#define EQDMA_GLBL_VCH_HOST_PROFILE_ADDR 0x2c8 -#define GLBL_VCH_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_VCH_HOST_PROFILE_2C_MM_MASK GENMASK(27, 24) -#define GLBL_VCH_HOST_PROFILE_2C_ST_MASK GENMASK(23, 20) -#define GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK GENMASK(19, 16) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK GENMASK(15, 12) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK GENMASK(7, 4) -#define GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK GENMASK(3, 0) -#define EQDMA_GLBL_BRIDGE_HOST_PROFILE_ADDR 0x308 -#define GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 4) -#define GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK GENMASK(3, 0) -#define EQDMA_AXIMM_IRQ_DEST_ADDR_ADDR 0x30c -#define AXIMM_IRQ_DEST_ADDR_ADDR_MASK GENMASK(31, 0) -#define EQDMA_FAB_ERR_LOG_ADDR 0x314 -#define FAB_ERR_LOG_RSVD_1_MASK GENMASK(31, 7) -#define FAB_ERR_LOG_SRC_MASK GENMASK(6, 0) -#define EQDMA_GLBL_REQ_ERR_STS_ADDR 0x318 -#define GLBL_REQ_ERR_STS_RSVD_1_MASK GENMASK(31, 11) -#define GLBL_REQ_ERR_STS_RC_DISCONTINUE_MASK BIT(10) -#define GLBL_REQ_ERR_STS_RC_PRTY_MASK BIT(9) -#define GLBL_REQ_ERR_STS_RC_FLR_MASK BIT(8) -#define GLBL_REQ_ERR_STS_RC_TIMEOUT_MASK BIT(7) -#define GLBL_REQ_ERR_STS_RC_INV_BCNT_MASK BIT(6) -#define GLBL_REQ_ERR_STS_RC_INV_TAG_MASK BIT(5) -#define GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH_MASK BIT(4) -#define GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH_MASK BIT(3) -#define GLBL_REQ_ERR_STS_RC_NO_DATA_MASK BIT(2) -#define GLBL_REQ_ERR_STS_RC_UR_CA_CRS_MASK BIT(1) -#define GLBL_REQ_ERR_STS_RC_POISONED_MASK BIT(0) -#define EQDMA_GLBL_REQ_ERR_MSK_ADDR 0x31C -#define GLBL_REQ_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_DBG_LAT0_A_ADDR 0x320 -#define GLBL_DSC_LAT0_A_LAT_MAX_MASK GENMASK(31, 16) -#define GLBL_DSC_LAT0_A_LAT_MIN_MASK GENMASK(15, 0) -#define EQDMA_GLBL_DSC_DBG_LAT1_A_ADDR 0x324 -#define GLBL_DSC_LAT1_A_RSVD_MASK GENMASK(31, 17) -#define GLBL_DSC_LAT1_A_LAT_OVF_MASK BIT(16) -#define GLBL_DSC_LAT1_A_LAT_AVG_MASK GENMASK(15, 0) -#define EQDMA_GLBL_DSC_CRD_CTR0_A_ADDR 0x328 -#define GLBL_DSC_CRD_CTR0_A_CRD_RCV_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CRD_CTR1_A_ADDR 0x32C -#define GLBL_DSC_CRD_CTR1_A_CRD_RCV_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CRD_CTR2_A_ADDR 0x330 -#define GLBL_DSC_CRD_CTR2_A_CRD_RCV_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CRD_CTR3_A_ADDR 0x334 -#define GLBL_DSC_CRD_CTR3_A_CRD_RCV_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_IMM_CRD_CTR0_A_ADDR 0x338 -#define GLBL_DSC_IMM_CRD_CTR0_A_RCV_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_IMM_CRD_CTR1_A_ADDR 0x33C -#define GLBL_DSC_IMM_CRD_CTR1_A_RCV_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_IMM_CRD_CTR2_A_ADDR 0x340 -#define GLBL_DSC_IMM_CRD_CTR2_A_RCV_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_IMM_CRD_CTR3_A_ADDR 0x344 -#define GLBL_DSC_IMM_CRD_CTR3_A_RCV_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_H2C_OUT_CTR0_A_ADDR 0x348 -#define GLBL_DSC_H2C_OUT_CTR0_A_H2CVLD_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_H2C_OUT_CTR1_A_ADDR 0x34C -#define GLBL_DSC_H2C_OUT_CTR1_A_H2CVLD_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_H2C_OUT_CTR2_A_ADDR 0x350 -#define GLBL_DSC_H2C_OUT_CTR2_A_H2CVLD_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_H2C_OUT_CTR3_A_ADDR 0x354 -#define GLBL_DSC_H2C_OUT_CTR3_A_H2CVLD_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_C2H_OUT_CTR0_A_ADDR 0x358 -#define GLBL_DSC_C2H_OUT_CTR0_A_C2HVLD_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_C2H_OUT_CTR1_A_ADDR 0x35C -#define GLBL_DSC_C2H_OUT_CTR1_A_C2HVLD_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_C2H_OUT_CTR2_A_ADDR 0x360 -#define GLBL_DSC_C2H_OUT_CTR2_A_C2HVLD_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_C2H_OUT_CTR3_A_ADDR 0x364 -#define GLBL_DSC_C2H_OUT_CTR3_A_C2HVLD_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_T_ADDR 0x368 -#define T_USER_CTR_MAX_MASK GENMASK(31, 0) -#define EQDMA_GLBL_PERF_CNTR_CTL_A1_ADDR 0x36C -#define GLBL_PERF_CNTR_CTL_A1_RSVD_MASK GENMASK(31, 18) -#define GLBL_PERF_CNTR_CTL_A1_USER_CTR_CLEAR_MASK BIT(17) -#define GLBL_PERF_CNTR_CTL_A1_USER_CTR_READ_MASK BIT(16) -#define GLBL_PERF_CNTR_CTL_A1_USER_CTR_MAX_MASK GENMASK(15, 0) -#define EQDMA_GLBL_FREE_CNT_A0_ADDR 0x370 -#define GLBL_FREE_CNT_A0_S_MASK GENMASK(31, 0) -#define EQDMA_GLBL_FREE_CNT_A1_ADDR 0x374 -#define GLBL_FREE_CNT_A1_RSVD_MASK GENMASK(31, 16) -#define GLBL_FREE_CNT_A1_S_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A0_ADDR 0x378 -#define GLBL_AXIS_H2C_CNT_A0_MPKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A1_ADDR 0x37C -#define GLBL_AXIS_H2C_CNT_A1_MIDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_AXIS_H2C_CNT_A1_MPKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A2_ADDR 0x380 -#define GLBL_AXIS_H2C_CNT_A2_MIDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A3_ADDR 0x384 -#define GLBL_AXIS_H2C_CNT_A3_MACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A4_ADDR 0x388 -#define GLBL_AXIS_H2C_CNT_A4_MBUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_AXIS_H2C_CNT_A4_MACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A5_ADDR 0x38C -#define GLBL_AXIS_H2C_CNT_A5_MBUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A0_ADDR 0x390 -#define GLBL_AXIS_C2H_CNT_A0_SPKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A1_ADDR 0x394 -#define GLBL_AXIS_C2H_CNT_A1_SIDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_AXIS_C2H_CNT_A1_SPKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A2_ADDR 0x398 -#define GLBL_AXIS_C2H_CNT_A2_SIDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A3_ADDR 0x39C -#define GLBL_AXIS_C2H_CNT_A3_SACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A4_ADDR 0x3A0 -#define GLBL_AXIS_C2H_CNT_A4_SBUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_AXIS_C2H_CNT_A4_SACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A5_ADDR 0x3A4 -#define GLBL_AXIS_C2H_CNT_A5_SBUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A0_ADDR 0x3A8 -#define GLBL_M_AXI_WR_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A1_ADDR 0x3AC -#define GLBL_M_AXI_WR_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXI_WR_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A2_ADDR 0x3B0 -#define GLBL_M_AXI_WR_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A3_ADDR 0x3B4 -#define GLBL_M_AXI_WR_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A4_ADDR 0x3B8 -#define GLBL_M_AXI_WR_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXI_WR_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A5_ADDR 0x3BC -#define GLBL_M_AXI_WR_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A0_ADDR 0x3C0 -#define GLBL_M_AXI_RD_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A1_ADDR 0x3C4 -#define GLBL_M_AXI_RD_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXI_RD_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A2_ADDR 0x3C8 -#define GLBL_M_AXI_RD_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A3_ADDR 0x3CC -#define GLBL_M_AXI_RD_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A4_ADDR 0x3D0 -#define GLBL_M_AXI_RD_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXI_RD_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A5_ADDR 0x3D4 -#define GLBL_M_AXI_RD_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A0_ADDR 0x3D8 -#define GLBL_M_AXIB_WR_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A1_ADDR 0x3DC -#define GLBL_M_AXIB_WR_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXIB_WR_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A2_ADDR 0x3E0 -#define GLBL_M_AXIB_WR_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A3_ADDR 0x3E4 -#define GLBL_M_AXIB_WR_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A4_ADDR 0x3E8 -#define GLBL_M_AXIB_WR_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXIB_WR_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A5_ADDR 0x3EC -#define GLBL_M_AXIB_WR_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A0_ADDR 0x3F0 -#define GLBL_M_AXIB_RD_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A1_ADDR 0x3F4 -#define GLBL_M_AXIB_RD_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXIB_RD_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A2_ADDR 0x3F8 -#define GLBL_M_AXIB_RD_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A3_ADDR 0x3FC -#define GLBL_M_AXIB_RD_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A4_ADDR 0x400 -#define GLBL_M_AXIB_RD_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXIB_RD_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A5_ADDR 0x404 -#define GLBL_M_AXIB_RD_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A0_ADDR 0x408 -#define GLBL_S_AXI_WR_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A1_ADDR 0x40C -#define GLBL_S_AXI_WR_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXI_WR_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A2_ADDR 0x410 -#define GLBL_S_AXI_WR_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A3_ADDR 0x414 -#define GLBL_S_AXI_WR_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A4_ADDR 0x418 -#define GLBL_S_AXI_WR_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXI_WR_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A5_ADDR 0x41C -#define GLBL_S_AXI_WR_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A0_ADDR 0x420 -#define GLBL_S_AXI_RD_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A1_ADDR 0x424 -#define GLBL_S_AXI_RD_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXI_RD_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A2_ADDR 0x428 -#define GLBL_S_AXI_RD_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A3_ADDR 0x42C -#define GLBL_S_AXI_RD_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A4_ADDR 0x430 -#define GLBL_S_AXI_RD_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXI_RD_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A5_ADDR 0x434 -#define GLBL_S_AXI_RD_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A0_ADDR 0x438 -#define GLBL_S_AXIS_CMP_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A1_ADDR 0x43C -#define GLBL_S_AXIS_CMP_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXIS_CMP_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A2_ADDR 0x440 -#define GLBL_S_AXIS_CMP_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A3_ADDR 0x444 -#define GLBL_S_AXIS_CMP_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A4_ADDR 0x448 -#define GLBL_S_AXIS_CMP_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXIS_CMP_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A5_ADDR 0x44C -#define GLBL_S_AXIS_CMP_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_DATA_ADDR 0x804 -#define IND_CTXT_DATA_DATA_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_MASK_ADDR 0x824 -#define IND_CTXT_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_CMD_ADDR 0x844 -#define IND_CTXT_CMD_RSVD_1_MASK GENMASK(31, 20) -#define IND_CTXT_CMD_QID_MASK GENMASK(19, 7) -#define IND_CTXT_CMD_OP_MASK GENMASK(6, 5) -#define IND_CTXT_CMD_SEL_MASK GENMASK(4, 1) -#define IND_CTXT_CMD_BUSY_MASK BIT(0) -#define EQDMA_C2H_TIMER_CNT_ADDR 0xA00 -#define C2H_TIMER_CNT_RSVD_1_MASK GENMASK(31, 16) -#define C2H_TIMER_CNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_CNT_TH_ADDR 0xA40 -#define C2H_CNT_TH_RSVD_1_MASK GENMASK(31, 16) -#define C2H_CNT_TH_THESHOLD_CNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CFG_1_ADDR 0xA80 -#define C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_1_QCNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CFG_2_ADDR 0xA84 -#define C2H_PFCH_CFG_2_FENCE_MASK BIT(31) -#define C2H_PFCH_CFG_2_RSVD_MASK GENMASK(30, 29) -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK BIT(28) -#define C2H_PFCH_CFG_2_LL_SZ_TH_MASK GENMASK(27, 12) -#define C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK GENMASK(11, 6) -#define C2H_PFCH_CFG_2_NUM_MASK GENMASK(5, 0) -#define EQDMA_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR 0xA88 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR 0xA8C -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR 0xA90 -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_AXIS_PKG_CMP_ADDR 0xA94 -#define C2H_STAT_AXIS_PKG_CMP_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_ACCEPTED_ADDR 0xA98 -#define C2H_STAT_DESC_RSP_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_CMP_ADDR 0xA9C -#define C2H_STAT_DESC_RSP_CMP_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_WRQ_OUT_ADDR 0xAA0 -#define C2H_STAT_WRQ_OUT_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_WPL_REN_ACCEPTED_ADDR 0xAA4 -#define C2H_STAT_WPL_REN_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_TOTAL_WRQ_LEN_ADDR 0xAA8 -#define C2H_STAT_TOTAL_WRQ_LEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_TOTAL_WPL_LEN_ADDR 0xAAC -#define C2H_STAT_TOTAL_WPL_LEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_BUF_SZ_ADDR 0xAB0 -#define C2H_BUF_SZ_IZE_MASK GENMASK(31, 0) -#define EQDMA_C2H_ERR_STAT_ADDR 0xAF0 -#define C2H_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK BIT(20) -#define C2H_ERR_STAT_HDR_PAR_ERR_MASK BIT(19) -#define C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK BIT(18) -#define C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(17) -#define C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK BIT(16) -#define C2H_ERR_STAT_WRB_PRTY_ERR_MASK BIT(15) -#define C2H_ERR_STAT_WRB_CIDX_ERR_MASK BIT(14) -#define C2H_ERR_STAT_WRB_QFULL_ERR_MASK BIT(13) -#define C2H_ERR_STAT_WRB_INV_Q_ERR_MASK BIT(12) -#define C2H_ERR_STAT_RSVD_2_MASK BIT(11) -#define C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK BIT(10) -#define C2H_ERR_STAT_ERR_DESC_CNT_MASK BIT(9) -#define C2H_ERR_STAT_RSVD_3_MASK BIT(8) -#define C2H_ERR_STAT_MSI_INT_FAIL_MASK BIT(7) -#define C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define C2H_ERR_STAT_RSVD_4_MASK BIT(5) -#define C2H_ERR_STAT_DESC_RSP_ERR_MASK BIT(4) -#define C2H_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK BIT(2) -#define C2H_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_C2H_ERR_MASK_ADDR 0xAF4 -#define C2H_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_C2H_FATAL_ERR_STAT_ADDR 0xAF8 -#define C2H_FATAL_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(20) -#define C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK BIT(19) -#define C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK BIT(18) -#define C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK BIT(17) -#define C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK BIT(15) -#define C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define C2H_FATAL_ERR_STAT_RESERVED2_MASK BIT(13) -#define C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK BIT(9) -#define C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK BIT(8) -#define C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK GENMASK(7, 4) -#define C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_FATAL_ERR_STAT_RESERVED1_MASK BIT(2) -#define C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_C2H_FATAL_ERR_MASK_ADDR 0xAFC -#define C2H_FATAL_ERR_C2HEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_FATAL_ERR_ENABLE_ADDR 0xB00 -#define C2H_FATAL_ERR_ENABLE_RSVD_1_MASK GENMASK(31, 2) -#define C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK BIT(1) -#define C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK BIT(0) -#define EQDMA_GLBL_ERR_INT_ADDR 0xB04 -#define GLBL_ERR_INT_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_ERR_INT_HOST_ID_MASK GENMASK(29, 26) -#define GLBL_ERR_INT_DIS_INTR_ON_VF_MASK BIT(25) -#define GLBL_ERR_INT_ARM_MASK BIT(24) -#define GLBL_ERR_INT_EN_COAL_MASK BIT(23) -#define GLBL_ERR_INT_VEC_MASK GENMASK(22, 12) -#define GLBL_ERR_INT_FUNC_MASK GENMASK(11, 0) -#define EQDMA_C2H_PFCH_CFG_ADDR 0xB08 -#define C2H_PFCH_CFG_EVTFL_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_FL_TH_MASK GENMASK(15, 0) -#define EQDMA_C2H_INT_TIMER_TICK_ADDR 0xB0C -#define C2H_INT_TIMER_TICK_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR 0xB10 -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR 0xB14 -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_REQ_ADDR 0xB18 -#define C2H_STAT_DESC_REQ_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_0_ADDR 0xB1C -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK BIT(31) -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK BIT(30) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK GENMASK(29, 27) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK GENMASK(26, 24) -#define C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK BIT(23) -#define C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK BIT(22) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK BIT(21) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK GENMASK(20, 9) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK BIT(8) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK GENMASK(7, 5) -#define C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK BIT(4) -#define C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK GENMASK(3, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_1_ADDR 0xB20 -#define C2H_STAT_DMA_ENG_1_WRB_USER_0_CMPT_TYPE_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_1_DESC_RSP_FIFO_OUT_VLD_MASK GENMASK(29, 29) -#define C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK GENMASK(6, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_2_ADDR 0xB24 -#define C2H_STAT_DMA_ENG_2_WRB_USER_1_CMPT_TYPE_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_2_DESC_RSP_FIFO_OUT_VLD_1_MASK GENMASK(29, 29) -#define C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_1_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_1_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_1_MASK GENMASK(6, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_3_ADDR 0xB28 -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_HAS_CMPT_MASK BIT(31) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_MARKER_MASK BIT(30) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_DROP_REQ_MASK BIT(29) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_QID_MASK GENMASK(28, 17) -#define C2H_STAT_DMA_ENG_3_WR_HDR_FIFO_OUT_CNT_MASK GENMASK(16, 12) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK BIT(11) -#define C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK BIT(10) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK BIT(9) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK BIT(8) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK BIT(7) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK BIT(6) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK BIT(5) -#define C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK BIT(4) -#define C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK BIT(3) -#define C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_MASK BIT(2) -#define C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK BIT(1) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK BIT(0) -#define EQDMA_C2H_DBG_PFCH_ERR_CTXT_ADDR 0xB2C -#define C2H_PFCH_ERR_CTXT_RSVD_1_MASK GENMASK(31, 14) -#define C2H_PFCH_ERR_CTXT_ERR_STAT_MASK BIT(13) -#define C2H_PFCH_ERR_CTXT_CMD_WR_MASK BIT(12) -#define C2H_PFCH_ERR_CTXT_QID_MASK GENMASK(11, 1) -#define C2H_PFCH_ERR_CTXT_DONE_MASK BIT(0) -#define EQDMA_C2H_FIRST_ERR_QID_ADDR 0xB30 -#define C2H_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(20, 16) -#define C2H_FIRST_ERR_QID_RSVD_MASK GENMASK(15, 13) -#define C2H_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_STAT_NUM_WRB_IN_ADDR 0xB34 -#define STAT_NUM_WRB_IN_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_IN_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_WRB_OUT_ADDR 0xB38 -#define STAT_NUM_WRB_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_OUT_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_WRB_DRP_ADDR 0xB3C -#define STAT_NUM_WRB_DRP_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_DRP_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_STAT_DESC_OUT_ADDR 0xB40 -#define STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_STAT_DESC_OUT_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_DSC_CRDT_SENT_ADDR 0xB44 -#define STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_DSC_CRDT_SENT_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_FCH_DSC_RCVD_ADDR 0xB48 -#define STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_BYP_DSC_RCVD_ADDR 0xB4C -#define STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK GENMASK(31, 11) -#define STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK GENMASK(10, 0) -#define EQDMA_C2H_WRB_COAL_CFG_ADDR 0xB50 -#define C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define C2H_WRB_COAL_CFG_TICK_VAL_MASK GENMASK(25, 14) -#define C2H_WRB_COAL_CFG_TICK_CNT_MASK GENMASK(13, 2) -#define C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK BIT(1) -#define C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK BIT(0) -#define EQDMA_C2H_INTR_H2C_REQ_ADDR 0xB54 -#define C2H_INTR_H2C_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_MM_REQ_ADDR 0xB58 -#define C2H_INTR_C2H_MM_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_MM_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_ERR_INT_REQ_ADDR 0xB5C -#define C2H_INTR_ERR_INT_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_ERR_INT_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_REQ_ADDR 0xB60 -#define C2H_INTR_C2H_ST_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_ADDR 0xB64 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_ADDR 0xB68 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_ADDR 0xB6C -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_ADDR 0xB70 -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_MSIX_ACK_ADDR 0xB74 -#define C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_MSIX_FAIL_ADDR 0xB78 -#define C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_NO_MSIX_ADDR 0xB7C -#define C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_CTXT_INVAL_ADDR 0xB80 -#define C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_WR_CMP_ADDR 0xB84 -#define C2H_STAT_WR_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WR_CMP_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_4_ADDR 0xB88 -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_HAS_CMPT_1_MASK BIT(31) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_MARKER_1_MASK BIT(30) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_DROP_REQ_1_MASK BIT(29) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_QID_1_MASK GENMASK(28, 17) -#define C2H_STAT_DMA_ENG_4_WR_HDR_FIFO_OUT_CNT_1_MASK GENMASK(16, 12) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_1_MASK BIT(11) -#define C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_1_MASK BIT(10) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_1_MASK BIT(9) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_1_MASK BIT(8) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_1_MASK BIT(7) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_1_MASK BIT(6) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_1_MASK BIT(5) -#define C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_1_MASK BIT(4) -#define C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_1_MASK BIT(3) -#define C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_1_MASK BIT(2) -#define C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_1_MASK BIT(1) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_1_MASK BIT(0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_5_ADDR 0xB8C -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_IN_RDY_MASK BIT(31) -#define C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK BIT(30) -#define C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK GENMASK(29, 24) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK GENMASK(23, 22) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK GENMASK(21, 6) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK BIT(5) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK BIT(4) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK BIT(3) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK BIT(2) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK BIT(1) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK BIT(0) -#define EQDMA_C2H_DBG_PFCH_QID_ADDR 0xB90 -#define C2H_PFCH_QID_RSVD_1_MASK GENMASK(31, 16) -#define C2H_PFCH_QID_ERR_CTXT_MASK BIT(15) -#define C2H_PFCH_QID_TARGET_MASK GENMASK(14, 12) -#define C2H_PFCH_QID_QID_OR_TAG_MASK GENMASK(11, 0) -#define EQDMA_C2H_DBG_PFCH_ADDR 0xB94 -#define C2H_PFCH_DATA_MASK GENMASK(31, 0) -#define EQDMA_C2H_INT_DBG_ADDR 0xB98 -#define C2H_INT_RSVD_1_MASK GENMASK(31, 8) -#define C2H_INT_INT_COAL_SM_MASK GENMASK(7, 4) -#define C2H_INT_INT_SM_MASK GENMASK(3, 0) -#define EQDMA_C2H_STAT_IMM_ACCEPTED_ADDR 0xB9C -#define C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_IMM_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_MARKER_ACCEPTED_ADDR 0xBA0 -#define C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_MARKER_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_DISABLE_CMP_ACCEPTED_ADDR 0xBA4 -#define C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_PLD_FIFO_CRDT_CNT_ADDR 0xBA8 -#define C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_PLD_FIFO_CRDT_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_DYN_REQ_ADDR 0xBAC -#define C2H_INTR_DYN_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_DYN_MISC_ADDR 0xBB0 -#define C2H_INTR_DYN_MISC_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_MISC_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_LEN_MISMATCH_ADDR 0xBB4 -#define C2H_DROP_LEN_MISMATCH_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_LEN_MISMATCH_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_DESC_RSP_LEN_ADDR 0xBB8 -#define C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_DESC_RSP_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_QID_FIFO_LEN_ADDR 0xBBC -#define C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_QID_FIFO_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_PLD_CNT_ADDR 0xBC0 -#define C2H_DROP_PLD_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_CMPT_FORMAT_0_ADDR 0xBC4 -#define C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_0_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_1_ADDR 0xBC8 -#define C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_1_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_2_ADDR 0xBCC -#define C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_2_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_3_ADDR 0xBD0 -#define C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_3_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_4_ADDR 0xBD4 -#define C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_4_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_5_ADDR 0xBD8 -#define C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_5_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_6_ADDR 0xBDC -#define C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_6_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CACHE_DEPTH_ADDR 0xBE0 -#define C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK GENMASK(23, 16) -#define C2H_PFCH_CACHE_DEPTH_MASK GENMASK(7, 0) -#define EQDMA_C2H_WRB_COAL_BUF_DEPTH_ADDR 0xBE4 -#define C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK GENMASK(31, 8) -#define C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK GENMASK(7, 0) -#define EQDMA_C2H_PFCH_CRDT_ADDR 0xBE8 -#define C2H_PFCH_CRDT_RSVD_1_MASK GENMASK(31, 1) -#define C2H_PFCH_CRDT_RSVD_2_MASK BIT(0) -#define EQDMA_C2H_STAT_HAS_CMPT_ACCEPTED_ADDR 0xBEC -#define C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_HAS_PLD_ACCEPTED_ADDR 0xBF0 -#define C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_PLD_PKT_ID_ADDR 0xBF4 -#define C2H_PLD_PKT_ID_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_DATA_MASK GENMASK(15, 0) -#define EQDMA_C2H_PLD_PKT_ID_1_ADDR 0xBF8 -#define C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_1_DATA_MASK GENMASK(15, 0) -#define EQDMA_C2H_DROP_PLD_CNT_1_ADDR 0xBFC -#define C2H_DROP_PLD_CNT_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_1_CNT_MASK GENMASK(17, 0) -#define EQDMA_H2C_ERR_STAT_ADDR 0xE00 -#define H2C_ERR_STAT_RSVD_1_MASK GENMASK(31, 6) -#define H2C_ERR_STAT_PAR_ERR_MASK BIT(5) -#define H2C_ERR_STAT_SBE_MASK BIT(4) -#define H2C_ERR_STAT_DBE_MASK BIT(3) -#define H2C_ERR_STAT_NO_DMA_DS_MASK BIT(2) -#define H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK BIT(1) -#define H2C_ERR_STAT_ZERO_LEN_DS_MASK BIT(0) -#define EQDMA_H2C_ERR_MASK_ADDR 0xE04 -#define H2C_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_H2C_FIRST_ERR_QID_ADDR 0xE08 -#define H2C_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 20) -#define H2C_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(19, 16) -#define H2C_FIRST_ERR_QID_RSVD_2_MASK GENMASK(15, 13) -#define H2C_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_H2C_DBG_REG0_ADDR 0xE0C -#define H2C_REG0_NUM_DSC_RCVD_MASK GENMASK(31, 16) -#define H2C_REG0_NUM_WRB_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG1_ADDR 0xE10 -#define H2C_REG1_NUM_REQ_SENT_MASK GENMASK(31, 16) -#define H2C_REG1_NUM_CMP_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG2_ADDR 0xE14 -#define H2C_REG2_RSVD_1_MASK GENMASK(31, 16) -#define H2C_REG2_NUM_ERR_DSC_RCVD_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG3_ADDR 0xE18 -#define H2C_REG3_RSVD_1_MASK BIT(31) -#define H2C_REG3_DSCO_FIFO_EMPTY_MASK BIT(30) -#define H2C_REG3_DSCO_FIFO_FULL_MASK BIT(29) -#define H2C_REG3_CUR_RC_STATE_MASK GENMASK(28, 26) -#define H2C_REG3_RDREQ_LINES_MASK GENMASK(25, 16) -#define H2C_REG3_RDATA_LINES_AVAIL_MASK GENMASK(15, 6) -#define H2C_REG3_PEND_FIFO_EMPTY_MASK BIT(5) -#define H2C_REG3_PEND_FIFO_FULL_MASK BIT(4) -#define H2C_REG3_CUR_RQ_STATE_MASK GENMASK(3, 2) -#define H2C_REG3_DSCI_FIFO_FULL_MASK BIT(1) -#define H2C_REG3_DSCI_FIFO_EMPTY_MASK BIT(0) -#define EQDMA_H2C_DBG_REG4_ADDR 0xE1C -#define H2C_REG4_RDREQ_ADDR_MASK GENMASK(31, 0) -#define EQDMA_H2C_FATAL_ERR_EN_ADDR 0xE20 -#define H2C_FATAL_ERR_EN_RSVD_1_MASK GENMASK(31, 1) -#define H2C_FATAL_ERR_EN_H2C_MASK BIT(0) -#define EQDMA_H2C_REQ_THROT_PCIE_ADDR 0xE24 -#define H2C_REQ_THROT_PCIE_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_PCIE_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_PCIE_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_PCIE_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_H2C_ALN_DBG_REG0_ADDR 0xE28 -#define H2C_ALN_REG0_NUM_PKT_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_REQ_THROT_AXIMM_ADDR 0xE2C -#define H2C_REQ_THROT_AXIMM_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_AXIMM_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_AXIMM_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_C2H_MM_CTL_ADDR 0x1004 -#define C2H_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define C2H_MM_CTL_ERRC_EN_MASK BIT(8) -#define C2H_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define C2H_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_C2H_MM_STATUS_ADDR 0x1040 -#define C2H_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define C2H_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_C2H_MM_CMPL_DESC_CNT_ADDR 0x1048 -#define C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1054 -#define C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK BIT(31) -#define C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK BIT(30) -#define C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK BIT(29) -#define C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK BIT(28) -#define C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK GENMASK(27, 2) -#define C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK BIT(1) -#define C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(0) -#define EQDMA_C2H_MM_ERR_CODE_ADDR 0x1058 -#define C2H_MM_ERR_CODE_RESERVED1_MASK GENMASK(31, 28) -#define C2H_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define C2H_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define C2H_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define C2H_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_C2H_MM_ERR_INFO_ADDR 0x105C -#define C2H_MM_ERR_INFO_VALID_MASK BIT(31) -#define C2H_MM_ERR_INFO_SEL_MASK BIT(30) -#define C2H_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define C2H_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_C2H_MM_PERF_MON_CTL_ADDR 0x10C0 -#define C2H_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define C2H_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define C2H_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_C2H_MM_PERF_MON_CYCLE_CNT0_ADDR 0x10C4 -#define C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_PERF_MON_CYCLE_CNT1_ADDR 0x10C8 -#define C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_C2H_MM_PERF_MON_DATA_CNT0_ADDR 0x10CC -#define C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_PERF_MON_DATA_CNT1_ADDR 0x10D0 -#define C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_C2H_MM_DBG_ADDR 0x10E8 -#define C2H_MM_RSVD_1_MASK GENMASK(31, 24) -#define C2H_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define C2H_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define C2H_MM_RD_STALL_MASK BIT(6) -#define C2H_MM_RRQ_FIFO_FI_MASK BIT(5) -#define C2H_MM_WR_STALL_MASK BIT(4) -#define C2H_MM_WRQ_FIFO_FI_MASK BIT(3) -#define C2H_MM_WBK_STALL_MASK BIT(2) -#define C2H_MM_DSC_FIFO_EP_MASK BIT(1) -#define C2H_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_H2C_MM_CTL_ADDR 0x1204 -#define H2C_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define H2C_MM_CTL_ERRC_EN_MASK BIT(8) -#define H2C_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define H2C_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_H2C_MM_STATUS_ADDR 0x1240 -#define H2C_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define H2C_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_H2C_MM_CMPL_DESC_CNT_ADDR 0x1248 -#define H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1254 -#define H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK GENMASK(31, 30) -#define H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(29) -#define H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK BIT(28) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK GENMASK(27, 23) -#define H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK BIT(22) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK GENMASK(21, 17) -#define H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK BIT(16) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK GENMASK(15, 9) -#define H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK BIT(8) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK GENMASK(7, 6) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK BIT(5) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK BIT(4) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK BIT(3) -#define H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK BIT(2) -#define H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK BIT(1) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK BIT(0) -#define EQDMA_H2C_MM_ERR_CODE_ADDR 0x1258 -#define H2C_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 28) -#define H2C_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define H2C_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define H2C_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define H2C_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_H2C_MM_ERR_INFO_ADDR 0x125C -#define H2C_MM_ERR_INFO_VALID_MASK BIT(31) -#define H2C_MM_ERR_INFO_SEL_MASK BIT(30) -#define H2C_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define H2C_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_H2C_MM_PERF_MON_CTL_ADDR 0x12C0 -#define H2C_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define H2C_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define H2C_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_H2C_MM_PERF_MON_CYCLE_CNT0_ADDR 0x12C4 -#define H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_PERF_MON_CYCLE_CNT1_ADDR 0x12C8 -#define H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_H2C_MM_PERF_MON_DATA_CNT0_ADDR 0x12CC -#define H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_PERF_MON_DATA_CNT1_ADDR 0x12D0 -#define H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_H2C_MM_DBG_ADDR 0x12E8 -#define H2C_MM_RSVD_1_MASK GENMASK(31, 24) -#define H2C_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define H2C_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define H2C_MM_RD_STALL_MASK BIT(6) -#define H2C_MM_RRQ_FIFO_FI_MASK BIT(5) -#define H2C_MM_WR_STALL_MASK BIT(4) -#define H2C_MM_WRQ_FIFO_FI_MASK BIT(3) -#define H2C_MM_WBK_STALL_MASK BIT(2) -#define H2C_MM_DSC_FIFO_EP_MASK BIT(1) -#define H2C_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_H2C_MM_DATA_THROTTLE_ADDR 0x12EC -#define H2C_MM_DATA_THROTTLE_RSVD_1_MASK GENMASK(31, 17) -#define H2C_MM_DATA_THROTTLE_DAT_EN_MASK BIT(16) -#define H2C_MM_DATA_THROTTLE_DAT_MASK GENMASK(15, 0) -#define EQDMA_C2H_CRDT_COAL_CFG_1_ADDR 0x1400 -#define C2H_CRDT_COAL_CFG_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK GENMASK(17, 10) -#define C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK GENMASK(9, 0) -#define EQDMA_C2H_CRDT_COAL_CFG_2_ADDR 0x1404 -#define C2H_CRDT_COAL_CFG_2_RSVD_1_MASK GENMASK(31, 24) -#define C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK GENMASK(23, 16) -#define C2H_CRDT_COAL_CFG_2_RESERVED1_MASK GENMASK(15, 11) -#define C2H_CRDT_COAL_CFG_2_NT_TH_MASK GENMASK(10, 0) -#define EQDMA_C2H_PFCH_BYP_QID_ADDR 0x1408 -#define C2H_PFCH_BYP_QID_RSVD_1_MASK GENMASK(31, 12) -#define C2H_PFCH_BYP_QID_MASK GENMASK(11, 0) -#define EQDMA_C2H_PFCH_BYP_TAG_ADDR 0x140C -#define C2H_PFCH_BYP_TAG_RSVD_1_MASK GENMASK(31, 20) -#define C2H_PFCH_BYP_TAG_BYP_QID_MASK GENMASK(19, 8) -#define C2H_PFCH_BYP_TAG_RSVD_2_MASK BIT(7) -#define C2H_PFCH_BYP_TAG_MASK GENMASK(6, 0) -#define EQDMA_C2H_WATER_MARK_ADDR 0x1410 -#define C2H_WATER_MARK_HIGH_WM_MASK GENMASK(31, 16) -#define C2H_WATER_MARK_LOW_WM_MASK GENMASK(15, 0) -#define EQDMA_C2H_NOTIFY_EMPTY_ADDR 0x1450 -#define C2H_NOTIFY_EMPTY_RSVD_1_MASK GENMASK(31, 16) -#define C2H_NOTIFY_EMPTY_NOE_MASK GENMASK(15, 0) -#define EQDMA_C2H_STAT_S_AXIS_C2H_ACCEPTED_1_ADDR 0x1454 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_1_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_1_ADDR 0x1458 -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_1_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_ADDR 0x145C -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_AXIS_PKG_CMP_1_ADDR 0x1460 -#define C2H_STAT_AXIS_PKG_CMP_1_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_2_ADDR 0x1464 -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_2_MASK GENMASK(31, 0) -#define EQDMA_C2H_ST_PLD_FIFO_DEPTH_ADDR 0x1468 -#define C2H_ST_PLD_FIFO_DEPTH_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_6_ADDR 0x146C -#define C2H_STAT_DMA_ENG_6_RSVD_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_6_PLD_ST_FIFO_OUT_DATA_QID_MASK GENMASK(28, 17) -#define C2H_STAT_DMA_ENG_6_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_MASK \ - GENMASK(16, 1) -#define C2H_STAT_DMA_ENG_6_PLD_PKT_ID_LARGER_PLD_ST_MASK BIT(0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_7_ADDR 0x1470 -#define C2H_STAT_DMA_ENG_7_RSVD_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_7_PLD_ST_FIFO_OUT_DATA_QID_1_MASK GENMASK(28, 17) -#define C2H_STAT_DMA_ENG_7_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_1_MASK \ - GENMASK(16, 1) -#define C2H_STAT_DMA_ENG_7_PLD_PKT_ID_LARGER_PLD_ST_1_MASK BIT(0) -#define EQDMA_C2H_STAT_PCIE_CMP_1_ADDR 0x1474 -#define C2H_STAT_PCIE_CMP_1_DEPTH_MASK GENMASK(31, 0) -#define EQDMA_C2H_PLD_FIFO_ALMOST_FULL_ADDR 0x1478 -#define C2H_PLD_FIFO_ALMOST_FULL_ENABLE_MASK BIT(31) -#define C2H_PLD_FIFO_ALMOST_FULL_TH_MASK GENMASK(30, 0) -#define EQDMA_PFCH_CFG_3_ADDR 0x147C -#define PFCH_CFG_3_RSVD_MASK GENMASK(31, 16) -#define PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_MASK GENMASK(15, 7) -#define PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_MASK GENMASK(6, 0) -#define EQDMA_CMPT_CFG_0_ADDR 0x1480 -#define CMPT_CFG_0_RSVD_MASK GENMASK(31, 2) -#define CMPT_CFG_0_VIO_SPRS_INT_AFTER_RTY_MASK BIT(1) -#define CMPT_CFG_0_VIO_EVNT_SUP_EN_MASK BIT(0) -#define EQDMA_PFCH_CFG_4_ADDR 0x1484 -#define PFCH_CFG_4_GLB_EVT_TIMER_TICK_MASK GENMASK(31, 17) -#define PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_MASK BIT(16) -#define PFCH_CFG_4_EVT_TIMER_TICK_MASK GENMASK(15, 1) -#define PFCH_CFG_4_DISABLE_EVT_TIMER_MASK BIT(0) -#define SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK GENMASK(31, 11) -#define SW_IND_CTXT_DATA_W5_PASID_EN_MASK BIT(10) -#define SW_IND_CTXT_DATA_W5_PASID_H_MASK GENMASK(9, 0) -#define SW_IND_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 20) -#define SW_IND_CTXT_DATA_W4_HOST_ID_MASK GENMASK(19, 16) -#define SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK BIT(15) -#define SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK BIT(14) -#define SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK BIT(13) -#define SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(12) -#define SW_IND_CTXT_DATA_W4_INT_AGGR_MASK BIT(11) -#define SW_IND_CTXT_DATA_W4_VEC_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W3_DSC_BASE_H_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W2_DSC_BASE_L_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W1_IS_MM_MASK BIT(31) -#define SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK BIT(30) -#define SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK BIT(29) -#define SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK BIT(28) -#define SW_IND_CTXT_DATA_W1_ERR_MASK GENMASK(27, 26) -#define SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK BIT(25) -#define SW_IND_CTXT_DATA_W1_PORT_ID_MASK GENMASK(24, 22) -#define SW_IND_CTXT_DATA_W1_IRQ_EN_MASK BIT(21) -#define SW_IND_CTXT_DATA_W1_WBK_EN_MASK BIT(20) -#define SW_IND_CTXT_DATA_W1_MM_CHN_MASK BIT(19) -#define SW_IND_CTXT_DATA_W1_BYPASS_MASK BIT(18) -#define SW_IND_CTXT_DATA_W1_DSC_SZ_MASK GENMASK(17, 16) -#define SW_IND_CTXT_DATA_W1_RNG_SZ_MASK GENMASK(15, 12) -#define SW_IND_CTXT_DATA_W1_RSVD_1_MASK GENMASK(11, 9) -#define SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK GENMASK(8, 5) -#define SW_IND_CTXT_DATA_W1_AT_MASK BIT(4) -#define SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK BIT(3) -#define SW_IND_CTXT_DATA_W1_WBI_CHK_MASK BIT(2) -#define SW_IND_CTXT_DATA_W1_FCRD_EN_MASK BIT(1) -#define SW_IND_CTXT_DATA_W1_QEN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W0_RSV_MASK GENMASK(31, 29) -#define SW_IND_CTXT_DATA_W0_FNC_MASK GENMASK(28, 17) -#define SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK BIT(16) -#define SW_IND_CTXT_DATA_W0_PIDX_MASK GENMASK(15, 0) -#define HW_IND_CTXT_DATA_W1_RSVD_1_MASK BIT(15) -#define HW_IND_CTXT_DATA_W1_FETCH_PND_MASK GENMASK(14, 11) -#define HW_IND_CTXT_DATA_W1_EVT_PND_MASK BIT(10) -#define HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK BIT(9) -#define HW_IND_CTXT_DATA_W1_DSC_PND_MASK BIT(8) -#define HW_IND_CTXT_DATA_W1_RSVD_2_MASK GENMASK(7, 0) -#define HW_IND_CTXT_DATA_W0_CRD_USE_MASK GENMASK(31, 16) -#define HW_IND_CTXT_DATA_W0_CIDX_MASK GENMASK(15, 0) -#define CRED_CTXT_DATA_W0_RSVD_1_MASK GENMASK(31, 16) -#define CRED_CTXT_DATA_W0_CREDT_MASK GENMASK(15, 0) -#define PREFETCH_CTXT_DATA_W1_VALID_MASK BIT(13) -#define PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define PREFETCH_CTXT_DATA_W0_PFCH_MASK BIT(28) -#define PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK BIT(27) -#define PREFETCH_CTXT_DATA_W0_ERR_MASK BIT(26) -#define PREFETCH_CTXT_DATA_W0_RSVD_MASK GENMASK(25, 22) -#define PREFETCH_CTXT_DATA_W0_PFCH_NEED_MASK GENMASK(21, 16) -#define PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK GENMASK(15, 10) -#define PREFETCH_CTXT_DATA_W0_VIRTIO_MASK BIT(9) -#define PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK BIT(8) -#define PREFETCH_CTXT_DATA_W0_PORT_ID_MASK GENMASK(7, 5) -#define PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK GENMASK(4, 1) -#define PREFETCH_CTXT_DATA_W0_BYPASS_MASK BIT(0) -#define CMPL_CTXT_DATA_W6_RSVD_1_H_MASK GENMASK(7, 0) -#define CMPL_CTXT_DATA_W5_RSVD_1_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W5_PORT_ID_MASK GENMASK(22, 20) -#define CMPL_CTXT_DATA_W5_SH_CMPT_MASK BIT(19) -#define CMPL_CTXT_DATA_W5_VIO_EOP_MASK BIT(18) -#define CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK GENMASK(17, 14) -#define CMPL_CTXT_DATA_W5_PASID_EN_MASK BIT(13) -#define CMPL_CTXT_DATA_W5_PASID_H_MASK GENMASK(12, 0) -#define CMPL_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W4_HOST_ID_MASK GENMASK(22, 19) -#define CMPL_CTXT_DATA_W4_DIR_C2H_MASK BIT(18) -#define CMPL_CTXT_DATA_W4_VIO_MASK BIT(17) -#define CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(16) -#define CMPL_CTXT_DATA_W4_INT_AGGR_MASK BIT(15) -#define CMPL_CTXT_DATA_W4_VEC_MASK GENMASK(14, 4) -#define CMPL_CTXT_DATA_W4_AT_MASK BIT(3) -#define CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK BIT(2) -#define CMPL_CTXT_DATA_W4_FULL_UPD_MASK BIT(1) -#define CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK BIT(0) -#define CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK BIT(31) -#define CMPL_CTXT_DATA_W3_ERR_MASK GENMASK(30, 29) -#define CMPL_CTXT_DATA_W3_VALID_MASK BIT(28) -#define CMPL_CTXT_DATA_W3_CIDX_MASK GENMASK(27, 12) -#define CMPL_CTXT_DATA_W3_PIDX_H_MASK GENMASK(11, 0) -#define CMPL_CTXT_DATA_W2_PIDX_L_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W2_DESC_SIZE_MASK GENMASK(27, 26) -#define CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK GENMASK(25, 0) -#define CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK GENMASK(31, 0) -#define CMPL_CTXT_DATA_W0_QSIZE_IX_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W0_COLOR_MASK BIT(27) -#define CMPL_CTXT_DATA_W0_INT_ST_MASK GENMASK(26, 25) -#define CMPL_CTXT_DATA_W0_TIMER_IX_MASK GENMASK(24, 21) -#define CMPL_CTXT_DATA_W0_CNTER_IX_MASK GENMASK(20, 17) -#define CMPL_CTXT_DATA_W0_FNC_ID_MASK GENMASK(16, 5) -#define CMPL_CTXT_DATA_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define CMPL_CTXT_DATA_W0_EN_INT_MASK BIT(1) -#define CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK BIT(0) -#define INTR_CTXT_DATA_W3_FUNC_MASK GENMASK(29, 18) -#define INTR_CTXT_DATA_W3_RSVD_MASK GENMASK(17, 14) -#define INTR_CTXT_DATA_W3_PASID_EN_MASK BIT(13) -#define INTR_CTXT_DATA_W3_PASID_H_MASK GENMASK(12, 0) -#define INTR_CTXT_DATA_W2_PASID_L_MASK GENMASK(31, 23) -#define INTR_CTXT_DATA_W2_HOST_ID_MASK GENMASK(22, 19) -#define INTR_CTXT_DATA_W2_AT_MASK BIT(18) -#define INTR_CTXT_DATA_W2_PIDX_MASK GENMASK(17, 6) -#define INTR_CTXT_DATA_W2_PAGE_SIZE_MASK GENMASK(5, 3) -#define INTR_CTXT_DATA_W2_BADDR_4K_H_MASK GENMASK(2, 0) -#define INTR_CTXT_DATA_W1_BADDR_4K_M_MASK GENMASK(31, 0) -#define INTR_CTXT_DATA_W0_BADDR_4K_L_MASK GENMASK(31, 15) -#define INTR_CTXT_DATA_W0_COLOR_MASK BIT(14) -#define INTR_CTXT_DATA_W0_INT_ST_MASK BIT(13) -#define INTR_CTXT_DATA_W0_RSVD1_MASK BIT(12) -#define INTR_CTXT_DATA_W0_VEC_MASK GENMASK(11, 1) -#define INTR_CTXT_DATA_W0_VALID_MASK BIT(0) -#define HOSTID_TABLE_W6_SMID_MASK GENMASK(9, 0) -#define HOSTID_TABLE_W5_H2C_MM_AWPROT_MASK GENMASK(27, 26) -#define HOSTID_TABLE_W5_H2C_MM_AWCACHE_MASK GENMASK(25, 22) -#define HOSTID_TABLE_W5_H2C_MM_AWSTEERING_MASK GENMASK(20, 18) -#define HOSTID_TABLE_W5_DSC_AWPROT_MASK GENMASK(17, 16) -#define HOSTID_TABLE_W5_DSC_AWCACHE_MASK GENMASK(15, 12) -#define HOSTID_TABLE_W5_DSC_AWSTEERING_MASK GENMASK(11, 8) -#define HOSTID_TABLE_W5_INT_MSG_AWPROT_MASK GENMASK(7, 6) -#define HOSTID_TABLE_W5_INT_MSG_AWCACHE_MASK GENMASK(5, 2) -#define HOSTID_TABLE_W5_INT_MSG_AWSTEERING_H_MASK GENMASK(0, 0) -#define HOSTID_TABLE_W4_INT_MSG_AWSTEERING_L_MASK GENMASK(31, 30) -#define HOSTID_TABLE_W4_INT_AGGR_AWPROT_MASK GENMASK(29, 28) -#define HOSTID_TABLE_W4_INT_AGGR_AWCACHE_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W4_INT_AGGR_AWSTEERING_MASK GENMASK(22, 20) -#define HOSTID_TABLE_W4_CMPT_AWPROT_MASK GENMASK(19, 18) -#define HOSTID_TABLE_W4_CMPT_AWCACHE_MASK GENMASK(17, 14) -#define HOSTID_TABLE_W4_CMPT_AWSTEERING_MASK GENMASK(12, 10) -#define HOSTID_TABLE_W4_C2H_PLD_AWPROT_MASK GENMASK(9, 8) -#define HOSTID_TABLE_W4_C2H_PLD_AWCACHE_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W4_C2H_PLD_AWSTEERING_MASK GENMASK(2, 0) -#define HOSTID_TABLE_W3_C2H_MM_ARPROT_MASK GENMASK(7, 6) -#define HOSTID_TABLE_W3_C2H_MM_ARCACHE_MASK GENMASK(5, 2) -#define HOSTID_TABLE_W3_C2H_MM_ARSTEERING_H_MASK GENMASK(0, 0) -#define HOSTID_TABLE_W2_C2H_MM_ARSTEERING_L_MASK GENMASK(31, 30) -#define HOSTID_TABLE_W2_H2C_MM_ARPROT_MASK GENMASK(29, 28) -#define HOSTID_TABLE_W2_H2C_MM_ARCACHE_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W2_H2C_MM_ARSTEERING_MASK GENMASK(22, 20) -#define HOSTID_TABLE_W2_H2C_ST_ARPROT_MASK GENMASK(19, 18) -#define HOSTID_TABLE_W2_H2C_ST_ARCACHE_MASK GENMASK(17, 14) -#define HOSTID_TABLE_W2_H2C_ST_ARSTEERING_MASK GENMASK(12, 10) -#define HOSTID_TABLE_W2_DSC_ARPOT_MASK GENMASK(9, 8) -#define HOSTID_TABLE_W2_DSC_ARCACHE_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W2_DSC_ARSTEERING_MASK GENMASK(2, 0) -#define HOSTID_TABLE_W0_VCH_H2C_MM_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W0_VCH_H2C_ST_MASK GENMASK(23, 20) -#define HOSTID_TABLE_W0_VCH_DSC_MASK GENMASK(19, 16) -#define HOSTID_TABLE_W0_VCH_INT_MSG_MASK GENMASK(15, 12) -#define HOSTID_TABLE_W0_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define HOSTID_TABLE_W0_VCH_CMPT_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W0_VCH_H2C_PLD_MASK GENMASK(3, 0) -#define CTXT_SELC_FNC_STS_W0_MSIX_MASK GENMASK(3, 3) -#define CTXT_SELC_FNC_STS_W0_MSIX_ENABLE_MASK GENMASK(2, 2) -#define CTXT_SELC_FNC_STS_W0_MEM_SPACE_ENABLE_MASK GENMASK(1, 1) -#define CTXT_SELC_FNC_STS_W0_BUS_MASTER_ENABLE_MASK GENMASK(0, 0) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c deleted file mode 100755 index 41950f9..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c +++ /dev/null @@ -1,5338 +0,0 @@ -/* - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "eqdma_soft_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_soft_reg_dump.tmh" -#endif - - -static struct regfield_info - cfg_blk_identifier_field_info[] = { - {"CFG_BLK_IDENTIFIER", - CFG_BLK_IDENTIFIER_MASK}, - {"CFG_BLK_IDENTIFIER_1", - CFG_BLK_IDENTIFIER_1_MASK}, - {"CFG_BLK_IDENTIFIER_RSVD_1", - CFG_BLK_IDENTIFIER_RSVD_1_MASK}, - {"CFG_BLK_IDENTIFIER_VERSION", - CFG_BLK_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_pld_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_PROG", - CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_read_req_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_system_id_field_info[] = { - {"CFG_BLK_SYSTEM_ID_RSVD_1", - CFG_BLK_SYSTEM_ID_RSVD_1_MASK}, - {"CFG_BLK_SYSTEM_ID_INST_TYPE", - CFG_BLK_SYSTEM_ID_INST_TYPE_MASK}, - {"CFG_BLK_SYSTEM_ID", - CFG_BLK_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - cfg_blk_msix_enable_field_info[] = { - {"CFG_BLK_MSIX_ENABLE", - CFG_BLK_MSIX_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_pcie_data_width_field_info[] = { - {"CFG_PCIE_DATA_WIDTH_RSVD_1", - CFG_PCIE_DATA_WIDTH_RSVD_1_MASK}, - {"CFG_PCIE_DATA_WIDTH_DATAPATH", - CFG_PCIE_DATA_WIDTH_DATAPATH_MASK}, -}; - - -static struct regfield_info - cfg_pcie_ctl_field_info[] = { - {"CFG_PCIE_CTL_RSVD_1", - CFG_PCIE_CTL_RSVD_1_MASK}, - {"CFG_PCIE_CTL_MGMT_AXIL_CTRL", - CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK}, - {"CFG_PCIE_CTL_RSVD_2", - CFG_PCIE_CTL_RSVD_2_MASK}, - {"CFG_PCIE_CTL_RRQ_DISABLE", - CFG_PCIE_CTL_RRQ_DISABLE_MASK}, - {"CFG_PCIE_CTL_RELAXED_ORDERING", - CFG_PCIE_CTL_RELAXED_ORDERING_MASK}, -}; - - -static struct regfield_info - cfg_blk_msi_enable_field_info[] = { - {"CFG_BLK_MSI_ENABLE", - CFG_BLK_MSI_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_pld_size_field_info[] = { - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_ISSUED", - CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_PROG", - CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_read_req_size_field_info[] = { - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK}, -}; - - -static struct regfield_info - cfg_blk_misc_ctl_field_info[] = { - {"CFG_BLK_MISC_CTL_RSVD_1", - CFG_BLK_MISC_CTL_RSVD_1_MASK}, - {"CFG_BLK_MISC_CTL_10B_TAG_EN", - CFG_BLK_MISC_CTL_10B_TAG_EN_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_2", - CFG_BLK_MISC_CTL_RSVD_2_MASK}, - {"CFG_BLK_MISC_CTL_AXI_WBK", - CFG_BLK_MISC_CTL_AXI_WBK_MASK}, - {"CFG_BLK_MISC_CTL_AXI_DSC", - CFG_BLK_MISC_CTL_AXI_DSC_MASK}, - {"CFG_BLK_MISC_CTL_NUM_TAG", - CFG_BLK_MISC_CTL_NUM_TAG_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_3", - CFG_BLK_MISC_CTL_RSVD_3_MASK}, - {"CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER", - CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK}, -}; - - -static struct regfield_info - cfg_pl_cred_ctl_field_info[] = { - {"CFG_PL_CRED_CTL_RSVD_1", - CFG_PL_CRED_CTL_RSVD_1_MASK}, - {"CFG_PL_CRED_CTL_SLAVE_CRD_RLS", - CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK}, - {"CFG_PL_CRED_CTL_RSVD_2", - CFG_PL_CRED_CTL_RSVD_2_MASK}, - {"CFG_PL_CRED_CTL_MASTER_CRD_RST", - CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_field_info[] = { - {"CFG_BLK_SCRATCH", - CFG_BLK_SCRATCH_MASK}, -}; - - -static struct regfield_info - cfg_gic_field_info[] = { - {"CFG_GIC_RSVD_1", - CFG_GIC_RSVD_1_MASK}, - {"CFG_GIC_GIC_IRQ", - CFG_GIC_GIC_IRQ_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_1_a_field_info[] = { - {"RAM_SBE_MSK_1_A", - RAM_SBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_1_a_field_info[] = { - {"RAM_SBE_STS_1_A_RSVD", - RAM_SBE_STS_1_A_RSVD_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_SBE_STS_1_A_TAG_EVEN_RAM", - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_SBE_STS_1_A_TAG_ODD_RAM", - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_1_a_field_info[] = { - {"RAM_DBE_MSK_1_A", - RAM_DBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_1_a_field_info[] = { - {"RAM_DBE_STS_1_A_RSVD", - RAM_DBE_STS_1_A_RSVD_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_DBE_STS_1_A_TAG_EVEN_RAM", - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_DBE_STS_1_A_TAG_ODD_RAM", - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_a_field_info[] = { - {"RAM_SBE_MSK_A", - RAM_SBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_a_field_info[] = { - {"RAM_SBE_STS_A_RC_RRQ_ODD_RAM", - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_SBE_STS_A_PEND_FIFO_RAM", - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_LL_RAM", - RAM_SBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_CTXT_RAM", - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_CTXT_RAM", - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_INT_CTXT_RAM", - RAM_SBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_COAL_DATA_RAM", - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_SBE_STS_A_QID_FIFO_RAM", - RAM_SBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_TIMER_FIFO_RAM", - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_DSC_CPLD", - RAM_SBE_STS_A_DSC_CPLD_MASK}, - {"RAM_SBE_STS_A_DSC_CPLI", - RAM_SBE_STS_A_DSC_CPLI_MASK}, - {"RAM_SBE_STS_A_DSC_SW_CTXT", - RAM_SBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_SBE_STS_A_DSC_CRD_RCV", - RAM_SBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_SBE_STS_A_DSC_HW_CTXT", - RAM_SBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_SBE_STS_A_FUNC_MAP", - RAM_SBE_STS_A_FUNC_MAP_MASK}, - {"RAM_SBE_STS_A_C2H_WR_BRG_DAT", - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_C2H_RD_BRG_DAT", - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_WR_BRG_DAT", - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_RD_BRG_DAT", - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H3_DAT", - RAM_SBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H2_DAT", - RAM_SBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H1_DAT", - RAM_SBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H0_DAT", - RAM_SBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C3_DAT", - RAM_SBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C2_DAT", - RAM_SBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C1_DAT", - RAM_SBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C0_DAT", - RAM_SBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_a_field_info[] = { - {"RAM_DBE_MSK_A", - RAM_DBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_a_field_info[] = { - {"RAM_DBE_STS_A_RC_RRQ_ODD_RAM", - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_DBE_STS_A_PEND_FIFO_RAM", - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_LL_RAM", - RAM_DBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_CTXT_RAM", - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_CTXT_RAM", - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_INT_CTXT_RAM", - RAM_DBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_COAL_DATA_RAM", - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_DBE_STS_A_QID_FIFO_RAM", - RAM_DBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_TIMER_FIFO_RAM", - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_DSC_CPLD", - RAM_DBE_STS_A_DSC_CPLD_MASK}, - {"RAM_DBE_STS_A_DSC_CPLI", - RAM_DBE_STS_A_DSC_CPLI_MASK}, - {"RAM_DBE_STS_A_DSC_SW_CTXT", - RAM_DBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_DBE_STS_A_DSC_CRD_RCV", - RAM_DBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_DBE_STS_A_DSC_HW_CTXT", - RAM_DBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_DBE_STS_A_FUNC_MAP", - RAM_DBE_STS_A_FUNC_MAP_MASK}, - {"RAM_DBE_STS_A_C2H_WR_BRG_DAT", - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_C2H_RD_BRG_DAT", - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_WR_BRG_DAT", - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_RD_BRG_DAT", - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H3_DAT", - RAM_DBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H2_DAT", - RAM_DBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H1_DAT", - RAM_DBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H0_DAT", - RAM_DBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C3_DAT", - RAM_DBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C2_DAT", - RAM_DBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C1_DAT", - RAM_DBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C0_DAT", - RAM_DBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_identifier_field_info[] = { - {"GLBL2_IDENTIFIER", - GLBL2_IDENTIFIER_MASK}, - {"GLBL2_IDENTIFIER_VERSION", - GLBL2_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - glbl2_channel_inst_field_info[] = { - {"GLBL2_CHANNEL_INST_RSVD_1", - GLBL2_CHANNEL_INST_RSVD_1_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ST", - GLBL2_CHANNEL_INST_C2H_ST_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ST", - GLBL2_CHANNEL_INST_H2C_ST_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_2", - GLBL2_CHANNEL_INST_RSVD_2_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ENG", - GLBL2_CHANNEL_INST_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_3", - GLBL2_CHANNEL_INST_RSVD_3_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ENG", - GLBL2_CHANNEL_INST_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_mdma_field_info[] = { - {"GLBL2_CHANNEL_MDMA_RSVD_1", - GLBL2_CHANNEL_MDMA_RSVD_1_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ST", - GLBL2_CHANNEL_MDMA_C2H_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ST", - GLBL2_CHANNEL_MDMA_H2C_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_2", - GLBL2_CHANNEL_MDMA_RSVD_2_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ENG", - GLBL2_CHANNEL_MDMA_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_3", - GLBL2_CHANNEL_MDMA_RSVD_3_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ENG", - GLBL2_CHANNEL_MDMA_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_strm_field_info[] = { - {"GLBL2_CHANNEL_STRM_RSVD_1", - GLBL2_CHANNEL_STRM_RSVD_1_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ST", - GLBL2_CHANNEL_STRM_C2H_ST_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ST", - GLBL2_CHANNEL_STRM_H2C_ST_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_2", - GLBL2_CHANNEL_STRM_RSVD_2_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ENG", - GLBL2_CHANNEL_STRM_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_3", - GLBL2_CHANNEL_STRM_RSVD_3_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ENG", - GLBL2_CHANNEL_STRM_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_cap_field_info[] = { - {"GLBL2_CHANNEL_CAP_RSVD_1", - GLBL2_CHANNEL_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_CAP_MULTIQ_MAX", - GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK}, -}; - - -static struct regfield_info - glbl2_channel_pasid_cap_field_info[] = { - {"GLBL2_CHANNEL_PASID_CAP_RSVD_1", - GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEEN", - GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_DMAEN", - GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK}, -}; - - -static struct regfield_info - glbl2_system_id_field_info[] = { - {"GLBL2_SYSTEM_ID_RSVD_1", - GLBL2_SYSTEM_ID_RSVD_1_MASK}, - {"GLBL2_SYSTEM_ID", - GLBL2_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - glbl2_misc_cap_field_info[] = { - {"GLBL2_MISC_CAP", - GLBL2_MISC_CAP_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_brg_throt_field_info[] = { - {"GLBL2_RRQ_BRG_THROT_REQ_EN", - GLBL2_RRQ_BRG_THROT_REQ_EN_MASK}, - {"GLBL2_RRQ_BRG_THROT_REQ", - GLBL2_RRQ_BRG_THROT_REQ_MASK}, - {"GLBL2_RRQ_BRG_THROT_DAT_EN", - GLBL2_RRQ_BRG_THROT_DAT_EN_MASK}, - {"GLBL2_RRQ_BRG_THROT_DAT", - GLBL2_RRQ_BRG_THROT_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_pcie_throt_field_info[] = { - {"GLBL2_RRQ_PCIE_THROT_REQ_EN", - GLBL2_RRQ_PCIE_THROT_REQ_EN_MASK}, - {"GLBL2_RRQ_PCIE_THROT_REQ", - GLBL2_RRQ_PCIE_THROT_REQ_MASK}, - {"GLBL2_RRQ_PCIE_THROT_DAT_EN", - GLBL2_RRQ_PCIE_THROT_DAT_EN_MASK}, - {"GLBL2_RRQ_PCIE_THROT_DAT", - GLBL2_RRQ_PCIE_THROT_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_aximm_throt_field_info[] = { - {"GLBL2_RRQ_AXIMM_THROT_REQ_EN", - GLBL2_RRQ_AXIMM_THROT_REQ_EN_MASK}, - {"GLBL2_RRQ_AXIMM_THROT_REQ", - GLBL2_RRQ_AXIMM_THROT_REQ_MASK}, - {"GLBL2_RRQ_AXIMM_THROT_DAT_EN", - GLBL2_RRQ_AXIMM_THROT_DAT_EN_MASK}, - {"GLBL2_RRQ_AXIMM_THROT_DAT", - GLBL2_RRQ_AXIMM_THROT_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_pcie_lat0_field_info[] = { - {"GLBL2_RRQ_PCIE_LAT0_MAX", - GLBL2_RRQ_PCIE_LAT0_MAX_MASK}, - {"GLBL2_RRQ_PCIE_LAT0_MIN", - GLBL2_RRQ_PCIE_LAT0_MIN_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_pcie_lat1_field_info[] = { - {"GLBL2_RRQ_PCIE_LAT1_RSVD", - GLBL2_RRQ_PCIE_LAT1_RSVD_MASK}, - {"GLBL2_RRQ_PCIE_LAT1_OVFL", - GLBL2_RRQ_PCIE_LAT1_OVFL_MASK}, - {"GLBL2_RRQ_PCIE_LAT1_AVG", - GLBL2_RRQ_PCIE_LAT1_AVG_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_aximm_lat0_field_info[] = { - {"GLBL2_RRQ_AXIMM_LAT0_MAX", - GLBL2_RRQ_AXIMM_LAT0_MAX_MASK}, - {"GLBL2_RRQ_AXIMM_LAT0_MIN", - GLBL2_RRQ_AXIMM_LAT0_MIN_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_aximm_lat1_field_info[] = { - {"GLBL2_RRQ_AXIMM_LAT1_RSVD", - GLBL2_RRQ_AXIMM_LAT1_RSVD_MASK}, - {"GLBL2_RRQ_AXIMM_LAT1_OVFL", - GLBL2_RRQ_AXIMM_LAT1_OVFL_MASK}, - {"GLBL2_RRQ_AXIMM_LAT1_AVG", - GLBL2_RRQ_AXIMM_LAT1_AVG_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq0_field_info[] = { - {"GLBL2_PCIE_RQ0_NPH_AVL", - GLBL2_PCIE_RQ0_NPH_AVL_MASK}, - {"GLBL2_PCIE_RQ0_RCB_AVL", - GLBL2_PCIE_RQ0_RCB_AVL_MASK}, - {"GLBL2_PCIE_RQ0_SLV_RD_CREDS", - GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK}, - {"GLBL2_PCIE_RQ0_TAG_EP", - GLBL2_PCIE_RQ0_TAG_EP_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq1_field_info[] = { - {"GLBL2_PCIE_RQ1_RSVD_1", - GLBL2_PCIE_RQ1_RSVD_1_MASK}, - {"GLBL2_PCIE_RQ1_TAG_FL", - GLBL2_PCIE_RQ1_TAG_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_EP", - GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_FL", - GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM", - GLBL2_PCIE_RQ1_TLPSM_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM512", - GLBL2_PCIE_RQ1_TLPSM512_MASK}, - {"GLBL2_PCIE_RQ1_RREQ_RCB_OK", - GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_SLV", - GLBL2_PCIE_RQ1_RREQ0_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_VLD", - GLBL2_PCIE_RQ1_RREQ0_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_RDY", - GLBL2_PCIE_RQ1_RREQ0_RDY_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_SLV", - GLBL2_PCIE_RQ1_RREQ1_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_VLD", - GLBL2_PCIE_RQ1_RREQ1_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_RDY", - GLBL2_PCIE_RQ1_RREQ1_RDY_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_REQ", - GLBL2_PCIE_RQ1_WTLP_REQ_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_STRADDLE", - GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr0_field_info[] = { - {"GLBL2_AXIMM_WR0_RSVD_1", - GLBL2_AXIMM_WR0_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR0_WR_REQ", - GLBL2_AXIMM_WR0_WR_REQ_MASK}, - {"GLBL2_AXIMM_WR0_WR_CHN", - GLBL2_AXIMM_WR0_WR_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP", - GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_WPL_FIFO_EP", - GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN", - GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WRREQ_CNT", - GLBL2_AXIMM_WR0_WRREQ_CNT_MASK}, - {"GLBL2_AXIMM_WR0_BID", - GLBL2_AXIMM_WR0_BID_MASK}, - {"GLBL2_AXIMM_WR0_BVALID", - GLBL2_AXIMM_WR0_BVALID_MASK}, - {"GLBL2_AXIMM_WR0_BREADY", - GLBL2_AXIMM_WR0_BREADY_MASK}, - {"GLBL2_AXIMM_WR0_WVALID", - GLBL2_AXIMM_WR0_WVALID_MASK}, - {"GLBL2_AXIMM_WR0_WREADY", - GLBL2_AXIMM_WR0_WREADY_MASK}, - {"GLBL2_AXIMM_WR0_AWID", - GLBL2_AXIMM_WR0_AWID_MASK}, - {"GLBL2_AXIMM_WR0_AWVALID", - GLBL2_AXIMM_WR0_AWVALID_MASK}, - {"GLBL2_AXIMM_WR0_AWREADY", - GLBL2_AXIMM_WR0_AWREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr1_field_info[] = { - {"GLBL2_AXIMM_WR1_RSVD_1", - GLBL2_AXIMM_WR1_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT4", - GLBL2_AXIMM_WR1_BRSP_CNT4_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT3", - GLBL2_AXIMM_WR1_BRSP_CNT3_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT2", - GLBL2_AXIMM_WR1_BRSP_CNT2_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT1", - GLBL2_AXIMM_WR1_BRSP_CNT1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT0", - GLBL2_AXIMM_WR1_BRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd0_field_info[] = { - {"GLBL2_AXIMM_RD0_RSVD_1", - GLBL2_AXIMM_RD0_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD0_PND_CNT", - GLBL2_AXIMM_RD0_PND_CNT_MASK}, - {"GLBL2_AXIMM_RD0_RD_REQ", - GLBL2_AXIMM_RD0_RD_REQ_MASK}, - {"GLBL2_AXIMM_RD0_RD_CHNL", - GLBL2_AXIMM_RD0_RD_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL", - GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RID", - GLBL2_AXIMM_RD0_RID_MASK}, - {"GLBL2_AXIMM_RD0_RVALID", - GLBL2_AXIMM_RD0_RVALID_MASK}, - {"GLBL2_AXIMM_RD0_RREADY", - GLBL2_AXIMM_RD0_RREADY_MASK}, - {"GLBL2_AXIMM_RD0_ARID", - GLBL2_AXIMM_RD0_ARID_MASK}, - {"GLBL2_AXIMM_RD0_ARVALID", - GLBL2_AXIMM_RD0_ARVALID_MASK}, - {"GLBL2_AXIMM_RD0_ARREADY", - GLBL2_AXIMM_RD0_ARREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd1_field_info[] = { - {"GLBL2_AXIMM_RD1_RSVD_1", - GLBL2_AXIMM_RD1_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT4", - GLBL2_AXIMM_RD1_RRSP_CNT4_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT3", - GLBL2_AXIMM_RD1_RRSP_CNT3_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT2", - GLBL2_AXIMM_RD1_RRSP_CNT2_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT1", - GLBL2_AXIMM_RD1_RRSP_CNT1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT0", - GLBL2_AXIMM_RD1_RRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab0_field_info[] = { - {"GLBL2_FAB0_H2C_INB_CONV_IN_VLD", - GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_INB_CONV_IN_RDY", - GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_VLD", - GLBL2_FAB0_H2C_SEG_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_RDY", - GLBL2_FAB0_H2C_SEG_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_VLD", - GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_RDY", - GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_H2C_MST_CRDT_STAT", - GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_FULL", - GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY", - GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_VLD", - GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_RDY", - GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_VLD", - GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_RDY", - GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD", - GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY", - GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_FULL", - GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY", - GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY", - GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab1_field_info[] = { - {"GLBL2_FAB1_BYP_OUT_CRDT_STAT", - GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK}, - {"GLBL2_FAB1_TM_DSC_STS_CRDT_STAT", - GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_FULL", - GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_1", - GLBL2_FAB1_RSVD_1_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_2", - GLBL2_FAB1_RSVD_2_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_3", - GLBL2_FAB1_RSVD_3_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_4", - GLBL2_FAB1_RSVD_4_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_sel_field_info[] = { - {"GLBL2_MATCH_SEL_RSV", - GLBL2_MATCH_SEL_RSV_MASK}, - {"GLBL2_MATCH_SEL_CSR_SEL", - GLBL2_MATCH_SEL_CSR_SEL_MASK}, - {"GLBL2_MATCH_SEL_CSR_EN", - GLBL2_MATCH_SEL_CSR_EN_MASK}, - {"GLBL2_MATCH_SEL_ROTATE1", - GLBL2_MATCH_SEL_ROTATE1_MASK}, - {"GLBL2_MATCH_SEL_ROTATE0", - GLBL2_MATCH_SEL_ROTATE0_MASK}, - {"GLBL2_MATCH_SEL_SEL", - GLBL2_MATCH_SEL_SEL_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_msk_field_info[] = { - {"GLBL2_MATCH_MSK", - GLBL2_MATCH_MSK_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_pat_field_info[] = { - {"GLBL2_MATCH_PAT_PATTERN", - GLBL2_MATCH_PAT_PATTERN_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_1_field_info[] = { - {"GLBL_RNG_SZ_1_RSVD_1", - GLBL_RNG_SZ_1_RSVD_1_MASK}, - {"GLBL_RNG_SZ_1_RING_SIZE", - GLBL_RNG_SZ_1_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_2_field_info[] = { - {"GLBL_RNG_SZ_2_RSVD_1", - GLBL_RNG_SZ_2_RSVD_1_MASK}, - {"GLBL_RNG_SZ_2_RING_SIZE", - GLBL_RNG_SZ_2_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_3_field_info[] = { - {"GLBL_RNG_SZ_3_RSVD_1", - GLBL_RNG_SZ_3_RSVD_1_MASK}, - {"GLBL_RNG_SZ_3_RING_SIZE", - GLBL_RNG_SZ_3_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_4_field_info[] = { - {"GLBL_RNG_SZ_4_RSVD_1", - GLBL_RNG_SZ_4_RSVD_1_MASK}, - {"GLBL_RNG_SZ_4_RING_SIZE", - GLBL_RNG_SZ_4_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_5_field_info[] = { - {"GLBL_RNG_SZ_5_RSVD_1", - GLBL_RNG_SZ_5_RSVD_1_MASK}, - {"GLBL_RNG_SZ_5_RING_SIZE", - GLBL_RNG_SZ_5_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_6_field_info[] = { - {"GLBL_RNG_SZ_6_RSVD_1", - GLBL_RNG_SZ_6_RSVD_1_MASK}, - {"GLBL_RNG_SZ_6_RING_SIZE", - GLBL_RNG_SZ_6_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_7_field_info[] = { - {"GLBL_RNG_SZ_7_RSVD_1", - GLBL_RNG_SZ_7_RSVD_1_MASK}, - {"GLBL_RNG_SZ_7_RING_SIZE", - GLBL_RNG_SZ_7_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_8_field_info[] = { - {"GLBL_RNG_SZ_8_RSVD_1", - GLBL_RNG_SZ_8_RSVD_1_MASK}, - {"GLBL_RNG_SZ_8_RING_SIZE", - GLBL_RNG_SZ_8_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_9_field_info[] = { - {"GLBL_RNG_SZ_9_RSVD_1", - GLBL_RNG_SZ_9_RSVD_1_MASK}, - {"GLBL_RNG_SZ_9_RING_SIZE", - GLBL_RNG_SZ_9_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_a_field_info[] = { - {"GLBL_RNG_SZ_A_RSVD_1", - GLBL_RNG_SZ_A_RSVD_1_MASK}, - {"GLBL_RNG_SZ_A_RING_SIZE", - GLBL_RNG_SZ_A_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_b_field_info[] = { - {"GLBL_RNG_SZ_B_RSVD_1", - GLBL_RNG_SZ_B_RSVD_1_MASK}, - {"GLBL_RNG_SZ_B_RING_SIZE", - GLBL_RNG_SZ_B_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_c_field_info[] = { - {"GLBL_RNG_SZ_C_RSVD_1", - GLBL_RNG_SZ_C_RSVD_1_MASK}, - {"GLBL_RNG_SZ_C_RING_SIZE", - GLBL_RNG_SZ_C_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_d_field_info[] = { - {"GLBL_RNG_SZ_D_RSVD_1", - GLBL_RNG_SZ_D_RSVD_1_MASK}, - {"GLBL_RNG_SZ_D_RING_SIZE", - GLBL_RNG_SZ_D_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_e_field_info[] = { - {"GLBL_RNG_SZ_E_RSVD_1", - GLBL_RNG_SZ_E_RSVD_1_MASK}, - {"GLBL_RNG_SZ_E_RING_SIZE", - GLBL_RNG_SZ_E_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_f_field_info[] = { - {"GLBL_RNG_SZ_F_RSVD_1", - GLBL_RNG_SZ_F_RSVD_1_MASK}, - {"GLBL_RNG_SZ_F_RING_SIZE", - GLBL_RNG_SZ_F_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_10_field_info[] = { - {"GLBL_RNG_SZ_10_RSVD_1", - GLBL_RNG_SZ_10_RSVD_1_MASK}, - {"GLBL_RNG_SZ_10_RING_SIZE", - GLBL_RNG_SZ_10_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_err_stat_field_info[] = { - {"GLBL_ERR_STAT_RSVD_1", - GLBL_ERR_STAT_RSVD_1_MASK}, - {"GLBL_ERR_STAT_ERR_FAB", - GLBL_ERR_STAT_ERR_FAB_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_ST", - GLBL_ERR_STAT_ERR_H2C_ST_MASK}, - {"GLBL_ERR_STAT_ERR_BDG", - GLBL_ERR_STAT_ERR_BDG_MASK}, - {"GLBL_ERR_STAT_IND_CTXT_CMD_ERR", - GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_ST", - GLBL_ERR_STAT_ERR_C2H_ST_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_1", - GLBL_ERR_STAT_ERR_C2H_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_0", - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_1", - GLBL_ERR_STAT_ERR_H2C_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_0", - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_TRQ", - GLBL_ERR_STAT_ERR_TRQ_MASK}, - {"GLBL_ERR_STAT_ERR_DSC", - GLBL_ERR_STAT_ERR_DSC_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_DBE", - GLBL_ERR_STAT_ERR_RAM_DBE_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_SBE", - GLBL_ERR_STAT_ERR_RAM_SBE_MASK}, -}; - - -static struct regfield_info - glbl_err_mask_field_info[] = { - {"GLBL_ERR", - GLBL_ERR_MASK}, -}; - - -static struct regfield_info - glbl_dsc_cfg_field_info[] = { - {"GLBL_DSC_CFG_RSVD_1", - GLBL_DSC_CFG_RSVD_1_MASK}, - {"GLBL_DSC_CFG_C2H_UODSC_LIMIT", - GLBL_DSC_CFG_C2H_UODSC_LIMIT_MASK}, - {"GLBL_DSC_CFG_H2C_UODSC_LIMIT", - GLBL_DSC_CFG_H2C_UODSC_LIMIT_MASK}, - {"GLBL_DSC_CFG_UNC_OVR_COR", - GLBL_DSC_CFG_UNC_OVR_COR_MASK}, - {"GLBL_DSC_CFG_CTXT_FER_DIS", - GLBL_DSC_CFG_CTXT_FER_DIS_MASK}, - {"GLBL_DSC_CFG_RSVD_2", - GLBL_DSC_CFG_RSVD_2_MASK}, - {"GLBL_DSC_CFG_MAXFETCH", - GLBL_DSC_CFG_MAXFETCH_MASK}, - {"GLBL_DSC_CFG_WB_ACC_INT", - GLBL_DSC_CFG_WB_ACC_INT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_sts_field_info[] = { - {"GLBL_DSC_ERR_STS_RSVD_1", - GLBL_DSC_ERR_STS_RSVD_1_MASK}, - {"GLBL_DSC_ERR_STS_PORT_ID", - GLBL_DSC_ERR_STS_PORT_ID_MASK}, - {"GLBL_DSC_ERR_STS_SBE", - GLBL_DSC_ERR_STS_SBE_MASK}, - {"GLBL_DSC_ERR_STS_DBE", - GLBL_DSC_ERR_STS_DBE_MASK}, - {"GLBL_DSC_ERR_STS_RQ_CANCEL", - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_DSC", - GLBL_DSC_ERR_STS_DSC_MASK}, - {"GLBL_DSC_ERR_STS_DMA", - GLBL_DSC_ERR_STS_DMA_MASK}, - {"GLBL_DSC_ERR_STS_FLR_CANCEL", - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_RSVD_2", - GLBL_DSC_ERR_STS_RSVD_2_MASK}, - {"GLBL_DSC_ERR_STS_DAT_POISON", - GLBL_DSC_ERR_STS_DAT_POISON_MASK}, - {"GLBL_DSC_ERR_STS_TIMEOUT", - GLBL_DSC_ERR_STS_TIMEOUT_MASK}, - {"GLBL_DSC_ERR_STS_FLR", - GLBL_DSC_ERR_STS_FLR_MASK}, - {"GLBL_DSC_ERR_STS_TAG", - GLBL_DSC_ERR_STS_TAG_MASK}, - {"GLBL_DSC_ERR_STS_ADDR", - GLBL_DSC_ERR_STS_ADDR_MASK}, - {"GLBL_DSC_ERR_STS_PARAM", - GLBL_DSC_ERR_STS_PARAM_MASK}, - {"GLBL_DSC_ERR_STS_BCNT", - GLBL_DSC_ERR_STS_BCNT_MASK}, - {"GLBL_DSC_ERR_STS_UR_CA", - GLBL_DSC_ERR_STS_UR_CA_MASK}, - {"GLBL_DSC_ERR_STS_POISON", - GLBL_DSC_ERR_STS_POISON_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_msk_field_info[] = { - {"GLBL_DSC_ERR_MSK", - GLBL_DSC_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log0_field_info[] = { - {"GLBL_DSC_ERR_LOG0_VALID", - GLBL_DSC_ERR_LOG0_VALID_MASK}, - {"GLBL_DSC_ERR_LOG0_SEL", - GLBL_DSC_ERR_LOG0_SEL_MASK}, - {"GLBL_DSC_ERR_LOG0_RSVD_1", - GLBL_DSC_ERR_LOG0_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG0_QID", - GLBL_DSC_ERR_LOG0_QID_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log1_field_info[] = { - {"GLBL_DSC_ERR_LOG1_RSVD_1", - GLBL_DSC_ERR_LOG1_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG1_CIDX", - GLBL_DSC_ERR_LOG1_CIDX_MASK}, - {"GLBL_DSC_ERR_LOG1_RSVD_2", - GLBL_DSC_ERR_LOG1_RSVD_2_MASK}, - {"GLBL_DSC_ERR_LOG1_SUB_TYPE", - GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK}, - {"GLBL_DSC_ERR_LOG1_ERR_TYPE", - GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_sts_field_info[] = { - {"GLBL_TRQ_ERR_STS_RSVD_1", - GLBL_TRQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_2", - GLBL_TRQ_ERR_STS_RSVD_2_MASK}, - {"GLBL_TRQ_ERR_STS_QID_RANGE", - GLBL_TRQ_ERR_STS_QID_RANGE_MASK}, - {"GLBL_TRQ_ERR_STS_QSPC_UNMAPPED", - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_3", - GLBL_TRQ_ERR_STS_RSVD_3_MASK}, - {"GLBL_TRQ_ERR_STS_VF_ACCESS_ERR", - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK}, - {"GLBL_TRQ_ERR_STS_CSR_UNMAPPED", - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_msk_field_info[] = { - {"GLBL_TRQ_ERR_MSK", - GLBL_TRQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_log_field_info[] = { - {"GLBL_TRQ_ERR_LOG_SRC", - GLBL_TRQ_ERR_LOG_SRC_MASK}, - {"GLBL_TRQ_ERR_LOG_TARGET", - GLBL_TRQ_ERR_LOG_TARGET_MASK}, - {"GLBL_TRQ_ERR_LOG_FUNC", - GLBL_TRQ_ERR_LOG_FUNC_MASK}, - {"GLBL_TRQ_ERR_LOG_ADDRESS", - GLBL_TRQ_ERR_LOG_ADDRESS_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat0_field_info[] = { - {"GLBL_DSC_DAT0_RSVD_1", - GLBL_DSC_DAT0_RSVD_1_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_DIR", - GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_QID", - GLBL_DSC_DAT0_CTXT_ARB_QID_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_REQ", - GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK}, - {"GLBL_DSC_DAT0_IRQ_FIFO_FL", - GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK}, - {"GLBL_DSC_DAT0_TMSTALL", - GLBL_DSC_DAT0_TMSTALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_STALL", - GLBL_DSC_DAT0_RRQ_STALL_MASK}, - {"GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL", - GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK}, - {"GLBL_DSC_DAT0_DSC_OUT_STALL", - GLBL_DSC_DAT0_DSC_OUT_STALL_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat1_field_info[] = { - {"GLBL_DSC_DAT1_RSVD_1", - GLBL_DSC_DAT1_RSVD_1_MASK}, - {"GLBL_DSC_DAT1_EVT_SPC_C2H", - GLBL_DSC_DAT1_EVT_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_EVT_SP_H2C", - GLBL_DSC_DAT1_EVT_SP_H2C_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_C2H", - GLBL_DSC_DAT1_DSC_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_H2C", - GLBL_DSC_DAT1_DSC_SPC_H2C_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_ctl_field_info[] = { - {"GLBL_DSC_CTL_RSVD_1", - GLBL_DSC_CTL_RSVD_1_MASK}, - {"GLBL_DSC_CTL_LAT_QID", - GLBL_DSC_CTL_LAT_QID_MASK}, - {"GLBL_DSC_CTL_DSC_ENG_LAT_CLR", - GLBL_DSC_CTL_DSC_ENG_LAT_CLR_MASK}, - {"GLBL_DSC_CTL_SELECT", - GLBL_DSC_CTL_SELECT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log2_field_info[] = { - {"GLBL_DSC_ERR_LOG2_OLD_PIDX", - GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK}, - {"GLBL_DSC_ERR_LOG2_NEW_PIDX", - GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK}, -}; - - -static struct regfield_info - glbl_glbl_interrupt_cfg_field_info[] = { - {"GLBL_GLBL_INTERRUPT_CFG_RSVD_1", - GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING", - GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR", - GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK}, -}; - - -static struct regfield_info - glbl_vch_host_profile_field_info[] = { - {"GLBL_VCH_HOST_PROFILE_RSVD_1", - GLBL_VCH_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_MM", - GLBL_VCH_HOST_PROFILE_2C_MM_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_ST", - GLBL_VCH_HOST_PROFILE_2C_ST_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_DSC", - GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_MSG", - GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR", - GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_CMPT", - GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD", - GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK}, -}; - - -static struct regfield_info - glbl_bridge_host_profile_field_info[] = { - {"GLBL_BRIDGE_HOST_PROFILE_RSVD_1", - GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_BRIDGE_HOST_PROFILE_BDGID", - GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK}, -}; - - -static struct regfield_info - aximm_irq_dest_addr_field_info[] = { - {"AXIMM_IRQ_DEST_ADDR_ADDR", - AXIMM_IRQ_DEST_ADDR_ADDR_MASK}, -}; - - -static struct regfield_info - fab_err_log_field_info[] = { - {"FAB_ERR_LOG_RSVD_1", - FAB_ERR_LOG_RSVD_1_MASK}, - {"FAB_ERR_LOG_SRC", - FAB_ERR_LOG_SRC_MASK}, -}; - - -static struct regfield_info - glbl_req_err_sts_field_info[] = { - {"GLBL_REQ_ERR_STS_RSVD_1", - GLBL_REQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_REQ_ERR_STS_RC_DISCONTINUE", - GLBL_REQ_ERR_STS_RC_DISCONTINUE_MASK}, - {"GLBL_REQ_ERR_STS_RC_PRTY", - GLBL_REQ_ERR_STS_RC_PRTY_MASK}, - {"GLBL_REQ_ERR_STS_RC_FLR", - GLBL_REQ_ERR_STS_RC_FLR_MASK}, - {"GLBL_REQ_ERR_STS_RC_TIMEOUT", - GLBL_REQ_ERR_STS_RC_TIMEOUT_MASK}, - {"GLBL_REQ_ERR_STS_RC_INV_BCNT", - GLBL_REQ_ERR_STS_RC_INV_BCNT_MASK}, - {"GLBL_REQ_ERR_STS_RC_INV_TAG", - GLBL_REQ_ERR_STS_RC_INV_TAG_MASK}, - {"GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH", - GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH_MASK}, - {"GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH", - GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH_MASK}, - {"GLBL_REQ_ERR_STS_RC_NO_DATA", - GLBL_REQ_ERR_STS_RC_NO_DATA_MASK}, - {"GLBL_REQ_ERR_STS_RC_UR_CA_CRS", - GLBL_REQ_ERR_STS_RC_UR_CA_CRS_MASK}, - {"GLBL_REQ_ERR_STS_RC_POISONED", - GLBL_REQ_ERR_STS_RC_POISONED_MASK}, -}; - - -static struct regfield_info - glbl_req_err_msk_field_info[] = { - {"GLBL_REQ_ERR_MSK", - GLBL_REQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_lat0_a_field_info[] = { - {"GLBL_DSC_LAT0_A_LAT_MAX", - GLBL_DSC_LAT0_A_LAT_MAX_MASK}, - {"GLBL_DSC_LAT0_A_LAT_MIN", - GLBL_DSC_LAT0_A_LAT_MIN_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_lat1_a_field_info[] = { - {"GLBL_DSC_LAT1_A_RSVD", - GLBL_DSC_LAT1_A_RSVD_MASK}, - {"GLBL_DSC_LAT1_A_LAT_OVF", - GLBL_DSC_LAT1_A_LAT_OVF_MASK}, - {"GLBL_DSC_LAT1_A_LAT_AVG", - GLBL_DSC_LAT1_A_LAT_AVG_MASK}, -}; - - -static struct regfield_info - glbl_dsc_crd_ctr0_a_field_info[] = { - {"GLBL_DSC_CRD_CTR0_A_CRD_RCV_CNT", - GLBL_DSC_CRD_CTR0_A_CRD_RCV_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_crd_ctr1_a_field_info[] = { - {"GLBL_DSC_CRD_CTR1_A_CRD_RCV_CNT", - GLBL_DSC_CRD_CTR1_A_CRD_RCV_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_crd_ctr2_a_field_info[] = { - {"GLBL_DSC_CRD_CTR2_A_CRD_RCV_NRDY_CNT", - GLBL_DSC_CRD_CTR2_A_CRD_RCV_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_crd_ctr3_a_field_info[] = { - {"GLBL_DSC_CRD_CTR3_A_CRD_RCV_NRDY_CNT", - GLBL_DSC_CRD_CTR3_A_CRD_RCV_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_imm_crd_ctr0_a_field_info[] = { - {"GLBL_DSC_IMM_CRD_CTR0_A_RCV_CNT", - GLBL_DSC_IMM_CRD_CTR0_A_RCV_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_imm_crd_ctr1_a_field_info[] = { - {"GLBL_DSC_IMM_CRD_CTR1_A_RCV_CNT", - GLBL_DSC_IMM_CRD_CTR1_A_RCV_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_imm_crd_ctr2_a_field_info[] = { - {"GLBL_DSC_IMM_CRD_CTR2_A_RCV_NRDY_CNT", - GLBL_DSC_IMM_CRD_CTR2_A_RCV_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_imm_crd_ctr3_a_field_info[] = { - {"GLBL_DSC_IMM_CRD_CTR3_A_RCV_NRDY_CNT", - GLBL_DSC_IMM_CRD_CTR3_A_RCV_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_h2c_out_ctr0_a_field_info[] = { - {"GLBL_DSC_H2C_OUT_CTR0_A_H2CVLD_CNT", - GLBL_DSC_H2C_OUT_CTR0_A_H2CVLD_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_h2c_out_ctr1_a_field_info[] = { - {"GLBL_DSC_H2C_OUT_CTR1_A_H2CVLD_CNT", - GLBL_DSC_H2C_OUT_CTR1_A_H2CVLD_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_h2c_out_ctr2_a_field_info[] = { - {"GLBL_DSC_H2C_OUT_CTR2_A_H2CVLD_NRDY_CNT", - GLBL_DSC_H2C_OUT_CTR2_A_H2CVLD_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_h2c_out_ctr3_a_field_info[] = { - {"GLBL_DSC_H2C_OUT_CTR3_A_H2CVLD_NRDY_CNT", - GLBL_DSC_H2C_OUT_CTR3_A_H2CVLD_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_c2h_out_ctr0_a_field_info[] = { - {"GLBL_DSC_C2H_OUT_CTR0_A_C2HVLD_CNT", - GLBL_DSC_C2H_OUT_CTR0_A_C2HVLD_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_c2h_out_ctr1_a_field_info[] = { - {"GLBL_DSC_C2H_OUT_CTR1_A_C2HVLD_CNT", - GLBL_DSC_C2H_OUT_CTR1_A_C2HVLD_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_c2h_out_ctr2_a_field_info[] = { - {"GLBL_DSC_C2H_OUT_CTR2_A_C2HVLD_NRDY_CNT", - GLBL_DSC_C2H_OUT_CTR2_A_C2HVLD_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_c2h_out_ctr3_a_field_info[] = { - {"GLBL_DSC_C2H_OUT_CTR3_A_C2HVLD_NRDY_CNT", - GLBL_DSC_C2H_OUT_CTR3_A_C2HVLD_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - t_field_info[] = { - {"T_USER_CTR_MAX", - T_USER_CTR_MAX_MASK}, -}; - - -static struct regfield_info - glbl_perf_cntr_ctl_a1_field_info[] = { - {"GLBL_PERF_CNTR_CTL_A1_RSVD", - GLBL_PERF_CNTR_CTL_A1_RSVD_MASK}, - {"GLBL_PERF_CNTR_CTL_A1_USER_CTR_CLEAR", - GLBL_PERF_CNTR_CTL_A1_USER_CTR_CLEAR_MASK}, - {"GLBL_PERF_CNTR_CTL_A1_USER_CTR_READ", - GLBL_PERF_CNTR_CTL_A1_USER_CTR_READ_MASK}, - {"GLBL_PERF_CNTR_CTL_A1_USER_CTR_MAX", - GLBL_PERF_CNTR_CTL_A1_USER_CTR_MAX_MASK}, -}; - - -static struct regfield_info - glbl_free_cnt_a0_field_info[] = { - {"GLBL_FREE_CNT_A0_S", - GLBL_FREE_CNT_A0_S_MASK}, -}; - - -static struct regfield_info - glbl_free_cnt_a1_field_info[] = { - {"GLBL_FREE_CNT_A1_RSVD", - GLBL_FREE_CNT_A1_RSVD_MASK}, - {"GLBL_FREE_CNT_A1_S", - GLBL_FREE_CNT_A1_S_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a0_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A0_MPKT_CNTS", - GLBL_AXIS_H2C_CNT_A0_MPKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a1_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A1_MIDLE_CNTS", - GLBL_AXIS_H2C_CNT_A1_MIDLE_CNTS_MASK}, - {"GLBL_AXIS_H2C_CNT_A1_MPKT_CNTS", - GLBL_AXIS_H2C_CNT_A1_MPKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a2_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A2_MIDLE_CNTS", - GLBL_AXIS_H2C_CNT_A2_MIDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a3_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A3_MACTV_CNTS", - GLBL_AXIS_H2C_CNT_A3_MACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a4_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A4_MBUSY_CNTS", - GLBL_AXIS_H2C_CNT_A4_MBUSY_CNTS_MASK}, - {"GLBL_AXIS_H2C_CNT_A4_MACTV_CNTS", - GLBL_AXIS_H2C_CNT_A4_MACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a5_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A5_MBUSY_CNTS", - GLBL_AXIS_H2C_CNT_A5_MBUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a0_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A0_SPKT_CNTS", - GLBL_AXIS_C2H_CNT_A0_SPKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a1_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A1_SIDLE_CNTS", - GLBL_AXIS_C2H_CNT_A1_SIDLE_CNTS_MASK}, - {"GLBL_AXIS_C2H_CNT_A1_SPKT_CNTS", - GLBL_AXIS_C2H_CNT_A1_SPKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a2_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A2_SIDLE_CNTS", - GLBL_AXIS_C2H_CNT_A2_SIDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a3_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A3_SACTV_CNTS", - GLBL_AXIS_C2H_CNT_A3_SACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a4_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A4_SBUSY_CNTS", - GLBL_AXIS_C2H_CNT_A4_SBUSY_CNTS_MASK}, - {"GLBL_AXIS_C2H_CNT_A4_SACTV_CNTS", - GLBL_AXIS_C2H_CNT_A4_SACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a5_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A5_SBUSY_CNTS", - GLBL_AXIS_C2H_CNT_A5_SBUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a0_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A0_PKT_CNTS", - GLBL_M_AXI_WR_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a1_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A1_IDLE_CNTS", - GLBL_M_AXI_WR_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_M_AXI_WR_CNT_A1_PKT_CNTS", - GLBL_M_AXI_WR_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a2_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A2_IDLE_CNTS", - GLBL_M_AXI_WR_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a3_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A3_ACTV_CNTS", - GLBL_M_AXI_WR_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a4_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A4_BUSY_CNTS", - GLBL_M_AXI_WR_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_M_AXI_WR_CNT_A4_ACTV_CNTS", - GLBL_M_AXI_WR_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a5_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A5_BUSY_CNTS", - GLBL_M_AXI_WR_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a0_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A0_PKT_CNTS", - GLBL_M_AXI_RD_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a1_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A1_IDLE_CNTS", - GLBL_M_AXI_RD_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_M_AXI_RD_CNT_A1_PKT_CNTS", - GLBL_M_AXI_RD_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a2_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A2_IDLE_CNTS", - GLBL_M_AXI_RD_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a3_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A3_ACTV_CNTS", - GLBL_M_AXI_RD_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a4_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A4_BUSY_CNTS", - GLBL_M_AXI_RD_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_M_AXI_RD_CNT_A4_ACTV_CNTS", - GLBL_M_AXI_RD_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a5_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A5_BUSY_CNTS", - GLBL_M_AXI_RD_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a0_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A0_PKT_CNTS", - GLBL_M_AXIB_WR_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a1_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A1_IDLE_CNTS", - GLBL_M_AXIB_WR_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_M_AXIB_WR_CNT_A1_PKT_CNTS", - GLBL_M_AXIB_WR_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a2_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A2_IDLE_CNTS", - GLBL_M_AXIB_WR_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a3_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A3_ACTV_CNTS", - GLBL_M_AXIB_WR_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a4_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A4_BUSY_CNTS", - GLBL_M_AXIB_WR_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_M_AXIB_WR_CNT_A4_ACTV_CNTS", - GLBL_M_AXIB_WR_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a5_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A5_BUSY_CNTS", - GLBL_M_AXIB_WR_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a0_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A0_PKT_CNTS", - GLBL_M_AXIB_RD_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a1_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A1_IDLE_CNTS", - GLBL_M_AXIB_RD_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_M_AXIB_RD_CNT_A1_PKT_CNTS", - GLBL_M_AXIB_RD_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a2_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A2_IDLE_CNTS", - GLBL_M_AXIB_RD_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a3_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A3_ACTV_CNTS", - GLBL_M_AXIB_RD_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a4_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A4_BUSY_CNTS", - GLBL_M_AXIB_RD_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_M_AXIB_RD_CNT_A4_ACTV_CNTS", - GLBL_M_AXIB_RD_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a5_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A5_BUSY_CNTS", - GLBL_M_AXIB_RD_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a0_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A0_PKT_CNTS", - GLBL_S_AXI_WR_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a1_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A1_IDLE_CNTS", - GLBL_S_AXI_WR_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_S_AXI_WR_CNT_A1_PKT_CNTS", - GLBL_S_AXI_WR_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a2_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A2_IDLE_CNTS", - GLBL_S_AXI_WR_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a3_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A3_ACTV_CNTS", - GLBL_S_AXI_WR_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a4_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A4_BUSY_CNTS", - GLBL_S_AXI_WR_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_S_AXI_WR_CNT_A4_ACTV_CNTS", - GLBL_S_AXI_WR_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a5_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A5_BUSY_CNTS", - GLBL_S_AXI_WR_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a0_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A0_PKT_CNTS", - GLBL_S_AXI_RD_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a1_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A1_IDLE_CNTS", - GLBL_S_AXI_RD_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_S_AXI_RD_CNT_A1_PKT_CNTS", - GLBL_S_AXI_RD_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a2_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A2_IDLE_CNTS", - GLBL_S_AXI_RD_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a3_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A3_ACTV_CNTS", - GLBL_S_AXI_RD_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a4_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A4_BUSY_CNTS", - GLBL_S_AXI_RD_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_S_AXI_RD_CNT_A4_ACTV_CNTS", - GLBL_S_AXI_RD_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a5_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A5_BUSY_CNTS", - GLBL_S_AXI_RD_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a0_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A0_PKT_CNTS", - GLBL_S_AXIS_CMP_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a1_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A1_IDLE_CNTS", - GLBL_S_AXIS_CMP_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_S_AXIS_CMP_CNT_A1_PKT_CNTS", - GLBL_S_AXIS_CMP_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a2_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A2_IDLE_CNTS", - GLBL_S_AXIS_CMP_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a3_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A3_ACTV_CNTS", - GLBL_S_AXIS_CMP_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a4_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A4_BUSY_CNTS", - GLBL_S_AXIS_CMP_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_S_AXIS_CMP_CNT_A4_ACTV_CNTS", - GLBL_S_AXIS_CMP_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a5_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A5_BUSY_CNTS", - GLBL_S_AXIS_CMP_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_field_info[] = { - {"IND_CTXT_DATA_DATA", - IND_CTXT_DATA_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_mask_field_info[] = { - {"IND_CTXT", - IND_CTXT_MASK}, -}; - - -static struct regfield_info - ind_ctxt_cmd_field_info[] = { - {"IND_CTXT_CMD_RSVD_1", - IND_CTXT_CMD_RSVD_1_MASK}, - {"IND_CTXT_CMD_QID", - IND_CTXT_CMD_QID_MASK}, - {"IND_CTXT_CMD_OP", - IND_CTXT_CMD_OP_MASK}, - {"IND_CTXT_CMD_SEL", - IND_CTXT_CMD_SEL_MASK}, - {"IND_CTXT_CMD_BUSY", - IND_CTXT_CMD_BUSY_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_field_info[] = { - {"C2H_TIMER_CNT_RSVD_1", - C2H_TIMER_CNT_RSVD_1_MASK}, - {"C2H_TIMER_CNT", - C2H_TIMER_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_field_info[] = { - {"C2H_CNT_TH_RSVD_1", - C2H_CNT_TH_RSVD_1_MASK}, - {"C2H_CNT_TH_THESHOLD_CNT", - C2H_CNT_TH_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_1_field_info[] = { - {"C2H_PFCH_CFG_1_EVT_QCNT_TH", - C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK}, - {"C2H_PFCH_CFG_1_QCNT", - C2H_PFCH_CFG_1_QCNT_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_2_field_info[] = { - {"C2H_PFCH_CFG_2_FENCE", - C2H_PFCH_CFG_2_FENCE_MASK}, - {"C2H_PFCH_CFG_2_RSVD", - C2H_PFCH_CFG_2_RSVD_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NO_DROP", - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK}, - {"C2H_PFCH_CFG_2_LL_SZ_TH", - C2H_PFCH_CFG_2_LL_SZ_TH_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NUM", - C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK}, - {"C2H_PFCH_CFG_2_NUM", - C2H_PFCH_CFG_2_NUM_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED", - C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP", - C2H_STAT_AXIS_PKG_CMP_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ACCEPTED_D", - C2H_STAT_DESC_RSP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_cmp_field_info[] = { - {"C2H_STAT_DESC_RSP_CMP_D", - C2H_STAT_DESC_RSP_CMP_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_wrq_out_field_info[] = { - {"C2H_STAT_WRQ_OUT", - C2H_STAT_WRQ_OUT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wpl_ren_accepted_field_info[] = { - {"C2H_STAT_WPL_REN_ACCEPTED", - C2H_STAT_WPL_REN_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wrq_len_field_info[] = { - {"C2H_STAT_TOTAL_WRQ_LEN", - C2H_STAT_TOTAL_WRQ_LEN_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wpl_len_field_info[] = { - {"C2H_STAT_TOTAL_WPL_LEN", - C2H_STAT_TOTAL_WPL_LEN_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_field_info[] = { - {"C2H_BUF_SZ_IZE", - C2H_BUF_SZ_IZE_MASK}, -}; - - -static struct regfield_info - c2h_err_stat_field_info[] = { - {"C2H_ERR_STAT_RSVD_1", - C2H_ERR_STAT_RSVD_1_MASK}, - {"C2H_ERR_STAT_WRB_PORT_ID_ERR", - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK}, - {"C2H_ERR_STAT_HDR_PAR_ERR", - C2H_ERR_STAT_HDR_PAR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_COR_ERR", - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_ERR_STAT_AVL_RING_DSC_ERR", - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK}, - {"C2H_ERR_STAT_WRB_PRTY_ERR", - C2H_ERR_STAT_WRB_PRTY_ERR_MASK}, - {"C2H_ERR_STAT_WRB_CIDX_ERR", - C2H_ERR_STAT_WRB_CIDX_ERR_MASK}, - {"C2H_ERR_STAT_WRB_QFULL_ERR", - C2H_ERR_STAT_WRB_QFULL_ERR_MASK}, - {"C2H_ERR_STAT_WRB_INV_Q_ERR", - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_2", - C2H_ERR_STAT_RSVD_2_MASK}, - {"C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH", - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK}, - {"C2H_ERR_STAT_ERR_DESC_CNT", - C2H_ERR_STAT_ERR_DESC_CNT_MASK}, - {"C2H_ERR_STAT_RSVD_3", - C2H_ERR_STAT_RSVD_3_MASK}, - {"C2H_ERR_STAT_MSI_INT_FAIL", - C2H_ERR_STAT_MSI_INT_FAIL_MASK}, - {"C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR", - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_4", - C2H_ERR_STAT_RSVD_4_MASK}, - {"C2H_ERR_STAT_DESC_RSP_ERR", - C2H_ERR_STAT_DESC_RSP_ERR_MASK}, - {"C2H_ERR_STAT_QID_MISMATCH", - C2H_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_ERR_STAT_SH_CMPT_DSC_ERR", - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK}, - {"C2H_ERR_STAT_LEN_MISMATCH", - C2H_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_ERR_STAT_MTY_MISMATCH", - C2H_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_err_mask_field_info[] = { - {"C2H_ERR_EN", - C2H_ERR_EN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_stat_field_info[] = { - {"C2H_FATAL_ERR_STAT_RSVD_1", - C2H_FATAL_ERR_STAT_RSVD_1_MASK}, - {"C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR", - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED2", - C2H_FATAL_ERR_STAT_RESERVED2_MASK}, - {"C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_MISMATCH", - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED1", - C2H_FATAL_ERR_STAT_RESERVED1_MASK}, - {"C2H_FATAL_ERR_STAT_LEN_MISMATCH", - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_MTY_MISMATCH", - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_mask_field_info[] = { - {"C2H_FATAL_ERR_C2HEN", - C2H_FATAL_ERR_C2HEN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_enable_field_info[] = { - {"C2H_FATAL_ERR_ENABLE_RSVD_1", - C2H_FATAL_ERR_ENABLE_RSVD_1_MASK}, - {"C2H_FATAL_ERR_ENABLE_WPL_PAR_INV", - C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK}, - {"C2H_FATAL_ERR_ENABLE_WRQ_DIS", - C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK}, -}; - - -static struct regfield_info - glbl_err_int_field_info[] = { - {"GLBL_ERR_INT_RSVD_1", - GLBL_ERR_INT_RSVD_1_MASK}, - {"GLBL_ERR_INT_HOST_ID", - GLBL_ERR_INT_HOST_ID_MASK}, - {"GLBL_ERR_INT_DIS_INTR_ON_VF", - GLBL_ERR_INT_DIS_INTR_ON_VF_MASK}, - {"GLBL_ERR_INT_ARM", - GLBL_ERR_INT_ARM_MASK}, - {"GLBL_ERR_INT_EN_COAL", - GLBL_ERR_INT_EN_COAL_MASK}, - {"GLBL_ERR_INT_VEC", - GLBL_ERR_INT_VEC_MASK}, - {"GLBL_ERR_INT_FUNC", - GLBL_ERR_INT_FUNC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_field_info[] = { - {"C2H_PFCH_CFG_EVTFL_TH", - C2H_PFCH_CFG_EVTFL_TH_MASK}, - {"C2H_PFCH_CFG_FL_TH", - C2H_PFCH_CFG_FL_TH_MASK}, -}; - - -static struct regfield_info - c2h_int_timer_tick_field_info[] = { - {"C2H_INT_TIMER_TICK", - C2H_INT_TIMER_TICK_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_drop_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_D", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_err_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_D", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_req_field_info[] = { - {"C2H_STAT_DESC_REQ", - C2H_STAT_DESC_REQ_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_0_field_info[] = { - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_SM_CS", - C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK}, - {"C2H_STAT_DMA_ENG_0_MAIN_SM_CS", - C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_1_field_info[] = { - {"C2H_STAT_DMA_ENG_1_WRB_USER_0_CMPT_TYPE", - C2H_STAT_DMA_ENG_1_WRB_USER_0_CMPT_TYPE_MASK}, - {"C2H_STAT_DMA_ENG_1_DESC_RSP_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_1_DESC_RSP_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT", - C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_2_field_info[] = { - {"C2H_STAT_DMA_ENG_2_WRB_USER_1_CMPT_TYPE", - C2H_STAT_DMA_ENG_2_WRB_USER_1_CMPT_TYPE_MASK}, - {"C2H_STAT_DMA_ENG_2_DESC_RSP_FIFO_OUT_VLD_1", - C2H_STAT_DMA_ENG_2_DESC_RSP_FIFO_OUT_VLD_1_MASK}, - {"C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_1", - C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_1_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_1", - C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_1_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_1", - C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_3_field_info[] = { - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_HAS_CMPT", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_HAS_CMPT_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_MARKER", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_DROP_REQ", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_DROP_REQ_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_QID", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_QID_MASK}, - {"C2H_STAT_DMA_ENG_3_WR_HDR_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_3_WR_HDR_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER", - C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_MASK}, - {"C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_err_ctxt_field_info[] = { - {"C2H_PFCH_ERR_CTXT_RSVD_1", - C2H_PFCH_ERR_CTXT_RSVD_1_MASK}, - {"C2H_PFCH_ERR_CTXT_ERR_STAT", - C2H_PFCH_ERR_CTXT_ERR_STAT_MASK}, - {"C2H_PFCH_ERR_CTXT_CMD_WR", - C2H_PFCH_ERR_CTXT_CMD_WR_MASK}, - {"C2H_PFCH_ERR_CTXT_QID", - C2H_PFCH_ERR_CTXT_QID_MASK}, - {"C2H_PFCH_ERR_CTXT_DONE", - C2H_PFCH_ERR_CTXT_DONE_MASK}, -}; - - -static struct regfield_info - c2h_first_err_qid_field_info[] = { - {"C2H_FIRST_ERR_QID_RSVD_1", - C2H_FIRST_ERR_QID_RSVD_1_MASK}, - {"C2H_FIRST_ERR_QID_ERR_TYPE", - C2H_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"C2H_FIRST_ERR_QID_RSVD", - C2H_FIRST_ERR_QID_RSVD_MASK}, - {"C2H_FIRST_ERR_QID_QID", - C2H_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_in_field_info[] = { - {"STAT_NUM_WRB_IN_RSVD_1", - STAT_NUM_WRB_IN_RSVD_1_MASK}, - {"STAT_NUM_WRB_IN_WRB_CNT", - STAT_NUM_WRB_IN_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_out_field_info[] = { - {"STAT_NUM_WRB_OUT_RSVD_1", - STAT_NUM_WRB_OUT_RSVD_1_MASK}, - {"STAT_NUM_WRB_OUT_WRB_CNT", - STAT_NUM_WRB_OUT_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_drp_field_info[] = { - {"STAT_NUM_WRB_DRP_RSVD_1", - STAT_NUM_WRB_DRP_RSVD_1_MASK}, - {"STAT_NUM_WRB_DRP_WRB_CNT", - STAT_NUM_WRB_DRP_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_stat_desc_out_field_info[] = { - {"STAT_NUM_STAT_DESC_OUT_RSVD_1", - STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK}, - {"STAT_NUM_STAT_DESC_OUT_CNT", - STAT_NUM_STAT_DESC_OUT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_dsc_crdt_sent_field_info[] = { - {"STAT_NUM_DSC_CRDT_SENT_RSVD_1", - STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK}, - {"STAT_NUM_DSC_CRDT_SENT_CNT", - STAT_NUM_DSC_CRDT_SENT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_fch_dsc_rcvd_field_info[] = { - {"STAT_NUM_FCH_DSC_RCVD_RSVD_1", - STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_FCH_DSC_RCVD_DSC_CNT", - STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_byp_dsc_rcvd_field_info[] = { - {"STAT_NUM_BYP_DSC_RCVD_RSVD_1", - STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_BYP_DSC_RCVD_DSC_CNT", - STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_cfg_field_info[] = { - {"C2H_WRB_COAL_CFG_MAX_BUF_SZ", - C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK}, - {"C2H_WRB_COAL_CFG_TICK_VAL", - C2H_WRB_COAL_CFG_TICK_VAL_MASK}, - {"C2H_WRB_COAL_CFG_TICK_CNT", - C2H_WRB_COAL_CFG_TICK_CNT_MASK}, - {"C2H_WRB_COAL_CFG_SET_GLB_FLUSH", - C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK}, - {"C2H_WRB_COAL_CFG_DONE_GLB_FLUSH", - C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_req_field_info[] = { - {"C2H_INTR_H2C_REQ_RSVD_1", - C2H_INTR_H2C_REQ_RSVD_1_MASK}, - {"C2H_INTR_H2C_REQ_CNT", - C2H_INTR_H2C_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_mm_req_field_info[] = { - {"C2H_INTR_C2H_MM_REQ_RSVD_1", - C2H_INTR_C2H_MM_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_MM_REQ_CNT", - C2H_INTR_C2H_MM_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_err_int_req_field_info[] = { - {"C2H_INTR_ERR_INT_REQ_RSVD_1", - C2H_INTR_ERR_INT_REQ_RSVD_1_MASK}, - {"C2H_INTR_ERR_INT_REQ_CNT", - C2H_INTR_ERR_INT_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_req_field_info[] = { - {"C2H_INTR_C2H_ST_REQ_RSVD_1", - C2H_INTR_C2H_ST_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_REQ_CNT", - C2H_INTR_C2H_ST_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_ack_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1", - C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_ACK_CNT", - C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_fail_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1", - C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_FAIL_CNT", - C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_no_msix_field_info[] = { - {"C2H_INTR_C2H_ST_NO_MSIX_RSVD_1", - C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_NO_MSIX_CNT", - C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_ctxt_inval_field_info[] = { - {"C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1", - C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_CTXT_INVAL_CNT", - C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wr_cmp_field_info[] = { - {"C2H_STAT_WR_CMP_RSVD_1", - C2H_STAT_WR_CMP_RSVD_1_MASK}, - {"C2H_STAT_WR_CMP_CNT", - C2H_STAT_WR_CMP_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_4_field_info[] = { - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_HAS_CMPT_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_HAS_CMPT_1_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_MARKER_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_MARKER_1_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_DROP_REQ_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_DROP_REQ_1_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_QID_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_QID_1_MASK}, - {"C2H_STAT_DMA_ENG_4_WR_HDR_FIFO_OUT_CNT_1", - C2H_STAT_DMA_ENG_4_WR_HDR_FIFO_OUT_CNT_1_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_1", - C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_1_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_1", - C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_1_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_1", - C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_1", - C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_1_MASK}, - {"C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_1", - C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_5_field_info[] = { - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_5_ARB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH", - C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ", - C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_qid_field_info[] = { - {"C2H_PFCH_QID_RSVD_1", - C2H_PFCH_QID_RSVD_1_MASK}, - {"C2H_PFCH_QID_ERR_CTXT", - C2H_PFCH_QID_ERR_CTXT_MASK}, - {"C2H_PFCH_QID_TARGET", - C2H_PFCH_QID_TARGET_MASK}, - {"C2H_PFCH_QID_QID_OR_TAG", - C2H_PFCH_QID_QID_OR_TAG_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_field_info[] = { - {"C2H_PFCH_DATA", - C2H_PFCH_DATA_MASK}, -}; - - -static struct regfield_info - c2h_int_dbg_field_info[] = { - {"C2H_INT_RSVD_1", - C2H_INT_RSVD_1_MASK}, - {"C2H_INT_INT_COAL_SM", - C2H_INT_INT_COAL_SM_MASK}, - {"C2H_INT_INT_SM", - C2H_INT_INT_SM_MASK}, -}; - - -static struct regfield_info - c2h_stat_imm_accepted_field_info[] = { - {"C2H_STAT_IMM_ACCEPTED_RSVD_1", - C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_IMM_ACCEPTED_CNT", - C2H_STAT_IMM_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_marker_accepted_field_info[] = { - {"C2H_STAT_MARKER_ACCEPTED_RSVD_1", - C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_MARKER_ACCEPTED_CNT", - C2H_STAT_MARKER_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_disable_cmp_accepted_field_info[] = { - {"C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1", - C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED_CNT", - C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_crdt_cnt_field_info[] = { - {"C2H_PLD_FIFO_CRDT_CNT_RSVD_1", - C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK}, - {"C2H_PLD_FIFO_CRDT_CNT_CNT", - C2H_PLD_FIFO_CRDT_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_req_field_info[] = { - {"C2H_INTR_DYN_REQ_RSVD_1", - C2H_INTR_DYN_REQ_RSVD_1_MASK}, - {"C2H_INTR_DYN_REQ_CNT", - C2H_INTR_DYN_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_misc_field_info[] = { - {"C2H_INTR_DYN_MISC_RSVD_1", - C2H_INTR_DYN_MISC_RSVD_1_MASK}, - {"C2H_INTR_DYN_MISC_CNT", - C2H_INTR_DYN_MISC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_len_mismatch_field_info[] = { - {"C2H_DROP_LEN_MISMATCH_RSVD_1", - C2H_DROP_LEN_MISMATCH_RSVD_1_MASK}, - {"C2H_DROP_LEN_MISMATCH_CNT", - C2H_DROP_LEN_MISMATCH_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_desc_rsp_len_field_info[] = { - {"C2H_DROP_DESC_RSP_LEN_RSVD_1", - C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK}, - {"C2H_DROP_DESC_RSP_LEN_CNT", - C2H_DROP_DESC_RSP_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_qid_fifo_len_field_info[] = { - {"C2H_DROP_QID_FIFO_LEN_RSVD_1", - C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK}, - {"C2H_DROP_QID_FIFO_LEN_CNT", - C2H_DROP_QID_FIFO_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_field_info[] = { - {"C2H_DROP_PLD_CNT_RSVD_1", - C2H_DROP_PLD_CNT_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_CNT", - C2H_DROP_PLD_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_0_field_info[] = { - {"C2H_CMPT_FORMAT_0_DESC_ERR_LOC", - C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_0_COLOR_LOC", - C2H_CMPT_FORMAT_0_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_1_field_info[] = { - {"C2H_CMPT_FORMAT_1_DESC_ERR_LOC", - C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_1_COLOR_LOC", - C2H_CMPT_FORMAT_1_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_2_field_info[] = { - {"C2H_CMPT_FORMAT_2_DESC_ERR_LOC", - C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_2_COLOR_LOC", - C2H_CMPT_FORMAT_2_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_3_field_info[] = { - {"C2H_CMPT_FORMAT_3_DESC_ERR_LOC", - C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_3_COLOR_LOC", - C2H_CMPT_FORMAT_3_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_4_field_info[] = { - {"C2H_CMPT_FORMAT_4_DESC_ERR_LOC", - C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_4_COLOR_LOC", - C2H_CMPT_FORMAT_4_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_5_field_info[] = { - {"C2H_CMPT_FORMAT_5_DESC_ERR_LOC", - C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_5_COLOR_LOC", - C2H_CMPT_FORMAT_5_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_6_field_info[] = { - {"C2H_CMPT_FORMAT_6_DESC_ERR_LOC", - C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_6_COLOR_LOC", - C2H_CMPT_FORMAT_6_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cache_depth_field_info[] = { - {"C2H_PFCH_CACHE_DEPTH_MAX_STBUF", - C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK}, - {"C2H_PFCH_CACHE_DEPTH", - C2H_PFCH_CACHE_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_buf_depth_field_info[] = { - {"C2H_WRB_COAL_BUF_DEPTH_RSVD_1", - C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK}, - {"C2H_WRB_COAL_BUF_DEPTH_BUFFER", - C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK}, -}; - - -static struct regfield_info - c2h_pfch_crdt_field_info[] = { - {"C2H_PFCH_CRDT_RSVD_1", - C2H_PFCH_CRDT_RSVD_1_MASK}, - {"C2H_PFCH_CRDT_RSVD_2", - C2H_PFCH_CRDT_RSVD_2_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_cmpt_accepted_field_info[] = { - {"C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1", - C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_CMPT_ACCEPTED_CNT", - C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_pld_accepted_field_info[] = { - {"C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1", - C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_PLD_ACCEPTED_CNT", - C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_field_info[] = { - {"C2H_PLD_PKT_ID_CMPT_WAIT", - C2H_PLD_PKT_ID_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_DATA", - C2H_PLD_PKT_ID_DATA_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_1_field_info[] = { - {"C2H_PLD_PKT_ID_1_CMPT_WAIT", - C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_1_DATA", - C2H_PLD_PKT_ID_1_DATA_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_1_field_info[] = { - {"C2H_DROP_PLD_CNT_1_RSVD_1", - C2H_DROP_PLD_CNT_1_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_1_CNT", - C2H_DROP_PLD_CNT_1_CNT_MASK}, -}; - - -static struct regfield_info - h2c_err_stat_field_info[] = { - {"H2C_ERR_STAT_RSVD_1", - H2C_ERR_STAT_RSVD_1_MASK}, - {"H2C_ERR_STAT_PAR_ERR", - H2C_ERR_STAT_PAR_ERR_MASK}, - {"H2C_ERR_STAT_SBE", - H2C_ERR_STAT_SBE_MASK}, - {"H2C_ERR_STAT_DBE", - H2C_ERR_STAT_DBE_MASK}, - {"H2C_ERR_STAT_NO_DMA_DS", - H2C_ERR_STAT_NO_DMA_DS_MASK}, - {"H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR", - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK}, - {"H2C_ERR_STAT_ZERO_LEN_DS", - H2C_ERR_STAT_ZERO_LEN_DS_MASK}, -}; - - -static struct regfield_info - h2c_err_mask_field_info[] = { - {"H2C_ERR_EN", - H2C_ERR_EN_MASK}, -}; - - -static struct regfield_info - h2c_first_err_qid_field_info[] = { - {"H2C_FIRST_ERR_QID_RSVD_1", - H2C_FIRST_ERR_QID_RSVD_1_MASK}, - {"H2C_FIRST_ERR_QID_ERR_TYPE", - H2C_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"H2C_FIRST_ERR_QID_RSVD_2", - H2C_FIRST_ERR_QID_RSVD_2_MASK}, - {"H2C_FIRST_ERR_QID_QID", - H2C_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg0_field_info[] = { - {"H2C_REG0_NUM_DSC_RCVD", - H2C_REG0_NUM_DSC_RCVD_MASK}, - {"H2C_REG0_NUM_WRB_SENT", - H2C_REG0_NUM_WRB_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg1_field_info[] = { - {"H2C_REG1_NUM_REQ_SENT", - H2C_REG1_NUM_REQ_SENT_MASK}, - {"H2C_REG1_NUM_CMP_SENT", - H2C_REG1_NUM_CMP_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg2_field_info[] = { - {"H2C_REG2_RSVD_1", - H2C_REG2_RSVD_1_MASK}, - {"H2C_REG2_NUM_ERR_DSC_RCVD", - H2C_REG2_NUM_ERR_DSC_RCVD_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg3_field_info[] = { - {"H2C_REG3_RSVD_1", - H2C_REG3_RSVD_1_MASK}, - {"H2C_REG3_DSCO_FIFO_EMPTY", - H2C_REG3_DSCO_FIFO_EMPTY_MASK}, - {"H2C_REG3_DSCO_FIFO_FULL", - H2C_REG3_DSCO_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RC_STATE", - H2C_REG3_CUR_RC_STATE_MASK}, - {"H2C_REG3_RDREQ_LINES", - H2C_REG3_RDREQ_LINES_MASK}, - {"H2C_REG3_RDATA_LINES_AVAIL", - H2C_REG3_RDATA_LINES_AVAIL_MASK}, - {"H2C_REG3_PEND_FIFO_EMPTY", - H2C_REG3_PEND_FIFO_EMPTY_MASK}, - {"H2C_REG3_PEND_FIFO_FULL", - H2C_REG3_PEND_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RQ_STATE", - H2C_REG3_CUR_RQ_STATE_MASK}, - {"H2C_REG3_DSCI_FIFO_FULL", - H2C_REG3_DSCI_FIFO_FULL_MASK}, - {"H2C_REG3_DSCI_FIFO_EMPTY", - H2C_REG3_DSCI_FIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg4_field_info[] = { - {"H2C_REG4_RDREQ_ADDR", - H2C_REG4_RDREQ_ADDR_MASK}, -}; - - -static struct regfield_info - h2c_fatal_err_en_field_info[] = { - {"H2C_FATAL_ERR_EN_RSVD_1", - H2C_FATAL_ERR_EN_RSVD_1_MASK}, - {"H2C_FATAL_ERR_EN_H2C", - H2C_FATAL_ERR_EN_H2C_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_pcie_field_info[] = { - {"H2C_REQ_THROT_PCIE_EN_REQ", - H2C_REQ_THROT_PCIE_EN_REQ_MASK}, - {"H2C_REQ_THROT_PCIE", - H2C_REQ_THROT_PCIE_MASK}, - {"H2C_REQ_THROT_PCIE_EN_DATA", - H2C_REQ_THROT_PCIE_EN_DATA_MASK}, - {"H2C_REQ_THROT_PCIE_DATA_THRESH", - H2C_REQ_THROT_PCIE_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - h2c_aln_dbg_reg0_field_info[] = { - {"H2C_ALN_REG0_NUM_PKT_SENT", - H2C_ALN_REG0_NUM_PKT_SENT_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_aximm_field_info[] = { - {"H2C_REQ_THROT_AXIMM_EN_REQ", - H2C_REQ_THROT_AXIMM_EN_REQ_MASK}, - {"H2C_REQ_THROT_AXIMM", - H2C_REQ_THROT_AXIMM_MASK}, - {"H2C_REQ_THROT_AXIMM_EN_DATA", - H2C_REQ_THROT_AXIMM_EN_DATA_MASK}, - {"H2C_REQ_THROT_AXIMM_DATA_THRESH", - H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - c2h_mm_ctl_field_info[] = { - {"C2H_MM_CTL_RESERVED1", - C2H_MM_CTL_RESERVED1_MASK}, - {"C2H_MM_CTL_ERRC_EN", - C2H_MM_CTL_ERRC_EN_MASK}, - {"C2H_MM_CTL_RESERVED0", - C2H_MM_CTL_RESERVED0_MASK}, - {"C2H_MM_CTL_RUN", - C2H_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_status_field_info[] = { - {"C2H_MM_STATUS_RSVD_1", - C2H_MM_STATUS_RSVD_1_MASK}, - {"C2H_MM_STATUS_RUN", - C2H_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_cmpl_desc_cnt_field_info[] = { - {"C2H_MM_CMPL_DESC_CNT_C2H_CO", - C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_enable_mask_field_info[] = { - {"C2H_MM_ERR_CODE_ENABLE_RESERVED1", - C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM", - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UR", - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_FLR", - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RESERVED0", - C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_field_info[] = { - {"C2H_MM_ERR_CODE_RESERVED1", - C2H_MM_ERR_CODE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_CIDX", - C2H_MM_ERR_CODE_CIDX_MASK}, - {"C2H_MM_ERR_CODE_RESERVED0", - C2H_MM_ERR_CODE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_SUB_TYPE", - C2H_MM_ERR_CODE_SUB_TYPE_MASK}, - {"C2H_MM_ERR_CODE", - C2H_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_info_field_info[] = { - {"C2H_MM_ERR_INFO_VALID", - C2H_MM_ERR_INFO_VALID_MASK}, - {"C2H_MM_ERR_INFO_SEL", - C2H_MM_ERR_INFO_SEL_MASK}, - {"C2H_MM_ERR_INFO_RSVD_1", - C2H_MM_ERR_INFO_RSVD_1_MASK}, - {"C2H_MM_ERR_INFO_QID", - C2H_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_ctl_field_info[] = { - {"C2H_MM_PERF_MON_CTL_RSVD_1", - C2H_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_START", - C2H_MM_PERF_MON_CTL_IMM_START_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_START", - C2H_MM_PERF_MON_CTL_RUN_START_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_CLEAR", - C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_CLEAR", - C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT0_DCNT", - C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT1_RSVD_1", - C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_DATA_CNT1_DCNT", - C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_dbg_field_info[] = { - {"C2H_MM_RSVD_1", - C2H_MM_RSVD_1_MASK}, - {"C2H_MM_RRQ_ENTRIES", - C2H_MM_RRQ_ENTRIES_MASK}, - {"C2H_MM_DAT_FIFO_SPC", - C2H_MM_DAT_FIFO_SPC_MASK}, - {"C2H_MM_RD_STALL", - C2H_MM_RD_STALL_MASK}, - {"C2H_MM_RRQ_FIFO_FI", - C2H_MM_RRQ_FIFO_FI_MASK}, - {"C2H_MM_WR_STALL", - C2H_MM_WR_STALL_MASK}, - {"C2H_MM_WRQ_FIFO_FI", - C2H_MM_WRQ_FIFO_FI_MASK}, - {"C2H_MM_WBK_STALL", - C2H_MM_WBK_STALL_MASK}, - {"C2H_MM_DSC_FIFO_EP", - C2H_MM_DSC_FIFO_EP_MASK}, - {"C2H_MM_DSC_FIFO_FL", - C2H_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_mm_ctl_field_info[] = { - {"H2C_MM_CTL_RESERVED1", - H2C_MM_CTL_RESERVED1_MASK}, - {"H2C_MM_CTL_ERRC_EN", - H2C_MM_CTL_ERRC_EN_MASK}, - {"H2C_MM_CTL_RESERVED0", - H2C_MM_CTL_RESERVED0_MASK}, - {"H2C_MM_CTL_RUN", - H2C_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_status_field_info[] = { - {"H2C_MM_STATUS_RSVD_1", - H2C_MM_STATUS_RSVD_1_MASK}, - {"H2C_MM_STATUS_RUN", - H2C_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_cmpl_desc_cnt_field_info[] = { - {"H2C_MM_CMPL_DESC_CNT_H2C_CO", - H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_enable_mask_field_info[] = { - {"H2C_MM_ERR_CODE_ENABLE_RESERVED5", - H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED4", - H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED3", - H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED2", - H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED1", - H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_UR_CA", - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED0", - H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_field_info[] = { - {"H2C_MM_ERR_CODE_RSVD_1", - H2C_MM_ERR_CODE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_CIDX", - H2C_MM_ERR_CODE_CIDX_MASK}, - {"H2C_MM_ERR_CODE_RESERVED0", - H2C_MM_ERR_CODE_RESERVED0_MASK}, - {"H2C_MM_ERR_CODE_SUB_TYPE", - H2C_MM_ERR_CODE_SUB_TYPE_MASK}, - {"H2C_MM_ERR_CODE", - H2C_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_info_field_info[] = { - {"H2C_MM_ERR_INFO_VALID", - H2C_MM_ERR_INFO_VALID_MASK}, - {"H2C_MM_ERR_INFO_SEL", - H2C_MM_ERR_INFO_SEL_MASK}, - {"H2C_MM_ERR_INFO_RSVD_1", - H2C_MM_ERR_INFO_RSVD_1_MASK}, - {"H2C_MM_ERR_INFO_QID", - H2C_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_ctl_field_info[] = { - {"H2C_MM_PERF_MON_CTL_RSVD_1", - H2C_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_START", - H2C_MM_PERF_MON_CTL_IMM_START_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_START", - H2C_MM_PERF_MON_CTL_RUN_START_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_CLEAR", - H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_CLEAR", - H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT0_DCNT", - H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT1_RSVD_1", - H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_DATA_CNT1_DCNT", - H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_dbg_field_info[] = { - {"H2C_MM_RSVD_1", - H2C_MM_RSVD_1_MASK}, - {"H2C_MM_RRQ_ENTRIES", - H2C_MM_RRQ_ENTRIES_MASK}, - {"H2C_MM_DAT_FIFO_SPC", - H2C_MM_DAT_FIFO_SPC_MASK}, - {"H2C_MM_RD_STALL", - H2C_MM_RD_STALL_MASK}, - {"H2C_MM_RRQ_FIFO_FI", - H2C_MM_RRQ_FIFO_FI_MASK}, - {"H2C_MM_WR_STALL", - H2C_MM_WR_STALL_MASK}, - {"H2C_MM_WRQ_FIFO_FI", - H2C_MM_WRQ_FIFO_FI_MASK}, - {"H2C_MM_WBK_STALL", - H2C_MM_WBK_STALL_MASK}, - {"H2C_MM_DSC_FIFO_EP", - H2C_MM_DSC_FIFO_EP_MASK}, - {"H2C_MM_DSC_FIFO_FL", - H2C_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_mm_data_throttle_field_info[] = { - {"H2C_MM_DATA_THROTTLE_RSVD_1", - H2C_MM_DATA_THROTTLE_RSVD_1_MASK}, - {"H2C_MM_DATA_THROTTLE_DAT_EN", - H2C_MM_DATA_THROTTLE_DAT_EN_MASK}, - {"H2C_MM_DATA_THROTTLE_DAT", - H2C_MM_DATA_THROTTLE_DAT_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_1_field_info[] = { - {"C2H_CRDT_COAL_CFG_1_RSVD_1", - C2H_CRDT_COAL_CFG_1_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH", - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_1_TIMER_TH", - C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_2_field_info[] = { - {"C2H_CRDT_COAL_CFG_2_RSVD_1", - C2H_CRDT_COAL_CFG_2_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_2_FIFO_TH", - C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_2_RESERVED1", - C2H_CRDT_COAL_CFG_2_RESERVED1_MASK}, - {"C2H_CRDT_COAL_CFG_2_NT_TH", - C2H_CRDT_COAL_CFG_2_NT_TH_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_qid_field_info[] = { - {"C2H_PFCH_BYP_QID_RSVD_1", - C2H_PFCH_BYP_QID_RSVD_1_MASK}, - {"C2H_PFCH_BYP_QID", - C2H_PFCH_BYP_QID_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_tag_field_info[] = { - {"C2H_PFCH_BYP_TAG_RSVD_1", - C2H_PFCH_BYP_TAG_RSVD_1_MASK}, - {"C2H_PFCH_BYP_TAG_BYP_QID", - C2H_PFCH_BYP_TAG_BYP_QID_MASK}, - {"C2H_PFCH_BYP_TAG_RSVD_2", - C2H_PFCH_BYP_TAG_RSVD_2_MASK}, - {"C2H_PFCH_BYP_TAG", - C2H_PFCH_BYP_TAG_MASK}, -}; - - -static struct regfield_info - c2h_water_mark_field_info[] = { - {"C2H_WATER_MARK_HIGH_WM", - C2H_WATER_MARK_HIGH_WM_MASK}, - {"C2H_WATER_MARK_LOW_WM", - C2H_WATER_MARK_LOW_WM_MASK}, -}; - - -static struct regfield_info - c2h_notify_empty_field_info[] = { - {"C2H_NOTIFY_EMPTY_RSVD_1", - C2H_NOTIFY_EMPTY_RSVD_1_MASK}, - {"C2H_NOTIFY_EMPTY_NOE", - C2H_NOTIFY_EMPTY_NOE_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_1_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED_1", - C2H_STAT_S_AXIS_C2H_ACCEPTED_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_1_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_1", - C2H_STAT_S_AXIS_WRB_ACCEPTED_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_1_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_1_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP_1", - C2H_STAT_AXIS_PKG_CMP_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_2_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_2", - C2H_STAT_S_AXIS_WRB_ACCEPTED_2_MASK}, -}; - - -static struct regfield_info - c2h_st_pld_fifo_depth_field_info[] = { - {"C2H_ST_PLD_FIFO_DEPTH", - C2H_ST_PLD_FIFO_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_6_field_info[] = { - {"C2H_STAT_DMA_ENG_6_RSVD", - C2H_STAT_DMA_ENG_6_RSVD_MASK}, - {"C2H_STAT_DMA_ENG_6_PLD_ST_FIFO_OUT_DATA_QID", - C2H_STAT_DMA_ENG_6_PLD_ST_FIFO_OUT_DATA_QID_MASK}, - {"C2H_STAT_DMA_ENG_6_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID", - C2H_STAT_DMA_ENG_6_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_MASK}, - {"C2H_STAT_DMA_ENG_6_PLD_PKT_ID_LARGER_PLD_ST", - C2H_STAT_DMA_ENG_6_PLD_PKT_ID_LARGER_PLD_ST_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_7_field_info[] = { - {"C2H_STAT_DMA_ENG_7_RSVD", - C2H_STAT_DMA_ENG_7_RSVD_MASK}, - {"C2H_STAT_DMA_ENG_7_PLD_ST_FIFO_OUT_DATA_QID_1", - C2H_STAT_DMA_ENG_7_PLD_ST_FIFO_OUT_DATA_QID_1_MASK}, - {"C2H_STAT_DMA_ENG_7_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_1", - C2H_STAT_DMA_ENG_7_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_1_MASK}, - {"C2H_STAT_DMA_ENG_7_PLD_PKT_ID_LARGER_PLD_ST_1", - C2H_STAT_DMA_ENG_7_PLD_PKT_ID_LARGER_PLD_ST_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_pcie_cmp_1_field_info[] = { - {"C2H_STAT_PCIE_CMP_1_DEPTH", - C2H_STAT_PCIE_CMP_1_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_almost_full_field_info[] = { - {"C2H_PLD_FIFO_ALMOST_FULL_ENABLE", - C2H_PLD_FIFO_ALMOST_FULL_ENABLE_MASK}, - {"C2H_PLD_FIFO_ALMOST_FULL_TH", - C2H_PLD_FIFO_ALMOST_FULL_TH_MASK}, -}; - - -static struct regfield_info - pfch_cfg_3_field_info[] = { - {"PFCH_CFG_3_RSVD", - PFCH_CFG_3_RSVD_MASK}, - {"PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH", - PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_MASK}, - {"PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH", - PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_MASK}, -}; - - -static struct regfield_info - cmpt_cfg_0_field_info[] = { - {"CMPT_CFG_0_RSVD", - CMPT_CFG_0_RSVD_MASK}, - {"CMPT_CFG_0_VIO_SPRS_INT_AFTER_RTY", - CMPT_CFG_0_VIO_SPRS_INT_AFTER_RTY_MASK}, - {"CMPT_CFG_0_VIO_EVNT_SUP_EN", - CMPT_CFG_0_VIO_EVNT_SUP_EN_MASK}, -}; - - -static struct regfield_info - pfch_cfg_4_field_info[] = { - {"PFCH_CFG_4_GLB_EVT_TIMER_TICK", - PFCH_CFG_4_GLB_EVT_TIMER_TICK_MASK}, - {"PFCH_CFG_4_DISABLE_GLB_EVT_TIMER", - PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_MASK}, - {"PFCH_CFG_4_EVT_TIMER_TICK", - PFCH_CFG_4_EVT_TIMER_TICK_MASK}, - {"PFCH_CFG_4_DISABLE_EVT_TIMER", - PFCH_CFG_4_DISABLE_EVT_TIMER_MASK}, -}; - -static struct xreg_info eqdma_config_regs[] = { -{"CFG_BLK_IDENTIFIER", 0x00, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_identifier_field_info), - cfg_blk_identifier_field_info -}, -{"CFG_BLK_PCIE_MAX_PLD_SIZE", 0x08, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_pld_size_field_info), - cfg_blk_pcie_max_pld_size_field_info -}, -{"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", 0x0c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_read_req_size_field_info), - cfg_blk_pcie_max_read_req_size_field_info -}, -{"CFG_BLK_SYSTEM_ID", 0x10, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_system_id_field_info), - cfg_blk_system_id_field_info -}, -{"CFG_BLK_MSIX_ENABLE", 0x014, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msix_enable_field_info), - cfg_blk_msix_enable_field_info -}, -{"CFG_PCIE_DATA_WIDTH", 0x18, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_data_width_field_info), - cfg_pcie_data_width_field_info -}, -{"CFG_PCIE_CTL", 0x1c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_ctl_field_info), - cfg_pcie_ctl_field_info -}, -{"CFG_BLK_MSI_ENABLE", 0x20, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msi_enable_field_info), - cfg_blk_msi_enable_field_info -}, -{"CFG_AXI_USER_MAX_PLD_SIZE", 0x40, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_pld_size_field_info), - cfg_axi_user_max_pld_size_field_info -}, -{"CFG_AXI_USER_MAX_READ_REQ_SIZE", 0x44, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_read_req_size_field_info), - cfg_axi_user_max_read_req_size_field_info -}, -{"CFG_BLK_MISC_CTL", 0x4c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_misc_ctl_field_info), - cfg_blk_misc_ctl_field_info -}, -{"CFG_PL_CRED_CTL", 0x68, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pl_cred_ctl_field_info), - cfg_pl_cred_ctl_field_info -}, -{"CFG_BLK_SCRATCH", 0x80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_field_info), - cfg_blk_scratch_field_info -}, -{"CFG_GIC", 0xa0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_gic_field_info), - cfg_gic_field_info -}, -{"RAM_SBE_MSK_1_A", 0xe0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_1_a_field_info), - ram_sbe_msk_1_a_field_info -}, -{"RAM_SBE_STS_1_A", 0xe4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_1_a_field_info), - ram_sbe_sts_1_a_field_info -}, -{"RAM_DBE_MSK_1_A", 0xe8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_1_a_field_info), - ram_dbe_msk_1_a_field_info -}, -{"RAM_DBE_STS_1_A", 0xec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_1_a_field_info), - ram_dbe_sts_1_a_field_info -}, -{"RAM_SBE_MSK_A", 0xf0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_a_field_info), - ram_sbe_msk_a_field_info -}, -{"RAM_SBE_STS_A", 0xf4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_a_field_info), - ram_sbe_sts_a_field_info -}, -{"RAM_DBE_MSK_A", 0xf8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_a_field_info), - ram_dbe_msk_a_field_info -}, -{"RAM_DBE_STS_A", 0xfc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_a_field_info), - ram_dbe_sts_a_field_info -}, -{"GLBL2_IDENTIFIER", 0x100, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_identifier_field_info), - glbl2_identifier_field_info -}, -{"GLBL2_CHANNEL_INST", 0x114, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_inst_field_info), - glbl2_channel_inst_field_info -}, -{"GLBL2_CHANNEL_MDMA", 0x118, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_mdma_field_info), - glbl2_channel_mdma_field_info -}, -{"GLBL2_CHANNEL_STRM", 0x11c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_strm_field_info), - glbl2_channel_strm_field_info -}, -{"GLBL2_CHANNEL_CAP", 0x120, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_cap_field_info), - glbl2_channel_cap_field_info -}, -{"GLBL2_CHANNEL_PASID_CAP", 0x128, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_pasid_cap_field_info), - glbl2_channel_pasid_cap_field_info -}, -{"GLBL2_SYSTEM_ID", 0x130, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_system_id_field_info), - glbl2_system_id_field_info -}, -{"GLBL2_MISC_CAP", 0x134, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_misc_cap_field_info), - glbl2_misc_cap_field_info -}, -{"GLBL2_RRQ_BRG_THROT", 0x158, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_brg_throt_field_info), - glbl2_rrq_brg_throt_field_info -}, -{"GLBL2_RRQ_PCIE_THROT", 0x15c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_pcie_throt_field_info), - glbl2_rrq_pcie_throt_field_info -}, -{"GLBL2_RRQ_AXIMM_THROT", 0x160, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_aximm_throt_field_info), - glbl2_rrq_aximm_throt_field_info -}, -{"GLBL2_RRQ_PCIE_LAT0", 0x164, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_pcie_lat0_field_info), - glbl2_rrq_pcie_lat0_field_info -}, -{"GLBL2_RRQ_PCIE_LAT1", 0x168, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_pcie_lat1_field_info), - glbl2_rrq_pcie_lat1_field_info -}, -{"GLBL2_RRQ_AXIMM_LAT0", 0x16c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_aximm_lat0_field_info), - glbl2_rrq_aximm_lat0_field_info -}, -{"GLBL2_RRQ_AXIMM_LAT1", 0x170, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_aximm_lat1_field_info), - glbl2_rrq_aximm_lat1_field_info -}, -{"GLBL2_DBG_PCIE_RQ0", 0x1b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq0_field_info), - glbl2_dbg_pcie_rq0_field_info -}, -{"GLBL2_DBG_PCIE_RQ1", 0x1bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq1_field_info), - glbl2_dbg_pcie_rq1_field_info -}, -{"GLBL2_DBG_AXIMM_WR0", 0x1c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr0_field_info), - glbl2_dbg_aximm_wr0_field_info -}, -{"GLBL2_DBG_AXIMM_WR1", 0x1c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr1_field_info), - glbl2_dbg_aximm_wr1_field_info -}, -{"GLBL2_DBG_AXIMM_RD0", 0x1c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd0_field_info), - glbl2_dbg_aximm_rd0_field_info -}, -{"GLBL2_DBG_AXIMM_RD1", 0x1cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd1_field_info), - glbl2_dbg_aximm_rd1_field_info -}, -{"GLBL2_DBG_FAB0", 0x1d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab0_field_info), - glbl2_dbg_fab0_field_info -}, -{"GLBL2_DBG_FAB1", 0x1d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab1_field_info), - glbl2_dbg_fab1_field_info -}, -{"GLBL2_DBG_MATCH_SEL", 0x1f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_sel_field_info), - glbl2_dbg_match_sel_field_info -}, -{"GLBL2_DBG_MATCH_MSK", 0x1f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_msk_field_info), - glbl2_dbg_match_msk_field_info -}, -{"GLBL2_DBG_MATCH_PAT", 0x1fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_pat_field_info), - glbl2_dbg_match_pat_field_info -}, -{"GLBL_RNG_SZ_1", 0x204, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_1_field_info), - glbl_rng_sz_1_field_info -}, -{"GLBL_RNG_SZ_2", 0x208, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_2_field_info), - glbl_rng_sz_2_field_info -}, -{"GLBL_RNG_SZ_3", 0x20c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_3_field_info), - glbl_rng_sz_3_field_info -}, -{"GLBL_RNG_SZ_4", 0x210, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_4_field_info), - glbl_rng_sz_4_field_info -}, -{"GLBL_RNG_SZ_5", 0x214, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_5_field_info), - glbl_rng_sz_5_field_info -}, -{"GLBL_RNG_SZ_6", 0x218, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_6_field_info), - glbl_rng_sz_6_field_info -}, -{"GLBL_RNG_SZ_7", 0x21c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_7_field_info), - glbl_rng_sz_7_field_info -}, -{"GLBL_RNG_SZ_8", 0x220, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_8_field_info), - glbl_rng_sz_8_field_info -}, -{"GLBL_RNG_SZ_9", 0x224, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_9_field_info), - glbl_rng_sz_9_field_info -}, -{"GLBL_RNG_SZ_A", 0x228, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_a_field_info), - glbl_rng_sz_a_field_info -}, -{"GLBL_RNG_SZ_B", 0x22c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_b_field_info), - glbl_rng_sz_b_field_info -}, -{"GLBL_RNG_SZ_C", 0x230, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_c_field_info), - glbl_rng_sz_c_field_info -}, -{"GLBL_RNG_SZ_D", 0x234, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_d_field_info), - glbl_rng_sz_d_field_info -}, -{"GLBL_RNG_SZ_E", 0x238, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_e_field_info), - glbl_rng_sz_e_field_info -}, -{"GLBL_RNG_SZ_F", 0x23c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_f_field_info), - glbl_rng_sz_f_field_info -}, -{"GLBL_RNG_SZ_10", 0x240, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_10_field_info), - glbl_rng_sz_10_field_info -}, -{"GLBL_ERR_STAT", 0x248, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_stat_field_info), - glbl_err_stat_field_info -}, -{"GLBL_ERR_MASK", 0x24c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_mask_field_info), - glbl_err_mask_field_info -}, -{"GLBL_DSC_CFG", 0x250, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_cfg_field_info), - glbl_dsc_cfg_field_info -}, -{"GLBL_DSC_ERR_STS", 0x254, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_sts_field_info), - glbl_dsc_err_sts_field_info -}, -{"GLBL_DSC_ERR_MSK", 0x258, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_msk_field_info), - glbl_dsc_err_msk_field_info -}, -{"GLBL_DSC_ERR_LOG0", 0x25c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log0_field_info), - glbl_dsc_err_log0_field_info -}, -{"GLBL_DSC_ERR_LOG1", 0x260, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log1_field_info), - glbl_dsc_err_log1_field_info -}, -{"GLBL_TRQ_ERR_STS", 0x264, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_sts_field_info), - glbl_trq_err_sts_field_info -}, -{"GLBL_TRQ_ERR_MSK", 0x268, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_msk_field_info), - glbl_trq_err_msk_field_info -}, -{"GLBL_TRQ_ERR_LOG", 0x26c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_log_field_info), - glbl_trq_err_log_field_info -}, -{"GLBL_DSC_DBG_DAT0", 0x270, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat0_field_info), - glbl_dsc_dbg_dat0_field_info -}, -{"GLBL_DSC_DBG_DAT1", 0x274, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat1_field_info), - glbl_dsc_dbg_dat1_field_info -}, -{"GLBL_DSC_DBG_CTL", 0x278, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_ctl_field_info), - glbl_dsc_dbg_ctl_field_info -}, -{"GLBL_DSC_ERR_LOG2", 0x27c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log2_field_info), - glbl_dsc_err_log2_field_info -}, -{"GLBL_GLBL_INTERRUPT_CFG", 0x2c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_glbl_interrupt_cfg_field_info), - glbl_glbl_interrupt_cfg_field_info -}, -{"GLBL_VCH_HOST_PROFILE", 0x2c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_vch_host_profile_field_info), - glbl_vch_host_profile_field_info -}, -{"GLBL_BRIDGE_HOST_PROFILE", 0x308, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_bridge_host_profile_field_info), - glbl_bridge_host_profile_field_info -}, -{"AXIMM_IRQ_DEST_ADDR", 0x30c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(aximm_irq_dest_addr_field_info), - aximm_irq_dest_addr_field_info -}, -{"FAB_ERR_LOG", 0x314, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(fab_err_log_field_info), - fab_err_log_field_info -}, -{"GLBL_REQ_ERR_STS", 0x318, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_req_err_sts_field_info), - glbl_req_err_sts_field_info -}, -{"GLBL_REQ_ERR_MSK", 0x31c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_req_err_msk_field_info), - glbl_req_err_msk_field_info -}, -{"GLBL_DSC_DBG_LAT0_A", 0x320, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_dbg_lat0_a_field_info), - glbl_dsc_dbg_lat0_a_field_info -}, -{"GLBL_DSC_DBG_LAT1_A", 0x324, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_dbg_lat1_a_field_info), - glbl_dsc_dbg_lat1_a_field_info -}, -{"GLBL_DSC_CRD_CTR0_A", 0x328, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_crd_ctr0_a_field_info), - glbl_dsc_crd_ctr0_a_field_info -}, -{"GLBL_DSC_CRD_CTR1_A", 0x32c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_crd_ctr1_a_field_info), - glbl_dsc_crd_ctr1_a_field_info -}, -{"GLBL_DSC_CRD_CTR2_A", 0x330, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_crd_ctr2_a_field_info), - glbl_dsc_crd_ctr2_a_field_info -}, -{"GLBL_DSC_CRD_CTR3_A", 0x334, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_crd_ctr3_a_field_info), - glbl_dsc_crd_ctr3_a_field_info -}, -{"GLBL_DSC_IMM_CRD_CTR0_A", 0x338, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_imm_crd_ctr0_a_field_info), - glbl_dsc_imm_crd_ctr0_a_field_info -}, -{"GLBL_DSC_IMM_CRD_CTR1_A", 0x33c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_imm_crd_ctr1_a_field_info), - glbl_dsc_imm_crd_ctr1_a_field_info -}, -{"GLBL_DSC_IMM_CRD_CTR2_A", 0x340, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_imm_crd_ctr2_a_field_info), - glbl_dsc_imm_crd_ctr2_a_field_info -}, -{"GLBL_DSC_IMM_CRD_CTR3_A", 0x344, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_imm_crd_ctr3_a_field_info), - glbl_dsc_imm_crd_ctr3_a_field_info -}, -{"GLBL_DSC_H2C_OUT_CTR0_A", 0x348, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_h2c_out_ctr0_a_field_info), - glbl_dsc_h2c_out_ctr0_a_field_info -}, -{"GLBL_DSC_H2C_OUT_CTR1_A", 0x34c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_h2c_out_ctr1_a_field_info), - glbl_dsc_h2c_out_ctr1_a_field_info -}, -{"GLBL_DSC_H2C_OUT_CTR2_A", 0x350, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_h2c_out_ctr2_a_field_info), - glbl_dsc_h2c_out_ctr2_a_field_info -}, -{"GLBL_DSC_H2C_OUT_CTR3_A", 0x354, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_h2c_out_ctr3_a_field_info), - glbl_dsc_h2c_out_ctr3_a_field_info -}, -{"GLBL_DSC_C2H_OUT_CTR0_A", 0x358, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_c2h_out_ctr0_a_field_info), - glbl_dsc_c2h_out_ctr0_a_field_info -}, -{"GLBL_DSC_C2H_OUT_CTR1_A", 0x35c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_c2h_out_ctr1_a_field_info), - glbl_dsc_c2h_out_ctr1_a_field_info -}, -{"GLBL_DSC_C2H_OUT_CTR2_A", 0x360, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_c2h_out_ctr2_a_field_info), - glbl_dsc_c2h_out_ctr2_a_field_info -}, -{"GLBL_DSC_C2H_OUT_CTR3_A", 0x364, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_c2h_out_ctr3_a_field_info), - glbl_dsc_c2h_out_ctr3_a_field_info -}, -{"T", 0x368, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(t_field_info), - t_field_info -}, -{"GLBL_PERF_CNTR_CTL_A1", 0x36c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_perf_cntr_ctl_a1_field_info), - glbl_perf_cntr_ctl_a1_field_info -}, -{"GLBL_FREE_CNT_A0", 0x370, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_free_cnt_a0_field_info), - glbl_free_cnt_a0_field_info -}, -{"GLBL_FREE_CNT_A1", 0x374, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_free_cnt_a1_field_info), - glbl_free_cnt_a1_field_info -}, -{"GLBL_AXIS_H2C_CNT_A0", 0x378, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a0_field_info), - glbl_axis_h2c_cnt_a0_field_info -}, -{"GLBL_AXIS_H2C_CNT_A1", 0x37c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a1_field_info), - glbl_axis_h2c_cnt_a1_field_info -}, -{"GLBL_AXIS_H2C_CNT_A2", 0x380, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a2_field_info), - glbl_axis_h2c_cnt_a2_field_info -}, -{"GLBL_AXIS_H2C_CNT_A3", 0x384, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a3_field_info), - glbl_axis_h2c_cnt_a3_field_info -}, -{"GLBL_AXIS_H2C_CNT_A4", 0x388, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a4_field_info), - glbl_axis_h2c_cnt_a4_field_info -}, -{"GLBL_AXIS_H2C_CNT_A5", 0x38c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a5_field_info), - glbl_axis_h2c_cnt_a5_field_info -}, -{"GLBL_AXIS_C2H_CNT_A0", 0x390, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a0_field_info), - glbl_axis_c2h_cnt_a0_field_info -}, -{"GLBL_AXIS_C2H_CNT_A1", 0x394, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a1_field_info), - glbl_axis_c2h_cnt_a1_field_info -}, -{"GLBL_AXIS_C2H_CNT_A2", 0x398, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a2_field_info), - glbl_axis_c2h_cnt_a2_field_info -}, -{"GLBL_AXIS_C2H_CNT_A3", 0x39c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a3_field_info), - glbl_axis_c2h_cnt_a3_field_info -}, -{"GLBL_AXIS_C2H_CNT_A4", 0x3a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a4_field_info), - glbl_axis_c2h_cnt_a4_field_info -}, -{"GLBL_AXIS_C2H_CNT_A5", 0x3a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a5_field_info), - glbl_axis_c2h_cnt_a5_field_info -}, -{"GLBL_M_AXI_WR_CNT_A0", 0x3a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a0_field_info), - glbl_m_axi_wr_cnt_a0_field_info -}, -{"GLBL_M_AXI_WR_CNT_A1", 0x3ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a1_field_info), - glbl_m_axi_wr_cnt_a1_field_info -}, -{"GLBL_M_AXI_WR_CNT_A2", 0x3b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a2_field_info), - glbl_m_axi_wr_cnt_a2_field_info -}, -{"GLBL_M_AXI_WR_CNT_A3", 0x3b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a3_field_info), - glbl_m_axi_wr_cnt_a3_field_info -}, -{"GLBL_M_AXI_WR_CNT_A4", 0x3b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a4_field_info), - glbl_m_axi_wr_cnt_a4_field_info -}, -{"GLBL_M_AXI_WR_CNT_A5", 0x3bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a5_field_info), - glbl_m_axi_wr_cnt_a5_field_info -}, -{"GLBL_M_AXI_RD_CNT_A0", 0x3c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a0_field_info), - glbl_m_axi_rd_cnt_a0_field_info -}, -{"GLBL_M_AXI_RD_CNT_A1", 0x3c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a1_field_info), - glbl_m_axi_rd_cnt_a1_field_info -}, -{"GLBL_M_AXI_RD_CNT_A2", 0x3c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a2_field_info), - glbl_m_axi_rd_cnt_a2_field_info -}, -{"GLBL_M_AXI_RD_CNT_A3", 0x3cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a3_field_info), - glbl_m_axi_rd_cnt_a3_field_info -}, -{"GLBL_M_AXI_RD_CNT_A4", 0x3d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a4_field_info), - glbl_m_axi_rd_cnt_a4_field_info -}, -{"GLBL_M_AXI_RD_CNT_A5", 0x3d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a5_field_info), - glbl_m_axi_rd_cnt_a5_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A0", 0x3d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a0_field_info), - glbl_m_axib_wr_cnt_a0_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A1", 0x3dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a1_field_info), - glbl_m_axib_wr_cnt_a1_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A2", 0x3e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a2_field_info), - glbl_m_axib_wr_cnt_a2_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A3", 0x3e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a3_field_info), - glbl_m_axib_wr_cnt_a3_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A4", 0x3e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a4_field_info), - glbl_m_axib_wr_cnt_a4_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A5", 0x3ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a5_field_info), - glbl_m_axib_wr_cnt_a5_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A0", 0x3f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a0_field_info), - glbl_m_axib_rd_cnt_a0_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A1", 0x3f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a1_field_info), - glbl_m_axib_rd_cnt_a1_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A2", 0x3f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a2_field_info), - glbl_m_axib_rd_cnt_a2_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A3", 0x3fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a3_field_info), - glbl_m_axib_rd_cnt_a3_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A4", 0x400, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a4_field_info), - glbl_m_axib_rd_cnt_a4_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A5", 0x404, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a5_field_info), - glbl_m_axib_rd_cnt_a5_field_info -}, -{"GLBL_S_AXI_WR_CNT_A0", 0x408, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a0_field_info), - glbl_s_axi_wr_cnt_a0_field_info -}, -{"GLBL_S_AXI_WR_CNT_A1", 0x40c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a1_field_info), - glbl_s_axi_wr_cnt_a1_field_info -}, -{"GLBL_S_AXI_WR_CNT_A2", 0x410, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a2_field_info), - glbl_s_axi_wr_cnt_a2_field_info -}, -{"GLBL_S_AXI_WR_CNT_A3", 0x414, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a3_field_info), - glbl_s_axi_wr_cnt_a3_field_info -}, -{"GLBL_S_AXI_WR_CNT_A4", 0x418, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a4_field_info), - glbl_s_axi_wr_cnt_a4_field_info -}, -{"GLBL_S_AXI_WR_CNT_A5", 0x41c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a5_field_info), - glbl_s_axi_wr_cnt_a5_field_info -}, -{"GLBL_S_AXI_RD_CNT_A0", 0x420, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a0_field_info), - glbl_s_axi_rd_cnt_a0_field_info -}, -{"GLBL_S_AXI_RD_CNT_A1", 0x424, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a1_field_info), - glbl_s_axi_rd_cnt_a1_field_info -}, -{"GLBL_S_AXI_RD_CNT_A2", 0x428, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a2_field_info), - glbl_s_axi_rd_cnt_a2_field_info -}, -{"GLBL_S_AXI_RD_CNT_A3", 0x42c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a3_field_info), - glbl_s_axi_rd_cnt_a3_field_info -}, -{"GLBL_S_AXI_RD_CNT_A4", 0x430, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a4_field_info), - glbl_s_axi_rd_cnt_a4_field_info -}, -{"GLBL_S_AXI_RD_CNT_A5", 0x434, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a5_field_info), - glbl_s_axi_rd_cnt_a5_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A0", 0x438, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a0_field_info), - glbl_s_axis_cmp_cnt_a0_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A1", 0x43c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a1_field_info), - glbl_s_axis_cmp_cnt_a1_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A2", 0x440, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a2_field_info), - glbl_s_axis_cmp_cnt_a2_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A3", 0x444, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a3_field_info), - glbl_s_axis_cmp_cnt_a3_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A4", 0x448, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a4_field_info), - glbl_s_axis_cmp_cnt_a4_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A5", 0x44c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a5_field_info), - glbl_s_axis_cmp_cnt_a5_field_info -}, -{"IND_CTXT_DATA", 0x804, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_field_info), - ind_ctxt_data_field_info -}, -{"IND_CTXT_MASK", 0x824, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_mask_field_info), - ind_ctxt_mask_field_info -}, -{"IND_CTXT_CMD", 0x844, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_cmd_field_info), - ind_ctxt_cmd_field_info -}, -{"C2H_TIMER_CNT", 0xa00, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_field_info), - c2h_timer_cnt_field_info -}, -{"C2H_CNT_TH", 0xa40, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_field_info), - c2h_cnt_th_field_info -}, -{"C2H_PFCH_CFG_1", 0xa80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_pfch_cfg_1_field_info), - c2h_pfch_cfg_1_field_info -}, -{"C2H_PFCH_CFG_2", 0xa84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_pfch_cfg_2_field_info), - c2h_pfch_cfg_2_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xa88, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_field_info), - c2h_stat_s_axis_c2h_accepted_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED", 0xa8c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_field_info), - c2h_stat_s_axis_wrb_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xa90, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_field_info), - c2h_stat_desc_rsp_pkt_accepted_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP", 0xa94, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_field_info), - c2h_stat_axis_pkg_cmp_field_info -}, -{"C2H_STAT_DESC_RSP_ACCEPTED", 0xa98, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_accepted_field_info), - c2h_stat_desc_rsp_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_CMP", 0xa9c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_cmp_field_info), - c2h_stat_desc_rsp_cmp_field_info -}, -{"C2H_STAT_WRQ_OUT", 0xaa0, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wrq_out_field_info), - c2h_stat_wrq_out_field_info -}, -{"C2H_STAT_WPL_REN_ACCEPTED", 0xaa4, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wpl_ren_accepted_field_info), - c2h_stat_wpl_ren_accepted_field_info -}, -{"C2H_STAT_TOTAL_WRQ_LEN", 0xaa8, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wrq_len_field_info), - c2h_stat_total_wrq_len_field_info -}, -{"C2H_STAT_TOTAL_WPL_LEN", 0xaac, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wpl_len_field_info), - c2h_stat_total_wpl_len_field_info -}, -{"C2H_BUF_SZ", 0xab0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_field_info), - c2h_buf_sz_field_info -}, -{"C2H_ERR_STAT", 0xaf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_stat_field_info), - c2h_err_stat_field_info -}, -{"C2H_ERR_MASK", 0xaf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_mask_field_info), - c2h_err_mask_field_info -}, -{"C2H_FATAL_ERR_STAT", 0xaf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_stat_field_info), - c2h_fatal_err_stat_field_info -}, -{"C2H_FATAL_ERR_MASK", 0xafc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_mask_field_info), - c2h_fatal_err_mask_field_info -}, -{"C2H_FATAL_ERR_ENABLE", 0xb00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_enable_field_info), - c2h_fatal_err_enable_field_info -}, -{"GLBL_ERR_INT", 0xb04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_int_field_info), - glbl_err_int_field_info -}, -{"C2H_PFCH_CFG", 0xb08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_field_info), - c2h_pfch_cfg_field_info -}, -{"C2H_INT_TIMER_TICK", 0xb0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_timer_tick_field_info), - c2h_int_timer_tick_field_info -}, -{"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xb10, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_drop_accepted_field_info), - c2h_stat_desc_rsp_drop_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xb14, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_err_accepted_field_info), - c2h_stat_desc_rsp_err_accepted_field_info -}, -{"C2H_STAT_DESC_REQ", 0xb18, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_req_field_info), - c2h_stat_desc_req_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_0", 0xb1c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_0_field_info), - c2h_stat_dbg_dma_eng_0_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_1", 0xb20, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_1_field_info), - c2h_stat_dbg_dma_eng_1_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_2", 0xb24, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_2_field_info), - c2h_stat_dbg_dma_eng_2_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_3", 0xb28, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_3_field_info), - c2h_stat_dbg_dma_eng_3_field_info -}, -{"C2H_DBG_PFCH_ERR_CTXT", 0xb2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_err_ctxt_field_info), - c2h_dbg_pfch_err_ctxt_field_info -}, -{"C2H_FIRST_ERR_QID", 0xb30, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_first_err_qid_field_info), - c2h_first_err_qid_field_info -}, -{"STAT_NUM_WRB_IN", 0xb34, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_in_field_info), - stat_num_wrb_in_field_info -}, -{"STAT_NUM_WRB_OUT", 0xb38, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_out_field_info), - stat_num_wrb_out_field_info -}, -{"STAT_NUM_WRB_DRP", 0xb3c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_drp_field_info), - stat_num_wrb_drp_field_info -}, -{"STAT_NUM_STAT_DESC_OUT", 0xb40, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_stat_desc_out_field_info), - stat_num_stat_desc_out_field_info -}, -{"STAT_NUM_DSC_CRDT_SENT", 0xb44, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_dsc_crdt_sent_field_info), - stat_num_dsc_crdt_sent_field_info -}, -{"STAT_NUM_FCH_DSC_RCVD", 0xb48, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_fch_dsc_rcvd_field_info), - stat_num_fch_dsc_rcvd_field_info -}, -{"STAT_NUM_BYP_DSC_RCVD", 0xb4c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_byp_dsc_rcvd_field_info), - stat_num_byp_dsc_rcvd_field_info -}, -{"C2H_WRB_COAL_CFG", 0xb50, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_cfg_field_info), - c2h_wrb_coal_cfg_field_info -}, -{"C2H_INTR_H2C_REQ", 0xb54, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_h2c_req_field_info), - c2h_intr_h2c_req_field_info -}, -{"C2H_INTR_C2H_MM_REQ", 0xb58, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_mm_req_field_info), - c2h_intr_c2h_mm_req_field_info -}, -{"C2H_INTR_ERR_INT_REQ", 0xb5c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_err_int_req_field_info), - c2h_intr_err_int_req_field_info -}, -{"C2H_INTR_C2H_ST_REQ", 0xb60, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_req_field_info), - c2h_intr_c2h_st_req_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK", 0xb64, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_ack_field_info), - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL", 0xb68, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_fail_field_info), - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX", 0xb6c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info), - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL", 0xb70, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info), - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_ACK", 0xb74, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_ack_field_info), - c2h_intr_c2h_st_msix_ack_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_FAIL", 0xb78, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_fail_field_info), - c2h_intr_c2h_st_msix_fail_field_info -}, -{"C2H_INTR_C2H_ST_NO_MSIX", 0xb7c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_no_msix_field_info), - c2h_intr_c2h_st_no_msix_field_info -}, -{"C2H_INTR_C2H_ST_CTXT_INVAL", 0xb80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_ctxt_inval_field_info), - c2h_intr_c2h_st_ctxt_inval_field_info -}, -{"C2H_STAT_WR_CMP", 0xb84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wr_cmp_field_info), - c2h_stat_wr_cmp_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_4", 0xb88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_4_field_info), - c2h_stat_dbg_dma_eng_4_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_5", 0xb8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_5_field_info), - c2h_stat_dbg_dma_eng_5_field_info -}, -{"C2H_DBG_PFCH_QID", 0xb90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_qid_field_info), - c2h_dbg_pfch_qid_field_info -}, -{"C2H_DBG_PFCH", 0xb94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_field_info), - c2h_dbg_pfch_field_info -}, -{"C2H_INT_DBG", 0xb98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_dbg_field_info), - c2h_int_dbg_field_info -}, -{"C2H_STAT_IMM_ACCEPTED", 0xb9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_imm_accepted_field_info), - c2h_stat_imm_accepted_field_info -}, -{"C2H_STAT_MARKER_ACCEPTED", 0xba0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_marker_accepted_field_info), - c2h_stat_marker_accepted_field_info -}, -{"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xba4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_disable_cmp_accepted_field_info), - c2h_stat_disable_cmp_accepted_field_info -}, -{"C2H_PLD_FIFO_CRDT_CNT", 0xba8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_crdt_cnt_field_info), - c2h_pld_fifo_crdt_cnt_field_info -}, -{"C2H_INTR_DYN_REQ", 0xbac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_req_field_info), - c2h_intr_dyn_req_field_info -}, -{"C2H_INTR_DYN_MISC", 0xbb0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_misc_field_info), - c2h_intr_dyn_misc_field_info -}, -{"C2H_DROP_LEN_MISMATCH", 0xbb4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_len_mismatch_field_info), - c2h_drop_len_mismatch_field_info -}, -{"C2H_DROP_DESC_RSP_LEN", 0xbb8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_desc_rsp_len_field_info), - c2h_drop_desc_rsp_len_field_info -}, -{"C2H_DROP_QID_FIFO_LEN", 0xbbc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_qid_fifo_len_field_info), - c2h_drop_qid_fifo_len_field_info -}, -{"C2H_DROP_PLD_CNT", 0xbc0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_field_info), - c2h_drop_pld_cnt_field_info -}, -{"C2H_CMPT_FORMAT_0", 0xbc4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_0_field_info), - c2h_cmpt_format_0_field_info -}, -{"C2H_CMPT_FORMAT_1", 0xbc8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_1_field_info), - c2h_cmpt_format_1_field_info -}, -{"C2H_CMPT_FORMAT_2", 0xbcc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_2_field_info), - c2h_cmpt_format_2_field_info -}, -{"C2H_CMPT_FORMAT_3", 0xbd0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_3_field_info), - c2h_cmpt_format_3_field_info -}, -{"C2H_CMPT_FORMAT_4", 0xbd4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_4_field_info), - c2h_cmpt_format_4_field_info -}, -{"C2H_CMPT_FORMAT_5", 0xbd8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_5_field_info), - c2h_cmpt_format_5_field_info -}, -{"C2H_CMPT_FORMAT_6", 0xbdc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_6_field_info), - c2h_cmpt_format_6_field_info -}, -{"C2H_PFCH_CACHE_DEPTH", 0xbe0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cache_depth_field_info), - c2h_pfch_cache_depth_field_info -}, -{"C2H_WRB_COAL_BUF_DEPTH", 0xbe4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_buf_depth_field_info), - c2h_wrb_coal_buf_depth_field_info -}, -{"C2H_PFCH_CRDT", 0xbe8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_crdt_field_info), - c2h_pfch_crdt_field_info -}, -{"C2H_STAT_HAS_CMPT_ACCEPTED", 0xbec, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_cmpt_accepted_field_info), - c2h_stat_has_cmpt_accepted_field_info -}, -{"C2H_STAT_HAS_PLD_ACCEPTED", 0xbf0, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_pld_accepted_field_info), - c2h_stat_has_pld_accepted_field_info -}, -{"C2H_PLD_PKT_ID", 0xbf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_field_info), - c2h_pld_pkt_id_field_info -}, -{"C2H_PLD_PKT_ID_1", 0xbf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_1_field_info), - c2h_pld_pkt_id_1_field_info -}, -{"C2H_DROP_PLD_CNT_1", 0xbfc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_1_field_info), - c2h_drop_pld_cnt_1_field_info -}, -{"H2C_ERR_STAT", 0xe00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_stat_field_info), - h2c_err_stat_field_info -}, -{"H2C_ERR_MASK", 0xe04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_mask_field_info), - h2c_err_mask_field_info -}, -{"H2C_FIRST_ERR_QID", 0xe08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_first_err_qid_field_info), - h2c_first_err_qid_field_info -}, -{"H2C_DBG_REG0", 0xe0c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg0_field_info), - h2c_dbg_reg0_field_info -}, -{"H2C_DBG_REG1", 0xe10, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg1_field_info), - h2c_dbg_reg1_field_info -}, -{"H2C_DBG_REG2", 0xe14, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg2_field_info), - h2c_dbg_reg2_field_info -}, -{"H2C_DBG_REG3", 0xe18, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg3_field_info), - h2c_dbg_reg3_field_info -}, -{"H2C_DBG_REG4", 0xe1c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg4_field_info), - h2c_dbg_reg4_field_info -}, -{"H2C_FATAL_ERR_EN", 0xe20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_fatal_err_en_field_info), - h2c_fatal_err_en_field_info -}, -{"H2C_REQ_THROT_PCIE", 0xe24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_pcie_field_info), - h2c_req_throt_pcie_field_info -}, -{"H2C_ALN_DBG_REG0", 0xe28, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_aln_dbg_reg0_field_info), - h2c_aln_dbg_reg0_field_info -}, -{"H2C_REQ_THROT_AXIMM", 0xe2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_aximm_field_info), - h2c_req_throt_aximm_field_info -}, -{"C2H_MM_CTL", 0x1004, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_ctl_field_info), - c2h_mm_ctl_field_info -}, -{"C2H_MM_STATUS", 0x1040, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_status_field_info), - c2h_mm_status_field_info -}, -{"C2H_MM_CMPL_DESC_CNT", 0x1048, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_cmpl_desc_cnt_field_info), - c2h_mm_cmpl_desc_cnt_field_info -}, -{"C2H_MM_ERR_CODE_ENABLE_MASK", 0x1054, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_enable_mask_field_info), - c2h_mm_err_code_enable_mask_field_info -}, -{"C2H_MM_ERR_CODE", 0x1058, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_field_info), - c2h_mm_err_code_field_info -}, -{"C2H_MM_ERR_INFO", 0x105c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_info_field_info), - c2h_mm_err_info_field_info -}, -{"C2H_MM_PERF_MON_CTL", 0x10c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_ctl_field_info), - c2h_mm_perf_mon_ctl_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT0", 0x10c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt0_field_info), - c2h_mm_perf_mon_cycle_cnt0_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT1", 0x10c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt1_field_info), - c2h_mm_perf_mon_cycle_cnt1_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT0", 0x10cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt0_field_info), - c2h_mm_perf_mon_data_cnt0_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT1", 0x10d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt1_field_info), - c2h_mm_perf_mon_data_cnt1_field_info -}, -{"C2H_MM_DBG", 0x10e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_dbg_field_info), - c2h_mm_dbg_field_info -}, -{"H2C_MM_CTL", 0x1204, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_ctl_field_info), - h2c_mm_ctl_field_info -}, -{"H2C_MM_STATUS", 0x1240, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_status_field_info), - h2c_mm_status_field_info -}, -{"H2C_MM_CMPL_DESC_CNT", 0x1248, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_cmpl_desc_cnt_field_info), - h2c_mm_cmpl_desc_cnt_field_info -}, -{"H2C_MM_ERR_CODE_ENABLE_MASK", 0x1254, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_enable_mask_field_info), - h2c_mm_err_code_enable_mask_field_info -}, -{"H2C_MM_ERR_CODE", 0x1258, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_field_info), - h2c_mm_err_code_field_info -}, -{"H2C_MM_ERR_INFO", 0x125c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_info_field_info), - h2c_mm_err_info_field_info -}, -{"H2C_MM_PERF_MON_CTL", 0x12c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_ctl_field_info), - h2c_mm_perf_mon_ctl_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT0", 0x12c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt0_field_info), - h2c_mm_perf_mon_cycle_cnt0_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT1", 0x12c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt1_field_info), - h2c_mm_perf_mon_cycle_cnt1_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT0", 0x12cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt0_field_info), - h2c_mm_perf_mon_data_cnt0_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT1", 0x12d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt1_field_info), - h2c_mm_perf_mon_data_cnt1_field_info -}, -{"H2C_MM_DBG", 0x12e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_dbg_field_info), - h2c_mm_dbg_field_info -}, -{"H2C_MM_DATA_THROTTLE", 0x12ec, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_data_throttle_field_info), - h2c_mm_data_throttle_field_info -}, -{"C2H_CRDT_COAL_CFG_1", 0x1400, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_1_field_info), - c2h_crdt_coal_cfg_1_field_info -}, -{"C2H_CRDT_COAL_CFG_2", 0x1404, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_2_field_info), - c2h_crdt_coal_cfg_2_field_info -}, -{"C2H_PFCH_BYP_QID", 0x1408, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_qid_field_info), - c2h_pfch_byp_qid_field_info -}, -{"C2H_PFCH_BYP_TAG", 0x140c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_tag_field_info), - c2h_pfch_byp_tag_field_info -}, -{"C2H_WATER_MARK", 0x1410, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_water_mark_field_info), - c2h_water_mark_field_info -}, -{"C2H_NOTIFY_EMPTY", 0x1450, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_notify_empty_field_info), - c2h_notify_empty_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED_1", 0x1454, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_1_field_info), - c2h_stat_s_axis_c2h_accepted_1_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED_1", 0x1458, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_1_field_info), - c2h_stat_s_axis_wrb_accepted_1_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED_1", 0x145c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_1_field_info), - c2h_stat_desc_rsp_pkt_accepted_1_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP_1", 0x1460, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_1_field_info), - c2h_stat_axis_pkg_cmp_1_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED_2", 0x1464, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_2_field_info), - c2h_stat_s_axis_wrb_accepted_2_field_info -}, -{"C2H_ST_PLD_FIFO_DEPTH", 0x1468, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_st_pld_fifo_depth_field_info), - c2h_st_pld_fifo_depth_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_6", 0x146c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_6_field_info), - c2h_stat_dbg_dma_eng_6_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_7", 0x1470, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_7_field_info), - c2h_stat_dbg_dma_eng_7_field_info -}, -{"C2H_STAT_PCIE_CMP_1", 0x1474, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_pcie_cmp_1_field_info), - c2h_stat_pcie_cmp_1_field_info -}, -{"C2H_PLD_FIFO_ALMOST_FULL", 0x1478, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_almost_full_field_info), - c2h_pld_fifo_almost_full_field_info -}, -{"PFCH_CFG_3", 0x147c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(pfch_cfg_3_field_info), - pfch_cfg_3_field_info -}, -{"CMPT_CFG_0", 0x1480, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cmpt_cfg_0_field_info), - cmpt_cfg_0_field_info -}, -{"PFCH_CFG_4", 0x1484, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(pfch_cfg_4_field_info), - pfch_cfg_4_field_info -}, - -}; - -uint32_t eqdma_config_num_regs_get(void) -{ - return (sizeof(eqdma_config_regs)/ - sizeof(eqdma_config_regs[0])); -} - -struct xreg_info *eqdma_config_regs_get(void) -{ - return eqdma_config_regs; -} - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_common.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_common.c deleted file mode 100755 index 84a9526..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_common.c +++ /dev/null @@ -1,1530 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma_access_common.h" -#include "qdma_platform.h" -#include "qdma_soft_reg.h" -#include "qdma_soft_access.h" -#include "qdma_cpm4_access/qdma_cpm4_access.h" -#include "eqdma_soft_access.h" -#include "eqdma_cpm5_access/eqdma_cpm5_access.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_access_common.tmh" -#endif - -/* qdma version info */ -#define RTL_BASE_VERSION 2 -#define RTL_PATCH_VERSION 3 - -/** - * enum qdma_ip - To hold ip type - */ -enum qdma_ip { - QDMA_OR_VERSAL_IP, - EQDMA_IP, - EQDMA_CPM5_IP -}; - - -/* - * hw_monitor_reg() - polling a register repeatly until - * (the register value & mask) == val or time is up - * - * return -QDMA_BUSY_IIMEOUT_ERR if register value didn't match, 0 other wise - */ -int hw_monitor_reg(void *dev_hndl, uint32_t reg, uint32_t mask, - uint32_t val, uint32_t interval_us, uint32_t timeout_us) -{ - int count; - uint32_t v; - - if (!interval_us) - interval_us = QDMA_REG_POLL_DFLT_INTERVAL_US; - if (!timeout_us) - timeout_us = QDMA_REG_POLL_DFLT_TIMEOUT_US; - - count = timeout_us / interval_us; - - do { - v = qdma_reg_read(dev_hndl, reg); - if ((v & mask) == val) - return QDMA_SUCCESS; - qdma_udelay(interval_us); - } while (--count); - - v = qdma_reg_read(dev_hndl, reg); - if ((v & mask) == val) - return QDMA_SUCCESS; - - qdma_log_error("%s: Reg read=%u Expected=%u, err:%d\n", - __func__, v, val, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; -} - -/*****************************************************************************/ -/** - * qdma_get_rtl_version() - Function to get the rtl_version in - * string format - * - * @rtl_version: Vivado release ID - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_rtl_version(enum qdma_rtl_version rtl_version) -{ - switch (rtl_version) { - case QDMA_RTL_PATCH: - return "RTL Patch"; - case QDMA_RTL_BASE: - return "RTL Base"; - default: - qdma_log_error("%s: invalid rtl_version(%d), err:%d\n", - __func__, rtl_version, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_ip_type() - Function to get the ip type in string format - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: IP Type - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_ip_type(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type) -{ - uint32_t ip_version; - int rv = QDMA_SUCCESS; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return NULL; - } - - switch (ip_type) { - case QDMA_VERSAL_HARD_IP: - return "Versal Hard IP"; - case QDMA_VERSAL_SOFT_IP: - return "Versal Soft IP"; - case QDMA_SOFT_IP: - return "QDMA Soft IP"; - case EQDMA_SOFT_IP: - rv = eqdma_get_ip_version(dev_hndl, is_vf, &ip_version); - if (rv != QDMA_SUCCESS) - return NULL; - - if (ip_version == EQDMA_IP_VERSION_4) - return "EQDMA4.0 Soft IP"; - else if (ip_version == EQDMA_IP_VERSION_5) - return "EQDMA5.0 Soft IP"; - - qdma_log_error("%s: invalid eqdma ip version(%d), err:%d\n", - __func__, ip_version, -QDMA_ERR_INV_PARAM); - return NULL; - default: - qdma_log_error("%s: invalid ip type(%d), err:%d\n", - __func__, ip_type, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_device_type() - Function to get the device type in - * string format - * - * @device_type: Device Type - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_device_type(enum qdma_device_type device_type) -{ - switch (device_type) { - case QDMA_DEVICE_SOFT: - return "Soft IP"; - case QDMA_DEVICE_VERSAL_CPM4: - return "Versal CPM4 Hard IP"; - case QDMA_DEVICE_VERSAL_CPM5: - return "Versal Hard CPM5"; - default: - qdma_log_error("%s: invalid device type(%d), err:%d\n", - __func__, device_type, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_vivado_release_id() - Function to get the vivado release id in - * string format - * - * @vivado_release_id: Vivado release ID - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_vivado_release_id( - enum qdma_vivado_release_id vivado_release_id) -{ - switch (vivado_release_id) { - case QDMA_VIVADO_2018_3: - return "vivado 2018.3"; - case QDMA_VIVADO_2019_1: - return "vivado 2019.1"; - case QDMA_VIVADO_2019_2: - return "vivado 2019.2"; - case QDMA_VIVADO_2020_1: - return "vivado 2020.1"; - case QDMA_VIVADO_2020_2: - return "vivado 2020.2"; - case QDMA_VIVADO_2021_1: - return "vivado 2021.1"; - case QDMA_VIVADO_2022_1: - return "vivado 2022.1"; - default: - qdma_log_error("%s: invalid vivado_release_id(%d), err:%d\n", - __func__, - vivado_release_id, - -QDMA_ERR_INV_PARAM); - return NULL; - } -} - - -void qdma_write_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, const uint32_t *values) -{ - uint32_t index, reg_addr; - - for (index = idx; index < (idx + cnt); index++) { - reg_addr = reg_offst + (index * sizeof(uint32_t)); - qdma_reg_write(dev_hndl, reg_addr, values[index - idx]); - } -} - -void qdma_read_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, uint32_t *values) -{ - uint32_t index, reg_addr; - - reg_addr = reg_offst + (idx * sizeof(uint32_t)); - for (index = 0; index < cnt; index++) { - values[index] = qdma_reg_read(dev_hndl, reg_addr + - (index * sizeof(uint32_t))); - } -} - -void qdma_fetch_version_details(void *dev_hndl, uint8_t is_vf, - uint32_t version_reg_val, struct qdma_hw_version_info *version_info) -{ - uint32_t rtl_version, vivado_release_id, ip_type, device_type; - const char *version_str; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return; - } - - if (!is_vf) { - rtl_version = FIELD_GET(QDMA_GLBL2_RTL_VERSION_MASK, - version_reg_val); - vivado_release_id = - FIELD_GET(QDMA_GLBL2_VIVADO_RELEASE_MASK, - version_reg_val); - device_type = FIELD_GET(QDMA_GLBL2_DEVICE_ID_MASK, - version_reg_val); - ip_type = FIELD_GET(QDMA_GLBL2_VERSAL_IP_MASK, - version_reg_val); - } else { - rtl_version = - FIELD_GET(QDMA_GLBL2_VF_RTL_VERSION_MASK, - version_reg_val); - vivado_release_id = - FIELD_GET(QDMA_GLBL2_VF_VIVADO_RELEASE_MASK, - version_reg_val); - device_type = FIELD_GET(QDMA_GLBL2_VF_DEVICE_ID_MASK, - version_reg_val); - ip_type = - FIELD_GET(QDMA_GLBL2_VF_VERSAL_IP_MASK, - version_reg_val); - } - - switch (rtl_version) { - case 0: - version_info->rtl_version = QDMA_RTL_BASE; - break; - case 1: - version_info->rtl_version = QDMA_RTL_PATCH; - break; - default: - version_info->rtl_version = QDMA_RTL_NONE; - break; - } - - version_str = qdma_get_rtl_version(version_info->rtl_version); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_rtl_version_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - switch (device_type) { - case 0: - version_info->device_type = QDMA_DEVICE_SOFT; - break; - case 1: - version_info->device_type = QDMA_DEVICE_VERSAL_CPM4; - break; - case 2: - version_info->device_type = QDMA_DEVICE_VERSAL_CPM5; - break; - default: - version_info->device_type = QDMA_DEVICE_NONE; - break; - } - - version_str = qdma_get_device_type(version_info->device_type); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_device_type_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - - if (version_info->device_type == QDMA_DEVICE_SOFT) { - switch (ip_type) { - case 0: - version_info->ip_type = QDMA_SOFT_IP; - break; - case 1: - case 2: - /* For QDMA4.0 and QDMA5.0, HW design and - * register map is same except some - * performance optimizations - */ - version_info->ip_type = EQDMA_SOFT_IP; - break; - default: - version_info->ip_type = QDMA_NONE_IP; - } - } else { - switch (ip_type) { - case 0: - version_info->ip_type = QDMA_VERSAL_HARD_IP; - break; - case 1: - version_info->ip_type = QDMA_VERSAL_SOFT_IP; - break; - default: - version_info->ip_type = QDMA_NONE_IP; - } - } - - version_str = qdma_get_ip_type(dev_hndl, is_vf, version_info->ip_type); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_ip_type_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - if (version_info->ip_type == QDMA_SOFT_IP) { - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2018_3; - break; - case 1: - version_info->vivado_release = QDMA_VIVADO_2019_1; - break; - case 2: - version_info->vivado_release = QDMA_VIVADO_2019_2; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } else if (version_info->ip_type == EQDMA_SOFT_IP) { - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2020_1; - break; - case 1: - version_info->vivado_release = QDMA_VIVADO_2020_2; - break; - case 2: - version_info->vivado_release = QDMA_VIVADO_2022_1; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } else if (version_info->device_type == QDMA_DEVICE_VERSAL_CPM5) { - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2021_1; - break; - case 1: - version_info->vivado_release = QDMA_VIVADO_2022_1; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } else { /* Versal case */ - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2019_2; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } - - version_str = qdma_get_vivado_release_id( - version_info->vivado_release); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_vivado_release_id_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); -} - - -/* - * dump_reg() - Helper function to dump register value into string - * - * return len - length of the string copied into buffer - */ -int dump_reg(char *buf, int buf_sz, uint32_t raddr, - const char *rname, uint32_t rval) -{ - /* length of the line should be minimum 80 chars. - * If below print pattern is changed, check for - * new buffer size requirement - */ - if (buf_sz < DEBGFS_LINE_SZ) { - qdma_log_error("%s: buf_sz(%d) < expected(%d): err: %d\n", - __func__, - buf_sz, DEBGFS_LINE_SZ, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return QDMA_SNPRINTF_S(buf, buf_sz, DEBGFS_LINE_SZ, - "[%#7x] %-47s %#-10x %u\n", - raddr, rname, rval, rval); - -} - -void qdma_memset(void *to, uint8_t val, uint32_t size) -{ - uint32_t i; - uint8_t *_to = (uint8_t *)to; - - for (i = 0; i < size; i++) - _to[i] = val; -} - -/*****************************************************************************/ -/** - * qdma_queue_cmpt_cidx_read() - function to read the CMPT CIDX register - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: pointer to array to hold the values read - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_queue_cmpt_cidx_read(void *dev_hndl, uint8_t is_vf, - uint16_t qid, struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_OFFSET_DMAP_SEL_CMPT_CIDX; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - reg_addr += qid * QDMA_CMPT_CIDX_STEP; - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - reg_info->wrb_cidx = - FIELD_GET(QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK, reg_val); - reg_info->counter_idx = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_val)); - reg_info->wrb_en = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_val)); - reg_info->irq_en = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK, reg_val)); - reg_info->timer_idx = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK, reg_val)); - reg_info->trig_mode = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK, reg_val)); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_initiate_flr() - function to initiate Function Level Reset - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_initiate_flr(void *dev_hndl, uint8_t is_vf) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_REG_FLR_STATUS : - QDMA_OFFSET_PF_REG_FLR_STATUS; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_reg_write(dev_hndl, reg_addr, 1); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_is_flr_done() - function to check whether the FLR is done or not - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @done: if FLR process completed , done is 1 else 0. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_is_flr_done(void *dev_hndl, uint8_t is_vf, uint8_t *done) -{ - int rv; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_REG_FLR_STATUS : - QDMA_OFFSET_PF_REG_FLR_STATUS; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!done) { - qdma_log_error("%s: done is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* wait for it to become zero */ - rv = hw_monitor_reg(dev_hndl, reg_addr, QDMA_FLR_STATUS_MASK, - 0, 5 * QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US); - if (rv < 0) - *done = 0; - else - *done = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_is_config_bar() - function for the config bar verification - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_is_config_bar(void *dev_hndl, uint8_t is_vf, enum qdma_ip *ip) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_VERSION : - QDMA_OFFSET_CONFIG_BLOCK_ID; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - /** TODO: Version register for VFs is 0x5014 for EQDMA and - * 0x1014 for QDMA/Versal. First time reading 0x5014 for - * all the device and based on the upper 16 bits value - * (i.e. 0x1fd3), finding out whether its EQDMA or QDMA/Versal - * for EQDMA VFs. - * Need to modify this logic once the hardware team - * comes up with a common register for VFs - */ - if (is_vf) { - if (FIELD_GET(QDMA_GLBL2_VF_UNIQUE_ID_MASK, reg_val) - != QDMA_MAGIC_NUMBER) { - /* Its either QDMA or Versal */ - -#ifdef EQDMA_CPM5_VF_GT_256Q_SUPPORTED - *ip = EQDMA_CPM5_IP; - reg_addr = EQDMA_CPM5_OFFSET_VF_VERSION; -#else - *ip = EQDMA_IP; - reg_addr = EQDMA_OFFSET_VF_VERSION; -#endif - reg_val = qdma_reg_read(dev_hndl, reg_addr); - } else { - *ip = QDMA_OR_VERSAL_IP; - return QDMA_SUCCESS; - } - } - - if (FIELD_GET(QDMA_CONFIG_BLOCK_ID_MASK, reg_val) - != QDMA_MAGIC_NUMBER) { - qdma_log_error("%s: Invalid config bar, err:%d\n", - __func__, - -QDMA_ERR_HWACC_INV_CONFIG_BAR); - return -QDMA_ERR_HWACC_INV_CONFIG_BAR; - } - - return QDMA_SUCCESS; -} - -int qdma_acc_reg_dump_buf_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, int *buflen) -{ - uint32_t len = 0; - int rv = 0; - - *buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - len = qdma_soft_reg_dump_buf_len(); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - len = qdma_cpm4_reg_dump_buf_len(); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - len = eqdma_cpm5_reg_dump_buf_len(); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - len = eqdma_reg_dump_buf_len(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *buflen = (int)len; - return rv; -} - -int qdma_acc_reg_info_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, int *buflen, int *num_regs) -{ - uint32_t len = 0; - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buflen) { - qdma_log_error("%s: buflen is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!num_regs) { - qdma_log_error("%s: num_regs is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - *buflen = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - len = 0; - *num_regs = 0; - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) { - len = qdma_cpm4_reg_dump_buf_len(); - *num_regs = (int)((len / REG_DUMP_SIZE_PER_LINE) - 1); - } else if (device_type == QDMA_DEVICE_VERSAL_CPM5) { - len = eqdma_cpm5_reg_dump_buf_len(); - *num_regs = (int)((len / REG_DUMP_SIZE_PER_LINE) - 1); - } else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - break; - case EQDMA_SOFT_IP: - len = eqdma_reg_dump_buf_len(); - *num_regs = (int)((len / REG_DUMP_SIZE_PER_LINE) - 1); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *buflen = (int)len; - return rv; -} - -int qdma_acc_context_buf_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - int rv = 0; - - *buflen = 0; - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_context_buf_len(st, q_type, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_context_buf_len(st, q_type, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_context_buf_len(st, q_type, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_context_buf_len(st, q_type, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -int qdma_acc_get_num_config_regs(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint32_t *num_regs) -{ - int rv = 0; - - *num_regs = 0; - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_get_config_num_regs(); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_get_config_num_regs(); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_get_config_num_regs(); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_get_config_num_regs(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *num_regs = rv; - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_acc_get_config_regs() - Function to get qdma config registers. - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @reg_data: pointer to register data to be filled - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_get_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, enum qdma_device_type device_type, - uint32_t *reg_data) -{ - struct xreg_info *reg_info; - uint32_t count = 0; - uint32_t num_regs; - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (is_vf) { - qdma_log_error("%s: Get Config regs not valid for VF, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (reg_data == NULL) { - qdma_log_error("%s: reg_data is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - num_regs = qdma_get_config_num_regs(); - reg_info = qdma_get_config_regs(); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) { - num_regs = qdma_cpm4_get_config_num_regs(); - reg_info = qdma_cpm4_get_config_regs(); - } else if (device_type == QDMA_DEVICE_VERSAL_CPM5) { - num_regs = eqdma_cpm5_get_config_num_regs(); - reg_info = eqdma_cpm5_get_config_regs(); - } else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - break; - case EQDMA_SOFT_IP: - num_regs = eqdma_get_config_num_regs(); - reg_info = eqdma_get_config_regs(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (count = 0; count < num_regs - 1; count++) { - reg_data[count] = qdma_reg_read(dev_hndl, - reg_info[count].addr); - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, enum qdma_device_type device_type, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_reg_info() - Function to dump fileds in - * a specified register. - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_reg_info(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf || !buflen) { - qdma_log_error("%s: Invalid input buffer, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - QDMA_SNPRINTF_S(buf, buflen, DEBGFS_LINE_SZ, - "QDMA reg field info not supported for QDMA_SOFT_IP\n"); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_dump_reg_info(dev_hndl, reg_addr, - num_regs, buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_dump_reg_info(dev_hndl, reg_addr, - num_regs, buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_reg_info(dev_hndl, reg_addr, - num_regs, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_queue_context() - Function to get qdma queue context dump in a - * buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @st: Queue Mode (ST or MM) - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_read_dump_queue_context() - Function to read and dump the queue - * context in the user-provided buffer. This API is valid only for PF and - * should not be used for VFs. For VF's use qdma_dump_queue_context() API - * after reading the context through mailbox. - * - * @dev_hndl: device handle - * @ip_type: QDMA IP type - * @device_type:QDMA DEVICE Type - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT)* - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_read_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_read_dump_queue_context(dev_hndl, func_id, - qid_hw, st, q_type, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_read_dump_queue_context(dev_hndl, - func_id, qid_hw, st, q_type, buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_read_dump_queue_context(dev_hndl, - func_id, qid_hw, st, q_type, buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_read_dump_queue_context(dev_hndl, func_id, - qid_hw, st, q_type, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @ip_type: QDMA ip type - * @num_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_acc_dump_config_reg_list(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_get_function_number() - Function to get the function number - * - * @dev_hndl: device handle - * @func_id: pointer to hold the function id - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_get_function_number(void *dev_hndl, uint16_t *func_id) -{ - if (!dev_hndl || !func_id) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *func_id = (uint8_t)qdma_reg_read(dev_hndl, - QDMA_OFFSET_GLBL2_CHANNEL_FUNC_RET); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_hw_error_intr_setup() - Function to set up the qdma error - * interrupt - * - * @dev_hndl: device handle - * @func_id: Function id - * @err_intr_index: Interrupt vector - * @rearm: rearm or not - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_error_intr_setup(void *dev_hndl, uint16_t func_id, - uint8_t err_intr_index) -{ - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = - FIELD_SET(QDMA_GLBL_ERR_FUNC_MASK, func_id) | - FIELD_SET(QDMA_GLBL_ERR_VEC_MASK, err_intr_index); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_intr_rearm() - Function to re-arm the error interrupt - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_error_intr_rearm(void *dev_hndl) -{ - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT); - reg_val |= FIELD_SET(QDMA_GLBL_ERR_ARM_MASK, 1); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_error_code() - function to get the qdma access mapped - * error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_error_code(int acc_err_code) -{ - return qdma_get_err_code(acc_err_code); -} - -int qdma_hw_access_init(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_access *hw_access) -{ - int rv = QDMA_SUCCESS; - enum qdma_ip ip = EQDMA_IP; - - struct qdma_hw_version_info version_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!hw_access) { - qdma_log_error("%s: hw_access is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_is_config_bar(dev_hndl, is_vf, &ip); - if (rv != QDMA_SUCCESS) { - qdma_log_error("%s: config bar passed is INVALID, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return rv; - } - - qdma_memset(hw_access, 0, sizeof(struct qdma_hw_access)); - - if (ip == EQDMA_IP) - hw_access->qdma_get_version = &eqdma_get_version; - else if (ip == EQDMA_CPM5_IP) - hw_access->qdma_get_version = &eqdma_cpm5_get_version; - else - hw_access->qdma_get_version = &qdma_get_version; - - hw_access->qdma_init_ctxt_memory = &qdma_init_ctxt_memory; - hw_access->qdma_fmap_conf = &qdma_fmap_conf; - hw_access->qdma_sw_ctx_conf = &qdma_sw_ctx_conf; - hw_access->qdma_pfetch_ctx_conf = &qdma_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &qdma_cmpt_ctx_conf; - hw_access->qdma_hw_ctx_conf = &qdma_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = &qdma_credit_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = &qdma_indirect_intr_ctx_conf; - hw_access->qdma_set_default_global_csr = &qdma_set_default_global_csr; - hw_access->qdma_global_csr_conf = &qdma_global_csr_conf; - hw_access->qdma_global_writeback_interval_conf = - &qdma_global_writeback_interval_conf; - hw_access->qdma_queue_pidx_update = &qdma_queue_pidx_update; - hw_access->qdma_queue_cmpt_cidx_read = &qdma_queue_cmpt_cidx_read; - hw_access->qdma_queue_cmpt_cidx_update = &qdma_queue_cmpt_cidx_update; - hw_access->qdma_queue_intr_cidx_update = &qdma_queue_intr_cidx_update; - hw_access->qdma_mm_channel_conf = &qdma_mm_channel_conf; - hw_access->qdma_get_user_bar = &qdma_get_user_bar; - hw_access->qdma_get_function_number = &qdma_get_function_number; - hw_access->qdma_get_device_attributes = &qdma_get_device_attributes; - hw_access->qdma_hw_error_intr_setup = &qdma_hw_error_intr_setup; - hw_access->qdma_hw_error_intr_rearm = &qdma_hw_error_intr_rearm; - hw_access->qdma_hw_error_enable = &qdma_hw_error_enable; - hw_access->qdma_hw_get_error_name = &qdma_hw_get_error_name; - hw_access->qdma_hw_error_process = &qdma_hw_error_process; - hw_access->qdma_dump_config_regs = &qdma_soft_dump_config_regs; - hw_access->qdma_dump_queue_context = &qdma_soft_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &qdma_soft_read_dump_queue_context; - hw_access->qdma_dump_intr_context = &qdma_dump_intr_context; - hw_access->qdma_is_legacy_intr_pend = &qdma_is_legacy_intr_pend; - hw_access->qdma_clear_pend_legacy_intr = &qdma_clear_pend_legacy_intr; - hw_access->qdma_legacy_intr_conf = &qdma_legacy_intr_conf; - hw_access->qdma_initiate_flr = &qdma_initiate_flr; - hw_access->qdma_is_flr_done = &qdma_is_flr_done; - hw_access->qdma_get_error_code = &qdma_get_error_code; - hw_access->qdma_read_reg_list = &qdma_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &qdma_soft_dump_config_reg_list; - hw_access->qdma_dump_reg_info = &qdma_dump_reg_info; - hw_access->mbox_base_pf = QDMA_OFFSET_MBOX_BASE_PF; - hw_access->mbox_base_vf = QDMA_OFFSET_MBOX_BASE_VF; - hw_access->qdma_max_errors = QDMA_ERRS_ALL; - - rv = hw_access->qdma_get_version(dev_hndl, is_vf, &version_info); - if (rv != QDMA_SUCCESS) - return rv; - - qdma_log_info("Device Type: %s\n", - qdma_get_device_type(version_info.device_type)); - - qdma_log_info("IP Type: %s\n", - qdma_get_ip_type(dev_hndl, is_vf, version_info.ip_type)); - - qdma_log_info("Vivado Release: %s\n", - qdma_get_vivado_release_id(version_info.vivado_release)); - - if (version_info.ip_type == QDMA_VERSAL_HARD_IP && - version_info.device_type == QDMA_DEVICE_VERSAL_CPM4) { - hw_access->qdma_init_ctxt_memory = - &qdma_cpm4_init_ctxt_memory; - hw_access->qdma_qid2vec_conf = &qdma_cpm4_qid2vec_conf; - hw_access->qdma_fmap_conf = &qdma_cpm4_fmap_conf; - hw_access->qdma_sw_ctx_conf = &qdma_cpm4_sw_ctx_conf; - hw_access->qdma_pfetch_ctx_conf = - &qdma_cpm4_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &qdma_cpm4_cmpt_ctx_conf; - hw_access->qdma_hw_ctx_conf = &qdma_cpm4_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = - &qdma_cpm4_credit_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = - &qdma_cpm4_indirect_intr_ctx_conf; - hw_access->qdma_set_default_global_csr = - &qdma_cpm4_set_default_global_csr; - hw_access->qdma_queue_pidx_update = - &qdma_cpm4_queue_pidx_update; - hw_access->qdma_queue_cmpt_cidx_update = - &qdma_cpm4_queue_cmpt_cidx_update; - hw_access->qdma_queue_intr_cidx_update = - &qdma_cpm4_queue_intr_cidx_update; - hw_access->qdma_get_user_bar = &qdma_cmp_get_user_bar; - hw_access->qdma_get_device_attributes = - &qdma_cpm4_get_device_attributes; - hw_access->qdma_dump_config_regs = - &qdma_cpm4_dump_config_regs; - hw_access->qdma_dump_intr_context = - &qdma_cpm4_dump_intr_context; - hw_access->qdma_hw_error_enable = - &qdma_cpm4_hw_error_enable; - hw_access->qdma_hw_error_process = - &qdma_cpm4_hw_error_process; - hw_access->qdma_hw_get_error_name = - &qdma_cpm4_hw_get_error_name; - hw_access->qdma_legacy_intr_conf = NULL; - hw_access->qdma_read_reg_list = &qdma_cpm4_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &qdma_cpm4_dump_config_reg_list; - hw_access->qdma_dump_queue_context = - &qdma_cpm4_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &qdma_cpm4_read_dump_queue_context; - hw_access->qdma_dump_reg_info = &qdma_cpm4_dump_reg_info; - hw_access->qdma_max_errors = QDMA_CPM4_ERRS_ALL; - } - - if (version_info.ip_type == QDMA_VERSAL_HARD_IP && - version_info.device_type == QDMA_DEVICE_VERSAL_CPM5) { - hw_access->qdma_init_ctxt_memory = - &eqdma_cpm5_init_ctxt_memory; -#ifdef TANDEM_BOOT_SUPPORTED - hw_access->qdma_init_st_ctxt = - &eqdma_cpm5_init_st_ctxt; -#endif - hw_access->qdma_sw_ctx_conf = &eqdma_cpm5_sw_ctx_conf; - hw_access->qdma_fmap_conf = &eqdma_cpm5_fmap_conf; - hw_access->qdma_pfetch_ctx_conf = - &eqdma_cpm5_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &eqdma_cpm5_cmpt_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = - &eqdma_cpm5_indirect_intr_ctx_conf; - hw_access->qdma_dump_config_regs = - &eqdma_cpm5_dump_config_regs; - hw_access->qdma_dump_intr_context = - &eqdma_cpm5_dump_intr_context; - hw_access->qdma_hw_error_enable = - &eqdma_cpm5_hw_error_enable; - hw_access->qdma_hw_error_process = - &eqdma_cpm5_hw_error_process; - hw_access->qdma_hw_get_error_name = - &eqdma_cpm5_hw_get_error_name; - hw_access->qdma_hw_ctx_conf = &eqdma_cpm5_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = - &eqdma_cpm5_credit_ctx_conf; - hw_access->qdma_set_default_global_csr = - &eqdma_cpm5_set_default_global_csr; - hw_access->qdma_get_device_attributes = - &eqdma_cpm5_get_device_attributes; - hw_access->qdma_get_user_bar = &eqdma_cpm5_get_user_bar; - hw_access->qdma_read_reg_list = &eqdma_cpm5_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &eqdma_cpm5_dump_config_reg_list; - hw_access->qdma_dump_queue_context = - &eqdma_cpm5_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &eqdma_cpm5_read_dump_queue_context; - hw_access->qdma_dump_reg_info = &eqdma_cpm5_dump_reg_info; - /* All CSR and Queue space register belongs to Window 0. - * Mailbox and MSIX register belongs to Window 1 - * Therefore, Mailbox offsets are different for EQDMA - * Mailbox offset for PF : 128K + original address - * Mailbox offset for VF : 16K + original address - */ - hw_access->mbox_base_pf = EQDMA_CPM5_OFFSET_MBOX_BASE_PF; - hw_access->mbox_base_vf = EQDMA_CPM5_OFFSET_MBOX_BASE_VF; - hw_access->qdma_max_errors = EQDMA_CPM5_ERRS_ALL; - -} - - if (version_info.ip_type == EQDMA_SOFT_IP) { - hw_access->qdma_init_ctxt_memory = &eqdma_init_ctxt_memory; - hw_access->qdma_sw_ctx_conf = &eqdma_sw_ctx_conf; - hw_access->qdma_fmap_conf = &eqdma_fmap_conf; - hw_access->qdma_pfetch_ctx_conf = &eqdma_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &eqdma_cmpt_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = - &eqdma_indirect_intr_ctx_conf; - hw_access->qdma_dump_config_regs = &eqdma_dump_config_regs; - hw_access->qdma_dump_intr_context = &eqdma_dump_intr_context; - hw_access->qdma_hw_error_enable = &eqdma_hw_error_enable; - hw_access->qdma_hw_error_process = &eqdma_hw_error_process; - hw_access->qdma_hw_get_error_name = &eqdma_hw_get_error_name; - hw_access->qdma_hw_ctx_conf = &eqdma_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = &eqdma_credit_ctx_conf; - hw_access->qdma_set_default_global_csr = - &eqdma_set_default_global_csr; - hw_access->qdma_get_device_attributes = - &eqdma_get_device_attributes; - hw_access->qdma_get_user_bar = &eqdma_get_user_bar; - hw_access->qdma_read_reg_list = &eqdma_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &eqdma_dump_config_reg_list; - hw_access->qdma_dump_queue_context = - &eqdma_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &eqdma_read_dump_queue_context; - hw_access->qdma_dump_reg_info = &eqdma_dump_reg_info; - /* All CSR and Queue space register belongs to Window 0. - * Mailbox and MSIX register belongs to Window 1 - * Therefore, Mailbox offsets are different for EQDMA - * Mailbox offset for PF : 128K + original address - * Mailbox offset for VF : 16K + original address - */ - hw_access->mbox_base_pf = EQDMA_OFFSET_MBOX_BASE_PF; - hw_access->mbox_base_vf = EQDMA_OFFSET_MBOX_BASE_VF; - hw_access->qdma_max_errors = EQDMA_ERRS_ALL; - } - - return QDMA_SUCCESS; -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_common.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_common.h deleted file mode 100755 index 24a2189..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_common.h +++ /dev/null @@ -1,942 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_ACCESS_COMMON_H_ -#define __QDMA_ACCESS_COMMON_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_access_export.h" -#include "qdma_access_errors.h" - -/* QDMA HW version string array length */ -#define QDMA_HW_VERSION_STRING_LEN 32 - -#define ENABLE_INIT_CTXT_MEMORY 1 - -#ifdef GCC_COMPILER -static inline uint32_t get_trailing_zeros(uint64_t x) -{ - uint32_t rv = - __builtin_ffsll(x) - 1; - return rv; -} -#else -static inline uint32_t get_trailing_zeros(uint64_t value) -{ - uint32_t pos = 0; - - if ((value & 0xffffffff) == 0) { - pos += 32; - value >>= 32; - } - if ((value & 0xffff) == 0) { - pos += 16; - value >>= 16; - } - if ((value & 0xff) == 0) { - pos += 8; - value >>= 8; - } - if ((value & 0xf) == 0) { - pos += 4; - value >>= 4; - } - if ((value & 0x3) == 0) { - pos += 2; - value >>= 2; - } - if ((value & 0x1) == 0) - pos += 1; - - return pos; -} -#endif - -#define FIELD_SHIFT(mask) get_trailing_zeros(mask) -#define FIELD_SET(mask, val) ((val << FIELD_SHIFT(mask)) & mask) -#define FIELD_GET(mask, reg) ((reg & mask) >> FIELD_SHIFT(mask)) - - -/* CSR Default values */ -#define DEFAULT_MAX_DSC_FETCH 6 -#define DEFAULT_WRB_INT QDMA_WRB_INTERVAL_128 - -/* Default values for 0xB08 */ -#define DEFAULT_PFCH_NUM_ENTRIES_PER_Q 8 -#define DEFAULT_PFCH_MAX_Q_CNT 16 -#define DEFAULT_C2H_INTR_TIMER_TICK 25 -#define DEFAULT_CMPT_COAL_TIMER_TICK 25 -#define DEFAULT_CMPT_COAL_MAX_BUF_SZ 32 - -#ifdef THROUGHPUT_MEASUREMENT -/* Update WRB coalesce timer count for throughput measurement */ -#define DEFAULT_CMPT_COAL_TIMER_CNT 10 -#else -/* Update WRB coalesce timer count for low latency measurement */ -#define DEFAULT_CMPT_COAL_TIMER_CNT 5 -#endif - -#define QDMA_BAR_NUM 6 - -/** Maximum data vectors to be used for each function - * TODO: Please note that for 2018.2 only one vector would be used - * per pf and only one ring would be created for this vector - * It is also assumed that all functions have the same number of data vectors - * and currently different number of vectors per PF is not supported - */ -#define QDMA_NUM_DATA_VEC_FOR_INTR_CXT 1 - -enum ind_ctxt_cmd_op { - QDMA_CTXT_CMD_CLR, - QDMA_CTXT_CMD_WR, - QDMA_CTXT_CMD_RD, - QDMA_CTXT_CMD_INV -}; - -enum ind_ctxt_cmd_sel { - QDMA_CTXT_SEL_SW_C2H, - QDMA_CTXT_SEL_SW_H2C, - QDMA_CTXT_SEL_HW_C2H, - QDMA_CTXT_SEL_HW_H2C, - QDMA_CTXT_SEL_CR_C2H, - QDMA_CTXT_SEL_CR_H2C, - QDMA_CTXT_SEL_CMPT, - QDMA_CTXT_SEL_PFTCH, - QDMA_CTXT_SEL_INT_COAL, - QDMA_CTXT_SEL_PASID_RAM_LOW, - QDMA_CTXT_SEL_PASID_RAM_HIGH, - QDMA_CTXT_SEL_TIMER, - QDMA_CTXT_SEL_FMAP, -}; - -/* polling a register */ -#define QDMA_REG_POLL_DFLT_INTERVAL_US 10 /* 10us per poll */ -#define QDMA_REG_POLL_DFLT_TIMEOUT_US (500*1000) /* 500ms */ - -/** Constants */ -#define QDMA_NUM_RING_SIZES 16 -#define QDMA_NUM_C2H_TIMERS 16 -#define QDMA_NUM_C2H_BUFFER_SIZES 16 -#define QDMA_NUM_C2H_COUNTERS 16 -#define QDMA_MM_CONTROL_RUN 0x1 -#define QDMA_MM_CONTROL_STEP 0x100 -#define QDMA_MAGIC_NUMBER 0x1fd3 -#define QDMA_PIDX_STEP 0x10 -#define QDMA_CMPT_CIDX_STEP 0x10 -#define QDMA_INT_CIDX_STEP 0x10 - - -/** QDMA_IND_REG_SEL_PFTCH */ -#define QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK GENMASK(15, 3) -#define QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK GENMASK(2, 0) - -/** QDMA_IND_REG_SEL_CMPT */ -#define QDMA_COMPL_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 38) -#define QDMA_COMPL_CTXT_BADDR_GET_L_MASK GENMASK_ULL(37, 12) -#define QDMA_COMPL_CTXT_PIDX_GET_H_MASK GENMASK(15, 4) -#define QDMA_COMPL_CTXT_PIDX_GET_L_MASK GENMASK(3, 0) - -#define QDMA_INTR_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 61) -#define QDMA_INTR_CTXT_BADDR_GET_M_MASK GENMASK_ULL(60, 29) -#define QDMA_INTR_CTXT_BADDR_GET_L_MASK GENMASK_ULL(28, 12) - -#define QDMA_GLBL2_MM_CMPT_EN_MASK BIT(2) -#define QDMA_GLBL2_FLR_PRESENT_MASK BIT(1) -#define QDMA_GLBL2_MAILBOX_EN_MASK BIT(0) - -#define QDMA_REG_IND_CTXT_REG_COUNT 8 - -/* ------------------------ indirect register context fields -----------*/ -union qdma_ind_ctxt_cmd { - uint32_t word; - struct { - uint32_t busy:1; - uint32_t sel:4; - uint32_t op:2; - uint32_t qid:12; - uint32_t rsvd:14; - } bits; -}; - -#define QDMA_IND_CTXT_DATA_NUM_REGS 8 - -/** - * struct qdma_indirect_ctxt_regs - Inirect Context programming registers - */ -struct qdma_indirect_ctxt_regs { - uint32_t qdma_ind_ctxt_data[QDMA_IND_CTXT_DATA_NUM_REGS]; - uint32_t qdma_ind_ctxt_mask[QDMA_IND_CTXT_DATA_NUM_REGS]; - union qdma_ind_ctxt_cmd cmd; -}; - -/** - * struct qdma_fmap_cfg - fmap config data structure - */ -struct qdma_fmap_cfg { - - /** @qbase - queue base for the function */ - uint16_t qbase; - /** @qmax - maximum queues in the function */ - uint16_t qmax; -}; - -/** - * struct qdma_qid2vec - qid to vector mapping data structure - */ -struct qdma_qid2vec { - - /** @c2h_vector - For direct interrupt, it is the interrupt - * vector index of msix table; - * for indirect interrupt, it is the ring index - */ - uint8_t c2h_vector; - /** @c2h_en_coal - C2H Interrupt aggregation enable */ - uint8_t c2h_en_coal; - /** @h2c_vector - For direct interrupt, it is the interrupt - * vector index of msix table; - * for indirect interrupt, it is the ring index - */ - uint8_t h2c_vector; - /** @h2c_en_coal - H2C Interrupt aggregation enable */ - uint8_t h2c_en_coal; -}; - -/** - * struct qdma_descq_sw_ctxt - descq SW context config data structure - */ -struct qdma_descq_sw_ctxt { - - /** @ring_bs_addr - ring base address */ - uint64_t ring_bs_addr; - /** @vec - vector number */ - uint16_t vec; - /** @pidx - initial producer index */ - uint16_t pidx; - /** @irq_arm - Interrupt Arm */ - uint8_t irq_arm; - /** @fnc_id - Function ID */ - uint8_t fnc_id; - /** @qen - Indicates that the queue is enabled */ - uint8_t qen; - /** @frcd_en -Enable fetch credit */ - uint8_t frcd_en; - /** @wbi_chk -Writeback/Interrupt after pending check */ - uint8_t wbi_chk; - /** @wbi_intvl_en -Write back/Interrupt interval */ - uint8_t wbi_intvl_en; - /** @at - Address tanslation */ - uint8_t at; - /** @fetch_max - Maximum number of descriptor fetches outstanding */ - uint8_t fetch_max; - /** @rngsz_idx - Descriptor ring size index */ - uint8_t rngsz_idx; - /** @desc_sz -Descriptor fetch size */ - uint8_t desc_sz; - /** @bypass - bypass enable */ - uint8_t bypass; - /** @mm_chn - MM channel */ - uint8_t mm_chn; - /** @wbk_en -Writeback enable */ - uint8_t wbk_en; - /** @irq_en -Interrupt enable */ - uint8_t irq_en; - /** @port_id -Port_id */ - uint8_t port_id; - /** @irq_no_last - No interrupt was sent */ - uint8_t irq_no_last; - /** @err - Error status */ - uint8_t err; - /** @err_wb_sent -writeback/interrupt was sent for an error */ - uint8_t err_wb_sent; - /** @irq_req - Interrupt due to error waiting to be sent */ - uint8_t irq_req; - /** @mrkr_dis - Marker disable */ - uint8_t mrkr_dis; - /** @is_mm - MM mode */ - uint8_t is_mm; - /** @intr_aggr - interrupt aggregation enable */ - uint8_t intr_aggr; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @dis_intr_on_vf - Disbale interrupt with VF */ - uint8_t dis_intr_on_vf; - /** @virtio_en - Queue is in Virtio Mode */ - uint8_t virtio_en; - /** @pack_byp_out - descs on desc output interface can be packed */ - uint8_t pack_byp_out; - /** @irq_byp - IRQ Bypass mode */ - uint8_t irq_byp; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @virtio_dsc_base - Virtio Desc Base Address */ - uint64_t virtio_dsc_base; -}; - -/** - * struct qdma_descq_hw_ctxt - descq hw context config data structure - */ -struct qdma_descq_hw_ctxt { - /** @cidx - consumer index */ - uint16_t cidx; - /** @crd_use - credits consumed */ - uint16_t crd_use; - /** @dsc_pend - descriptors pending */ - uint8_t dsc_pend; - /** @idl_stp_b -Queue invalid and no descriptors pending */ - uint8_t idl_stp_b; - /** @evt_pnd - Event pending */ - uint8_t evt_pnd; - /** @fetch_pnd -Descriptor fetch pending */ - uint8_t fetch_pnd; -}; - -/** - * struct qdma_descq_credit_ctxt - descq credit context config data structure - */ -struct qdma_descq_credit_ctxt { - - /** @credit -Fetch credits received. */ - uint32_t credit; -}; - -/** - * struct qdma_descq_prefetch_ctxt - descq pfetch context config data structure - */ -struct qdma_descq_prefetch_ctxt { - /** @sw_crdt -Software credit */ - uint16_t sw_crdt; - /** @bypass - bypass enable */ - uint8_t bypass; - /** @bufsz_idx - c2h buffer size index */ - uint8_t bufsz_idx; - /** @port_id - port ID */ - uint8_t port_id; - /** @var_desc - Variable Descriptor */ - uint8_t var_desc; - /** @num_pftch - Number of descs prefetched */ - uint16_t num_pftch; - /** @err -Error detected on this queue */ - uint8_t err; - /** @pfch_en - Enable prefetch */ - uint8_t pfch_en; - /** @pfch - Queue is in prefetch */ - uint8_t pfch; - /** @valid - context is valid */ - uint8_t valid; -}; - -/** - * struct qdma_descq_cmpt_ctxt - descq completion context config data structure - */ -struct qdma_descq_cmpt_ctxt { - /** @bs_addr - completion ring base address */ - uint64_t bs_addr; - /** @vec - Interrupt Vector */ - uint16_t vec; - /** @pidx_l - producer index low */ - uint16_t pidx; - /** @cidx - consumer index */ - uint16_t cidx; - /** @en_stat_desc - Enable Completion Status writes */ - uint8_t en_stat_desc; - /** @en_int - Enable Completion interrupts */ - uint8_t en_int; - /** @trig_mode - Interrupt and Completion Status Write Trigger Mode */ - uint8_t trig_mode; - /** @fnc_id - Function ID */ - uint8_t fnc_id; - /** @counter_idx - Index to counter register */ - uint8_t counter_idx; - /** @timer_idx - Index to timer register */ - uint8_t timer_idx; - /** @in_st - Interrupt State */ - uint8_t in_st; - /** @color - initial color bit to be used on Completion */ - uint8_t color; - /** @ringsz_idx - Completion ring size index to ring size registers */ - uint8_t ringsz_idx; - /** @desc_sz -descriptor size */ - uint8_t desc_sz; - /** @valid - context valid */ - uint8_t valid; - /** @err - error status */ - uint8_t err; - /** - * @user_trig_pend - user logic initiated interrupt is - * pending to be generate - */ - uint8_t user_trig_pend; - /** @timer_running - timer is running on this queue */ - uint8_t timer_running; - /** @full_upd - Full update */ - uint8_t full_upd; - /** @ovf_chk_dis - Completion Ring Overflow Check Disable */ - uint8_t ovf_chk_dis; - /** @at -Address Translation */ - uint8_t at; - /** @int_aggr -Interrupt Aggregation */ - uint8_t int_aggr; - /** @dis_intr_on_vf - Disbale interrupt with VF */ - uint8_t dis_intr_on_vf; - /** @vio - queue is in VirtIO mode */ - uint8_t vio; - /** @dir_c2h - DMA direction is C2H */ - uint8_t dir_c2h; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @vio_eop - Virtio End-of-packet */ - uint8_t vio_eop; - /** @sh_cmpt - Shared Completion Queue */ - uint8_t sh_cmpt; -}; - -/** - * struct qdma_indirect_intr_ctxt - indirect interrupt context config data - * structure - */ -struct qdma_indirect_intr_ctxt { - /** @baddr_4k -Base address of Interrupt Aggregation Ring */ - uint64_t baddr_4k; - /** @vec - Interrupt vector index in msix table */ - uint16_t vec; - /** @pidx - Producer Index */ - uint16_t pidx; - /** @valid - context valid */ - uint8_t valid; - /** @int_st -Interrupt State */ - uint8_t int_st; - /** @color - Color bit */ - uint8_t color; - /** @page_size - Interrupt Aggregation Ring size */ - uint8_t page_size; - /** @at - Address translation */ - uint8_t at; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @func_id - Function ID */ - uint16_t func_id; -}; - -struct qdma_hw_version_info { - /** @rtl_version - RTL Version */ - enum qdma_rtl_version rtl_version; - /** @vivado_release - Vivado Release id */ - enum qdma_vivado_release_id vivado_release; - /** @versal_ip_state - Versal IP state */ - enum qdma_ip_type ip_type; - /** @device_type - Device Type */ - enum qdma_device_type device_type; - /** @qdma_rtl_version_str - RTL Version string*/ - char qdma_rtl_version_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_vivado_release_id_str - Vivado Release id string*/ - char qdma_vivado_release_id_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_device_type_str - Qdma device type string*/ - char qdma_device_type_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_versal_ip_state_str - Versal IP state string*/ - char qdma_ip_type_str[QDMA_HW_VERSION_STRING_LEN]; -}; - -#define CTXT_ENTRY_NAME_SZ 64 -struct qctx_entry { - char name[CTXT_ENTRY_NAME_SZ]; - uint32_t value; -}; - -/** - * @struct - qdma_descq_context - * @brief queue context information - */ -struct qdma_descq_context { - struct qdma_qid2vec qid2vec; - struct qdma_fmap_cfg fmap; - struct qdma_descq_sw_ctxt sw_ctxt; - struct qdma_descq_hw_ctxt hw_ctxt; - struct qdma_descq_credit_ctxt cr_ctxt; - struct qdma_descq_prefetch_ctxt pfetch_ctxt; - struct qdma_descq_cmpt_ctxt cmpt_ctxt; -}; - -/** - * struct qdma_q_pidx_reg_info - Software PIDX register fields - */ -struct qdma_q_pidx_reg_info { - /** @pidx - Producer Index */ - uint16_t pidx; - /** @irq_en - Interrupt enable */ - uint8_t irq_en; -}; - -/** - * struct qdma_q_intr_cidx_reg_info - Interrupt Ring CIDX register fields - */ -struct qdma_intr_cidx_reg_info { - /** @sw_cidx - Software Consumer Index */ - uint16_t sw_cidx; - /** @rng_idx - Ring Index of the Interrupt Aggregation ring */ - uint8_t rng_idx; -}; - -/** - * struct qdma_q_cmpt_cidx_reg_info - CMPT CIDX register fields - */ -struct qdma_q_cmpt_cidx_reg_info { - /** @wrb_cidx - CMPT Consumer Index */ - uint16_t wrb_cidx; - /** @counter_idx - Counter Threshold Index */ - uint8_t counter_idx; - /** @timer_idx - Timer Count Index */ - uint8_t timer_idx; - /** @trig_mode - Trigger mode */ - uint8_t trig_mode; - /** @wrb_en - Enable status descriptor for CMPT */ - uint8_t wrb_en; - /** @irq_en - Enable Interrupt for CMPT */ - uint8_t irq_en; -}; - - -/** - * struct qdma_csr_info - Global CSR info data structure - */ -struct qdma_csr_info { - /** @ringsz: ring size values */ - uint16_t ringsz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @bufsz: buffer size values */ - uint16_t bufsz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @timer_cnt: timer threshold values */ - uint8_t timer_cnt[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @cnt_thres: counter threshold values */ - uint8_t cnt_thres[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @wb_intvl: writeback interval */ - uint8_t wb_intvl; -}; - -#define QDMA_MAX_REGISTER_DUMP 14 - -/** - * struct qdma_reg_data - Structure to - * hold address value and pair - */ -struct qdma_reg_data { - /** @reg_addr: register address */ - uint32_t reg_addr; - /** @reg_val: register value */ - uint32_t reg_val; -}; - -/** - * enum qdma_hw_access_type - To hold hw access type - */ -enum qdma_hw_access_type { - QDMA_HW_ACCESS_READ, - QDMA_HW_ACCESS_WRITE, - QDMA_HW_ACCESS_CLEAR, - QDMA_HW_ACCESS_INVALIDATE, - QDMA_HW_ACCESS_MAX -}; - -/** - * enum qdma_global_csr_type - To hold global csr type - */ -enum qdma_global_csr_type { - QDMA_CSR_RING_SZ, - QDMA_CSR_TIMER_CNT, - QDMA_CSR_CNT_TH, - QDMA_CSR_BUF_SZ, - QDMA_CSR_MAX -}; - -/** - * enum status_type - To hold enable/disable status type - */ -enum status_type { - DISABLE = 0, - ENABLE = 1, -}; - -/** - * enum qdma_reg_read_type - Indicates reg read type - */ -enum qdma_reg_read_type { - /** @QDMA_REG_READ_PF_ONLY: Read the register for PFs only */ - QDMA_REG_READ_PF_ONLY, - /** @QDMA_REG_READ_VF_ONLY: Read the register for VFs only */ - QDMA_REG_READ_VF_ONLY, - /** @QDMA_REG_READ_PF_VF: Read the register for both PF and VF */ - QDMA_REG_READ_PF_VF, - /** @QDMA_REG_READ_MAX: Reg read enum max */ - QDMA_REG_READ_MAX -}; - -/** - * enum qdma_reg_read_groups - Indicates reg read groups - */ -enum qdma_reg_read_groups { - /** @QDMA_REG_READ_GROUP_1: Read the register from 0x000 to 0x288 */ - QDMA_REG_READ_GROUP_1, - /** @QDMA_REG_READ_GROUP_2: Read the register from 0x400 to 0xAFC */ - QDMA_REG_READ_GROUP_2, - /** @QDMA_REG_READ_GROUP_3: Read the register from 0xB00 to 0xE28 */ - QDMA_REG_READ_GROUP_3, - /** @QDMA_REG_READ_GROUP_4: Read the register Mailbox Registers */ - QDMA_REG_READ_GROUP_4, - /** @QDMA_REG_READ_GROUP_MAX: Reg read max groups */ - QDMA_REG_READ_GROUP_MAX -}; - -void qdma_write_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, const uint32_t *values); - -void qdma_read_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, uint32_t *values); - -int dump_reg(char *buf, int buf_sz, uint32_t raddr, - const char *rname, uint32_t rval); - -int hw_monitor_reg(void *dev_hndl, uint32_t reg, uint32_t mask, - uint32_t val, uint32_t interval_us, - uint32_t timeout_us); - -void qdma_memset(void *to, uint8_t val, uint32_t size); - -int qdma_acc_reg_dump_buf_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, int *buflen); - -int qdma_acc_reg_info_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, int *buflen, int *num_regs); - -int qdma_acc_context_buf_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int qdma_acc_get_num_config_regs(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint32_t *num_regs); - -/* - * struct qdma_hw_access - Structure to hold HW access function pointers - */ -struct qdma_hw_access { - int (*qdma_set_default_global_csr)(void *dev_hndl); - int (*qdma_global_csr_conf)(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - int (*qdma_global_writeback_interval_conf)(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - int (*qdma_init_ctxt_memory)(void *dev_hndl); - int (*qdma_qid2vec_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_fmap_conf)(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - int (*qdma_sw_ctx_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_pfetch_ctx_conf)(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_cmpt_ctx_conf)(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_hw_ctx_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_credit_ctx_conf)(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_indirect_intr_ctx_conf)(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_queue_pidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - uint8_t is_c2h, - const struct qdma_q_pidx_reg_info *reg_info); - int (*qdma_queue_cmpt_cidx_read)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - struct qdma_q_cmpt_cidx_reg_info *reg_info); - int (*qdma_queue_cmpt_cidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - const struct qdma_q_cmpt_cidx_reg_info *reg_info); - int (*qdma_queue_intr_cidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - const struct qdma_intr_cidx_reg_info *reg_info); - int (*qdma_mm_channel_conf)(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, uint8_t enable); - int (*qdma_get_user_bar)(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - int (*qdma_get_function_number)(void *dev_hndl, uint16_t *func_id); - int (*qdma_get_version)(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - int (*qdma_get_device_attributes)(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - int (*qdma_hw_error_intr_setup)(void *dev_hndl, uint16_t func_id, - uint8_t err_intr_index); - int (*qdma_hw_error_intr_rearm)(void *dev_hndl); - int (*qdma_hw_error_enable)(void *dev_hndl, - uint32_t err_idx); - const char *(*qdma_hw_get_error_name)(uint32_t err_idx); - int (*qdma_hw_error_process)(void *dev_hndl); - int (*qdma_dump_config_regs)(void *dev_hndl, uint8_t is_vf, char *buf, - uint32_t buflen); - int (*qdma_dump_reg_info)(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, - char *buf, - uint32_t buflen); - int (*qdma_dump_queue_context)(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - int (*qdma_read_dump_queue_context)(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - int (*qdma_dump_intr_context)(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - int (*qdma_is_legacy_intr_pend)(void *dev_hndl); - int (*qdma_clear_pend_legacy_intr)(void *dev_hndl); - int (*qdma_legacy_intr_conf)(void *dev_hndl, enum status_type enable); - int (*qdma_initiate_flr)(void *dev_hndl, uint8_t is_vf); - int (*qdma_is_flr_done)(void *dev_hndl, uint8_t is_vf, uint8_t *done); - int (*qdma_get_error_code)(int acc_err_code); - int (*qdma_read_reg_list)(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - int (*qdma_dump_config_reg_list)(void *dev_hndl, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); -#ifdef TANDEM_BOOT_SUPPORTED - int (*qdma_init_st_ctxt)(void *dev_hndl); -#endif - uint32_t mbox_base_pf; - uint32_t mbox_base_vf; - uint32_t qdma_max_errors; -}; - -/*****************************************************************************/ -/** - * qdma_hw_access_init() - Function to get the QDMA hardware - * access function pointers - * This function should be called once per device from - * device_open()/probe(). Caller shall allocate memory for - * qdma_hw_access structure and store pointer to it in their - * per device structure. Config BAR validation will be done - * inside this function - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @hw_access: qdma_hw_access structure pointer. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_access_init(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_access *hw_access); - -/*****************************************************************************/ -/** - * qdma_acc_get_config_regs() - Function to get qdma config registers - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @reg_data: pointer to register data to be filled - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_get_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint32_t *reg_data); - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_dump_reg_info() - Function to get qdma reg info in a buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @reg_addr: Register Address - * @num_regs: Number of Registers - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_reg_info(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_dump_queue_context() - Function to dump qdma queue context data in a - * buffer where context information is already available in 'ctxt_data' - * structure pointer buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @st: ST or MM - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @qid_hw: queue id - * @st: ST or MM - * @q_type: Queue Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_read_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type: QDMA DEVICE Type - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_acc_dump_config_reg_list(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_get_error_code() - function to get the qdma access mapped - * error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_error_code(int acc_err_code); - -/*****************************************************************************/ -/** - * qdma_fetch_version_details() - Function to fetch the version details from the - * version register value - * - * @is_vf : Whether PF or VF - * @version_reg_val : Value of the version register - * @version_info : Pointer to store the version details. - * - * Return: Nothing - *****************************************************************************/ -void qdma_fetch_version_details(void *dev_hndl, uint8_t is_vf, - uint32_t version_reg_val, struct qdma_hw_version_info *version_info); - -#ifdef __cplusplus -} -#endif - -#endif /* QDMA_ACCESS_COMMON_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_errors.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_errors.h deleted file mode 100755 index 8eb2c58..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_errors.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_ACCESS_ERRORS_H_ -#define __QDMA_ACCESS_ERRORS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library error codes definitions - * - * Header file *qdma_access_errors.h* defines error codes for common library - */ - -struct err_code_map { - int acc_err_code; - int err_code; -}; - -#define QDMA_HW_ERR_NOT_DETECTED 1 - -enum qdma_access_error_codes { - QDMA_SUCCESS = 0, - QDMA_ERR_INV_PARAM, - QDMA_ERR_NO_MEM, - QDMA_ERR_HWACC_BUSY_TIMEOUT, - QDMA_ERR_HWACC_INV_CONFIG_BAR, - QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR, - QDMA_ERR_HWACC_BAR_NOT_FOUND, - QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED, /* 7 */ - - QDMA_ERR_RM_RES_EXISTS, /* 8 */ - QDMA_ERR_RM_RES_NOT_EXISTS, - QDMA_ERR_RM_DEV_EXISTS, - QDMA_ERR_RM_DEV_NOT_EXISTS, - QDMA_ERR_RM_NO_QUEUES_LEFT, - QDMA_ERR_RM_QMAX_CONF_REJECTED, /* 13 */ - - QDMA_ERR_MBOX_FMAP_WR_FAILED, /* 14 */ - QDMA_ERR_MBOX_NUM_QUEUES, - QDMA_ERR_MBOX_INV_QID, - QDMA_ERR_MBOX_INV_RINGSZ, - QDMA_ERR_MBOX_INV_BUFSZ, - QDMA_ERR_MBOX_INV_CNTR_TH, - QDMA_ERR_MBOX_INV_TMR_TH, - QDMA_ERR_MBOX_INV_MSG, - QDMA_ERR_MBOX_SEND_BUSY, - QDMA_ERR_MBOX_NO_MSG_IN, - QDMA_ERR_MBOX_REG_READ_FAILED, - QDMA_ERR_MBOX_ALL_ZERO_MSG, /* 25 */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_ACCESS_ERRORS_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_export.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_export.h deleted file mode 100755 index dba8185..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_export.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_ACCESS_EXPORT_H_ -#define __QDMA_ACCESS_EXPORT_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform_env.h" - -/** QDMA Global CSR array size */ -#define QDMA_GLOBAL_CSR_ARRAY_SZ 16 - -/** - * struct qdma_dev_attributes - QDMA device attributes - */ -struct qdma_dev_attributes { - /** @num_pfs - Num of PFs*/ - uint8_t num_pfs; - /** @num_qs - Num of Queues */ - uint16_t num_qs; - /** @flr_present - FLR resent or not? */ - uint8_t flr_present:1; - /** @st_en - ST mode supported or not? */ - uint8_t st_en:1; - /** @mm_en - MM mode supported or not? */ - uint8_t mm_en:1; - /** @mm_cmpt_en - MM with Completions supported or not? */ - uint8_t mm_cmpt_en:1; - /** @mailbox_en - Mailbox supported or not? */ - uint8_t mailbox_en:1; - /** @debug_mode - Debug mode is enabled/disabled for IP */ - uint8_t debug_mode:1; - /** @desc_eng_mode - Descriptor Engine mode: - * Internal only/Bypass only/Internal & Bypass - */ - uint8_t desc_eng_mode:2; - /** @mm_channel_max - Num of MM channels */ - uint8_t mm_channel_max; - - /** Below are the list of HW features which are populated by qdma_access - * based on RTL version - */ - /** @qid2vec_ctx - To indicate support of qid2vec context */ - uint8_t qid2vec_ctx:1; - /** @cmpt_ovf_chk_dis - To indicate support of overflow check - * disable in CMPT ring - */ - uint8_t cmpt_ovf_chk_dis:1; - /** @mailbox_intr - To indicate support of mailbox interrupt */ - uint8_t mailbox_intr:1; - /** @sw_desc_64b - To indicate support of 64 bytes C2H/H2C - * descriptor format - */ - uint8_t sw_desc_64b:1; - /** @cmpt_desc_64b - To indicate support of 64 bytes CMPT - * descriptor format - */ - uint8_t cmpt_desc_64b:1; - /** @dynamic_bar - To indicate support of dynamic bar detection */ - uint8_t dynamic_bar:1; - /** @legacy_intr - To indicate support of legacy interrupt */ - uint8_t legacy_intr:1; - /** @cmpt_trig_count_timer - To indicate support of counter + timer - * trigger mode - */ - uint8_t cmpt_trig_count_timer:1; -}; - -/** qdma_dev_attributes structure size */ -#define QDMA_DEV_ATTR_STRUCT_SIZE (sizeof(struct qdma_dev_attributes)) - -/** global_csr_conf structure size */ -#define QDMA_DEV_GLOBAL_CSR_STRUCT_SIZE (sizeof(struct global_csr_conf)) - -/** - * enum qdma_dev_type - To hold qdma device type - */ -enum qdma_dev_type { - QDMA_DEV_PF, - QDMA_DEV_VF -}; - -/** - * enum qdma_dev_q_type: Q type - */ -enum qdma_dev_q_type { - /** @QDMA_DEV_Q_TYPE_H2C: H2C Q */ - QDMA_DEV_Q_TYPE_H2C, - /** @QDMA_DEV_Q_TYPE_C2H: C2H Q */ - QDMA_DEV_Q_TYPE_C2H, - /** @QDMA_DEV_Q_TYPE_CMPT: CMPT Q */ - QDMA_DEV_Q_TYPE_CMPT, - /** @QDMA_DEV_Q_TYPE_MAX: Total Q types */ - QDMA_DEV_Q_TYPE_MAX -}; - -/** - * @enum qdma_desc_size - QDMA queue descriptor size - */ -enum qdma_desc_size { - /** @QDMA_DESC_SIZE_8B - 8 byte descriptor */ - QDMA_DESC_SIZE_8B, - /** @QDMA_DESC_SIZE_16B - 16 byte descriptor */ - QDMA_DESC_SIZE_16B, - /** @QDMA_DESC_SIZE_32B - 32 byte descriptor */ - QDMA_DESC_SIZE_32B, - /** @QDMA_DESC_SIZE_64B - 64 byte descriptor */ - QDMA_DESC_SIZE_64B -}; - -/** - * @enum qdma_cmpt_update_trig_mode - Interrupt and Completion status write - * trigger mode - */ -enum qdma_cmpt_update_trig_mode { - /** @QDMA_CMPT_UPDATE_TRIG_MODE_DIS - disabled */ - QDMA_CMPT_UPDATE_TRIG_MODE_DIS, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_EVERY - every */ - QDMA_CMPT_UPDATE_TRIG_MODE_EVERY, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR_CNT - user counter */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR_CNT, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR - user */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR_TMR - user timer */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR_TMR, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR - timer + counter combo */ - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR -}; - - -/** - * @enum qdma_indirect_intr_ring_size - Indirect interrupt ring size - */ -enum qdma_indirect_intr_ring_size { - /** @QDMA_INDIRECT_INTR_RING_SIZE_4KB - Accommodates 512 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_4KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_8KB - Accommodates 1024 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_8KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_12KB - Accommodates 1536 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_12KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_16KB - Accommodates 2048 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_16KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_20KB - Accommodates 2560 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_20KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_24KB - Accommodates 3072 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_24KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_28KB - Accommodates 3584 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_28KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_32KB - Accommodates 4096 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_32KB -}; - -/** - * @enum qdma_wrb_interval - writeback update interval - */ -enum qdma_wrb_interval { - /** @QDMA_WRB_INTERVAL_4 - writeback update interval of 4 */ - QDMA_WRB_INTERVAL_4, - /** @QDMA_WRB_INTERVAL_8 - writeback update interval of 8 */ - QDMA_WRB_INTERVAL_8, - /** @QDMA_WRB_INTERVAL_16 - writeback update interval of 16 */ - QDMA_WRB_INTERVAL_16, - /** @QDMA_WRB_INTERVAL_32 - writeback update interval of 32 */ - QDMA_WRB_INTERVAL_32, - /** @QDMA_WRB_INTERVAL_64 - writeback update interval of 64 */ - QDMA_WRB_INTERVAL_64, - /** @QDMA_WRB_INTERVAL_128 - writeback update interval of 128 */ - QDMA_WRB_INTERVAL_128, - /** @QDMA_WRB_INTERVAL_256 - writeback update interval of 256 */ - QDMA_WRB_INTERVAL_256, - /** @QDMA_WRB_INTERVAL_512 - writeback update interval of 512 */ - QDMA_WRB_INTERVAL_512, - /** @QDMA_NUM_WRB_INTERVALS - total number of writeback intervals */ - QDMA_NUM_WRB_INTERVALS -}; - -enum qdma_rtl_version { - /** @QDMA_RTL_BASE - RTL Base */ - QDMA_RTL_BASE, - /** @QDMA_RTL_PATCH - RTL Patch */ - QDMA_RTL_PATCH, - /** @QDMA_RTL_NONE - Not a valid RTL version */ - QDMA_RTL_NONE, -}; - -enum qdma_vivado_release_id { - /** @QDMA_VIVADO_2018_3 - Vivado version 2018.3 */ - QDMA_VIVADO_2018_3, - /** @QDMA_VIVADO_2019_1 - Vivado version 2019.1 */ - QDMA_VIVADO_2019_1, - /** @QDMA_VIVADO_2019_2 - Vivado version 2019.2 */ - QDMA_VIVADO_2019_2, - /** @QDMA_VIVADO_2020_1 - Vivado version 2020.1 */ - QDMA_VIVADO_2020_1, - /** @QDMA_VIVADO_2020_2 - Vivado version 2020.2 */ - QDMA_VIVADO_2020_2, - /** @QDMA_VIVADO_2021_1 - Vivado version 2021.1 */ - QDMA_VIVADO_2021_1, - /** @QDMA_VIVADO_2022_1 - Vivado version 2022.1 */ - QDMA_VIVADO_2022_1, - /** @QDMA_VIVADO_NONE - Not a valid Vivado version*/ - QDMA_VIVADO_NONE -}; - -enum qdma_ip_type { - /** @QDMA_VERSAL_HARD_IP - Hard IP */ - QDMA_VERSAL_HARD_IP, - /** @QDMA_VERSAL_SOFT_IP - Soft IP */ - QDMA_VERSAL_SOFT_IP, - /** @QDMA_SOFT_IP - Hard IP */ - QDMA_SOFT_IP, - /** @EQDMA_SOFT_IP - Soft IP */ - EQDMA_SOFT_IP, - /** @QDMA_VERSAL_NONE - Not versal device */ - QDMA_NONE_IP -}; - - -enum qdma_device_type { - /** @QDMA_DEVICE_SOFT - UltraScale+ IP's */ - QDMA_DEVICE_SOFT, - /** @QDMA_DEVICE_VERSAL_CPM4 -VERSAL IP */ - QDMA_DEVICE_VERSAL_CPM4, - /** @QDMA_DEVICE_VERSAL_CPM5 -VERSAL IP */ - QDMA_DEVICE_VERSAL_CPM5, - /** @QDMA_DEVICE_NONE - Not a valid device */ - QDMA_DEVICE_NONE -}; - -enum qdma_desc_eng_mode { - /** @QDMA_DESC_ENG_INTERNAL_BYPASS - Internal and Bypass mode */ - QDMA_DESC_ENG_INTERNAL_BYPASS, - /** @QDMA_DESC_ENG_BYPASS_ONLY - Only Bypass mode */ - QDMA_DESC_ENG_BYPASS_ONLY, - /** @QDMA_DESC_ENG_INTERNAL_ONLY - Only Internal mode */ - QDMA_DESC_ENG_INTERNAL_ONLY, - /** @QDMA_DESC_ENG_MODE_MAX - Max of desc engine modes */ - QDMA_DESC_ENG_MODE_MAX -}; - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_ACCESS_EXPORT_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_version.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_version.h deleted file mode 100755 index 652a555..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_access_version.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_ACCESS_VERSION_H_ -#define __QDMA_ACCESS_VERSION_H_ - - -#define QDMA_VERSION_MAJOR 2023 -#define QDMA_VERSION_MINOR 2 -#define QDMA_VERSION_PATCH 1 - -#define QDMA_VERSION_STR \ - __stringify(QDMA_VERSION_MAJOR) "." \ - __stringify(QDMA_VERSION_MINOR) "." \ - __stringify(QDMA_VERSION_PATCH) - -#define QDMA_VERSION \ - ((QDMA_VERSION_MAJOR)*1000 + \ - (QDMA_VERSION_MINOR)*100 + \ - QDMA_VERSION_PATCH) - - -#endif /* __QDMA_ACCESS_VERSION_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.c deleted file mode 100755 index b70e924..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.c +++ /dev/null @@ -1,6071 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma_cpm4_access.h" -#include "qdma_cpm4_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_cpm4_access.tmh" -#endif - -/** QDMA CPM4 Hard Context array size */ -#define QDMA_CPM4_SW_CONTEXT_NUM_WORDS 4 -#define QDMA_CPM4_CMPT_CONTEXT_NUM_WORDS 4 -#define QDMA_CPM4_QID2VEC_CONTEXT_NUM_WORDS 1 -#define QDMA_CPM4_HW_CONTEXT_NUM_WORDS 2 -#define QDMA_CPM4_CR_CONTEXT_NUM_WORDS 1 -#define QDMA_CPM4_IND_INTR_CONTEXT_NUM_WORDS 3 -#define QDMA_CPM4_PFETCH_CONTEXT_NUM_WORDS 2 - -#define QDMA_CPM4_VF_USER_BAR_ID 2 - -#define QDMA_CPM4_REG_GROUP_1_START_ADDR 0x000 -#define QDMA_CPM4_REG_GROUP_2_START_ADDR 0x400 -#define QDMA_CPM4_REG_GROUP_3_START_ADDR 0xB00 -#define QDMA_CPM4_REG_GROUP_4_START_ADDR 0x1014 - -#define QDMA_CPM4_REG_TRQ_SEL_FMAP_STEP 4 - -#define QDMA_CPM4_IND_CTXT_DATA_NUM_REGS 4 - -#define QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS 7 -#define QDMA_CPM4_GLBL_TRQ_ERR_ALL_MASK 0XB3 -#define QDMA_CPM4_GLBL_DSC_ERR_ALL_MASK 0X1F9037E -#define QDMA_CPM4_C2H_ERR_ALL_MASK 0X3F6DF -#define QDMA_CPM4_C2H_FATAL_ERR_ALL_MASK 0X1FDF1B -#define QDMA_CPM4_H2C_ERR_ALL_MASK 0X3F -#define QDMA_CPM4_SBE_ERR_ALL_MASK 0XFFFFFFFF -#define QDMA_CPM4_DBE_ERR_ALL_MASK 0XFFFFFFFF - -#define QDMA_CPM4_OFFSET_DMAP_SEL_INT_CIDX 0x6400 -#define QDMA_CPM4_OFFSET_DMAP_SEL_H2C_DSC_PIDX 0x6404 -#define QDMA_CPM4_OFFSET_DMAP_SEL_C2H_DSC_PIDX 0x6408 -#define QDMA_CPM4_OFFSET_DMAP_SEL_CMPT_CIDX 0x640C - -#define QDMA_CPM4_OFFSET_VF_DMAP_SEL_INT_CIDX 0x3000 -#define QDMA_CPM4_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX 0x3004 -#define QDMA_CPM4_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX 0x3008 -#define QDMA_CPM4_OFFSET_VF_DMAP_SEL_CMPT_CIDX 0x300C - -#define QDMA_CPM4_DMA_SEL_INT_SW_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_DMA_SEL_INT_RING_IDX_MASK GENMASK(23, 16) -#define QDMA_CPM4_DMA_SEL_DESC_PIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_DMA_SEL_IRQ_EN_MASK BIT(16) -#define QDMA_CPM4_DMAP_SEL_CMPT_IRQ_EN_MASK BIT(28) -#define QDMA_CPM4_DMAP_SEL_CMPT_STS_DESC_EN_MASK BIT(27) -#define QDMA_CPM4_DMAP_SEL_CMPT_TRG_MODE_MASK GENMASK(26, 24) -#define QDMA_CPM4_DMAP_SEL_CMPT_TMR_CNT_MASK GENMASK(23, 20) -#define QDMA_CPM4_DMAP_SEL_CMPT_CNT_THRESH_MASK GENMASK(19, 16) -#define QDMA_CPM4_DMAP_SEL_CMPT_WRB_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_INTR_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 35) -#define QDMA_CPM4_INTR_CTXT_BADDR_GET_L_MASK GENMASK_ULL(34, 12) -#define QDMA_CPM4_COMPL_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 42) -#define QDMA_CPM4_COMPL_CTXT_BADDR_GET_M_MASK GENMASK_ULL(41, 10) -#define QDMA_CPM4_COMPL_CTXT_BADDR_GET_L_MASK GENMASK_ULL(9, 6) -#define QDMA_CPM4_COMPL_CTXT_PIDX_GET_H_MASK GENMASK(15, 8) -#define QDMA_CPM4_COMPL_CTXT_PIDX_GET_L_MASK GENMASK(7, 0) -#define QDMA_CPM4_QID2VEC_H2C_VECTOR GENMASK(16, 9) -#define QDMA_CPM4_QID2VEC_H2C_COAL_EN BIT(17) - -#define QDMA_CPM4_DEFAULT_PFCH_STOP_THRESH 256 - -static void qdma_cpm4_hw_st_h2c_err_process(void *dev_hndl); -static void qdma_cpm4_hw_st_c2h_err_process(void *dev_hndl); -static void qdma_cpm4_hw_desc_err_process(void *dev_hndl); -static void qdma_cpm4_hw_trq_err_process(void *dev_hndl); -static void qdma_cpm4_hw_ram_sbe_err_process(void *dev_hndl); -static void qdma_cpm4_hw_ram_dbe_err_process(void *dev_hndl); - -static struct qdma_cpm4_hw_err_info - qdma_cpm4_err_info[QDMA_CPM4_ERRS_ALL] = { - /* Descriptor errors */ - { - QDMA_CPM4_DSC_ERR_POISON, - "Poison error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_UR_CA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_PARAM, - "Parameter mismatch error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PARAM_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_ADDR, - "Address mismatch error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_ADDR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_TAG, - "Unexpected tag error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TAG_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_FLR, - "FLR error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_TIMEOUT, - "Timed out error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_DAT_POISON, - "Poison data error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DAT_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_DMA, - "DMA engine error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DMA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_DSC, - "Invalid PIDX update error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DSC_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_SBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_ALL, - "All Descriptor errors", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - QDMA_CPM4_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - - /* TRQ errors */ - { - QDMA_CPM4_TRQ_ERR_UNMAPPED, - "Access targeted unmapped register space via CSR pathway error", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - { - QDMA_CPM4_TRQ_ERR_QID_RANGE, - "Qid range error", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QID_RANGE_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - { - QDMA_CPM4_TRQ_ERR_VF_ACCESS_ERR, - "VF attempted to access Global register space or Function map", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - { - QDMA_CPM4_TRQ_ERR_TCP_TIMEOUT, - "Timeout on request to dma internal csr register", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - { - QDMA_CPM4_TRQ_ERR_ALL, - "All TRQ errors", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - - /* C2H Errors*/ - { - QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_DESC_RSP_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MSI_INT_FAIL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ERR_DESC_CNT_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - "Port id in packet and bypass in mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_WRB_INV_Q_ERR, - "Writeback on invalid queue error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_WRB_QFULL_ERR, - "Completion queue gets full error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_QFULL_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_WRB_CIDX_ERR, - "Bad CIDX update by the software error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_CIDX_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_WRB_PRTY_ERR, - "C2H completion Parity error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PRTY_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_ALL, - "All C2h errors", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - QDMA_CPM4_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - QDMA_CPM4_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_WRB_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_INT_QID2VEC_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_WRB_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_WPL_DATA_PAR_ERR, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_ALL, - "All fatal errors", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - QDMA_CPM4_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - "Zero length descriptor error", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_ZERO_LEN_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_SDI_MRKR_REQ_MOP_ERR, - "A non-EOP descriptor received", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_NO_DMA_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_DBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_ALL, - "All H2C errors", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - QDMA_CPM4_H2C_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - QDMA_CPM4_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_PASID_CTXT_RAM, - "Pasid ctxt FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PASID_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PLD_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_ALL, - "All SBE errors", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - QDMA_CPM4_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - - - /* DBE errors */ - { - QDMA_CPM4_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_PASID_CTXT_RAM, - "PASID CTXT RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PASID_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_PAYLOAD_FIFO_RAM, - "Payload fifo RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PLD_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_INT_QID2VEC_RAM, - "QID2VEC RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_ALL, - "All DBE errors", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - QDMA_CPM4_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - } -}; - -static int32_t all_qdma_cpm4_hw_errs[ - QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS] = { - - QDMA_CPM4_DSC_ERR_ALL, - QDMA_CPM4_TRQ_ERR_ALL, - QDMA_CPM4_ST_C2H_ERR_ALL, - QDMA_CPM4_ST_FATAL_ERR_ALL, - QDMA_CPM4_ST_H2C_ERR_ALL, - QDMA_CPM4_SBE_ERR_ALL, - QDMA_CPM4_DBE_ERR_ALL -}; - - - -union qdma_cpm4_ind_ctxt_cmd { - uint32_t word; - struct { - uint32_t busy:1; - uint32_t sel:4; - uint32_t op:2; - uint32_t qid:11; - uint32_t rsvd:14; - } bits; -}; - -struct qdma_cpm4_indirect_ctxt_regs { - uint32_t qdma_ind_ctxt_data[QDMA_CPM4_IND_CTXT_DATA_NUM_REGS]; - uint32_t qdma_ind_ctxt_mask[QDMA_CPM4_IND_CTXT_DATA_NUM_REGS]; - union qdma_cpm4_ind_ctxt_cmd cmd; -}; - -static struct qctx_entry qdma_cpm4_sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Function Id", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, -}; - -static struct qctx_entry qdma_cpm4_hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry qdma_cpm4_credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry qdma_cpm4_fmap_ctxt_entries[] = { - {"Queue Base", 0}, - {"Queue Max", 0}, -}; - -static struct qctx_entry qdma_cpm4_cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Address (Low)", 0}, - {"Base Address (High)", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, -}; - -static struct qctx_entry qdma_cpm4_c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry qdma_cpm4_qid2vec_ctxt_entries[] = { - {"c2h_vector", 0}, - {"c2h_en_coal", 0}, - {"h2c_vector", 0}, - {"h2c_en_coal", 0}, -}; - -static struct qctx_entry qdma_cpm4_ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, -}; - -static int qdma_cpm4_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_cpm4_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_cpm4_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int qdma_cpm4_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - -uint32_t qdma_cpm4_get_config_num_regs(void) -{ - return qdma_cpm4_config_num_regs_get(); -} - -struct xreg_info *qdma_cpm4_get_config_regs(void) -{ - return qdma_cpm4_config_regs_get(); -} - -uint32_t qdma_cpm4_reg_dump_buf_len(void) -{ - uint32_t length = (qdma_cpm4_config_num_regs_get() + 1) - * REG_DUMP_SIZE_PER_LINE; - return length; -} - -int qdma_cpm4_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *req_buflen) -{ - uint32_t len = 0; - int rv = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(qdma_cpm4_cmpt_ctxt_entries) / - sizeof(qdma_cpm4_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(qdma_cpm4_sw_ctxt_entries) / - sizeof(qdma_cpm4_sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_cpm4_hw_ctxt_entries) / - sizeof(qdma_cpm4_hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_cpm4_credit_ctxt_entries) / - sizeof(qdma_cpm4_credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_cpm4_fmap_ctxt_entries) / - sizeof(qdma_cpm4_fmap_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(qdma_cpm4_cmpt_ctxt_entries) / - sizeof(qdma_cpm4_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_cpm4_c2h_pftch_ctxt_entries) / - sizeof(qdma_cpm4_c2h_pftch_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } - } - - *req_buflen = len; - return rv; -} - -static uint32_t qdma_cpm4_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(qdma_cpm4_ind_intr_ctxt_entries) / - sizeof(qdma_cpm4_ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * qdma_acc_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void qdma_cpm4_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - qdma_cpm4_sw_ctxt_entries[0].value = sw_ctxt->pidx; - qdma_cpm4_sw_ctxt_entries[1].value = sw_ctxt->irq_arm; - qdma_cpm4_sw_ctxt_entries[2].value = sw_ctxt->qen; - qdma_cpm4_sw_ctxt_entries[3].value = sw_ctxt->frcd_en; - qdma_cpm4_sw_ctxt_entries[4].value = sw_ctxt->wbi_chk; - qdma_cpm4_sw_ctxt_entries[5].value = sw_ctxt->wbi_intvl_en; - qdma_cpm4_sw_ctxt_entries[6].value = sw_ctxt->fnc_id; - qdma_cpm4_sw_ctxt_entries[7].value = sw_ctxt->rngsz_idx; - qdma_cpm4_sw_ctxt_entries[8].value = sw_ctxt->desc_sz; - qdma_cpm4_sw_ctxt_entries[9].value = sw_ctxt->bypass; - qdma_cpm4_sw_ctxt_entries[10].value = sw_ctxt->mm_chn; - qdma_cpm4_sw_ctxt_entries[11].value = sw_ctxt->wbk_en; - qdma_cpm4_sw_ctxt_entries[12].value = sw_ctxt->irq_en; - qdma_cpm4_sw_ctxt_entries[13].value = sw_ctxt->port_id; - qdma_cpm4_sw_ctxt_entries[14].value = sw_ctxt->irq_no_last; - qdma_cpm4_sw_ctxt_entries[15].value = sw_ctxt->err; - qdma_cpm4_sw_ctxt_entries[16].value = sw_ctxt->err_wb_sent; - qdma_cpm4_sw_ctxt_entries[17].value = sw_ctxt->irq_req; - qdma_cpm4_sw_ctxt_entries[18].value = sw_ctxt->mrkr_dis; - qdma_cpm4_sw_ctxt_entries[19].value = sw_ctxt->is_mm; - qdma_cpm4_sw_ctxt_entries[20].value = - sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - qdma_cpm4_sw_ctxt_entries[21].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; -} - -/* - * qdma_acc_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void qdma_cpm4_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - qdma_cpm4_cmpt_ctxt_entries[0].value = cmpt_ctxt->en_stat_desc; - qdma_cpm4_cmpt_ctxt_entries[1].value = cmpt_ctxt->en_int; - qdma_cpm4_cmpt_ctxt_entries[2].value = cmpt_ctxt->trig_mode; - qdma_cpm4_cmpt_ctxt_entries[3].value = cmpt_ctxt->fnc_id; - qdma_cpm4_cmpt_ctxt_entries[4].value = cmpt_ctxt->counter_idx; - qdma_cpm4_cmpt_ctxt_entries[5].value = cmpt_ctxt->timer_idx; - qdma_cpm4_cmpt_ctxt_entries[6].value = cmpt_ctxt->in_st; - qdma_cpm4_cmpt_ctxt_entries[7].value = cmpt_ctxt->color; - qdma_cpm4_cmpt_ctxt_entries[8].value = cmpt_ctxt->ringsz_idx; - qdma_cpm4_cmpt_ctxt_entries[9].value = - cmpt_ctxt->bs_addr & 0xFFFFFFFF; - qdma_cpm4_cmpt_ctxt_entries[10].value = - (cmpt_ctxt->bs_addr >> 32) & 0xFFFFFFFF; - qdma_cpm4_cmpt_ctxt_entries[11].value = cmpt_ctxt->desc_sz; - qdma_cpm4_cmpt_ctxt_entries[12].value = cmpt_ctxt->pidx; - qdma_cpm4_cmpt_ctxt_entries[13].value = cmpt_ctxt->cidx; - qdma_cpm4_cmpt_ctxt_entries[14].value = cmpt_ctxt->valid; - qdma_cpm4_cmpt_ctxt_entries[15].value = cmpt_ctxt->err; - qdma_cpm4_cmpt_ctxt_entries[16].value = cmpt_ctxt->user_trig_pend; - qdma_cpm4_cmpt_ctxt_entries[17].value = cmpt_ctxt->timer_running; - qdma_cpm4_cmpt_ctxt_entries[18].value = cmpt_ctxt->full_upd; - -} - -/* - * qdma_acc_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void qdma_cpm4_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - qdma_cpm4_hw_ctxt_entries[0].value = hw_ctxt->cidx; - qdma_cpm4_hw_ctxt_entries[1].value = hw_ctxt->crd_use; - qdma_cpm4_hw_ctxt_entries[2].value = hw_ctxt->dsc_pend; - qdma_cpm4_hw_ctxt_entries[3].value = hw_ctxt->idl_stp_b; - qdma_cpm4_hw_ctxt_entries[4].value = hw_ctxt->evt_pnd; - qdma_cpm4_hw_ctxt_entries[5].value = hw_ctxt->fetch_pnd; -} - -/* - * qdma_acc_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void qdma_cpm4_fill_credit_ctxt( - struct qdma_descq_credit_ctxt *cr_ctxt) -{ - qdma_cpm4_credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * qdma_acc_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void qdma_cpm4_fill_pfetch_ctxt( - struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - qdma_cpm4_c2h_pftch_ctxt_entries[0].value = pfetch_ctxt->bypass; - qdma_cpm4_c2h_pftch_ctxt_entries[1].value = pfetch_ctxt->bufsz_idx; - qdma_cpm4_c2h_pftch_ctxt_entries[2].value = pfetch_ctxt->port_id; - qdma_cpm4_c2h_pftch_ctxt_entries[3].value = pfetch_ctxt->err; - qdma_cpm4_c2h_pftch_ctxt_entries[4].value = pfetch_ctxt->pfch_en; - qdma_cpm4_c2h_pftch_ctxt_entries[5].value = pfetch_ctxt->pfch; - qdma_cpm4_c2h_pftch_ctxt_entries[6].value = pfetch_ctxt->sw_crdt; - qdma_cpm4_c2h_pftch_ctxt_entries[7].value = pfetch_ctxt->valid; -} - -/* - * qdma_cpm4_fill_fmap_ctxt() - Helper function to fill fmap context - * into structure - * - */ -static void qdma_cpm4_fill_fmap_ctxt(struct qdma_fmap_cfg *fmap_ctxt) -{ - qdma_cpm4_fmap_ctxt_entries[0].value = fmap_ctxt->qbase; - qdma_cpm4_fmap_ctxt_entries[1].value = fmap_ctxt->qmax; -} - -static void qdma_cpm4_fill_qid2vec_ctxt(struct qdma_qid2vec *qid2vec_ctxt) -{ - qdma_cpm4_qid2vec_ctxt_entries[0].value = qid2vec_ctxt->c2h_vector; - qdma_cpm4_qid2vec_ctxt_entries[1].value = qid2vec_ctxt->c2h_en_coal; - qdma_cpm4_qid2vec_ctxt_entries[2].value = qid2vec_ctxt->h2c_vector; - qdma_cpm4_qid2vec_ctxt_entries[3].value = qid2vec_ctxt->h2c_en_coal; -} - -static void qdma_cpm4_fill_intr_ctxt( - struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - qdma_cpm4_ind_intr_ctxt_entries[0].value = intr_ctxt->valid; - qdma_cpm4_ind_intr_ctxt_entries[1].value = intr_ctxt->vec; - qdma_cpm4_ind_intr_ctxt_entries[2].value = intr_ctxt->int_st; - qdma_cpm4_ind_intr_ctxt_entries[3].value = intr_ctxt->color; - qdma_cpm4_ind_intr_ctxt_entries[4].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - qdma_cpm4_ind_intr_ctxt_entries[5].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - qdma_cpm4_ind_intr_ctxt_entries[6].value = intr_ctxt->page_size; - qdma_cpm4_ind_intr_ctxt_entries[7].value = intr_ctxt->pidx; -} - -/* - * dump_cpm4_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_cpm4_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_CMPT) { - qdma_log_error("%s: Invalid queue type(%d), err:%d\n", - __func__, - q_type, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_cpm4_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_cpm4_fill_credit_ctxt(&queue_context->cr_ctxt); - qdma_cpm4_fill_qid2vec_ctxt(&queue_context->qid2vec); - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - qdma_cpm4_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - qdma_cpm4_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - - qdma_cpm4_fill_fmap_ctxt(&queue_context->fmap); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* SW context dump */ - n = sizeof(qdma_cpm4_sw_ctxt_entries) / - sizeof((qdma_cpm4_sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_sw_ctxt_entries[i].name, - qdma_cpm4_sw_ctxt_entries[i].value, - qdma_cpm4_sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(qdma_cpm4_hw_ctxt_entries) / - sizeof((qdma_cpm4_hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_hw_ctxt_entries[i].name, - qdma_cpm4_hw_ctxt_entries[i].value, - qdma_cpm4_hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(qdma_cpm4_credit_ctxt_entries) / - sizeof((qdma_cpm4_credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_credit_ctxt_entries[i].name, - qdma_cpm4_credit_ctxt_entries[i].value, - qdma_cpm4_credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* SW context dump */ - n = sizeof(qdma_cpm4_qid2vec_ctxt_entries) / - sizeof((qdma_cpm4_qid2vec_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "QID2VEC Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_qid2vec_ctxt_entries[i].name, - qdma_cpm4_qid2vec_ctxt_entries[i].value, - qdma_cpm4_qid2vec_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(qdma_cpm4_cmpt_ctxt_entries) / - sizeof((qdma_cpm4_cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_cmpt_ctxt_entries[i].name, - qdma_cpm4_cmpt_ctxt_entries[i].value, - qdma_cpm4_cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(qdma_cpm4_c2h_pftch_ctxt_entries) / - sizeof(qdma_cpm4_c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_c2h_pftch_ctxt_entries[i].name, - qdma_cpm4_c2h_pftch_ctxt_entries[i].value, - qdma_cpm4_c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* Fmap context dump */ - n = sizeof(qdma_cpm4_fmap_ctxt_entries) / - sizeof(qdma_cpm4_fmap_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Fmap Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_fmap_ctxt_entries[i].name, - qdma_cpm4_fmap_ctxt_entries[i].value, - qdma_cpm4_fmap_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -static int dump_cpm4_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - qdma_cpm4_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(qdma_cpm4_ind_intr_ctxt_entries) / - sizeof((qdma_cpm4_ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_ind_intr_ctxt_entries[i].name, - qdma_cpm4_ind_intr_ctxt_entries[i].value, - qdma_cpm4_ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial intr context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * qdma_cpm4_indirect_reg_invalidate() - helper function to invalidate - * indirect context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_cpm4_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_cpm4_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_cpm4_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_cpm4_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_cpm4_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - - qdma_reg_write(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_cpm4_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_cpm4_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = QDMA_CPM4_IND_CTXT_DATA_3_ADDR; - union qdma_cpm4_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_cpm4_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_cpm4_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_cpm4_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_CPM4_IND_CTXT_DATA_NUM_REGS; - index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = QDMA_CPM4_IND_CTXT_DATA_3_ADDR; - - for (index = 0; - index < ((2 * QDMA_CPM4_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_write() - create qid2vec context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_qid2vec_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_qid2vec *ctxt) -{ - uint32_t qid2vec = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - int rv = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p qid2vec=%p, err:%d\n", - __func__, dev_hndl, ctxt, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - 1, &qid2vec); - if (rv < 0) - return rv; - if (c2h) { - qid2vec = qid2vec & (QDMA_CPM4_QID2VEC_H2C_VECTOR | - QDMA_CPM4_QID2VEC_H2C_COAL_EN); - qid2vec |= FIELD_SET(C2H_QID2VEC_MAP_C2H_VECTOR_MASK, - ctxt->c2h_vector) | - FIELD_SET(C2H_QID2VEC_MAP_C2H_EN_COAL_MASK, - ctxt->c2h_en_coal); - } else { - qid2vec = qid2vec & (C2H_QID2VEC_MAP_C2H_VECTOR_MASK | - C2H_QID2VEC_MAP_C2H_EN_COAL_MASK); - qid2vec |= - FIELD_SET(QDMA_CPM4_QID2VEC_H2C_VECTOR, - ctxt->h2c_vector) | - FIELD_SET(QDMA_CPM4_QID2VEC_H2C_COAL_EN, - ctxt->h2c_en_coal); - } - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, hw_qid, - &qid2vec, QDMA_CPM4_QID2VEC_CONTEXT_NUM_WORDS); - -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_read() - read qid2vec context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_qid2vec_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_qid2vec *ctxt) -{ - int rv = 0; - uint32_t qid2vec[QDMA_CPM4_QID2VEC_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p qid2vec=%p, err:%d\n", - __func__, dev_hndl, ctxt, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_QID2VEC_CONTEXT_NUM_WORDS, qid2vec); - if (rv < 0) - return rv; - - if (c2h) { - ctxt->c2h_vector = FIELD_GET(C2H_QID2VEC_MAP_C2H_VECTOR_MASK, - qid2vec[0]); - ctxt->c2h_en_coal = - (uint8_t)(FIELD_GET(C2H_QID2VEC_MAP_C2H_EN_COAL_MASK, - qid2vec[0])); - } else { - ctxt->h2c_vector = - (uint8_t)(FIELD_GET(QDMA_CPM4_QID2VEC_H2C_VECTOR, - qid2vec[0])); - ctxt->h2c_en_coal = - (uint8_t)(FIELD_GET(QDMA_CPM4_QID2VEC_H2C_COAL_EN, - qid2vec[0])); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_clear() - clear qid2vec context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_qid2vec_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_invalidate() - invalidate qid2vec context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_qid2vec_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_conf() - configure qid2vector context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_qid2vec_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_qid2vec_read(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_qid2vec_write(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_qid2vec_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_qid2vec_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_fmap_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_fmap_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap = 0; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle or config is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - fmap = FIELD_SET(TRQ_SEL_FMAP_0_QID_BASE_MASK, config->qbase) | - FIELD_SET(TRQ_SEL_FMAP_0_QID_MAX_MASK, - config->qmax); - - qdma_reg_write(dev_hndl, QDMA_CPM4_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_CPM4_REG_TRQ_SEL_FMAP_STEP, - fmap); - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_fmap_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_fmap_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - uint32_t fmap = 0; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - fmap = qdma_reg_read(dev_hndl, QDMA_CPM4_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_CPM4_REG_TRQ_SEL_FMAP_STEP); - - config->qbase = FIELD_GET(TRQ_SEL_FMAP_0_QID_BASE_MASK, fmap); - config->qmax = - (uint16_t)(FIELD_GET(TRQ_SEL_FMAP_0_QID_MAX_MASK, - fmap)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_fmap_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_fmap_clear(void *dev_hndl, uint16_t func_id) -{ - uint32_t fmap = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_reg_write(dev_hndl, QDMA_CPM4_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_CPM4_REG_TRQ_SEL_FMAP_STEP, - fmap); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE unsupported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_fmap_read(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_fmap_write(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_fmap_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[QDMA_CPM4_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl or ctxt is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((ctxt->desc_sz > QDMA_DESC_SIZE_64B) || - (ctxt->rngsz_idx >= QDMA_NUM_RING_SIZES)) { - qdma_log_error("%s: Invalid desc_sz(%d)/rngidx(%d), err:%d\n", - __func__, - ctxt->desc_sz, - ctxt->rngsz_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W0_PIDX_MASK, ctxt->pidx) | - FIELD_SET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, ctxt->irq_arm); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - ctxt->wbi_intvl_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - ctxt->irq_no_last) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_MASK, ctxt->err) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - ctxt->err_wb_sent) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = 0; - uint32_t sw_ctxt[QDMA_CPM4_SW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - struct qdma_qid2vec qid2vec_ctxt = {0}; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p sw_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(SW_IND_CTXT_DATA_W0_PIDX_MASK, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, - sw_ctxt[0])); - - ctxt->qen = FIELD_GET(SW_IND_CTXT_DATA_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, - sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, - sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - sw_ctxt[1]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_FNC_ID_MASK, - sw_ctxt[1])); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, - sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, - sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, - sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, - sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, - sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, - sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, - sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, - sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, - sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, - sw_ctxt[1])); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - /** Read the QID2VEC Context Data */ - rv = qdma_cpm4_qid2vec_read(dev_hndl, c2h, hw_qid, &qid2vec_ctxt); - if (rv < 0) - return rv; - - if (c2h) { - ctxt->vec = qid2vec_ctxt.c2h_vector; - ctxt->intr_aggr = qid2vec_ctxt.c2h_en_coal; - } else { - ctxt->vec = qid2vec_ctxt.h2c_vector; - ctxt->intr_aggr = qid2vec_ctxt.h2c_en_coal; - } - - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_sw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_sw_context_write(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_sw_context_invalidate(dev_hndl, - c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[QDMA_CPM4_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p pfetch_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_ERR_MASK, ctxt->err) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, ctxt->pfch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, sw_crdt_l); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(PREFETCH_CTXT_DATA_W1_VALID_MASK, ctxt->valid); - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = 0; - uint32_t pfetch_ctxt[QDMA_CPM4_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p pfetch_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, - pfetch_ctxt[0])); - ctxt->bufsz_idx = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK, - pfetch_ctxt[0])); - ctxt->port_id = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, - pfetch_ctxt[0])); - ctxt->err = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - (uint32_t)FIELD_GET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, - pfetch_ctxt[0]); - - sw_crdt_h = - (uint32_t)FIELD_GET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, - pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - (uint16_t)(FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, - sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_pfetch_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_pfetch_context_read(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_pfetch_context_write(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_pfetch_context_invalidate(dev_hndl, - hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[QDMA_CPM4_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h, baddr_m, pidx_l, pidx_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p cmpt_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((ctxt->desc_sz > QDMA_DESC_SIZE_32B) || - (ctxt->ringsz_idx >= QDMA_NUM_RING_SIZES) || - (ctxt->counter_idx >= QDMA_NUM_C2H_COUNTERS) || - (ctxt->timer_idx >= QDMA_NUM_C2H_TIMERS) || - (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR)) { - qdma_log_error - ("%s Inv dsz(%d)/ridx(%d)/cntr(%d)/tmr(%d)/tm(%d), err:%d\n", - __func__, - ctxt->desc_sz, - ctxt->ringsz_idx, - ctxt->counter_idx, - ctxt->timer_idx, - ctxt->trig_mode, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = - (uint32_t)FIELD_GET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_L_MASK, - ctxt->bs_addr); - baddr_m = - (uint32_t)FIELD_GET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_M_MASK, - ctxt->bs_addr); - baddr_h = - (uint32_t)FIELD_GET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_H_MASK, - ctxt->bs_addr); - - pidx_l = FIELD_GET(QDMA_CPM4_COMPL_CTXT_PIDX_GET_L_MASK, - ctxt->pidx); - pidx_h = FIELD_GET(QDMA_CPM4_COMPL_CTXT_PIDX_GET_H_MASK, - ctxt->pidx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(CMPL_CTXT_DATA_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(CMPL_CTXT_DATA_W0_CNTER_IDX_MASK, - ctxt->counter_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_TIMER_IDX_MASK, - ctxt->timer_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - ctxt->in_st) | - FIELD_SET(CMPL_CTXT_DATA_W0_COLOR_MASK, - ctxt->color) | - FIELD_SET(CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK, - ctxt->ringsz_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_BADDR_64_L_MASK, - baddr_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W1_BADDR_64_M_MASK, - baddr_m); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W2_BADDR_64_H_MASK, - baddr_h) | - FIELD_SET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - ctxt->desc_sz) | - FIELD_SET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, - pidx_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, - pidx_h) | - FIELD_SET(CMPL_CTXT_DATA_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(CMPL_CTXT_DATA_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(CMPL_CTXT_DATA_W3_ERR_MASK, ctxt->err) | - FIELD_SET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - ctxt->user_trig_pend) | - FIELD_SET(CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK, - ctxt->timer_running) | - FIELD_SET(CMPL_CTXT_DATA_W3_FULL_UPD_MASK, - ctxt->full_upd); - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); - -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = 0; - uint32_t cmpt_ctxt[QDMA_CPM4_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr_l, baddr_h, baddr_m, - pidx_l, pidx_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p cmpt_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(CMPL_CTXT_DATA_W0_EN_INT_MASK, - cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET( - CMPL_CTXT_DATA_W0_CNTER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_TIMER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK, - cmpt_ctxt[0])); - - baddr_l = - FIELD_GET(CMPL_CTXT_DATA_W0_BADDR_64_L_MASK, - cmpt_ctxt[0]); - baddr_m = - FIELD_GET(CMPL_CTXT_DATA_W1_BADDR_64_M_MASK, - cmpt_ctxt[1]); - baddr_h = - FIELD_GET(CMPL_CTXT_DATA_W2_BADDR_64_H_MASK, - cmpt_ctxt[2]); - - ctxt->desc_sz = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, - cmpt_ctxt[2]); - - pidx_h = FIELD_GET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, - cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(CMPL_CTXT_DATA_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_ERR_MASK, - cmpt_ctxt[3])); - ctxt->user_trig_pend = - (uint8_t)(FIELD_GET( - CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, cmpt_ctxt[3])); - - ctxt->timer_running = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK, - cmpt_ctxt[3])); - ctxt->full_upd = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_FULL_UPD_MASK, - cmpt_ctxt[3])); - - ctxt->bs_addr = - FIELD_SET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_L_MASK, - (uint64_t)baddr_l) | - FIELD_SET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_M_MASK, - (uint64_t)baddr_m) | - FIELD_SET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_H_MASK, - (uint64_t)baddr_h); - - ctxt->pidx = - (uint16_t)(FIELD_SET(QDMA_CPM4_COMPL_CTXT_PIDX_GET_L_MASK, - pidx_l) | - FIELD_SET(QDMA_CPM4_COMPL_CTXT_PIDX_GET_H_MASK, - pidx_h)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_cmpt_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_cmpt_context_read(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_cmpt_context_write(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_cmpt_context_invalidate(dev_hndl, - hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = 0; - uint32_t hw_ctxt[QDMA_CPM4_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p hw_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(HW_IND_CTXT_DATA_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(HW_IND_CTXT_DATA_W0_CRD_USE_MASK, - hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, - hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_FETCH_PND_MASK, - hw_ctxt[1])); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE unsupported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_hw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_hw_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_indirect_intr_context_write() - create indirect - * interrupt context and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_indirect_intr_context_write(void *dev_hndl, - uint16_t ring_index, const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[QDMA_CPM4_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->page_size > QDMA_INDIRECT_INTR_RING_SIZE_32KB) { - qdma_log_error("%s: ctxt->page_size=%u is too big, err:%d\n", - __func__, ctxt->page_size, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = - (uint32_t)FIELD_GET(QDMA_CPM4_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_h = - (uint32_t)FIELD_GET(QDMA_CPM4_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(INTR_CTXT_DATA_W0_VEC_MASK, ctxt->vec) | - FIELD_SET(INTR_CTXT_DATA_W0_INT_ST_MASK, - ctxt->int_st) | - FIELD_SET(INTR_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W1_BADDR_4K_H_MASK, baddr_h) | - FIELD_SET(INTR_CTXT_DATA_W1_PAGE_SIZE_MASK, - ctxt->page_size); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W2_PIDX_MASK, ctxt->pidx); - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_indirect_intr_context_read(void *dev_hndl, - uint16_t ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = 0; - uint32_t intr_ctxt[QDMA_CPM4_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, ring_index, - QDMA_CPM4_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(INTR_CTXT_DATA_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(INTR_CTXT_DATA_W0_VEC_MASK, - intr_ctxt[0]); - ctxt->int_st = FIELD_GET(INTR_CTXT_DATA_W0_INT_ST_MASK, - intr_ctxt[0]); - ctxt->color = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_COLOR_MASK, - intr_ctxt[0])); - baddr_l = FIELD_GET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, - intr_ctxt[0]); - - baddr_h = FIELD_GET(INTR_CTXT_DATA_W1_BADDR_4K_H_MASK, - intr_ctxt[1]); - ctxt->page_size = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W1_PAGE_SIZE_MASK, - intr_ctxt[1])); - ctxt->pidx = FIELD_GET(INTR_CTXT_DATA_W2_PIDX_MASK, - intr_ctxt[2]); - - ctxt->baddr_4k = - FIELD_SET(QDMA_CPM4_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_CPM4_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_indirect_intr_context_clear() - clear indirect - * interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_indirect_intr_context_clear(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_indirect_intr_context_invalidate() - invalidate - * indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_indirect_intr_context_read(dev_hndl, - ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_indirect_intr_context_write(dev_hndl, - ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_indirect_intr_context_invalidate( - dev_hndl, ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_set_default_global_csr() - function to set the global - * CSR register to default values. The value can be modified later by using - * the set/get csr functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, - 385, 513, 769, 1025, 1537, 3073, 4097, 6145, - 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, - 32, 48, 64, 80, 96, 112, 128, 144, - 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, - 4096, 8192, 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, QDMA_CPM4_GLBL_RNG_SZ_1_ADDR, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_CNT_TH_1_ADDR, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_TIMER_CNT_1_ADDR, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_DSC_CFG_ADDR, reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_BUF_SZ_0_ADDR, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - reg_val = - FIELD_SET(C2H_PFCH_CFG_FL_TH_MASK, - QDMA_CPM4_DEFAULT_PFCH_STOP_THRESH) | - FIELD_SET(C2H_PFCH_CFG_NUM_MASK, - DEFAULT_PFCH_NUM_ENTRIES_PER_Q) | - FIELD_SET(C2H_PFCH_CFG_QCNT_MASK, - DEFAULT_PFCH_MAX_Q_CNT) | - FIELD_SET(C2H_PFCH_CFG_EVT_QCNT_TH_MASK, - DEFAULT_C2H_INTR_TIMER_TICK); - qdma_reg_write(dev_hndl, - QDMA_CPM4_C2H_PFCH_CFG_ADDR, reg_val); - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, QDMA_CPM4_C2H_INT_TIMER_TICK_ADDR, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - reg_val = - FIELD_SET(C2H_WRB_COAL_CFG_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(C2H_WRB_COAL_CFG_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK, - DEFAULT_CMPT_COAL_MAX_BUF_SZ); - qdma_reg_write(dev_hndl, - QDMA_CPM4_C2H_WRB_COAL_CFG_ADDR, reg_val); - -#if 0 - /* H2C throttle Configuration*/ - reg_val = - FIELD_SET(QDMA_H2C_DATA_THRESH_MASK, - DEFAULT_H2C_THROT_DATA_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_DATA_MASK, - DEFAULT_THROT_EN_DATA); - qdma_reg_write(dev_hndl, QDMA_OFFSET_H2C_REQ_THROT, reg_val); -#endif - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_queue_pidx_update() - function to update the desc PIDX - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @reg_info: data needed for the PIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info) -{ - uint32_t reg_addr = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!is_vf) { - reg_addr = (is_c2h) ? - QDMA_CPM4_OFFSET_DMAP_SEL_C2H_DSC_PIDX : - QDMA_CPM4_OFFSET_DMAP_SEL_H2C_DSC_PIDX; - } else { - reg_addr = (is_c2h) ? - QDMA_CPM4_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX : - QDMA_CPM4_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX; - } - - reg_addr += (qid * QDMA_PIDX_STEP); - - reg_val = FIELD_SET(QDMA_CPM4_DMA_SEL_DESC_PIDX_MASK, - reg_info->pidx) | - FIELD_SET(QDMA_CPM4_DMA_SEL_IRQ_EN_MASK, - reg_info->irq_en); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_queue_cmpt_cidx_update() - function to update the CMPT - * CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? - QDMA_CPM4_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_CPM4_OFFSET_DMAP_SEL_CMPT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += (qid * QDMA_CMPT_CIDX_STEP); - - reg_val = - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_WRB_CIDX_MASK, - reg_info->wrb_cidx) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_info->counter_idx) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_TMR_CNT_MASK, - reg_info->timer_idx) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_TRG_MODE_MASK, - reg_info->trig_mode) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_info->wrb_en) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_IRQ_EN_MASK, - reg_info->irq_en); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_queue_intr_cidx_update() - function to update the - * CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? - QDMA_CPM4_OFFSET_VF_DMAP_SEL_INT_CIDX : - QDMA_CPM4_OFFSET_DMAP_SEL_INT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += qid * QDMA_INT_CIDX_STEP; - - reg_val = - FIELD_SET(QDMA_CPM4_DMA_SEL_INT_SW_CIDX_MASK, - reg_info->sw_cidx) | - FIELD_SET(QDMA_CPM4_DMA_SEL_INT_RING_IDX_MASK, - reg_info->rng_idx); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cmp_get_user_bar() - Function to get the - * AXI Master Lite(user bar) number - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite(user bar) number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cmp_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: user_bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr = (is_vf) ? QDMA_CPM4_GLBL2_PF_VF_BARLITE_EXT_ADDR : - QDMA_CPM4_GLBL2_PF_BARLITE_EXT_ADDR; - - if (!is_vf) { - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - } else { - *user_bar = QDMA_CPM4_VF_USER_BAR_ID; - return QDMA_SUCCESS; - } - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_ram_sbe_err_process() -Function to dump SBE err debug info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_ram_sbe_err_process(void *dev_hndl) -{ - qdma_cpm4_dump_reg_info(dev_hndl, QDMA_CPM4_RAM_SBE_STS_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_ram_dbe_err_process() -Function to dump DBE err debug info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_ram_dbe_err_process(void *dev_hndl) -{ - qdma_cpm4_dump_reg_info(dev_hndl, QDMA_CPM4_RAM_DBE_STS_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_desc_err_process() -Function to dump Descriptor Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_LOG0_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_LOG1_ADDR, - QDMA_CPM4_GLBL_DSC_DBG_DAT0_ADDR, - QDMA_CPM4_GLBL_DSC_DBG_DAT1_ADDR - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - qdma_cpm4_dump_reg_info(dev_hndl, - desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_trq_err_process() -Function to dump Target Access Err info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_LOG_ADDR - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - qdma_cpm4_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } - - -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_st_h2c_err_process() - Function to dump MM H2C Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - QDMA_CPM4_H2C_ERR_STAT_ADDR, - QDMA_CPM4_H2C_FIRST_ERR_QID_ADDR, - QDMA_CPM4_H2C_DBG_REG0_ADDR, - QDMA_CPM4_H2C_DBG_REG1_ADDR, - QDMA_CPM4_H2C_DBG_REG2_ADDR, - QDMA_CPM4_H2C_DBG_REG3_ADDR, - QDMA_CPM4_H2C_DBG_REG4_ADDR - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - qdma_cpm4_dump_reg_info(dev_hndl, - st_h2c_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_st_c2h_err_process() - Function to dump MM H2C Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - QDMA_CPM4_C2H_ERR_STAT_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - QDMA_CPM4_C2H_FIRST_ERR_QID_ADDR, - QDMA_CPM4_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR, - QDMA_CPM4_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR, - QDMA_CPM4_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR, - QDMA_CPM4_C2H_STAT_AXIS_PKG_CMP_ADDR, - QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_0_ADDR, - QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_1_ADDR, - QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_2_ADDR, - QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_3_ADDR, - QDMA_CPM4_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR, - QDMA_CPM4_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - qdma_cpm4_dump_reg_info(dev_hndl, - st_c2h_err_reg_list[i], - 1, NULL, 0); - } -} - - - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_get_error_name() - Function to get the error in str format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *qdma_cpm4_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= QDMA_CPM4_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, - (enum qdma_cpm4_error_idx)err_idx); - return NULL; - } - - return qdma_cpm4_err_info[ - (enum qdma_cpm4_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t i = 0, j = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS] = { - QDMA_CPM4_DSC_ERR_POISON, - QDMA_CPM4_TRQ_ERR_UNMAPPED, - QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH, - QDMA_CPM4_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_CPM4_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - QDMA_CPM4_SBE_ERR_MI_H2C0_DAT, - QDMA_CPM4_DBE_ERR_MI_H2C0_DAT - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_ERR_STAT_ADDR); - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - qdma_log_info("%s: Global Err Reg(0x%x) = 0x%x\n", - __func__, QDMA_CPM4_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - for (i = 0; i < QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - j = hw_err_position[i]; - - if ((!dev_cap.st_en) && - (j == QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH || - j == QDMA_CPM4_ST_FATAL_ERR_MTY_MISMATCH || - j == QDMA_CPM4_ST_H2C_ERR_ZERO_LEN_DESC_ERR)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - qdma_cpm4_err_info[j].stat_reg_addr); - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - qdma_cpm4_err_info[j].stat_reg_addr, - err_stat); - - qdma_cpm4_err_info[j].qdma_cpm4_hw_err_process( - dev_hndl); - for (idx = j; - idx < all_qdma_cpm4_hw_errs[i]; - idx++) { - /* call the platform specific handler */ - if (err_stat & - qdma_cpm4_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s\n", - __func__, - qdma_cpm4_hw_get_error_name( - idx)); - } - qdma_reg_write(dev_hndl, - qdma_cpm4_err_info[j].stat_reg_addr, - err_stat); - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_ERR_STAT_ADDR, glbl_err_stat); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > QDMA_CPM4_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, (enum qdma_cpm4_error_idx)err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == QDMA_CPM4_ERRS_ALL) { - for (i = 0; - i < QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS; - i++) { - - idx = all_qdma_cpm4_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == QDMA_CPM4_ST_C2H_ERR_ALL || - idx == QDMA_CPM4_ST_FATAL_ERR_ALL || - idx == QDMA_CPM4_ST_H2C_ERR_ALL) - continue; - } - - reg_val = qdma_cpm4_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - qdma_cpm4_err_info[idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_ERR_MASK_ADDR); - reg_val |= FIELD_SET( - qdma_cpm4_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_ERR_MASK_ADDR, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= QDMA_CPM4_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - qdma_cpm4_err_info[err_idx].mask_reg_addr); - reg_val |= - FIELD_SET(qdma_cpm4_err_info[err_idx].leaf_err_mask, - 1); - qdma_reg_write(dev_hndl, - qdma_cpm4_err_info[err_idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_ERR_MASK_ADDR); - reg_val |= - FIELD_SET( - qdma_cpm4_err_info[err_idx].global_err_mask, - 1); - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_ERR_MASK_ADDR, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_get_device_attributes() - Function to get the qdma - * device attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL2_PF_BARLITE_INT_ADDR); - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_CPM4_GLBL2_CHANNEL_CAP_ADDR); - dev_info->num_qs = (FIELD_GET(GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK, - reg_val)); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, QDMA_CPM4_GLBL2_MISC_CAP_ADDR); - dev_info->mailbox_en = FIELD_GET(QDMA_GLBL2_MAILBOX_EN_MASK, reg_val); - dev_info->flr_present = FIELD_GET(QDMA_GLBL2_FLR_PRESENT_MASK, reg_val); - dev_info->mm_cmpt_en = 0; - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL2_CHANNEL_MDMA_ADDR); - dev_info->mm_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ENG_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ENG_MASK, reg_val)) ? 1 : 0; - dev_info->st_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ST_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ST_MASK, - reg_val)) ? 1 : 0; - - /* num of mm channels for Versal Hard is 2 */ - dev_info->mm_channel_max = 2; - - dev_info->debug_mode = 0; - dev_info->desc_eng_mode = 0; - dev_info->qid2vec_ctx = 1; - dev_info->cmpt_ovf_chk_dis = 0; - dev_info->mailbox_intr = 0; - dev_info->sw_desc_64b = 0; - dev_info->cmpt_desc_64b = 0; - dev_info->dynamic_bar = 0; - dev_info->legacy_intr = 0; - dev_info->cmpt_trig_count_timer = 0; - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_cpm4_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * @ctxt : pointer to the context data - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[QDMA_CPM4_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(CRED_CTXT_DATA_W0_CREDT_MASK, - cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_credit_ctx_conf() - configure credit context - * - * @dev_hndl : device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * @ctxt : pointer to the context data - * @access_type : HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cpm4_credit_context_read(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_cpm4_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_cpm4_credit_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_cpm4_dump_config_regs() - Function to get qdma config register - * dump in a buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = qdma_cpm4_config_num_regs_get(); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < qdma_cpm4_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = qdma_cpm4_config_regs_get(); - - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", reg_info[i].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm4_queue_context() - Function to get qdma queue context dump - * in a buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_cpm4_context(ctxt_data, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm4_intr_context() - Function to get qdma interrupt - * context dump in a buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - req_buflen = qdma_cpm4_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_cpm4_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @func_id: function id - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_CMPT) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_context_buf_len(st, q_type, &req_buflen); - - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = qdma_cpm4_sw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.sw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read sw context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_cpm4_hw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.hw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read hw context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_cpm4_qid2vec_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.qid2vec), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read qid2vec context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_cpm4_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read credit context, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = qdma_cpm4_pfetch_ctx_conf(dev_hndl, - qid_hw, - &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read pftech context, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = qdma_cpm4_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read cmpt context, err = %d", - __func__, rv); - return rv; - } - } - - rv = qdma_cpm4_fmap_conf(dev_hndl, func_id, - &(context.fmap), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read fmap context, err = %d", - __func__, rv); - return rv; - } - - rv = dump_cpm4_context(&context, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_init_ctxt_memory() - Initialize the context for all queues - * - * @dev_hndl : device handle - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ - -int qdma_cpm4_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - qdma_cpm4_get_device_attributes(dev_hndl, &dev_info); - qdma_log_info("%s: clearing the context for all qs", - __func__); - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - -#ifdef TANDEM_BOOT_SUPPORTED - for (; sel <= QDMA_CTXT_SEL_CR_H2C; sel++) { - rv = qdma_cpm4_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } -#else - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - (sel == QDMA_CTXT_SEL_PFTCH || - sel == QDMA_CTXT_SEL_CMPT)) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug(" sel = %d", sel); - continue; - } - - rv = qdma_cpm4_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } -#endif - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - qdma_cpm4_fmap_clear(dev_hndl, i); -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return 0; -} - -#ifdef TANDEM_BOOT_SUPPORTED -/*****************************************************************************/ -/** - * qdma_cpm4_init_st_ctxt() - Initialize the ST context - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_cpm4_init_st_ctxt(void *dev_hndl) -{ - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - qdma_cpm4_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_CMPT; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = qdma_cpm4_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - return QDMA_SUCCESS; - -} -#endif - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = qdma_cpm4_config_num_regs_get(); - - reg_info = qdma_cpm4_config_regs_get(); - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_cpm4_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = qdma_cpm4_config_regs_get(); - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (reg_count = 0; - (reg_count < total_regs);) { - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; - -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_cpm4_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_slot, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - uint32_t num_regs = qdma_cpm4_config_num_regs_get(); - struct xreg_info *reg_info = qdma_cpm4_config_regs_get(); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_slot) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = QDMA_CPM4_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = QDMA_CPM4_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = QDMA_CPM4_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = QDMA_CPM4_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid slot received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_write_global_ring_sizes() - set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_global_ring_sizes() - function to get the - * global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, - QDMA_CPM4_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_TIMER_CNT_1_ADDR, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_CPM4_C2H_TIMER_CNT_1_ADDR, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_write_global_counter_threshold(void *dev_hndl, - uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_CNT_TH_1_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_global_counter_threshold() - get the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_read_global_counter_threshold(void *dev_hndl, - uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_CPM4_C2H_CNT_TH_1_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_write_global_buffer_sizes(void *dev_hndl, - uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_BUF_SZ_0_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, - QDMA_CPM4_C2H_BUF_SZ_0_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cpm4_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_cpm4_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cpm4_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_cpm4_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_cpm4_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_cpm4_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_cpm4_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_cpm4_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_global_writeback_interval_write() - function to set the - * writeback interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_DSC_CFG_ADDR); - reg_val |= FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_DSC_CFG_ADDR, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_global_writeback_interval_read() - function to get the - * writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_DSC_CFG_ADDR); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_cpm4_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_cpm4_global_writeback_interval_write(dev_hndl, - *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_cpm4_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? QDMA_CPM4_C2H_CHANNEL_CTL_ADDR : - QDMA_CPM4_H2C_CHANNEL_CTL_ADDR; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) { - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - } - - return QDMA_SUCCESS; -} - -int qdma_cpm4_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = qdma_cpm4_config_num_regs_get(); - struct xreg_info *config_regs = qdma_cpm4_config_regs_get(); - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; - -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.h deleted file mode 100755 index a28f633..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.h +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_CPM4_ACCESS_H_ -#define __QDMA_CPM4_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum qdma_cpm4_error_idx { - /* Descriptor errors */ - QDMA_CPM4_DSC_ERR_POISON, - QDMA_CPM4_DSC_ERR_UR_CA, - QDMA_CPM4_DSC_ERR_PARAM, - QDMA_CPM4_DSC_ERR_ADDR, - QDMA_CPM4_DSC_ERR_TAG, - QDMA_CPM4_DSC_ERR_FLR, - QDMA_CPM4_DSC_ERR_TIMEOUT, - QDMA_CPM4_DSC_ERR_DAT_POISON, - QDMA_CPM4_DSC_ERR_FLR_CANCEL, - QDMA_CPM4_DSC_ERR_DMA, - QDMA_CPM4_DSC_ERR_DSC, - QDMA_CPM4_DSC_ERR_RQ_CANCEL, - QDMA_CPM4_DSC_ERR_DBE, - QDMA_CPM4_DSC_ERR_SBE, - QDMA_CPM4_DSC_ERR_ALL, - - /* TRQ Errors */ - QDMA_CPM4_TRQ_ERR_UNMAPPED, - QDMA_CPM4_TRQ_ERR_QID_RANGE, - QDMA_CPM4_TRQ_ERR_VF_ACCESS_ERR, - QDMA_CPM4_TRQ_ERR_TCP_TIMEOUT, - QDMA_CPM4_TRQ_ERR_ALL, - - /* C2H Errors */ - QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_LEN_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_QID_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_DESC_RSP_ERR, - QDMA_CPM4_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - QDMA_CPM4_ST_C2H_ERR_MSI_INT_FAIL, - QDMA_CPM4_ST_C2H_ERR_ERR_DESC_CNT, - QDMA_CPM4_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_WRB_INV_Q_ERR, - QDMA_CPM4_ST_C2H_ERR_WRB_QFULL_ERR, - QDMA_CPM4_ST_C2H_ERR_WRB_CIDX_ERR, - QDMA_CPM4_ST_C2H_ERR_WRB_PRTY_ERR, - QDMA_CPM4_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - QDMA_CPM4_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_CPM4_ST_FATAL_ERR_LEN_MISMATCH, - QDMA_CPM4_ST_FATAL_ERR_QID_MISMATCH, - QDMA_CPM4_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_WRB_CTXT_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_INT_QID2VEC_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_WRB_COAL_DATA_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_WPL_DATA_PAR_ERR, - QDMA_CPM4_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - QDMA_CPM4_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - QDMA_CPM4_ST_H2C_ERR_SDI_MRKR_REQ_MOP_ERR, - QDMA_CPM4_ST_H2C_ERR_NO_DMA_DSC, - QDMA_CPM4_ST_H2C_ERR_DBE, - QDMA_CPM4_ST_H2C_ERR_SBE, - QDMA_CPM4_ST_H2C_ERR_ALL, - - /* Single bit errors */ - QDMA_CPM4_SBE_ERR_MI_H2C0_DAT, - QDMA_CPM4_SBE_ERR_MI_C2H0_DAT, - QDMA_CPM4_SBE_ERR_H2C_RD_BRG_DAT, - QDMA_CPM4_SBE_ERR_H2C_WR_BRG_DAT, - QDMA_CPM4_SBE_ERR_C2H_RD_BRG_DAT, - QDMA_CPM4_SBE_ERR_C2H_WR_BRG_DAT, - QDMA_CPM4_SBE_ERR_FUNC_MAP, - QDMA_CPM4_SBE_ERR_DSC_HW_CTXT, - QDMA_CPM4_SBE_ERR_DSC_CRD_RCV, - QDMA_CPM4_SBE_ERR_DSC_SW_CTXT, - QDMA_CPM4_SBE_ERR_DSC_CPLI, - QDMA_CPM4_SBE_ERR_DSC_CPLD, - QDMA_CPM4_SBE_ERR_PASID_CTXT_RAM, - QDMA_CPM4_SBE_ERR_TIMER_FIFO_RAM, - QDMA_CPM4_SBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_CPM4_SBE_ERR_QID_FIFO_RAM, - QDMA_CPM4_SBE_ERR_TUSER_FIFO_RAM, - QDMA_CPM4_SBE_ERR_WRB_COAL_DATA_RAM, - QDMA_CPM4_SBE_ERR_INT_QID2VEC_RAM, - QDMA_CPM4_SBE_ERR_INT_CTXT_RAM, - QDMA_CPM4_SBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_CPM4_SBE_ERR_PFCH_CTXT_RAM, - QDMA_CPM4_SBE_ERR_WRB_CTXT_RAM, - QDMA_CPM4_SBE_ERR_PFCH_LL_RAM, - QDMA_CPM4_SBE_ERR_ALL, - - /* Double bit Errors */ - QDMA_CPM4_DBE_ERR_MI_H2C0_DAT, - QDMA_CPM4_DBE_ERR_MI_C2H0_DAT, - QDMA_CPM4_DBE_ERR_H2C_RD_BRG_DAT, - QDMA_CPM4_DBE_ERR_H2C_WR_BRG_DAT, - QDMA_CPM4_DBE_ERR_C2H_RD_BRG_DAT, - QDMA_CPM4_DBE_ERR_C2H_WR_BRG_DAT, - QDMA_CPM4_DBE_ERR_FUNC_MAP, - QDMA_CPM4_DBE_ERR_DSC_HW_CTXT, - QDMA_CPM4_DBE_ERR_DSC_CRD_RCV, - QDMA_CPM4_DBE_ERR_DSC_SW_CTXT, - QDMA_CPM4_DBE_ERR_DSC_CPLI, - QDMA_CPM4_DBE_ERR_DSC_CPLD, - QDMA_CPM4_DBE_ERR_PASID_CTXT_RAM, - QDMA_CPM4_DBE_ERR_TIMER_FIFO_RAM, - QDMA_CPM4_DBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_CPM4_DBE_ERR_QID_FIFO_RAM, - QDMA_CPM4_DBE_ERR_WRB_COAL_DATA_RAM, - QDMA_CPM4_DBE_ERR_INT_QID2VEC_RAM, - QDMA_CPM4_DBE_ERR_INT_CTXT_RAM, - QDMA_CPM4_DBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_CPM4_DBE_ERR_PFCH_CTXT_RAM, - QDMA_CPM4_DBE_ERR_WRB_CTXT_RAM, - QDMA_CPM4_DBE_ERR_PFCH_LL_RAM, - QDMA_CPM4_DBE_ERR_ALL, - - QDMA_CPM4_ERRS_ALL -}; - -struct qdma_cpm4_hw_err_info { - enum qdma_cpm4_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*qdma_cpm4_hw_err_process)(void *dev_hndl); -}; - - -int qdma_cpm4_init_ctxt_memory(void *dev_hndl); - -#ifdef TANDEM_BOOT_SUPPORTED -int qdma_cpm4_init_st_ctxt(void *dev_hndl); -#endif - -int qdma_cpm4_qid2vec_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_set_default_global_csr(void *dev_hndl); - -int qdma_cpm4_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info); - -int qdma_cpm4_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info); - -int qdma_cpm4_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info); - -int qdma_cmp_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - -int qdma_cpm4_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -uint32_t qdma_cpm4_reg_dump_buf_len(void); - -int qdma_cpm4_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *req_buflen); - -int qdma_cpm4_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int qdma_cpm4_hw_error_process(void *dev_hndl); -const char *qdma_cpm4_hw_get_error_name(uint32_t err_idx); -int qdma_cpm4_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int qdma_cpm4_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -int qdma_cpm4_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -int qdma_cpm4_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int qdma_cpm4_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int qdma_cpm4_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_slot, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int qdma_cpm4_global_csr_conf(void *dev_hndl, uint8_t index, - uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, - uint8_t enable); - -int qdma_cpm4_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -uint32_t qdma_cpm4_get_config_num_regs(void); - -struct xreg_info *qdma_cpm4_get_config_regs(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_CPM4_ACCESS_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg.h deleted file mode 100755 index 00bba14..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg.h +++ /dev/null @@ -1,2062 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_CPM4_REG_H -#define __QDMA_CPM4_REG_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - -#define DEBGFS_LINE_SZ (81) - -#ifdef ARRAY_SIZE -#undef ARRAY_SIZE -#endif -#define ARRAY_SIZE(arr) (sizeof(arr) / \ - sizeof(arr[0])) - - -uint32_t qdma_cpm4_config_num_regs_get(void); -struct xreg_info *qdma_cpm4_config_regs_get(void); -#define QDMA_CPM4_CFG_BLK_IDENTIFIER_ADDR 0x00 -#define CFG_BLK_IDENTIFIER_MASK GENMASK(31, 20) -#define CFG_BLK_IDENTIFIER_1_MASK GENMASK(19, 16) -#define CFG_BLK_IDENTIFIER_RSVD_1_MASK GENMASK(15, 8) -#define CFG_BLK_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define QDMA_CPM4_CFG_BLK_BUSDEV_ADDR 0x04 -#define CFG_BLK_BUSDEV_BDF_MASK GENMASK(15, 0) -#define QDMA_CPM4_CFG_BLK_PCIE_MAX_PLD_SIZE_ADDR 0x08 -#define CFG_BLK_PCIE_MAX_PLD_SIZE_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ADDR 0x0C -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_BLK_SYSTEM_ID_ADDR 0x10 -#define CFG_BLK_SYSTEM_ID_MASK GENMASK(15, 0) -#define QDMA_CPM4_CFG_BLK_MSI_ENABLE_ADDR 0x014 -#define CFG_BLK_MSI_ENABLE_3_MASK BIT(17) -#define CFG_BLK_MSI_ENABLE_MSIX3_MASK BIT(16) -#define CFG_BLK_MSI_ENABLE_2_MASK BIT(13) -#define CFG_BLK_MSI_ENABLE_MSIX2_MASK BIT(12) -#define CFG_BLK_MSI_ENABLE_1_MASK BIT(9) -#define CFG_BLK_MSI_ENABLE_MSIX1_MASK BIT(8) -#define CFG_BLK_MSI_ENABLE_0_MASK BIT(1) -#define CFG_BLK_MSI_ENABLE_MSIX0_MASK BIT(0) -#define QDMA_CPM4_CFG_PCIE_DATA_WIDTH_ADDR 0x18 -#define CFG_PCIE_DATA_WIDTH_DATAPATH_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_PCIE_CTL_ADDR 0x1C -#define CFG_PCIE_CTL_RRQ_DISABLE_MASK BIT(1) -#define CFG_PCIE_CTL_RELAXED_ORDERING_MASK BIT(0) -#define QDMA_CPM4_CFG_AXI_USER_MAX_PLD_SIZE_ADDR 0x40 -#define CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_AXI_USER_MAX_READ_REQ_SIZE_ADDR 0x44 -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_BLK_MISC_CTL_ADDR 0x4C -#define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) -#define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_0_ADDR 0x80 -#define CFG_BLK_SCRATCH_0_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_1_ADDR 0x84 -#define CFG_BLK_SCRATCH_1_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_2_ADDR 0x88 -#define CFG_BLK_SCRATCH_2_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_3_ADDR 0x8C -#define CFG_BLK_SCRATCH_3_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_4_ADDR 0x90 -#define CFG_BLK_SCRATCH_4_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_5_ADDR 0x94 -#define CFG_BLK_SCRATCH_5_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_6_ADDR 0x98 -#define CFG_BLK_SCRATCH_6_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_7_ADDR 0x9C -#define CFG_BLK_SCRATCH_7_MASK GENMASK(31, 0) -#define QDMA_CPM4_RAM_SBE_MSK_A_ADDR 0xF0 -#define RAM_SBE_MSK_A_MASK GENMASK(31, 0) -#define QDMA_CPM4_RAM_SBE_STS_A_ADDR 0xF4 -#define RAM_SBE_STS_A_RSVD_1_MASK BIT(31) -#define RAM_SBE_STS_A_PFCH_LL_RAM_MASK BIT(30) -#define RAM_SBE_STS_A_WRB_CTXT_RAM_MASK BIT(29) -#define RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK BIT(28) -#define RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define RAM_SBE_STS_A_INT_CTXT_RAM_MASK BIT(26) -#define RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK BIT(25) -#define RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK BIT(23) -#define RAM_SBE_STS_A_QID_FIFO_RAM_MASK BIT(22) -#define RAM_SBE_STS_A_PLD_FIFO_RAM_MASK BIT(21) -#define RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK BIT(20) -#define RAM_SBE_STS_A_PASID_CTXT_RAM_MASK BIT(19) -#define RAM_SBE_STS_A_DSC_CPLD_MASK BIT(18) -#define RAM_SBE_STS_A_DSC_CPLI_MASK BIT(17) -#define RAM_SBE_STS_A_DSC_SW_CTXT_MASK BIT(16) -#define RAM_SBE_STS_A_DSC_CRD_RCV_MASK BIT(15) -#define RAM_SBE_STS_A_DSC_HW_CTXT_MASK BIT(14) -#define RAM_SBE_STS_A_FUNC_MAP_MASK BIT(13) -#define RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(12) -#define RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(11) -#define RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(10) -#define RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(9) -#define RAM_SBE_STS_A_RSVD_2_MASK GENMASK(8, 5) -#define RAM_SBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_SBE_STS_A_RSVD_3_MASK GENMASK(3, 1) -#define RAM_SBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_CPM4_RAM_DBE_MSK_A_ADDR 0xF8 -#define RAM_DBE_MSK_A_MASK GENMASK(31, 0) -#define QDMA_CPM4_RAM_DBE_STS_A_ADDR 0xFC -#define RAM_DBE_STS_A_RSVD_1_MASK BIT(31) -#define RAM_DBE_STS_A_PFCH_LL_RAM_MASK BIT(30) -#define RAM_DBE_STS_A_WRB_CTXT_RAM_MASK BIT(29) -#define RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK BIT(28) -#define RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define RAM_DBE_STS_A_INT_CTXT_RAM_MASK BIT(26) -#define RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK BIT(25) -#define RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_DBE_STS_A_TUSER_FIFO_RAM_MASK BIT(23) -#define RAM_DBE_STS_A_QID_FIFO_RAM_MASK BIT(22) -#define RAM_DBE_STS_A_PLD_FIFO_RAM_MASK BIT(21) -#define RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK BIT(20) -#define RAM_DBE_STS_A_PASID_CTXT_RAM_MASK BIT(19) -#define RAM_DBE_STS_A_DSC_CPLD_MASK BIT(18) -#define RAM_DBE_STS_A_DSC_CPLI_MASK BIT(17) -#define RAM_DBE_STS_A_DSC_SW_CTXT_MASK BIT(16) -#define RAM_DBE_STS_A_DSC_CRD_RCV_MASK BIT(15) -#define RAM_DBE_STS_A_DSC_HW_CTXT_MASK BIT(14) -#define RAM_DBE_STS_A_FUNC_MAP_MASK BIT(13) -#define RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(12) -#define RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(11) -#define RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(10) -#define RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(9) -#define RAM_DBE_STS_A_RSVD_2_MASK GENMASK(8, 5) -#define RAM_DBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_DBE_STS_A_RSVD_3_MASK GENMASK(3, 1) -#define RAM_DBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_CPM4_GLBL2_IDENTIFIER_ADDR 0x100 -#define GLBL2_IDENTIFIER_MASK GENMASK(31, 8) -#define GLBL2_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define QDMA_CPM4_GLBL2_PF_BARLITE_INT_ADDR 0x104 -#define GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_PF_VF_BARLITE_INT_ADDR 0x108 -#define GLBL2_PF_VF_BARLITE_INT_PF3_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_VF_BARLITE_INT_PF2_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_VF_BARLITE_INT_PF1_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_VF_BARLITE_INT_PF0_MAP_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_PF_BARLITE_EXT_ADDR 0x10C -#define GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_PF_VF_BARLITE_EXT_ADDR 0x110 -#define GLBL2_PF_VF_BARLITE_EXT_PF3_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_VF_BARLITE_EXT_PF2_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_VF_BARLITE_EXT_PF1_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_VF_BARLITE_EXT_PF0_MAP_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_CHANNEL_INST_ADDR 0x114 -#define GLBL2_CHANNEL_INST_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_INST_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_INST_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_INST_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_INST_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_INST_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_INST_H2C_ENG_MASK BIT(0) -#define QDMA_CPM4_GLBL2_CHANNEL_MDMA_ADDR 0x118 -#define GLBL2_CHANNEL_MDMA_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_MDMA_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_MDMA_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_MDMA_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_MDMA_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_MDMA_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_MDMA_H2C_ENG_MASK BIT(0) -#define QDMA_CPM4_GLBL2_CHANNEL_STRM_ADDR 0x11C -#define GLBL2_CHANNEL_STRM_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_STRM_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_STRM_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_STRM_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_STRM_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_STRM_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_STRM_H2C_ENG_MASK BIT(0) -#define QDMA_CPM4_GLBL2_CHANNEL_CAP_ADDR 0x120 -#define GLBL2_CHANNEL_CAP_RSVD_1_MASK GENMASK(31, 12) -#define GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK GENMASK(11, 0) -#define QDMA_CPM4_GLBL2_CHANNEL_PASID_CAP_ADDR 0x128 -#define GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET_MASK GENMASK(15, 4) -#define GLBL2_CHANNEL_PASID_CAP_RSVD_2_MASK GENMASK(3, 2) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK BIT(1) -#define GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK BIT(0) -#define QDMA_CPM4_GLBL2_CHANNEL_FUNC_RET_ADDR 0x12C -#define GLBL2_CHANNEL_FUNC_RET_RSVD_1_MASK GENMASK(31, 8) -#define GLBL2_CHANNEL_FUNC_RET_FUNC_MASK GENMASK(7, 0) -#define QDMA_CPM4_GLBL2_SYSTEM_ID_ADDR 0x130 -#define GLBL2_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_SYSTEM_ID_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL2_MISC_CAP_ADDR 0x134 -#define GLBL2_MISC_CAP_RSVD_1_MASK GENMASK(31, 0) -#define QDMA_CPM4_GLBL2_DBG_PCIE_RQ0_ADDR 0x1B8 -#define GLBL2_PCIE_RQ0_NPH_AVL_MASK GENMASK(31, 20) -#define GLBL2_PCIE_RQ0_RCB_AVL_MASK GENMASK(19, 10) -#define GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK GENMASK(9, 4) -#define GLBL2_PCIE_RQ0_TAG_EP_MASK GENMASK(3, 2) -#define GLBL2_PCIE_RQ0_TAG_FL_MASK GENMASK(1, 0) -#define QDMA_CPM4_GLBL2_DBG_PCIE_RQ1_ADDR 0x1BC -#define GLBL2_PCIE_RQ1_RSVD_1_MASK GENMASK(31, 17) -#define GLBL2_PCIE_RQ1_WTLP_REQ_MASK BIT(16) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK BIT(15) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK BIT(14) -#define GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK BIT(13) -#define GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK BIT(12) -#define GLBL2_PCIE_RQ1_TLPSM_MASK GENMASK(11, 9) -#define GLBL2_PCIE_RQ1_TLPSM512_MASK GENMASK(8, 6) -#define GLBL2_PCIE_RQ1_RREQ0_RCB_OK_MASK BIT(5) -#define GLBL2_PCIE_RQ1_RREQ0_SLV_MASK BIT(4) -#define GLBL2_PCIE_RQ1_RREQ0_VLD_MASK BIT(3) -#define GLBL2_PCIE_RQ1_RREQ1_RCB_OK_MASK BIT(2) -#define GLBL2_PCIE_RQ1_RREQ1_SLV_MASK BIT(1) -#define GLBL2_PCIE_RQ1_RREQ1_VLD_MASK BIT(0) -#define QDMA_CPM4_GLBL2_DBG_AXIMM_WR0_ADDR 0x1C0 -#define GLBL2_AXIMM_WR0_RSVD_1_MASK GENMASK(31, 27) -#define GLBL2_AXIMM_WR0_WR_REQ_MASK BIT(26) -#define GLBL2_AXIMM_WR0_WR_CHN_MASK GENMASK(25, 23) -#define GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK BIT(22) -#define GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK BIT(21) -#define GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK GENMASK(20, 18) -#define GLBL2_AXIMM_WR0_WRREQ_CNT_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR0_BID_MASK GENMASK(11, 9) -#define GLBL2_AXIMM_WR0_BVALID_MASK BIT(8) -#define GLBL2_AXIMM_WR0_BREADY_MASK BIT(7) -#define GLBL2_AXIMM_WR0_WVALID_MASK BIT(6) -#define GLBL2_AXIMM_WR0_WREADY_MASK BIT(5) -#define GLBL2_AXIMM_WR0_AWID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_WR0_AWVALID_MASK BIT(1) -#define GLBL2_AXIMM_WR0_AWREADY_MASK BIT(0) -#define QDMA_CPM4_GLBL2_DBG_AXIMM_WR1_ADDR 0x1C4 -#define GLBL2_AXIMM_WR1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_WR1_BRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_WR1_BRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_WR1_BRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR1_BRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_WR1_BRSP_CNT0_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_DBG_AXIMM_RD0_ADDR 0x1C8 -#define GLBL2_AXIMM_RD0_RSVD_1_MASK GENMASK(31, 23) -#define GLBL2_AXIMM_RD0_PND_CNT_MASK GENMASK(22, 17) -#define GLBL2_AXIMM_RD0_RD_CHNL_MASK GENMASK(16, 14) -#define GLBL2_AXIMM_RD0_RD_REQ_MASK BIT(13) -#define GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK GENMASK(12, 10) -#define GLBL2_AXIMM_RD0_RID_MASK GENMASK(9, 7) -#define GLBL2_AXIMM_RD0_RVALID_MASK BIT(6) -#define GLBL2_AXIMM_RD0_RREADY_MASK BIT(5) -#define GLBL2_AXIMM_RD0_ARID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_RD0_ARVALID_MASK BIT(1) -#define GLBL2_AXIMM_RD0_ARREADY_MASK BIT(0) -#define QDMA_CPM4_GLBL2_DBG_AXIMM_RD1_ADDR 0x1CC -#define GLBL2_AXIMM_RD1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_RD1_RRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_RD1_RRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_RD1_RRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_RD1_RRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_RD1_RRSP_CNT0_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_1_ADDR 0x204 -#define GLBL_RNG_SZ_1_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_1_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_2_ADDR 0x208 -#define GLBL_RNG_SZ_2_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_2_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_3_ADDR 0x20C -#define GLBL_RNG_SZ_3_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_3_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_4_ADDR 0x210 -#define GLBL_RNG_SZ_4_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_4_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_5_ADDR 0x214 -#define GLBL_RNG_SZ_5_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_5_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_6_ADDR 0x218 -#define GLBL_RNG_SZ_6_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_6_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_7_ADDR 0x21C -#define GLBL_RNG_SZ_7_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_7_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_8_ADDR 0x220 -#define GLBL_RNG_SZ_8_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_8_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_9_ADDR 0x224 -#define GLBL_RNG_SZ_9_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_9_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_A_ADDR 0x228 -#define GLBL_RNG_SZ_A_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_A_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_B_ADDR 0x22C -#define GLBL_RNG_SZ_B_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_B_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_C_ADDR 0x230 -#define GLBL_RNG_SZ_C_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_C_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_D_ADDR 0x234 -#define GLBL_RNG_SZ_D_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_D_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_E_ADDR 0x238 -#define GLBL_RNG_SZ_E_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_E_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_F_ADDR 0x23C -#define GLBL_RNG_SZ_F_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_F_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_10_ADDR 0x240 -#define GLBL_RNG_SZ_10_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_10_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_ERR_STAT_ADDR 0x248 -#define GLBL_ERR_STAT_RSVD_1_MASK GENMASK(31, 12) -#define GLBL_ERR_STAT_ERR_H2C_ST_MASK BIT(11) -#define GLBL_ERR_STAT_ERR_BDG_MASK BIT(10) -#define GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK BIT(9) -#define GLBL_ERR_STAT_ERR_C2H_ST_MASK BIT(8) -#define GLBL_ERR_STAT_ERR_C2H_MM_1_MASK BIT(7) -#define GLBL_ERR_STAT_ERR_C2H_MM_0_MASK BIT(6) -#define GLBL_ERR_STAT_ERR_H2C_MM_1_MASK BIT(5) -#define GLBL_ERR_STAT_ERR_H2C_MM_0_MASK BIT(4) -#define GLBL_ERR_STAT_ERR_TRQ_MASK BIT(3) -#define GLBL_ERR_STAT_ERR_DSC_MASK BIT(2) -#define GLBL_ERR_STAT_ERR_RAM_DBE_MASK BIT(1) -#define GLBL_ERR_STAT_ERR_RAM_SBE_MASK BIT(0) -#define QDMA_CPM4_GLBL_ERR_MASK_ADDR 0x24C -#define GLBL_ERR_RSVD_1_MASK GENMASK(31, 9) -#define GLBL_ERR_MASK GENMASK(8, 0) -#define QDMA_CPM4_GLBL_DSC_CFG_ADDR 0x250 -#define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 10) -#define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) -#define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) -#define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) -#define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) -#define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR 0x254 -#define GLBL_DSC_ERR_STS_RSVD_1_MASK GENMASK(31, 25) -#define GLBL_DSC_ERR_STS_SBE_MASK BIT(24) -#define GLBL_DSC_ERR_STS_DBE_MASK BIT(23) -#define GLBL_DSC_ERR_STS_RQ_CANCEL_MASK BIT(22) -#define GLBL_DSC_ERR_STS_DSC_MASK BIT(21) -#define GLBL_DSC_ERR_STS_DMA_MASK BIT(20) -#define GLBL_DSC_ERR_STS_FLR_CANCEL_MASK BIT(19) -#define GLBL_DSC_ERR_STS_RSVD_2_MASK GENMASK(18, 17) -#define GLBL_DSC_ERR_STS_DAT_POISON_MASK BIT(16) -#define GLBL_DSC_ERR_STS_TIMEOUT_MASK BIT(9) -#define GLBL_DSC_ERR_STS_FLR_MASK BIT(5) -#define GLBL_DSC_ERR_STS_TAG_MASK BIT(4) -#define GLBL_DSC_ERR_STS_ADDR_MASK BIT(3) -#define GLBL_DSC_ERR_STS_PARAM_MASK BIT(2) -#define GLBL_DSC_ERR_STS_UR_CA_MASK BIT(1) -#define GLBL_DSC_ERR_STS_POISON_MASK BIT(0) -#define QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR 0x258 -#define GLBL_DSC_ERR_MSK_MASK GENMASK(8, 0) -#define QDMA_CPM4_GLBL_DSC_ERR_LOG0_ADDR 0x25C -#define GLBL_DSC_ERR_LOG0_VALID_MASK BIT(31) -#define GLBL_DSC_ERR_LOG0_RSVD_1_MASK GENMASK(30, 29) -#define GLBL_DSC_ERR_LOG0_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_ERR_LOG0_SEL_MASK BIT(16) -#define GLBL_DSC_ERR_LOG0_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_DSC_ERR_LOG1_ADDR 0x260 -#define GLBL_DSC_ERR_LOG1_RSVD_1_MASK GENMASK(31, 9) -#define GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK GENMASK(8, 5) -#define GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK GENMASK(4, 0) -#define QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR 0x264 -#define GLBL_TRQ_ERR_STS_RSVD_1_MASK GENMASK(31, 4) -#define GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK BIT(3) -#define GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK BIT(2) -#define GLBL_TRQ_ERR_STS_QID_RANGE_MASK BIT(1) -#define GLBL_TRQ_ERR_STS_UNMAPPED_MASK BIT(0) -#define QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR 0x268 -#define GLBL_TRQ_ERR_MSK_MASK GENMASK(31, 0) -#define QDMA_CPM4_GLBL_TRQ_ERR_LOG_ADDR 0x26C -#define GLBL_TRQ_ERR_LOG_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_TRQ_ERR_LOG_TARGET_MASK GENMASK(27, 24) -#define GLBL_TRQ_ERR_LOG_FUNC_MASK GENMASK(23, 16) -#define GLBL_TRQ_ERR_LOG_ADDRESS_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_DSC_DBG_DAT0_ADDR 0x270 -#define GLBL_DSC_DAT0_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK BIT(29) -#define GLBL_DSC_DAT0_CTXT_ARB_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK GENMASK(16, 12) -#define GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK BIT(11) -#define GLBL_DSC_DAT0_TMSTALL_MASK BIT(10) -#define GLBL_DSC_DAT0_RRQ_STALL_MASK GENMASK(9, 8) -#define GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK GENMASK(7, 6) -#define GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK GENMASK(5, 4) -#define GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK GENMASK(3, 2) -#define GLBL_DSC_DAT0_DSC_OUT_STALL_MASK GENMASK(1, 0) -#define QDMA_CPM4_GLBL_DSC_DBG_DAT1_ADDR 0x274 -#define GLBL_DSC_DAT1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_DAT1_EVT_SPC_C2H_MASK GENMASK(27, 22) -#define GLBL_DSC_DAT1_EVT_SP_H2C_MASK GENMASK(21, 16) -#define GLBL_DSC_DAT1_DSC_SPC_C2H_MASK GENMASK(15, 8) -#define GLBL_DSC_DAT1_DSC_SPC_H2C_MASK GENMASK(7, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_0_ADDR 0x400 -#define TRQ_SEL_FMAP_0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1_ADDR 0x404 -#define TRQ_SEL_FMAP_1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2_ADDR 0x408 -#define TRQ_SEL_FMAP_2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3_ADDR 0x40C -#define TRQ_SEL_FMAP_3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4_ADDR 0x410 -#define TRQ_SEL_FMAP_4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5_ADDR 0x414 -#define TRQ_SEL_FMAP_5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6_ADDR 0x418 -#define TRQ_SEL_FMAP_6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7_ADDR 0x41C -#define TRQ_SEL_FMAP_7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8_ADDR 0x420 -#define TRQ_SEL_FMAP_8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9_ADDR 0x424 -#define TRQ_SEL_FMAP_9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A_ADDR 0x428 -#define TRQ_SEL_FMAP_A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B_ADDR 0x42C -#define TRQ_SEL_FMAP_B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D_ADDR 0x430 -#define TRQ_SEL_FMAP_D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E_ADDR 0x434 -#define TRQ_SEL_FMAP_E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_F_ADDR 0x438 -#define TRQ_SEL_FMAP_F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_10_ADDR 0x43C -#define TRQ_SEL_FMAP_10_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_10_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_10_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_11_ADDR 0x440 -#define TRQ_SEL_FMAP_11_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_11_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_11_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_12_ADDR 0x444 -#define TRQ_SEL_FMAP_12_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_12_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_12_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_13_ADDR 0x448 -#define TRQ_SEL_FMAP_13_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_13_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_13_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_14_ADDR 0x44C -#define TRQ_SEL_FMAP_14_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_14_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_14_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_15_ADDR 0x450 -#define TRQ_SEL_FMAP_15_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_15_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_15_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_16_ADDR 0x454 -#define TRQ_SEL_FMAP_16_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_16_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_16_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_17_ADDR 0x458 -#define TRQ_SEL_FMAP_17_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_17_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_17_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_18_ADDR 0x45C -#define TRQ_SEL_FMAP_18_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_18_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_18_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_19_ADDR 0x460 -#define TRQ_SEL_FMAP_19_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_19_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_19_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1A_ADDR 0x464 -#define TRQ_SEL_FMAP_1A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1B_ADDR 0x468 -#define TRQ_SEL_FMAP_1B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1C_ADDR 0x46C -#define TRQ_SEL_FMAP_1C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1D_ADDR 0x470 -#define TRQ_SEL_FMAP_1D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1E_ADDR 0x474 -#define TRQ_SEL_FMAP_1E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1F_ADDR 0x478 -#define TRQ_SEL_FMAP_1F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_20_ADDR 0x47C -#define TRQ_SEL_FMAP_20_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_20_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_20_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_21_ADDR 0x480 -#define TRQ_SEL_FMAP_21_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_21_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_21_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_22_ADDR 0x484 -#define TRQ_SEL_FMAP_22_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_22_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_22_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_23_ADDR 0x488 -#define TRQ_SEL_FMAP_23_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_23_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_23_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_24_ADDR 0x48C -#define TRQ_SEL_FMAP_24_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_24_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_24_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_25_ADDR 0x490 -#define TRQ_SEL_FMAP_25_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_25_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_25_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_26_ADDR 0x494 -#define TRQ_SEL_FMAP_26_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_26_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_26_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_27_ADDR 0x498 -#define TRQ_SEL_FMAP_27_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_27_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_27_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_28_ADDR 0x49C -#define TRQ_SEL_FMAP_28_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_28_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_28_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_29_ADDR 0x4A0 -#define TRQ_SEL_FMAP_29_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_29_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_29_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2A_ADDR 0x4A4 -#define TRQ_SEL_FMAP_2A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2B_ADDR 0x4A8 -#define TRQ_SEL_FMAP_2B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2C_ADDR 0x4AC -#define TRQ_SEL_FMAP_2C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2D_ADDR 0x4B0 -#define TRQ_SEL_FMAP_2D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2E_ADDR 0x4B4 -#define TRQ_SEL_FMAP_2E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2F_ADDR 0x4B8 -#define TRQ_SEL_FMAP_2F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_30_ADDR 0x4BC -#define TRQ_SEL_FMAP_30_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_30_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_30_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_31_ADDR 0x4D0 -#define TRQ_SEL_FMAP_31_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_31_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_31_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_32_ADDR 0x4D4 -#define TRQ_SEL_FMAP_32_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_32_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_32_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_33_ADDR 0x4D8 -#define TRQ_SEL_FMAP_33_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_33_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_33_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_34_ADDR 0x4DC -#define TRQ_SEL_FMAP_34_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_34_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_34_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_35_ADDR 0x4E0 -#define TRQ_SEL_FMAP_35_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_35_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_35_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_36_ADDR 0x4E4 -#define TRQ_SEL_FMAP_36_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_36_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_36_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_37_ADDR 0x4E8 -#define TRQ_SEL_FMAP_37_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_37_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_37_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_38_ADDR 0x4EC -#define TRQ_SEL_FMAP_38_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_38_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_38_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_39_ADDR 0x4F0 -#define TRQ_SEL_FMAP_39_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_39_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_39_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3A_ADDR 0x4F4 -#define TRQ_SEL_FMAP_3A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3B_ADDR 0x4F8 -#define TRQ_SEL_FMAP_3B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3C_ADDR 0x4FC -#define TRQ_SEL_FMAP_3C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3D_ADDR 0x500 -#define TRQ_SEL_FMAP_3D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3E_ADDR 0x504 -#define TRQ_SEL_FMAP_3E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3F_ADDR 0x508 -#define TRQ_SEL_FMAP_3F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_40_ADDR 0x50C -#define TRQ_SEL_FMAP_40_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_40_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_40_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_41_ADDR 0x510 -#define TRQ_SEL_FMAP_41_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_41_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_41_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_42_ADDR 0x514 -#define TRQ_SEL_FMAP_42_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_42_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_42_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_43_ADDR 0x518 -#define TRQ_SEL_FMAP_43_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_43_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_43_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_44_ADDR 0x51C -#define TRQ_SEL_FMAP_44_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_44_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_44_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_45_ADDR 0x520 -#define TRQ_SEL_FMAP_45_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_45_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_45_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_46_ADDR 0x524 -#define TRQ_SEL_FMAP_46_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_46_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_46_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_47_ADDR 0x528 -#define TRQ_SEL_FMAP_47_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_47_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_47_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_48_ADDR 0x52C -#define TRQ_SEL_FMAP_48_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_48_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_48_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_49_ADDR 0x530 -#define TRQ_SEL_FMAP_49_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_49_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_49_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4A_ADDR 0x534 -#define TRQ_SEL_FMAP_4A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4B_ADDR 0x538 -#define TRQ_SEL_FMAP_4B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4C_ADDR 0x53C -#define TRQ_SEL_FMAP_4C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4D_ADDR 0x540 -#define TRQ_SEL_FMAP_4D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4E_ADDR 0x544 -#define TRQ_SEL_FMAP_4E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4F_ADDR 0x548 -#define TRQ_SEL_FMAP_4F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_50_ADDR 0x54C -#define TRQ_SEL_FMAP_50_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_50_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_50_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_51_ADDR 0x550 -#define TRQ_SEL_FMAP_51_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_51_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_51_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_52_ADDR 0x554 -#define TRQ_SEL_FMAP_52_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_52_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_52_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_53_ADDR 0x558 -#define TRQ_SEL_FMAP_53_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_53_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_53_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_54_ADDR 0x55C -#define TRQ_SEL_FMAP_54_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_54_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_54_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_55_ADDR 0x560 -#define TRQ_SEL_FMAP_55_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_55_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_55_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_56_ADDR 0x564 -#define TRQ_SEL_FMAP_56_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_56_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_56_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_57_ADDR 0x568 -#define TRQ_SEL_FMAP_57_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_57_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_57_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_58_ADDR 0x56C -#define TRQ_SEL_FMAP_58_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_58_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_58_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_59_ADDR 0x570 -#define TRQ_SEL_FMAP_59_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_59_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_59_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5A_ADDR 0x574 -#define TRQ_SEL_FMAP_5A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5B_ADDR 0x578 -#define TRQ_SEL_FMAP_5B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5C_ADDR 0x57C -#define TRQ_SEL_FMAP_5C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5D_ADDR 0x580 -#define TRQ_SEL_FMAP_5D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5E_ADDR 0x584 -#define TRQ_SEL_FMAP_5E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5F_ADDR 0x588 -#define TRQ_SEL_FMAP_5F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_60_ADDR 0x58C -#define TRQ_SEL_FMAP_60_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_60_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_60_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_61_ADDR 0x590 -#define TRQ_SEL_FMAP_61_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_61_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_61_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_62_ADDR 0x594 -#define TRQ_SEL_FMAP_62_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_62_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_62_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_63_ADDR 0x598 -#define TRQ_SEL_FMAP_63_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_63_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_63_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_64_ADDR 0x59C -#define TRQ_SEL_FMAP_64_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_64_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_64_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_65_ADDR 0x5A0 -#define TRQ_SEL_FMAP_65_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_65_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_65_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_66_ADDR 0x5A4 -#define TRQ_SEL_FMAP_66_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_66_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_66_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_67_ADDR 0x5A8 -#define TRQ_SEL_FMAP_67_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_67_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_67_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_68_ADDR 0x5AC -#define TRQ_SEL_FMAP_68_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_68_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_68_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_69_ADDR 0x5B0 -#define TRQ_SEL_FMAP_69_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_69_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_69_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6A_ADDR 0x5B4 -#define TRQ_SEL_FMAP_6A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6B_ADDR 0x5B8 -#define TRQ_SEL_FMAP_6B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6C_ADDR 0x5BC -#define TRQ_SEL_FMAP_6C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6D_ADDR 0x5C0 -#define TRQ_SEL_FMAP_6D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6E_ADDR 0x5C4 -#define TRQ_SEL_FMAP_6E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6F_ADDR 0x5C8 -#define TRQ_SEL_FMAP_6F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_70_ADDR 0x5CC -#define TRQ_SEL_FMAP_70_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_70_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_70_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_71_ADDR 0x5D0 -#define TRQ_SEL_FMAP_71_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_71_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_71_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_72_ADDR 0x5D4 -#define TRQ_SEL_FMAP_72_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_72_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_72_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_73_ADDR 0x5D8 -#define TRQ_SEL_FMAP_73_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_73_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_73_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_74_ADDR 0x5DC -#define TRQ_SEL_FMAP_74_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_74_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_74_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_75_ADDR 0x5E0 -#define TRQ_SEL_FMAP_75_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_75_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_75_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_76_ADDR 0x5E4 -#define TRQ_SEL_FMAP_76_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_76_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_76_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_77_ADDR 0x5E8 -#define TRQ_SEL_FMAP_77_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_77_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_77_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_78_ADDR 0x5EC -#define TRQ_SEL_FMAP_78_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_78_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_78_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_79_ADDR 0x5F0 -#define TRQ_SEL_FMAP_79_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_79_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_79_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7A_ADDR 0x5F4 -#define TRQ_SEL_FMAP_7A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7B_ADDR 0x5F8 -#define TRQ_SEL_FMAP_7B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7C_ADDR 0x5FC -#define TRQ_SEL_FMAP_7C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7D_ADDR 0x600 -#define TRQ_SEL_FMAP_7D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7E_ADDR 0x604 -#define TRQ_SEL_FMAP_7E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7F_ADDR 0x608 -#define TRQ_SEL_FMAP_7F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_80_ADDR 0x60C -#define TRQ_SEL_FMAP_80_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_80_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_80_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_81_ADDR 0x610 -#define TRQ_SEL_FMAP_81_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_81_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_81_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_82_ADDR 0x614 -#define TRQ_SEL_FMAP_82_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_82_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_82_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_83_ADDR 0x618 -#define TRQ_SEL_FMAP_83_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_83_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_83_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_84_ADDR 0x61C -#define TRQ_SEL_FMAP_84_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_84_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_84_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_85_ADDR 0x620 -#define TRQ_SEL_FMAP_85_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_85_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_85_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_86_ADDR 0x624 -#define TRQ_SEL_FMAP_86_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_86_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_86_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_87_ADDR 0x628 -#define TRQ_SEL_FMAP_87_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_87_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_87_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_88_ADDR 0x62C -#define TRQ_SEL_FMAP_88_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_88_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_88_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_89_ADDR 0x630 -#define TRQ_SEL_FMAP_89_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_89_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_89_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8A_ADDR 0x634 -#define TRQ_SEL_FMAP_8A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8B_ADDR 0x638 -#define TRQ_SEL_FMAP_8B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8C_ADDR 0x63C -#define TRQ_SEL_FMAP_8C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8D_ADDR 0x640 -#define TRQ_SEL_FMAP_8D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8E_ADDR 0x644 -#define TRQ_SEL_FMAP_8E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8F_ADDR 0x648 -#define TRQ_SEL_FMAP_8F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_90_ADDR 0x64C -#define TRQ_SEL_FMAP_90_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_90_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_90_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_91_ADDR 0x650 -#define TRQ_SEL_FMAP_91_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_91_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_91_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_92_ADDR 0x654 -#define TRQ_SEL_FMAP_92_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_92_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_92_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_93_ADDR 0x658 -#define TRQ_SEL_FMAP_93_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_93_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_93_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_94_ADDR 0x65C -#define TRQ_SEL_FMAP_94_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_94_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_94_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_95_ADDR 0x660 -#define TRQ_SEL_FMAP_95_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_95_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_95_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_96_ADDR 0x664 -#define TRQ_SEL_FMAP_96_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_96_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_96_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_97_ADDR 0x668 -#define TRQ_SEL_FMAP_97_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_97_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_97_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_98_ADDR 0x66C -#define TRQ_SEL_FMAP_98_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_98_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_98_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_99_ADDR 0x670 -#define TRQ_SEL_FMAP_99_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_99_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_99_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9A_ADDR 0x674 -#define TRQ_SEL_FMAP_9A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9B_ADDR 0x678 -#define TRQ_SEL_FMAP_9B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9C_ADDR 0x67C -#define TRQ_SEL_FMAP_9C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9D_ADDR 0x680 -#define TRQ_SEL_FMAP_9D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9E_ADDR 0x684 -#define TRQ_SEL_FMAP_9E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9F_ADDR 0x688 -#define TRQ_SEL_FMAP_9F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A0_ADDR 0x68C -#define TRQ_SEL_FMAP_A0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A1_ADDR 0x690 -#define TRQ_SEL_FMAP_A1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A2_ADDR 0x694 -#define TRQ_SEL_FMAP_A2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A3_ADDR 0x698 -#define TRQ_SEL_FMAP_A3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A4_ADDR 0x69C -#define TRQ_SEL_FMAP_A4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A5_ADDR 0x6A0 -#define TRQ_SEL_FMAP_A5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A6_ADDR 0x6A4 -#define TRQ_SEL_FMAP_A6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A7_ADDR 0x6A8 -#define TRQ_SEL_FMAP_A7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A8_ADDR 0x6AC -#define TRQ_SEL_FMAP_A8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A9_ADDR 0x6B0 -#define TRQ_SEL_FMAP_A9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AA_ADDR 0x6B4 -#define TRQ_SEL_FMAP_AA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AB_ADDR 0x6B8 -#define TRQ_SEL_FMAP_AB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AC_ADDR 0x6BC -#define TRQ_SEL_FMAP_AC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AD_ADDR 0x6D0 -#define TRQ_SEL_FMAP_AD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AE_ADDR 0x6D4 -#define TRQ_SEL_FMAP_AE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AF_ADDR 0x6D8 -#define TRQ_SEL_FMAP_AF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B0_ADDR 0x6DC -#define TRQ_SEL_FMAP_B0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B1_ADDR 0x6E0 -#define TRQ_SEL_FMAP_B1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B2_ADDR 0x6E4 -#define TRQ_SEL_FMAP_B2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B3_ADDR 0x6E8 -#define TRQ_SEL_FMAP_B3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B4_ADDR 0x6EC -#define TRQ_SEL_FMAP_B4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B5_ADDR 0x6F0 -#define TRQ_SEL_FMAP_B5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B6_ADDR 0x6F4 -#define TRQ_SEL_FMAP_B6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B7_ADDR 0x6F8 -#define TRQ_SEL_FMAP_B7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B8_ADDR 0x6FC -#define TRQ_SEL_FMAP_B8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B9_ADDR 0x700 -#define TRQ_SEL_FMAP_B9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BA_ADDR 0x704 -#define TRQ_SEL_FMAP_BA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BB_ADDR 0x708 -#define TRQ_SEL_FMAP_BB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BC_ADDR 0x70C -#define TRQ_SEL_FMAP_BC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BD_ADDR 0x710 -#define TRQ_SEL_FMAP_BD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BE_ADDR 0x714 -#define TRQ_SEL_FMAP_BE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BF_ADDR 0x718 -#define TRQ_SEL_FMAP_BF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C0_ADDR 0x71C -#define TRQ_SEL_FMAP_C0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C1_ADDR 0x720 -#define TRQ_SEL_FMAP_C1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C2_ADDR 0x734 -#define TRQ_SEL_FMAP_C2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C3_ADDR 0x748 -#define TRQ_SEL_FMAP_C3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C4_ADDR 0x74C -#define TRQ_SEL_FMAP_C4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C5_ADDR 0x750 -#define TRQ_SEL_FMAP_C5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C6_ADDR 0x754 -#define TRQ_SEL_FMAP_C6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C7_ADDR 0x758 -#define TRQ_SEL_FMAP_C7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C8_ADDR 0x75C -#define TRQ_SEL_FMAP_C8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C9_ADDR 0x760 -#define TRQ_SEL_FMAP_C9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CA_ADDR 0x764 -#define TRQ_SEL_FMAP_CA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CB_ADDR 0x768 -#define TRQ_SEL_FMAP_CB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CC_ADDR 0x76C -#define TRQ_SEL_FMAP_CC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CD_ADDR 0x770 -#define TRQ_SEL_FMAP_CD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CE_ADDR 0x774 -#define TRQ_SEL_FMAP_CE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CF_ADDR 0x778 -#define TRQ_SEL_FMAP_CF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D0_ADDR 0x77C -#define TRQ_SEL_FMAP_D0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D1_ADDR 0x780 -#define TRQ_SEL_FMAP_D1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D2_ADDR 0x784 -#define TRQ_SEL_FMAP_D2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D3_ADDR 0x788 -#define TRQ_SEL_FMAP_D3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D4_ADDR 0x78C -#define TRQ_SEL_FMAP_D4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D5_ADDR 0x790 -#define TRQ_SEL_FMAP_D5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D6_ADDR 0x794 -#define TRQ_SEL_FMAP_D6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D7_ADDR 0x798 -#define TRQ_SEL_FMAP_D7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D8_ADDR 0x79C -#define TRQ_SEL_FMAP_D8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D9_ADDR 0x7A0 -#define TRQ_SEL_FMAP_D9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DA_ADDR 0x7A4 -#define TRQ_SEL_FMAP_DA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DB_ADDR 0x7A8 -#define TRQ_SEL_FMAP_DB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DC_ADDR 0x7AC -#define TRQ_SEL_FMAP_DC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DD_ADDR 0x7B0 -#define TRQ_SEL_FMAP_DD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DE_ADDR 0x7B4 -#define TRQ_SEL_FMAP_DE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DF_ADDR 0x7B8 -#define TRQ_SEL_FMAP_DF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E0_ADDR 0x7BC -#define TRQ_SEL_FMAP_E0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E1_ADDR 0x7C0 -#define TRQ_SEL_FMAP_E1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E2_ADDR 0x7C4 -#define TRQ_SEL_FMAP_E2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E3_ADDR 0x7C8 -#define TRQ_SEL_FMAP_E3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E4_ADDR 0x7CC -#define TRQ_SEL_FMAP_E4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E5_ADDR 0x7D0 -#define TRQ_SEL_FMAP_E5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E6_ADDR 0x7D4 -#define TRQ_SEL_FMAP_E6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E7_ADDR 0x7D8 -#define TRQ_SEL_FMAP_E7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E8_ADDR 0x7DC -#define TRQ_SEL_FMAP_E8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E9_ADDR 0x7E0 -#define TRQ_SEL_FMAP_E9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EA_ADDR 0x7E4 -#define TRQ_SEL_FMAP_EA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EB_ADDR 0x7E8 -#define TRQ_SEL_FMAP_EB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EC_ADDR 0x7EC -#define TRQ_SEL_FMAP_EC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_ED_ADDR 0x7F0 -#define TRQ_SEL_FMAP_ED_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_ED_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_ED_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EE_ADDR 0x7F4 -#define TRQ_SEL_FMAP_EE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EF_ADDR 0x7F8 -#define TRQ_SEL_FMAP_EF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_F0_ADDR 0x7FC -#define TRQ_SEL_FMAP_F0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_F0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_F0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_IND_CTXT_DATA_3_ADDR 0x804 -#define IND_CTXT_DATA_3_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT_DATA_2_ADDR 0x808 -#define IND_CTXT_DATA_2_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT_DATA_1_ADDR 0x80C -#define IND_CTXT_DATA_1_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT_DATA_0_ADDR 0x810 -#define IND_CTXT_DATA_0_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT3_ADDR 0x814 -#define IND_CTXT3_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT2_ADDR 0x818 -#define IND_CTXT2_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT1_ADDR 0x81C -#define IND_CTXT1_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT0_ADDR 0x820 -#define IND_CTXT0_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT_CMD_ADDR 0x824 -#define IND_CTXT_CMD_RSVD_1_MASK GENMASK(31, 18) -#define IND_CTXT_CMD_QID_MASK GENMASK(17, 7) -#define IND_CTXT_CMD_OP_MASK GENMASK(6, 5) -#define IND_CTXT_CMD_SET_MASK GENMASK(4, 1) -#define IND_CTXT_CMD_BUSY_MASK BIT(0) -#define QDMA_CPM4_C2H_TIMER_CNT_1_ADDR 0xA00 -#define C2H_TIMER_CNT_1_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_1_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_2_ADDR 0xA04 -#define C2H_TIMER_CNT_2_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_2_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_3_ADDR 0xA08 -#define C2H_TIMER_CNT_3_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_3_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_4_ADDR 0xA0C -#define C2H_TIMER_CNT_4_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_4_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_5_ADDR 0xA10 -#define C2H_TIMER_CNT_5_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_5_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_6_ADDR 0xA14 -#define C2H_TIMER_CNT_6_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_6_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_7_ADDR 0xA18 -#define C2H_TIMER_CNT_7_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_7_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_8_ADDR 0xA1C -#define C2H_TIMER_CNT_8_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_8_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_9_ADDR 0xA20 -#define C2H_TIMER_CNT_9_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_9_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_A_ADDR 0xA24 -#define C2H_TIMER_CNT_A_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_A_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_B_ADDR 0xA28 -#define C2H_TIMER_CNT_B_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_B_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_C_ADDR 0xA2C -#define C2H_TIMER_CNT_C_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_C_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_D_ADDR 0xA30 -#define C2H_TIMER_CNT_D_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_D_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_E_ADDR 0xA34 -#define C2H_TIMER_CNT_E_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_E_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_F_ADDR 0xA38 -#define C2H_TIMER_CNT_F_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_F_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_10_ADDR 0xA3C -#define C2H_TIMER_CNT_10_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_10_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_1_ADDR 0xA40 -#define C2H_CNT_TH_1_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_1_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_2_ADDR 0xA44 -#define C2H_CNT_TH_2_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_2_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_3_ADDR 0xA48 -#define C2H_CNT_TH_3_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_3_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_4_ADDR 0xA4C -#define C2H_CNT_TH_4_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_4_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_5_ADDR 0xA50 -#define C2H_CNT_TH_5_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_5_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_6_ADDR 0xA54 -#define C2H_CNT_TH_6_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_6_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_7_ADDR 0xA58 -#define C2H_CNT_TH_7_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_7_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_8_ADDR 0xA5C -#define C2H_CNT_TH_8_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_8_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_9_ADDR 0xA60 -#define C2H_CNT_TH_9_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_9_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_A_ADDR 0xA64 -#define C2H_CNT_TH_A_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_A_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_B_ADDR 0xA68 -#define C2H_CNT_TH_B_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_B_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_C_ADDR 0xA6C -#define C2H_CNT_TH_C_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_C_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_D_ADDR 0xA70 -#define C2H_CNT_TH_D_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_D_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_E_ADDR 0xA74 -#define C2H_CNT_TH_E_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_E_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_F_ADDR 0xA78 -#define C2H_CNT_TH_F_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_F_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_10_ADDR 0xA7C -#define C2H_CNT_TH_10_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_10_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_QID2VEC_MAP_QID_ADDR 0xA80 -#define C2H_QID2VEC_MAP_QID_RSVD_1_MASK GENMASK(31, 11) -#define C2H_QID2VEC_MAP_QID_QID_MASK GENMASK(10, 0) -#define QDMA_CPM4_C2H_QID2VEC_MAP_ADDR 0xA84 -#define C2H_QID2VEC_MAP_RSVD_1_MASK GENMASK(31, 19) -#define C2H_QID2VEC_MAP_H2C_EN_COAL_MASK BIT(18) -#define C2H_QID2VEC_MAP_H2C_VECTOR_MASK GENMASK(17, 9) -#define C2H_QID2VEC_MAP_C2H_EN_COAL_MASK BIT(8) -#define C2H_QID2VEC_MAP_C2H_VECTOR_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR 0xA88 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR 0xA8C -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR 0xA90 -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_AXIS_PKG_CMP_ADDR 0xA94 -#define C2H_STAT_AXIS_PKG_CMP_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_ACCEPTED_ADDR 0xA98 -#define C2H_STAT_DESC_RSP_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_CMP_ADDR 0xA9C -#define C2H_STAT_DESC_RSP_CMP_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_WRQ_OUT_ADDR 0xAA0 -#define C2H_STAT_WRQ_OUT_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_WPL_REN_ACCEPTED_ADDR 0xAA4 -#define C2H_STAT_WPL_REN_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_TOTAL_WRQ_LEN_ADDR 0xAA8 -#define C2H_STAT_TOTAL_WRQ_LEN_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_TOTAL_WPL_LEN_ADDR 0xAAC -#define C2H_STAT_TOTAL_WPL_LEN_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_0_ADDR 0xAB0 -#define C2H_BUF_SZ_0_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_1_ADDR 0xAB4 -#define C2H_BUF_SZ_1_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_2_ADDR 0xAB8 -#define C2H_BUF_SZ_2_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_3_ADDR 0xABC -#define C2H_BUF_SZ_3_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_4_ADDR 0xAC0 -#define C2H_BUF_SZ_4_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_5_ADDR 0xAC4 -#define C2H_BUF_SZ_5_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_7_ADDR 0XAC8 -#define C2H_BUF_SZ_7_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_8_ADDR 0XACC -#define C2H_BUF_SZ_8_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_9_ADDR 0xAD0 -#define C2H_BUF_SZ_9_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_10_ADDR 0xAD4 -#define C2H_BUF_SZ_10_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_11_ADDR 0xAD8 -#define C2H_BUF_SZ_11_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_12_ADDR 0xAE0 -#define C2H_BUF_SZ_12_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_13_ADDR 0xAE4 -#define C2H_BUF_SZ_13_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_14_ADDR 0xAE8 -#define C2H_BUF_SZ_14_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_15_ADDR 0XAEC -#define C2H_BUF_SZ_15_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_ERR_STAT_ADDR 0xAF0 -#define C2H_ERR_STAT_RSVD_1_MASK GENMASK(31, 16) -#define C2H_ERR_STAT_WRB_PRTY_ERR_MASK BIT(15) -#define C2H_ERR_STAT_WRB_CIDX_ERR_MASK BIT(14) -#define C2H_ERR_STAT_WRB_QFULL_ERR_MASK BIT(13) -#define C2H_ERR_STAT_WRB_INV_Q_ERR_MASK BIT(12) -#define C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH_MASK BIT(11) -#define C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK BIT(10) -#define C2H_ERR_STAT_ERR_DESC_CNT_MASK BIT(9) -#define C2H_ERR_STAT_RSVD_2_MASK BIT(8) -#define C2H_ERR_STAT_MSI_INT_FAIL_MASK BIT(7) -#define C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define C2H_ERR_STAT_RSVD_3_MASK BIT(5) -#define C2H_ERR_STAT_DESC_RSP_ERR_MASK BIT(4) -#define C2H_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_ERR_STAT_RSVD_4_MASK BIT(2) -#define C2H_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define QDMA_CPM4_C2H_ERR_MASK_ADDR 0xAF4 -#define C2H_ERR_EN_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR 0xAF8 -#define C2H_FATAL_ERR_STAT_RSVD_1_MASK GENMASK(31, 19) -#define C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK BIT(18) -#define C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK BIT(17) -#define C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK BIT(15) -#define C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK BIT(13) -#define C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK BIT(9) -#define C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK BIT(8) -#define C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK GENMASK(7, 4) -#define C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_FATAL_ERR_STAT_RSVD_2_MASK BIT(2) -#define C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR 0xAFC -#define C2H_FATAL_ERR_C2HEN_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_FATAL_ERR_ENABLE_ADDR 0xB00 -#define C2H_FATAL_ERR_ENABLE_RSVD_1_MASK GENMASK(31, 2) -#define C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK BIT(1) -#define C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK BIT(0) -#define QDMA_CPM4_GLBL_ERR_INT_ADDR 0xB04 -#define GLBL_ERR_INT_RSVD_1_MASK GENMASK(31, 18) -#define GLBL_ERR_INT_ARM_MASK BIT(17) -#define GLBL_ERR_INT_EN_COAL_MASK BIT(16) -#define GLBL_ERR_INT_VEC_MASK GENMASK(15, 8) -#define GLBL_ERR_INT_FUNC_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_PFCH_CFG_ADDR 0xB08 -#define C2H_PFCH_CFG_EVT_QCNT_TH_MASK GENMASK(31, 25) -#define C2H_PFCH_CFG_QCNT_MASK GENMASK(24, 16) -#define C2H_PFCH_CFG_NUM_MASK GENMASK(15, 8) -#define C2H_PFCH_CFG_FL_TH_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_INT_TIMER_TICK_ADDR 0xB0C -#define C2H_INT_TIMER_TICK_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR 0xB10 -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR 0xB14 -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_REQ_ADDR 0xB18 -#define C2H_STAT_DESC_REQ_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_0_ADDR 0xB1C -#define C2H_STAT_DMA_ENG_0_RSVD_1_MASK BIT(31) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK GENMASK(30, 28) -#define C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT_MASK GENMASK(27, 18) -#define C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 8) -#define C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT_MASK GENMASK(7, 5) -#define C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK BIT(4) -#define C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK GENMASK(3, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_1_ADDR 0xB20 -#define C2H_STAT_DMA_ENG_1_RSVD_1_MASK BIT(31) -#define C2H_STAT_DMA_ENG_1_DESC_RSP_LAST_MASK BIT(30) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_2_ADDR 0xB24 -#define C2H_STAT_DMA_ENG_2_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_3_ADDR 0xB28 -#define C2H_STAT_DMA_ENG_3_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_DBG_PFCH_ERR_CTXT_ADDR 0xB2C -#define C2H_PFCH_ERR_CTXT_RSVD_1_MASK GENMASK(31, 14) -#define C2H_PFCH_ERR_CTXT_ERR_STAT_MASK BIT(13) -#define C2H_PFCH_ERR_CTXT_CMD_WR_MASK BIT(12) -#define C2H_PFCH_ERR_CTXT_QID_MASK GENMASK(11, 1) -#define C2H_PFCH_ERR_CTXT_DONE_MASK BIT(0) -#define QDMA_CPM4_C2H_FIRST_ERR_QID_ADDR 0xB30 -#define C2H_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FIRST_ERR_QID_ERR_STAT_MASK GENMASK(20, 16) -#define C2H_FIRST_ERR_QID_CMD_WR_MASK GENMASK(15, 12) -#define C2H_FIRST_ERR_QID_QID_MASK GENMASK(11, 0) -#define QDMA_CPM4_STAT_NUM_WRB_IN_ADDR 0xB34 -#define STAT_NUM_WRB_IN_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_IN_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_WRB_OUT_ADDR 0xB38 -#define STAT_NUM_WRB_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_OUT_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_WRB_DRP_ADDR 0xB3C -#define STAT_NUM_WRB_DRP_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_DRP_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_STAT_DESC_OUT_ADDR 0xB40 -#define STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_STAT_DESC_OUT_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_DSC_CRDT_SENT_ADDR 0xB44 -#define STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_DSC_CRDT_SENT_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_FCH_DSC_RCVD_ADDR 0xB48 -#define STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_BYP_DSC_RCVD_ADDR 0xB4C -#define STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK GENMASK(31, 11) -#define STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK GENMASK(10, 0) -#define QDMA_CPM4_C2H_WRB_COAL_CFG_ADDR 0xB50 -#define C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define C2H_WRB_COAL_CFG_TICK_VAL_MASK GENMASK(25, 14) -#define C2H_WRB_COAL_CFG_TICK_CNT_MASK GENMASK(13, 2) -#define C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK BIT(1) -#define C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK BIT(0) -#define QDMA_CPM4_C2H_INTR_H2C_REQ_ADDR 0xB54 -#define C2H_INTR_H2C_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_MM_REQ_ADDR 0xB58 -#define C2H_INTR_C2H_MM_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_MM_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_ERR_INT_REQ_ADDR 0xB5C -#define C2H_INTR_ERR_INT_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_ERR_INT_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_REQ_ADDR 0xB60 -#define C2H_INTR_C2H_ST_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_ADDR 0xB64 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_ADDR 0xB68 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_ADDR 0xB6C -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_ADDR 0xB70 -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_MSIX_ACK_ADDR 0xB74 -#define C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_MSIX_FAIL_ADDR 0xB78 -#define C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_NO_MSIX_ADDR 0xB7C -#define C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_CTXT_INVAL_ADDR 0xB80 -#define C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_STAT_WR_CMP_ADDR 0xB84 -#define C2H_STAT_WR_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WR_CMP_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_4_ADDR 0xB88 -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD_MASK BIT(31) -#define C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY_MASK BIT(30) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_5_ADDR 0xB8C -#define C2H_STAT_DMA_ENG_5_RSVD_1_MASK GENMASK(31, 25) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD_MASK BIT(24) -#define C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY_MASK BIT(23) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT_MASK GENMASK(22, 13) -#define C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT_MASK GENMASK(12, 3) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT_MASK GENMASK(2, 0) -#define QDMA_CPM4_C2H_DBG_PFCH_QID_ADDR 0xB90 -#define C2H_PFCH_QID_RSVD_1_MASK GENMASK(31, 15) -#define C2H_PFCH_QID_ERR_CTXT_MASK BIT(14) -#define C2H_PFCH_QID_TARGET_MASK GENMASK(13, 11) -#define C2H_PFCH_QID_QID_OR_TAG_MASK GENMASK(10, 0) -#define QDMA_CPM4_C2H_DBG_PFCH_ADDR 0xB94 -#define C2H_PFCH_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_INT_DBG_ADDR 0xB98 -#define C2H_INT_RSVD_1_MASK GENMASK(31, 8) -#define C2H_INT_INT_COAL_SM_MASK GENMASK(7, 4) -#define C2H_INT_INT_SM_MASK GENMASK(3, 0) -#define QDMA_CPM4_C2H_STAT_IMM_ACCEPTED_ADDR 0xB9C -#define C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_IMM_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_STAT_MARKER_ACCEPTED_ADDR 0xBA0 -#define C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_MARKER_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_STAT_DISABLE_CMP_ACCEPTED_ADDR 0xBA4 -#define C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_PLD_FIFO_CRDT_CNT_ADDR 0xBA8 -#define C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_PLD_FIFO_CRDT_CNT_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_H2C_ERR_STAT_ADDR 0xE00 -#define H2C_ERR_STAT_RSVD_1_MASK GENMASK(31, 5) -#define H2C_ERR_STAT_SBE_MASK BIT(4) -#define H2C_ERR_STAT_DBE_MASK BIT(3) -#define H2C_ERR_STAT_NO_DMA_DS_MASK BIT(2) -#define H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK BIT(1) -#define H2C_ERR_STAT_ZERO_LEN_DS_MASK BIT(0) -#define QDMA_CPM4_H2C_ERR_MASK_ADDR 0xE04 -#define H2C_ERR_EN_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_FIRST_ERR_QID_ADDR 0xE08 -#define H2C_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 20) -#define H2C_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(19, 16) -#define H2C_FIRST_ERR_QID_RSVD_2_MASK GENMASK(15, 12) -#define H2C_FIRST_ERR_QID_QID_MASK GENMASK(11, 0) -#define QDMA_CPM4_H2C_DBG_REG0_ADDR 0xE0C -#define H2C_REG0_NUM_DSC_RCVD_MASK GENMASK(31, 16) -#define H2C_REG0_NUM_WRB_SENT_MASK GENMASK(15, 0) -#define QDMA_CPM4_H2C_DBG_REG1_ADDR 0xE10 -#define H2C_REG1_NUM_REQ_SENT_MASK GENMASK(31, 16) -#define H2C_REG1_NUM_CMP_SENT_MASK GENMASK(15, 0) -#define QDMA_CPM4_H2C_DBG_REG2_ADDR 0xE14 -#define H2C_REG2_RSVD_1_MASK GENMASK(31, 16) -#define H2C_REG2_NUM_ERR_DSC_RCVD_MASK GENMASK(15, 0) -#define QDMA_CPM4_H2C_DBG_REG3_ADDR 0xE18 -#define H2C_REG3_MASK BIT(31) -#define H2C_REG3_DSCO_FIFO_EMPTY_MASK BIT(30) -#define H2C_REG3_DSCO_FIFO_FULL_MASK BIT(29) -#define H2C_REG3_CUR_RC_STATE_MASK GENMASK(28, 26) -#define H2C_REG3_RDREQ_LINES_MASK GENMASK(25, 16) -#define H2C_REG3_RDATA_LINES_AVAIL_MASK GENMASK(15, 6) -#define H2C_REG3_PEND_FIFO_EMPTY_MASK BIT(5) -#define H2C_REG3_PEND_FIFO_FULL_MASK BIT(4) -#define H2C_REG3_CUR_RQ_STATE_MASK GENMASK(3, 2) -#define H2C_REG3_DSCI_FIFO_FULL_MASK BIT(1) -#define H2C_REG3_DSCI_FIFO_EMPTY_MASK BIT(0) -#define QDMA_CPM4_H2C_DBG_REG4_ADDR 0xE1C -#define H2C_REG4_RDREQ_ADDR_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_FATAL_ERR_EN_ADDR 0xE20 -#define H2C_FATAL_ERR_EN_RSVD_1_MASK GENMASK(31, 1) -#define H2C_FATAL_ERR_EN_H2C_MASK BIT(0) -#define QDMA_CPM4_C2H_CHANNEL_CTL_ADDR 0x1004 -#define C2H_CHANNEL_CTL_RSVD_1_MASK GENMASK(31, 1) -#define C2H_CHANNEL_CTL_RUN_MASK BIT(0) -#define QDMA_CPM4_C2H_CHANNEL_CTL_1_ADDR 0x1008 -#define C2H_CHANNEL_CTL_1_RUN_MASK GENMASK(31, 1) -#define C2H_CHANNEL_CTL_1_RUN_1_MASK BIT(0) -#define QDMA_CPM4_C2H_MM_STATUS_ADDR 0x1040 -#define C2H_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define C2H_MM_STATUS_RUN_MASK BIT(0) -#define QDMA_CPM4_C2H_CHANNEL_CMPL_DESC_CNT_ADDR 0x1048 -#define C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1054 -#define C2H_MM_ERR_CODE_ENABLE_RSVD_1_MASK BIT(31) -#define C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK BIT(30) -#define C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK BIT(29) -#define C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK BIT(28) -#define C2H_MM_ERR_CODE_ENABLE_RSVD_2_MASK GENMASK(27, 2) -#define C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK BIT(1) -#define C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(0) -#define QDMA_CPM4_C2H_MM_ERR_CODE_ADDR 0x1058 -#define C2H_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 18) -#define C2H_MM_ERR_CODE_VALID_MASK BIT(17) -#define C2H_MM_ERR_CODE_RDWR_MASK BIT(16) -#define C2H_MM_ERR_CODE_MASK GENMASK(4, 0) -#define QDMA_CPM4_C2H_MM_ERR_INFO_ADDR 0x105C -#define C2H_MM_ERR_INFO_RSVD_1_MASK GENMASK(31, 29) -#define C2H_MM_ERR_INFO_QID_MASK GENMASK(28, 17) -#define C2H_MM_ERR_INFO_DIR_MASK BIT(16) -#define C2H_MM_ERR_INFO_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_C2H_MM_PERF_MON_CTL_ADDR 0x10C0 -#define C2H_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define C2H_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define C2H_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define QDMA_CPM4_C2H_MM_PERF_MON_CYCLE_CNT0_ADDR 0x10C4 -#define C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_MM_PERF_MON_CYCLE_CNT1_ADDR 0x10C8 -#define C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_MM_PERF_MON_DATA_CNT0_ADDR 0x10CC -#define C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_MM_PERF_MON_DATA_CNT1_ADDR 0x10D0 -#define C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_MM_DBG_ADDR 0x10E8 -#define C2H_MM_RSVD_1_MASK GENMASK(31, 24) -#define C2H_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define C2H_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define C2H_MM_RD_STALL_MASK BIT(6) -#define C2H_MM_RRQ_FIFO_FI_MASK BIT(5) -#define C2H_MM_WR_STALL_MASK BIT(4) -#define C2H_MM_WRQ_FIFO_FI_MASK BIT(3) -#define C2H_MM_WBK_STALL_MASK BIT(2) -#define C2H_MM_DSC_FIFO_EP_MASK BIT(1) -#define C2H_MM_DSC_FIFO_FL_MASK BIT(0) -#define QDMA_CPM4_H2C_CHANNEL_CTL_ADDR 0x1204 -#define H2C_CHANNEL_CTL_RSVD_1_MASK GENMASK(31, 1) -#define H2C_CHANNEL_CTL_RUN_MASK BIT(0) -#define QDMA_CPM4_H2C_CHANNEL_CTL_1_ADDR 0x1208 -#define H2C_CHANNEL_CTL_1_RUN_MASK BIT(0) -#define QDMA_CPM4_H2C_CHANNEL_CTL_2_ADDR 0x120C -#define H2C_CHANNEL_CTL_2_RUN_MASK BIT(0) -#define QDMA_CPM4_H2C_MM_STATUS_ADDR 0x1240 -#define H2C_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define H2C_MM_STATUS_RUN_MASK BIT(0) -#define QDMA_CPM4_H2C_CHANNEL_CMPL_DESC_CNT_ADDR 0x1248 -#define H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1254 -#define H2C_MM_ERR_CODE_ENABLE_RSVD_1_MASK GENMASK(31, 30) -#define H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(29) -#define H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK BIT(28) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_2_MASK GENMASK(27, 23) -#define H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK BIT(22) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_3_MASK GENMASK(21, 17) -#define H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK BIT(16) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_4_MASK GENMASK(15, 9) -#define H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK BIT(8) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_5_MASK GENMASK(7, 6) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK BIT(5) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK BIT(4) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK BIT(3) -#define H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK BIT(2) -#define H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK BIT(1) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_6_MASK BIT(0) -#define QDMA_CPM4_H2C_MM_ERR_CODE_ADDR 0x1258 -#define H2C_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 18) -#define H2C_MM_ERR_CODE_VALID_MASK BIT(17) -#define H2C_MM_ERR_CODE_RDWR_MASK BIT(16) -#define H2C_MM_ERR_CODE_MASK GENMASK(4, 0) -#define QDMA_CPM4_H2C_MM_ERR_INFO_ADDR 0x125C -#define H2C_MM_ERR_INFO_RSVD_1_MASK GENMASK(31, 29) -#define H2C_MM_ERR_INFO_QID_MASK GENMASK(28, 17) -#define H2C_MM_ERR_INFO_DIR_MASK BIT(16) -#define H2C_MM_ERR_INFO_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_H2C_MM_PERF_MON_CTL_ADDR 0x12C0 -#define H2C_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define H2C_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define H2C_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define QDMA_CPM4_H2C_MM_PERF_MON_CYCLE_CNT0_ADDR 0x12C4 -#define H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_MM_PERF_MON_CYCLE_CNT1_ADDR 0x12C8 -#define H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_H2C_MM_PERF_MON_DATA_CNT0_ADDR 0x12CC -#define H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_MM_PERF_MON_DATA_CNT1_ADDR 0x12D0 -#define H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_H2C_MM_DBG_ADDR 0x12E8 -#define H2C_MM_RSVD_1_MASK GENMASK(31, 24) -#define H2C_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define H2C_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define H2C_MM_RD_STALL_MASK BIT(6) -#define H2C_MM_RRQ_FIFO_FI_MASK BIT(5) -#define H2C_MM_WR_STALL_MASK BIT(4) -#define H2C_MM_WRQ_FIFO_FI_MASK BIT(3) -#define H2C_MM_WBK_STALL_MASK BIT(2) -#define H2C_MM_DSC_FIFO_EP_MASK BIT(1) -#define H2C_MM_DSC_FIFO_FL_MASK BIT(0) -#define QDMA_CPM4_FUNC_STATUS_REG_ADDR 0x2400 -#define FUNC_STATUS_REG_RSVD_1_MASK GENMASK(31, 12) -#define FUNC_STATUS_REG_CUR_SRC_FN_MASK GENMASK(11, 4) -#define FUNC_STATUS_REG_ACK_MASK BIT(2) -#define FUNC_STATUS_REG_O_MSG_MASK BIT(1) -#define FUNC_STATUS_REG_I_MSG_MASK BIT(0) -#define QDMA_CPM4_FUNC_CMD_REG_ADDR 0x2404 -#define FUNC_CMD_REG_RSVD_1_MASK GENMASK(31, 3) -#define FUNC_CMD_REG_RSVD_2_MASK BIT(2) -#define FUNC_CMD_REG_MSG_RCV_MASK BIT(1) -#define FUNC_CMD_REG_MSG_SENT_MASK BIT(0) -#define QDMA_CPM4_FUNC_INTERRUPT_VECTOR_REG_ADDR 0x2408 -#define FUNC_INTERRUPT_VECTOR_REG_RSVD_1_MASK GENMASK(31, 5) -#define FUNC_INTERRUPT_VECTOR_REG_IN_MASK GENMASK(4, 0) -#define QDMA_CPM4_TARGET_FUNC_REG_ADDR 0x240C -#define TARGET_FUNC_REG_RSVD_1_MASK GENMASK(31, 8) -#define TARGET_FUNC_REG_N_ID_MASK GENMASK(7, 0) -#define QDMA_CPM4_FUNC_INTERRUPT_CTL_REG_ADDR 0x2410 -#define FUNC_INTERRUPT_CTL_REG_RSVD_1_MASK GENMASK(31, 1) -#define FUNC_INTERRUPT_CTL_REG_INT_EN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W3_DSC_BASE_H_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W2_DSC_BASE_L_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W1_IS_MM_MASK BIT(31) -#define SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK BIT(30) -#define SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK BIT(29) -#define SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK BIT(28) -#define SW_IND_CTXT_DATA_W1_ERR_MASK GENMASK(27, 26) -#define SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK BIT(25) -#define SW_IND_CTXT_DATA_W1_PORT_ID_MASK GENMASK(24, 22) -#define SW_IND_CTXT_DATA_W1_IRQ_EN_MASK BIT(21) -#define SW_IND_CTXT_DATA_W1_WBK_EN_MASK BIT(20) -#define SW_IND_CTXT_DATA_W1_MM_CHN_MASK BIT(19) -#define SW_IND_CTXT_DATA_W1_BYPASS_MASK BIT(18) -#define SW_IND_CTXT_DATA_W1_DSC_SZ_MASK GENMASK(17, 16) -#define SW_IND_CTXT_DATA_W1_RNG_SZ_MASK GENMASK(15, 12) -#define SW_IND_CTXT_DATA_W1_FNC_ID_MASK GENMASK(11, 4) -#define SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK BIT(3) -#define SW_IND_CTXT_DATA_W1_WBI_CHK_MASK BIT(2) -#define SW_IND_CTXT_DATA_W1_FCRD_EN_MASK BIT(1) -#define SW_IND_CTXT_DATA_W1_QEN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W0_RSV_MASK GENMASK(31, 17) -#define SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK BIT(16) -#define SW_IND_CTXT_DATA_W0_PIDX_MASK GENMASK(15, 0) -#define HW_IND_CTXT_DATA_W1_RSVD_MASK GENMASK(15, 11) -#define HW_IND_CTXT_DATA_W1_FETCH_PND_MASK BIT(10) -#define HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK BIT(9) -#define HW_IND_CTXT_DATA_W1_DSC_PND_MASK BIT(8) -#define HW_IND_CTXT_DATA_W1_RSVD_1_MASK GENMASK(7, 0) -#define HW_IND_CTXT_DATA_W0_CRD_USE_MASK GENMASK(31, 16) -#define HW_IND_CTXT_DATA_W0_CIDX_MASK GENMASK(15, 0) -#define CRED_CTXT_DATA_W0_RSVD_1_MASK GENMASK(31, 16) -#define CRED_CTXT_DATA_W0_CREDT_MASK GENMASK(15, 0) -#define PREFETCH_CTXT_DATA_W1_VALID_MASK BIT(13) -#define PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define PREFETCH_CTXT_DATA_W0_PFCH_MASK BIT(28) -#define PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK BIT(27) -#define PREFETCH_CTXT_DATA_W0_ERR_MASK BIT(26) -#define PREFETCH_CTXT_DATA_W0_RSVD_MASK GENMASK(25, 8) -#define PREFETCH_CTXT_DATA_W0_PORT_ID_MASK GENMASK(7, 5) -#define PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK GENMASK(4, 1) -#define PREFETCH_CTXT_DATA_W0_BYPASS_MASK BIT(0) -#define CMPL_CTXT_DATA_W3_RSVD_MASK GENMASK(31, 30) -#define CMPL_CTXT_DATA_W3_FULL_UPD_MASK BIT(29) -#define CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK BIT(28) -#define CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK BIT(27) -#define CMPL_CTXT_DATA_W3_ERR_MASK GENMASK(26, 25) -#define CMPL_CTXT_DATA_W3_VALID_MASK BIT(24) -#define CMPL_CTXT_DATA_W3_CIDX_MASK GENMASK(23, 8) -#define CMPL_CTXT_DATA_W3_PIDX_H_MASK GENMASK(7, 0) -#define CMPL_CTXT_DATA_W2_PIDX_L_MASK GENMASK(31, 24) -#define CMPL_CTXT_DATA_W2_DESC_SIZE_MASK GENMASK(23, 22) -#define CMPL_CTXT_DATA_W2_BADDR_64_H_MASK GENMASK(21, 0) -#define CMPL_CTXT_DATA_W1_BADDR_64_M_MASK GENMASK(31, 0) -#define CMPL_CTXT_DATA_W0_BADDR_64_L_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK GENMASK(27, 24) -#define CMPL_CTXT_DATA_W0_COLOR_MASK BIT(23) -#define CMPL_CTXT_DATA_W0_INT_ST_MASK GENMASK(22, 21) -#define CMPL_CTXT_DATA_W0_TIMER_IDX_MASK GENMASK(20, 17) -#define CMPL_CTXT_DATA_W0_CNTER_IDX_MASK GENMASK(16, 13) -#define CMPL_CTXT_DATA_W0_FNC_ID_MASK GENMASK(12, 5) -#define CMPL_CTXT_DATA_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define CMPL_CTXT_DATA_W0_EN_INT_MASK BIT(1) -#define CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK BIT(0) -#define INTR_CTXT_DATA_W2_PIDX_MASK GENMASK(11, 0) -#define INTR_CTXT_DATA_W1_PAGE_SIZE_MASK GENMASK(31, 29) -#define INTR_CTXT_DATA_W1_BADDR_4K_H_MASK GENMASK(28, 0) -#define INTR_CTXT_DATA_W0_BADDR_4K_L_MASK GENMASK(31, 9) -#define INTR_CTXT_DATA_W0_COLOR_MASK BIT(8) -#define INTR_CTXT_DATA_W0_INT_ST_MASK BIT(7) -#define INTR_CTXT_DATA_W0_RSVD_MASK BIT(6) -#define INTR_CTXT_DATA_W0_VEC_MASK GENMASK(5, 1) -#define INTR_CTXT_DATA_W0_VALID_MASK BIT(0) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c deleted file mode 100755 index 2955d7a..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c +++ /dev/null @@ -1,8029 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma_cpm4_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_cpm4_reg_dump.tmh" -#endif - - -static struct regfield_info - cfg_blk_identifier_field_info[] = { - {"CFG_BLK_IDENTIFIER", - CFG_BLK_IDENTIFIER_MASK}, - {"CFG_BLK_IDENTIFIER_1", - CFG_BLK_IDENTIFIER_1_MASK}, - {"CFG_BLK_IDENTIFIER_RSVD_1", - CFG_BLK_IDENTIFIER_RSVD_1_MASK}, - {"CFG_BLK_IDENTIFIER_VERSION", - CFG_BLK_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - cfg_blk_busdev_field_info[] = { - {"CFG_BLK_BUSDEV_BDF", - CFG_BLK_BUSDEV_BDF_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_pld_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_PLD_SIZE", - CFG_BLK_PCIE_MAX_PLD_SIZE_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_read_req_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_MASK}, -}; - - -static struct regfield_info - cfg_blk_system_id_field_info[] = { - {"CFG_BLK_SYSTEM_ID", - CFG_BLK_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - cfg_blk_msi_enable_field_info[] = { - {"CFG_BLK_MSI_ENABLE_3", - CFG_BLK_MSI_ENABLE_3_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX3", - CFG_BLK_MSI_ENABLE_MSIX3_MASK}, - {"CFG_BLK_MSI_ENABLE_2", - CFG_BLK_MSI_ENABLE_2_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX2", - CFG_BLK_MSI_ENABLE_MSIX2_MASK}, - {"CFG_BLK_MSI_ENABLE_1", - CFG_BLK_MSI_ENABLE_1_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX1", - CFG_BLK_MSI_ENABLE_MSIX1_MASK}, - {"CFG_BLK_MSI_ENABLE_0", - CFG_BLK_MSI_ENABLE_0_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX0", - CFG_BLK_MSI_ENABLE_MSIX0_MASK}, -}; - - -static struct regfield_info - cfg_pcie_data_width_field_info[] = { - {"CFG_PCIE_DATA_WIDTH_DATAPATH", - CFG_PCIE_DATA_WIDTH_DATAPATH_MASK}, -}; - - -static struct regfield_info - cfg_pcie_ctl_field_info[] = { - {"CFG_PCIE_CTL_RRQ_DISABLE", - CFG_PCIE_CTL_RRQ_DISABLE_MASK}, - {"CFG_PCIE_CTL_RELAXED_ORDERING", - CFG_PCIE_CTL_RELAXED_ORDERING_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_pld_size_field_info[] = { - {"CFG_AXI_USER_MAX_PLD_SIZE_ISSUED", - CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_PROG", - CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_read_req_size_field_info[] = { - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK}, -}; - - -static struct regfield_info - cfg_blk_misc_ctl_field_info[] = { - {"CFG_BLK_MISC_CTL_NUM_TAG", - CFG_BLK_MISC_CTL_NUM_TAG_MASK}, - {"CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER", - CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_0_field_info[] = { - {"CFG_BLK_SCRATCH_0", - CFG_BLK_SCRATCH_0_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_1_field_info[] = { - {"CFG_BLK_SCRATCH_1", - CFG_BLK_SCRATCH_1_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_2_field_info[] = { - {"CFG_BLK_SCRATCH_2", - CFG_BLK_SCRATCH_2_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_3_field_info[] = { - {"CFG_BLK_SCRATCH_3", - CFG_BLK_SCRATCH_3_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_4_field_info[] = { - {"CFG_BLK_SCRATCH_4", - CFG_BLK_SCRATCH_4_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_5_field_info[] = { - {"CFG_BLK_SCRATCH_5", - CFG_BLK_SCRATCH_5_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_6_field_info[] = { - {"CFG_BLK_SCRATCH_6", - CFG_BLK_SCRATCH_6_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_7_field_info[] = { - {"CFG_BLK_SCRATCH_7", - CFG_BLK_SCRATCH_7_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_a_field_info[] = { - {"RAM_SBE_MSK_A", - RAM_SBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_a_field_info[] = { - {"RAM_SBE_STS_A_RSVD_1", - RAM_SBE_STS_A_RSVD_1_MASK}, - {"RAM_SBE_STS_A_PFCH_LL_RAM", - RAM_SBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_CTXT_RAM", - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_CTXT_RAM", - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_INT_CTXT_RAM", - RAM_SBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_INT_QID2VEC_RAM", - RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_COAL_DATA_RAM", - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_SBE_STS_A_TUSER_FIFO_RAM", - RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_QID_FIFO_RAM", - RAM_SBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PLD_FIFO_RAM", - RAM_SBE_STS_A_PLD_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_TIMER_FIFO_RAM", - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PASID_CTXT_RAM", - RAM_SBE_STS_A_PASID_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DSC_CPLD", - RAM_SBE_STS_A_DSC_CPLD_MASK}, - {"RAM_SBE_STS_A_DSC_CPLI", - RAM_SBE_STS_A_DSC_CPLI_MASK}, - {"RAM_SBE_STS_A_DSC_SW_CTXT", - RAM_SBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_SBE_STS_A_DSC_CRD_RCV", - RAM_SBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_SBE_STS_A_DSC_HW_CTXT", - RAM_SBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_SBE_STS_A_FUNC_MAP", - RAM_SBE_STS_A_FUNC_MAP_MASK}, - {"RAM_SBE_STS_A_C2H_WR_BRG_DAT", - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_C2H_RD_BRG_DAT", - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_WR_BRG_DAT", - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_RD_BRG_DAT", - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_RSVD_2", - RAM_SBE_STS_A_RSVD_2_MASK}, - {"RAM_SBE_STS_A_MI_C2H0_DAT", - RAM_SBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_SBE_STS_A_RSVD_3", - RAM_SBE_STS_A_RSVD_3_MASK}, - {"RAM_SBE_STS_A_MI_H2C0_DAT", - RAM_SBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_a_field_info[] = { - {"RAM_DBE_MSK_A", - RAM_DBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_a_field_info[] = { - {"RAM_DBE_STS_A_RSVD_1", - RAM_DBE_STS_A_RSVD_1_MASK}, - {"RAM_DBE_STS_A_PFCH_LL_RAM", - RAM_DBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_CTXT_RAM", - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_CTXT_RAM", - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_INT_CTXT_RAM", - RAM_DBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_INT_QID2VEC_RAM", - RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_COAL_DATA_RAM", - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_DBE_STS_A_TUSER_FIFO_RAM", - RAM_DBE_STS_A_TUSER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_QID_FIFO_RAM", - RAM_DBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PLD_FIFO_RAM", - RAM_DBE_STS_A_PLD_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_TIMER_FIFO_RAM", - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PASID_CTXT_RAM", - RAM_DBE_STS_A_PASID_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DSC_CPLD", - RAM_DBE_STS_A_DSC_CPLD_MASK}, - {"RAM_DBE_STS_A_DSC_CPLI", - RAM_DBE_STS_A_DSC_CPLI_MASK}, - {"RAM_DBE_STS_A_DSC_SW_CTXT", - RAM_DBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_DBE_STS_A_DSC_CRD_RCV", - RAM_DBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_DBE_STS_A_DSC_HW_CTXT", - RAM_DBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_DBE_STS_A_FUNC_MAP", - RAM_DBE_STS_A_FUNC_MAP_MASK}, - {"RAM_DBE_STS_A_C2H_WR_BRG_DAT", - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_C2H_RD_BRG_DAT", - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_WR_BRG_DAT", - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_RD_BRG_DAT", - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_RSVD_2", - RAM_DBE_STS_A_RSVD_2_MASK}, - {"RAM_DBE_STS_A_MI_C2H0_DAT", - RAM_DBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_DBE_STS_A_RSVD_3", - RAM_DBE_STS_A_RSVD_3_MASK}, - {"RAM_DBE_STS_A_MI_H2C0_DAT", - RAM_DBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_identifier_field_info[] = { - {"GLBL2_IDENTIFIER", - GLBL2_IDENTIFIER_MASK}, - {"GLBL2_IDENTIFIER_VERSION", - GLBL2_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - glbl2_pf_barlite_int_field_info[] = { - {"GLBL2_PF_BARLITE_INT_PF3_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF2_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF1_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF0_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_vf_barlite_int_field_info[] = { - {"GLBL2_PF_VF_BARLITE_INT_PF3_MAP", - GLBL2_PF_VF_BARLITE_INT_PF3_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF2_MAP", - GLBL2_PF_VF_BARLITE_INT_PF2_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF1_MAP", - GLBL2_PF_VF_BARLITE_INT_PF1_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF0_MAP", - GLBL2_PF_VF_BARLITE_INT_PF0_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_barlite_ext_field_info[] = { - {"GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_vf_barlite_ext_field_info[] = { - {"GLBL2_PF_VF_BARLITE_EXT_PF3_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF3_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF2_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF2_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF1_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF1_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF0_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF0_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_channel_inst_field_info[] = { - {"GLBL2_CHANNEL_INST_RSVD_1", - GLBL2_CHANNEL_INST_RSVD_1_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ST", - GLBL2_CHANNEL_INST_C2H_ST_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ST", - GLBL2_CHANNEL_INST_H2C_ST_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_2", - GLBL2_CHANNEL_INST_RSVD_2_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ENG", - GLBL2_CHANNEL_INST_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_3", - GLBL2_CHANNEL_INST_RSVD_3_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ENG", - GLBL2_CHANNEL_INST_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_mdma_field_info[] = { - {"GLBL2_CHANNEL_MDMA_RSVD_1", - GLBL2_CHANNEL_MDMA_RSVD_1_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ST", - GLBL2_CHANNEL_MDMA_C2H_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ST", - GLBL2_CHANNEL_MDMA_H2C_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_2", - GLBL2_CHANNEL_MDMA_RSVD_2_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ENG", - GLBL2_CHANNEL_MDMA_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_3", - GLBL2_CHANNEL_MDMA_RSVD_3_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ENG", - GLBL2_CHANNEL_MDMA_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_strm_field_info[] = { - {"GLBL2_CHANNEL_STRM_RSVD_1", - GLBL2_CHANNEL_STRM_RSVD_1_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ST", - GLBL2_CHANNEL_STRM_C2H_ST_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ST", - GLBL2_CHANNEL_STRM_H2C_ST_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_2", - GLBL2_CHANNEL_STRM_RSVD_2_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ENG", - GLBL2_CHANNEL_STRM_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_3", - GLBL2_CHANNEL_STRM_RSVD_3_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ENG", - GLBL2_CHANNEL_STRM_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_cap_field_info[] = { - {"GLBL2_CHANNEL_CAP_RSVD_1", - GLBL2_CHANNEL_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_CAP_MULTIQ_MAX", - GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK}, -}; - - -static struct regfield_info - glbl2_channel_pasid_cap_field_info[] = { - {"GLBL2_CHANNEL_PASID_CAP_RSVD_1", - GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET", - GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_RSVD_2", - GLBL2_CHANNEL_PASID_CAP_RSVD_2_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEEN", - GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_DMAEN", - GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK}, -}; - - -static struct regfield_info - glbl2_channel_func_ret_field_info[] = { - {"GLBL2_CHANNEL_FUNC_RET_RSVD_1", - GLBL2_CHANNEL_FUNC_RET_RSVD_1_MASK}, - {"GLBL2_CHANNEL_FUNC_RET_FUNC", - GLBL2_CHANNEL_FUNC_RET_FUNC_MASK}, -}; - - -static struct regfield_info - glbl2_system_id_field_info[] = { - {"GLBL2_SYSTEM_ID_RSVD_1", - GLBL2_SYSTEM_ID_RSVD_1_MASK}, - {"GLBL2_SYSTEM_ID", - GLBL2_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - glbl2_misc_cap_field_info[] = { - {"GLBL2_MISC_CAP_RSVD_1", - GLBL2_MISC_CAP_RSVD_1_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq0_field_info[] = { - {"GLBL2_PCIE_RQ0_NPH_AVL", - GLBL2_PCIE_RQ0_NPH_AVL_MASK}, - {"GLBL2_PCIE_RQ0_RCB_AVL", - GLBL2_PCIE_RQ0_RCB_AVL_MASK}, - {"GLBL2_PCIE_RQ0_SLV_RD_CREDS", - GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK}, - {"GLBL2_PCIE_RQ0_TAG_EP", - GLBL2_PCIE_RQ0_TAG_EP_MASK}, - {"GLBL2_PCIE_RQ0_TAG_FL", - GLBL2_PCIE_RQ0_TAG_FL_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq1_field_info[] = { - {"GLBL2_PCIE_RQ1_RSVD_1", - GLBL2_PCIE_RQ1_RSVD_1_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_REQ", - GLBL2_PCIE_RQ1_WTLP_REQ_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_EP", - GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_FL", - GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM", - GLBL2_PCIE_RQ1_TLPSM_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM512", - GLBL2_PCIE_RQ1_TLPSM512_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_RCB_OK", - GLBL2_PCIE_RQ1_RREQ0_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_SLV", - GLBL2_PCIE_RQ1_RREQ0_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_VLD", - GLBL2_PCIE_RQ1_RREQ0_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_RCB_OK", - GLBL2_PCIE_RQ1_RREQ1_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_SLV", - GLBL2_PCIE_RQ1_RREQ1_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_VLD", - GLBL2_PCIE_RQ1_RREQ1_VLD_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr0_field_info[] = { - {"GLBL2_AXIMM_WR0_RSVD_1", - GLBL2_AXIMM_WR0_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR0_WR_REQ", - GLBL2_AXIMM_WR0_WR_REQ_MASK}, - {"GLBL2_AXIMM_WR0_WR_CHN", - GLBL2_AXIMM_WR0_WR_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP", - GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_WPL_FIFO_EP", - GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN", - GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WRREQ_CNT", - GLBL2_AXIMM_WR0_WRREQ_CNT_MASK}, - {"GLBL2_AXIMM_WR0_BID", - GLBL2_AXIMM_WR0_BID_MASK}, - {"GLBL2_AXIMM_WR0_BVALID", - GLBL2_AXIMM_WR0_BVALID_MASK}, - {"GLBL2_AXIMM_WR0_BREADY", - GLBL2_AXIMM_WR0_BREADY_MASK}, - {"GLBL2_AXIMM_WR0_WVALID", - GLBL2_AXIMM_WR0_WVALID_MASK}, - {"GLBL2_AXIMM_WR0_WREADY", - GLBL2_AXIMM_WR0_WREADY_MASK}, - {"GLBL2_AXIMM_WR0_AWID", - GLBL2_AXIMM_WR0_AWID_MASK}, - {"GLBL2_AXIMM_WR0_AWVALID", - GLBL2_AXIMM_WR0_AWVALID_MASK}, - {"GLBL2_AXIMM_WR0_AWREADY", - GLBL2_AXIMM_WR0_AWREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr1_field_info[] = { - {"GLBL2_AXIMM_WR1_RSVD_1", - GLBL2_AXIMM_WR1_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT4", - GLBL2_AXIMM_WR1_BRSP_CNT4_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT3", - GLBL2_AXIMM_WR1_BRSP_CNT3_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT2", - GLBL2_AXIMM_WR1_BRSP_CNT2_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT1", - GLBL2_AXIMM_WR1_BRSP_CNT1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT0", - GLBL2_AXIMM_WR1_BRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd0_field_info[] = { - {"GLBL2_AXIMM_RD0_RSVD_1", - GLBL2_AXIMM_RD0_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD0_PND_CNT", - GLBL2_AXIMM_RD0_PND_CNT_MASK}, - {"GLBL2_AXIMM_RD0_RD_CHNL", - GLBL2_AXIMM_RD0_RD_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RD_REQ", - GLBL2_AXIMM_RD0_RD_REQ_MASK}, - {"GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL", - GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RID", - GLBL2_AXIMM_RD0_RID_MASK}, - {"GLBL2_AXIMM_RD0_RVALID", - GLBL2_AXIMM_RD0_RVALID_MASK}, - {"GLBL2_AXIMM_RD0_RREADY", - GLBL2_AXIMM_RD0_RREADY_MASK}, - {"GLBL2_AXIMM_RD0_ARID", - GLBL2_AXIMM_RD0_ARID_MASK}, - {"GLBL2_AXIMM_RD0_ARVALID", - GLBL2_AXIMM_RD0_ARVALID_MASK}, - {"GLBL2_AXIMM_RD0_ARREADY", - GLBL2_AXIMM_RD0_ARREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd1_field_info[] = { - {"GLBL2_AXIMM_RD1_RSVD_1", - GLBL2_AXIMM_RD1_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT4", - GLBL2_AXIMM_RD1_RRSP_CNT4_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT3", - GLBL2_AXIMM_RD1_RRSP_CNT3_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT2", - GLBL2_AXIMM_RD1_RRSP_CNT2_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT1", - GLBL2_AXIMM_RD1_RRSP_CNT1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT0", - GLBL2_AXIMM_RD1_RRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_1_field_info[] = { - {"GLBL_RNG_SZ_1_RSVD_1", - GLBL_RNG_SZ_1_RSVD_1_MASK}, - {"GLBL_RNG_SZ_1_RING_SIZE", - GLBL_RNG_SZ_1_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_2_field_info[] = { - {"GLBL_RNG_SZ_2_RSVD_1", - GLBL_RNG_SZ_2_RSVD_1_MASK}, - {"GLBL_RNG_SZ_2_RING_SIZE", - GLBL_RNG_SZ_2_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_3_field_info[] = { - {"GLBL_RNG_SZ_3_RSVD_1", - GLBL_RNG_SZ_3_RSVD_1_MASK}, - {"GLBL_RNG_SZ_3_RING_SIZE", - GLBL_RNG_SZ_3_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_4_field_info[] = { - {"GLBL_RNG_SZ_4_RSVD_1", - GLBL_RNG_SZ_4_RSVD_1_MASK}, - {"GLBL_RNG_SZ_4_RING_SIZE", - GLBL_RNG_SZ_4_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_5_field_info[] = { - {"GLBL_RNG_SZ_5_RSVD_1", - GLBL_RNG_SZ_5_RSVD_1_MASK}, - {"GLBL_RNG_SZ_5_RING_SIZE", - GLBL_RNG_SZ_5_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_6_field_info[] = { - {"GLBL_RNG_SZ_6_RSVD_1", - GLBL_RNG_SZ_6_RSVD_1_MASK}, - {"GLBL_RNG_SZ_6_RING_SIZE", - GLBL_RNG_SZ_6_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_7_field_info[] = { - {"GLBL_RNG_SZ_7_RSVD_1", - GLBL_RNG_SZ_7_RSVD_1_MASK}, - {"GLBL_RNG_SZ_7_RING_SIZE", - GLBL_RNG_SZ_7_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_8_field_info[] = { - {"GLBL_RNG_SZ_8_RSVD_1", - GLBL_RNG_SZ_8_RSVD_1_MASK}, - {"GLBL_RNG_SZ_8_RING_SIZE", - GLBL_RNG_SZ_8_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_9_field_info[] = { - {"GLBL_RNG_SZ_9_RSVD_1", - GLBL_RNG_SZ_9_RSVD_1_MASK}, - {"GLBL_RNG_SZ_9_RING_SIZE", - GLBL_RNG_SZ_9_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_a_field_info[] = { - {"GLBL_RNG_SZ_A_RSVD_1", - GLBL_RNG_SZ_A_RSVD_1_MASK}, - {"GLBL_RNG_SZ_A_RING_SIZE", - GLBL_RNG_SZ_A_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_b_field_info[] = { - {"GLBL_RNG_SZ_B_RSVD_1", - GLBL_RNG_SZ_B_RSVD_1_MASK}, - {"GLBL_RNG_SZ_B_RING_SIZE", - GLBL_RNG_SZ_B_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_c_field_info[] = { - {"GLBL_RNG_SZ_C_RSVD_1", - GLBL_RNG_SZ_C_RSVD_1_MASK}, - {"GLBL_RNG_SZ_C_RING_SIZE", - GLBL_RNG_SZ_C_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_d_field_info[] = { - {"GLBL_RNG_SZ_D_RSVD_1", - GLBL_RNG_SZ_D_RSVD_1_MASK}, - {"GLBL_RNG_SZ_D_RING_SIZE", - GLBL_RNG_SZ_D_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_e_field_info[] = { - {"GLBL_RNG_SZ_E_RSVD_1", - GLBL_RNG_SZ_E_RSVD_1_MASK}, - {"GLBL_RNG_SZ_E_RING_SIZE", - GLBL_RNG_SZ_E_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_f_field_info[] = { - {"GLBL_RNG_SZ_F_RSVD_1", - GLBL_RNG_SZ_F_RSVD_1_MASK}, - {"GLBL_RNG_SZ_F_RING_SIZE", - GLBL_RNG_SZ_F_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_10_field_info[] = { - {"GLBL_RNG_SZ_10_RSVD_1", - GLBL_RNG_SZ_10_RSVD_1_MASK}, - {"GLBL_RNG_SZ_10_RING_SIZE", - GLBL_RNG_SZ_10_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_err_stat_field_info[] = { - {"GLBL_ERR_STAT_RSVD_1", - GLBL_ERR_STAT_RSVD_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_ST", - GLBL_ERR_STAT_ERR_H2C_ST_MASK}, - {"GLBL_ERR_STAT_ERR_BDG", - GLBL_ERR_STAT_ERR_BDG_MASK}, - {"GLBL_ERR_STAT_IND_CTXT_CMD_ERR", - GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_ST", - GLBL_ERR_STAT_ERR_C2H_ST_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_1", - GLBL_ERR_STAT_ERR_C2H_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_0", - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_1", - GLBL_ERR_STAT_ERR_H2C_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_0", - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_TRQ", - GLBL_ERR_STAT_ERR_TRQ_MASK}, - {"GLBL_ERR_STAT_ERR_DSC", - GLBL_ERR_STAT_ERR_DSC_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_DBE", - GLBL_ERR_STAT_ERR_RAM_DBE_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_SBE", - GLBL_ERR_STAT_ERR_RAM_SBE_MASK}, -}; - - -static struct regfield_info - glbl_err_mask_field_info[] = { - {"GLBL_ERR_RSVD_1", - GLBL_ERR_RSVD_1_MASK}, - {"GLBL_ERR", - GLBL_ERR_MASK}, -}; - - -static struct regfield_info - glbl_dsc_cfg_field_info[] = { - {"GLBL_DSC_CFG_RSVD_1", - GLBL_DSC_CFG_RSVD_1_MASK}, - {"GLBL_DSC_CFG_UNC_OVR_COR", - GLBL_DSC_CFG_UNC_OVR_COR_MASK}, - {"GLBL_DSC_CFG_CTXT_FER_DIS", - GLBL_DSC_CFG_CTXT_FER_DIS_MASK}, - {"GLBL_DSC_CFG_RSVD_2", - GLBL_DSC_CFG_RSVD_2_MASK}, - {"GLBL_DSC_CFG_MAXFETCH", - GLBL_DSC_CFG_MAXFETCH_MASK}, - {"GLBL_DSC_CFG_WB_ACC_INT", - GLBL_DSC_CFG_WB_ACC_INT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_sts_field_info[] = { - {"GLBL_DSC_ERR_STS_RSVD_1", - GLBL_DSC_ERR_STS_RSVD_1_MASK}, - {"GLBL_DSC_ERR_STS_SBE", - GLBL_DSC_ERR_STS_SBE_MASK}, - {"GLBL_DSC_ERR_STS_DBE", - GLBL_DSC_ERR_STS_DBE_MASK}, - {"GLBL_DSC_ERR_STS_RQ_CANCEL", - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_DSC", - GLBL_DSC_ERR_STS_DSC_MASK}, - {"GLBL_DSC_ERR_STS_DMA", - GLBL_DSC_ERR_STS_DMA_MASK}, - {"GLBL_DSC_ERR_STS_FLR_CANCEL", - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_RSVD_2", - GLBL_DSC_ERR_STS_RSVD_2_MASK}, - {"GLBL_DSC_ERR_STS_DAT_POISON", - GLBL_DSC_ERR_STS_DAT_POISON_MASK}, - {"GLBL_DSC_ERR_STS_TIMEOUT", - GLBL_DSC_ERR_STS_TIMEOUT_MASK}, - {"GLBL_DSC_ERR_STS_FLR", - GLBL_DSC_ERR_STS_FLR_MASK}, - {"GLBL_DSC_ERR_STS_TAG", - GLBL_DSC_ERR_STS_TAG_MASK}, - {"GLBL_DSC_ERR_STS_ADDR", - GLBL_DSC_ERR_STS_ADDR_MASK}, - {"GLBL_DSC_ERR_STS_PARAM", - GLBL_DSC_ERR_STS_PARAM_MASK}, - {"GLBL_DSC_ERR_STS_UR_CA", - GLBL_DSC_ERR_STS_UR_CA_MASK}, - {"GLBL_DSC_ERR_STS_POISON", - GLBL_DSC_ERR_STS_POISON_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_msk_field_info[] = { - {"GLBL_DSC_ERR_MSK", - GLBL_DSC_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log0_field_info[] = { - {"GLBL_DSC_ERR_LOG0_VALID", - GLBL_DSC_ERR_LOG0_VALID_MASK}, - {"GLBL_DSC_ERR_LOG0_RSVD_1", - GLBL_DSC_ERR_LOG0_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG0_QID", - GLBL_DSC_ERR_LOG0_QID_MASK}, - {"GLBL_DSC_ERR_LOG0_SEL", - GLBL_DSC_ERR_LOG0_SEL_MASK}, - {"GLBL_DSC_ERR_LOG0_CIDX", - GLBL_DSC_ERR_LOG0_CIDX_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log1_field_info[] = { - {"GLBL_DSC_ERR_LOG1_RSVD_1", - GLBL_DSC_ERR_LOG1_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG1_SUB_TYPE", - GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK}, - {"GLBL_DSC_ERR_LOG1_ERR_TYPE", - GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_sts_field_info[] = { - {"GLBL_TRQ_ERR_STS_RSVD_1", - GLBL_TRQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_VF_ACCESS_ERR", - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK}, - {"GLBL_TRQ_ERR_STS_QID_RANGE", - GLBL_TRQ_ERR_STS_QID_RANGE_MASK}, - {"GLBL_TRQ_ERR_STS_UNMAPPED", - GLBL_TRQ_ERR_STS_UNMAPPED_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_msk_field_info[] = { - {"GLBL_TRQ_ERR_MSK", - GLBL_TRQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_log_field_info[] = { - {"GLBL_TRQ_ERR_LOG_RSVD_1", - GLBL_TRQ_ERR_LOG_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_LOG_TARGET", - GLBL_TRQ_ERR_LOG_TARGET_MASK}, - {"GLBL_TRQ_ERR_LOG_FUNC", - GLBL_TRQ_ERR_LOG_FUNC_MASK}, - {"GLBL_TRQ_ERR_LOG_ADDRESS", - GLBL_TRQ_ERR_LOG_ADDRESS_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat0_field_info[] = { - {"GLBL_DSC_DAT0_RSVD_1", - GLBL_DSC_DAT0_RSVD_1_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_DIR", - GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_QID", - GLBL_DSC_DAT0_CTXT_ARB_QID_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_REQ", - GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK}, - {"GLBL_DSC_DAT0_IRQ_FIFO_FL", - GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK}, - {"GLBL_DSC_DAT0_TMSTALL", - GLBL_DSC_DAT0_TMSTALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_STALL", - GLBL_DSC_DAT0_RRQ_STALL_MASK}, - {"GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL", - GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK}, - {"GLBL_DSC_DAT0_DSC_OUT_STALL", - GLBL_DSC_DAT0_DSC_OUT_STALL_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat1_field_info[] = { - {"GLBL_DSC_DAT1_RSVD_1", - GLBL_DSC_DAT1_RSVD_1_MASK}, - {"GLBL_DSC_DAT1_EVT_SPC_C2H", - GLBL_DSC_DAT1_EVT_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_EVT_SP_H2C", - GLBL_DSC_DAT1_EVT_SP_H2C_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_C2H", - GLBL_DSC_DAT1_DSC_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_H2C", - GLBL_DSC_DAT1_DSC_SPC_H2C_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_0_field_info[] = { - {"TRQ_SEL_FMAP_0_RSVD_1", - TRQ_SEL_FMAP_0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_0_QID_MAX", - TRQ_SEL_FMAP_0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_0_QID_BASE", - TRQ_SEL_FMAP_0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1_field_info[] = { - {"TRQ_SEL_FMAP_1_RSVD_1", - TRQ_SEL_FMAP_1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1_QID_MAX", - TRQ_SEL_FMAP_1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1_QID_BASE", - TRQ_SEL_FMAP_1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2_field_info[] = { - {"TRQ_SEL_FMAP_2_RSVD_1", - TRQ_SEL_FMAP_2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2_QID_MAX", - TRQ_SEL_FMAP_2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2_QID_BASE", - TRQ_SEL_FMAP_2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3_field_info[] = { - {"TRQ_SEL_FMAP_3_RSVD_1", - TRQ_SEL_FMAP_3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3_QID_MAX", - TRQ_SEL_FMAP_3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3_QID_BASE", - TRQ_SEL_FMAP_3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4_field_info[] = { - {"TRQ_SEL_FMAP_4_RSVD_1", - TRQ_SEL_FMAP_4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4_QID_MAX", - TRQ_SEL_FMAP_4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4_QID_BASE", - TRQ_SEL_FMAP_4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5_field_info[] = { - {"TRQ_SEL_FMAP_5_RSVD_1", - TRQ_SEL_FMAP_5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5_QID_MAX", - TRQ_SEL_FMAP_5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5_QID_BASE", - TRQ_SEL_FMAP_5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6_field_info[] = { - {"TRQ_SEL_FMAP_6_RSVD_1", - TRQ_SEL_FMAP_6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6_QID_MAX", - TRQ_SEL_FMAP_6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6_QID_BASE", - TRQ_SEL_FMAP_6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7_field_info[] = { - {"TRQ_SEL_FMAP_7_RSVD_1", - TRQ_SEL_FMAP_7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7_QID_MAX", - TRQ_SEL_FMAP_7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7_QID_BASE", - TRQ_SEL_FMAP_7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8_field_info[] = { - {"TRQ_SEL_FMAP_8_RSVD_1", - TRQ_SEL_FMAP_8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8_QID_MAX", - TRQ_SEL_FMAP_8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8_QID_BASE", - TRQ_SEL_FMAP_8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9_field_info[] = { - {"TRQ_SEL_FMAP_9_RSVD_1", - TRQ_SEL_FMAP_9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9_QID_MAX", - TRQ_SEL_FMAP_9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9_QID_BASE", - TRQ_SEL_FMAP_9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a_field_info[] = { - {"TRQ_SEL_FMAP_A_RSVD_1", - TRQ_SEL_FMAP_A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A_QID_MAX", - TRQ_SEL_FMAP_A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A_QID_BASE", - TRQ_SEL_FMAP_A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b_field_info[] = { - {"TRQ_SEL_FMAP_B_RSVD_1", - TRQ_SEL_FMAP_B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B_QID_MAX", - TRQ_SEL_FMAP_B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B_QID_BASE", - TRQ_SEL_FMAP_B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d_field_info[] = { - {"TRQ_SEL_FMAP_D_RSVD_1", - TRQ_SEL_FMAP_D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D_QID_MAX", - TRQ_SEL_FMAP_D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D_QID_BASE", - TRQ_SEL_FMAP_D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e_field_info[] = { - {"TRQ_SEL_FMAP_E_RSVD_1", - TRQ_SEL_FMAP_E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E_QID_MAX", - TRQ_SEL_FMAP_E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E_QID_BASE", - TRQ_SEL_FMAP_E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_f_field_info[] = { - {"TRQ_SEL_FMAP_F_RSVD_1", - TRQ_SEL_FMAP_F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_F_QID_MAX", - TRQ_SEL_FMAP_F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_F_QID_BASE", - TRQ_SEL_FMAP_F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_10_field_info[] = { - {"TRQ_SEL_FMAP_10_RSVD_1", - TRQ_SEL_FMAP_10_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_10_QID_MAX", - TRQ_SEL_FMAP_10_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_10_QID_BASE", - TRQ_SEL_FMAP_10_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_11_field_info[] = { - {"TRQ_SEL_FMAP_11_RSVD_1", - TRQ_SEL_FMAP_11_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_11_QID_MAX", - TRQ_SEL_FMAP_11_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_11_QID_BASE", - TRQ_SEL_FMAP_11_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_12_field_info[] = { - {"TRQ_SEL_FMAP_12_RSVD_1", - TRQ_SEL_FMAP_12_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_12_QID_MAX", - TRQ_SEL_FMAP_12_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_12_QID_BASE", - TRQ_SEL_FMAP_12_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_13_field_info[] = { - {"TRQ_SEL_FMAP_13_RSVD_1", - TRQ_SEL_FMAP_13_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_13_QID_MAX", - TRQ_SEL_FMAP_13_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_13_QID_BASE", - TRQ_SEL_FMAP_13_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_14_field_info[] = { - {"TRQ_SEL_FMAP_14_RSVD_1", - TRQ_SEL_FMAP_14_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_14_QID_MAX", - TRQ_SEL_FMAP_14_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_14_QID_BASE", - TRQ_SEL_FMAP_14_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_15_field_info[] = { - {"TRQ_SEL_FMAP_15_RSVD_1", - TRQ_SEL_FMAP_15_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_15_QID_MAX", - TRQ_SEL_FMAP_15_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_15_QID_BASE", - TRQ_SEL_FMAP_15_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_16_field_info[] = { - {"TRQ_SEL_FMAP_16_RSVD_1", - TRQ_SEL_FMAP_16_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_16_QID_MAX", - TRQ_SEL_FMAP_16_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_16_QID_BASE", - TRQ_SEL_FMAP_16_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_17_field_info[] = { - {"TRQ_SEL_FMAP_17_RSVD_1", - TRQ_SEL_FMAP_17_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_17_QID_MAX", - TRQ_SEL_FMAP_17_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_17_QID_BASE", - TRQ_SEL_FMAP_17_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_18_field_info[] = { - {"TRQ_SEL_FMAP_18_RSVD_1", - TRQ_SEL_FMAP_18_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_18_QID_MAX", - TRQ_SEL_FMAP_18_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_18_QID_BASE", - TRQ_SEL_FMAP_18_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_19_field_info[] = { - {"TRQ_SEL_FMAP_19_RSVD_1", - TRQ_SEL_FMAP_19_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_19_QID_MAX", - TRQ_SEL_FMAP_19_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_19_QID_BASE", - TRQ_SEL_FMAP_19_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1a_field_info[] = { - {"TRQ_SEL_FMAP_1A_RSVD_1", - TRQ_SEL_FMAP_1A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1A_QID_MAX", - TRQ_SEL_FMAP_1A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1A_QID_BASE", - TRQ_SEL_FMAP_1A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1b_field_info[] = { - {"TRQ_SEL_FMAP_1B_RSVD_1", - TRQ_SEL_FMAP_1B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1B_QID_MAX", - TRQ_SEL_FMAP_1B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1B_QID_BASE", - TRQ_SEL_FMAP_1B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1c_field_info[] = { - {"TRQ_SEL_FMAP_1C_RSVD_1", - TRQ_SEL_FMAP_1C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1C_QID_MAX", - TRQ_SEL_FMAP_1C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1C_QID_BASE", - TRQ_SEL_FMAP_1C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1d_field_info[] = { - {"TRQ_SEL_FMAP_1D_RSVD_1", - TRQ_SEL_FMAP_1D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1D_QID_MAX", - TRQ_SEL_FMAP_1D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1D_QID_BASE", - TRQ_SEL_FMAP_1D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1e_field_info[] = { - {"TRQ_SEL_FMAP_1E_RSVD_1", - TRQ_SEL_FMAP_1E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1E_QID_MAX", - TRQ_SEL_FMAP_1E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1E_QID_BASE", - TRQ_SEL_FMAP_1E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1f_field_info[] = { - {"TRQ_SEL_FMAP_1F_RSVD_1", - TRQ_SEL_FMAP_1F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1F_QID_MAX", - TRQ_SEL_FMAP_1F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1F_QID_BASE", - TRQ_SEL_FMAP_1F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_20_field_info[] = { - {"TRQ_SEL_FMAP_20_RSVD_1", - TRQ_SEL_FMAP_20_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_20_QID_MAX", - TRQ_SEL_FMAP_20_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_20_QID_BASE", - TRQ_SEL_FMAP_20_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_21_field_info[] = { - {"TRQ_SEL_FMAP_21_RSVD_1", - TRQ_SEL_FMAP_21_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_21_QID_MAX", - TRQ_SEL_FMAP_21_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_21_QID_BASE", - TRQ_SEL_FMAP_21_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_22_field_info[] = { - {"TRQ_SEL_FMAP_22_RSVD_1", - TRQ_SEL_FMAP_22_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_22_QID_MAX", - TRQ_SEL_FMAP_22_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_22_QID_BASE", - TRQ_SEL_FMAP_22_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_23_field_info[] = { - {"TRQ_SEL_FMAP_23_RSVD_1", - TRQ_SEL_FMAP_23_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_23_QID_MAX", - TRQ_SEL_FMAP_23_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_23_QID_BASE", - TRQ_SEL_FMAP_23_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_24_field_info[] = { - {"TRQ_SEL_FMAP_24_RSVD_1", - TRQ_SEL_FMAP_24_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_24_QID_MAX", - TRQ_SEL_FMAP_24_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_24_QID_BASE", - TRQ_SEL_FMAP_24_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_25_field_info[] = { - {"TRQ_SEL_FMAP_25_RSVD_1", - TRQ_SEL_FMAP_25_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_25_QID_MAX", - TRQ_SEL_FMAP_25_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_25_QID_BASE", - TRQ_SEL_FMAP_25_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_26_field_info[] = { - {"TRQ_SEL_FMAP_26_RSVD_1", - TRQ_SEL_FMAP_26_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_26_QID_MAX", - TRQ_SEL_FMAP_26_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_26_QID_BASE", - TRQ_SEL_FMAP_26_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_27_field_info[] = { - {"TRQ_SEL_FMAP_27_RSVD_1", - TRQ_SEL_FMAP_27_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_27_QID_MAX", - TRQ_SEL_FMAP_27_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_27_QID_BASE", - TRQ_SEL_FMAP_27_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_28_field_info[] = { - {"TRQ_SEL_FMAP_28_RSVD_1", - TRQ_SEL_FMAP_28_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_28_QID_MAX", - TRQ_SEL_FMAP_28_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_28_QID_BASE", - TRQ_SEL_FMAP_28_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_29_field_info[] = { - {"TRQ_SEL_FMAP_29_RSVD_1", - TRQ_SEL_FMAP_29_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_29_QID_MAX", - TRQ_SEL_FMAP_29_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_29_QID_BASE", - TRQ_SEL_FMAP_29_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2a_field_info[] = { - {"TRQ_SEL_FMAP_2A_RSVD_1", - TRQ_SEL_FMAP_2A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2A_QID_MAX", - TRQ_SEL_FMAP_2A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2A_QID_BASE", - TRQ_SEL_FMAP_2A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2b_field_info[] = { - {"TRQ_SEL_FMAP_2B_RSVD_1", - TRQ_SEL_FMAP_2B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2B_QID_MAX", - TRQ_SEL_FMAP_2B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2B_QID_BASE", - TRQ_SEL_FMAP_2B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2c_field_info[] = { - {"TRQ_SEL_FMAP_2C_RSVD_1", - TRQ_SEL_FMAP_2C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2C_QID_MAX", - TRQ_SEL_FMAP_2C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2C_QID_BASE", - TRQ_SEL_FMAP_2C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2d_field_info[] = { - {"TRQ_SEL_FMAP_2D_RSVD_1", - TRQ_SEL_FMAP_2D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2D_QID_MAX", - TRQ_SEL_FMAP_2D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2D_QID_BASE", - TRQ_SEL_FMAP_2D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2e_field_info[] = { - {"TRQ_SEL_FMAP_2E_RSVD_1", - TRQ_SEL_FMAP_2E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2E_QID_MAX", - TRQ_SEL_FMAP_2E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2E_QID_BASE", - TRQ_SEL_FMAP_2E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2f_field_info[] = { - {"TRQ_SEL_FMAP_2F_RSVD_1", - TRQ_SEL_FMAP_2F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2F_QID_MAX", - TRQ_SEL_FMAP_2F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2F_QID_BASE", - TRQ_SEL_FMAP_2F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_30_field_info[] = { - {"TRQ_SEL_FMAP_30_RSVD_1", - TRQ_SEL_FMAP_30_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_30_QID_MAX", - TRQ_SEL_FMAP_30_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_30_QID_BASE", - TRQ_SEL_FMAP_30_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_31_field_info[] = { - {"TRQ_SEL_FMAP_31_RSVD_1", - TRQ_SEL_FMAP_31_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_31_QID_MAX", - TRQ_SEL_FMAP_31_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_31_QID_BASE", - TRQ_SEL_FMAP_31_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_32_field_info[] = { - {"TRQ_SEL_FMAP_32_RSVD_1", - TRQ_SEL_FMAP_32_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_32_QID_MAX", - TRQ_SEL_FMAP_32_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_32_QID_BASE", - TRQ_SEL_FMAP_32_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_33_field_info[] = { - {"TRQ_SEL_FMAP_33_RSVD_1", - TRQ_SEL_FMAP_33_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_33_QID_MAX", - TRQ_SEL_FMAP_33_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_33_QID_BASE", - TRQ_SEL_FMAP_33_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_34_field_info[] = { - {"TRQ_SEL_FMAP_34_RSVD_1", - TRQ_SEL_FMAP_34_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_34_QID_MAX", - TRQ_SEL_FMAP_34_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_34_QID_BASE", - TRQ_SEL_FMAP_34_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_35_field_info[] = { - {"TRQ_SEL_FMAP_35_RSVD_1", - TRQ_SEL_FMAP_35_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_35_QID_MAX", - TRQ_SEL_FMAP_35_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_35_QID_BASE", - TRQ_SEL_FMAP_35_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_36_field_info[] = { - {"TRQ_SEL_FMAP_36_RSVD_1", - TRQ_SEL_FMAP_36_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_36_QID_MAX", - TRQ_SEL_FMAP_36_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_36_QID_BASE", - TRQ_SEL_FMAP_36_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_37_field_info[] = { - {"TRQ_SEL_FMAP_37_RSVD_1", - TRQ_SEL_FMAP_37_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_37_QID_MAX", - TRQ_SEL_FMAP_37_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_37_QID_BASE", - TRQ_SEL_FMAP_37_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_38_field_info[] = { - {"TRQ_SEL_FMAP_38_RSVD_1", - TRQ_SEL_FMAP_38_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_38_QID_MAX", - TRQ_SEL_FMAP_38_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_38_QID_BASE", - TRQ_SEL_FMAP_38_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_39_field_info[] = { - {"TRQ_SEL_FMAP_39_RSVD_1", - TRQ_SEL_FMAP_39_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_39_QID_MAX", - TRQ_SEL_FMAP_39_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_39_QID_BASE", - TRQ_SEL_FMAP_39_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3a_field_info[] = { - {"TRQ_SEL_FMAP_3A_RSVD_1", - TRQ_SEL_FMAP_3A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3A_QID_MAX", - TRQ_SEL_FMAP_3A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3A_QID_BASE", - TRQ_SEL_FMAP_3A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3b_field_info[] = { - {"TRQ_SEL_FMAP_3B_RSVD_1", - TRQ_SEL_FMAP_3B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3B_QID_MAX", - TRQ_SEL_FMAP_3B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3B_QID_BASE", - TRQ_SEL_FMAP_3B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3c_field_info[] = { - {"TRQ_SEL_FMAP_3C_RSVD_1", - TRQ_SEL_FMAP_3C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3C_QID_MAX", - TRQ_SEL_FMAP_3C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3C_QID_BASE", - TRQ_SEL_FMAP_3C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3d_field_info[] = { - {"TRQ_SEL_FMAP_3D_RSVD_1", - TRQ_SEL_FMAP_3D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3D_QID_MAX", - TRQ_SEL_FMAP_3D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3D_QID_BASE", - TRQ_SEL_FMAP_3D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3e_field_info[] = { - {"TRQ_SEL_FMAP_3E_RSVD_1", - TRQ_SEL_FMAP_3E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3E_QID_MAX", - TRQ_SEL_FMAP_3E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3E_QID_BASE", - TRQ_SEL_FMAP_3E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3f_field_info[] = { - {"TRQ_SEL_FMAP_3F_RSVD_1", - TRQ_SEL_FMAP_3F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3F_QID_MAX", - TRQ_SEL_FMAP_3F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3F_QID_BASE", - TRQ_SEL_FMAP_3F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_40_field_info[] = { - {"TRQ_SEL_FMAP_40_RSVD_1", - TRQ_SEL_FMAP_40_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_40_QID_MAX", - TRQ_SEL_FMAP_40_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_40_QID_BASE", - TRQ_SEL_FMAP_40_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_41_field_info[] = { - {"TRQ_SEL_FMAP_41_RSVD_1", - TRQ_SEL_FMAP_41_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_41_QID_MAX", - TRQ_SEL_FMAP_41_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_41_QID_BASE", - TRQ_SEL_FMAP_41_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_42_field_info[] = { - {"TRQ_SEL_FMAP_42_RSVD_1", - TRQ_SEL_FMAP_42_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_42_QID_MAX", - TRQ_SEL_FMAP_42_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_42_QID_BASE", - TRQ_SEL_FMAP_42_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_43_field_info[] = { - {"TRQ_SEL_FMAP_43_RSVD_1", - TRQ_SEL_FMAP_43_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_43_QID_MAX", - TRQ_SEL_FMAP_43_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_43_QID_BASE", - TRQ_SEL_FMAP_43_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_44_field_info[] = { - {"TRQ_SEL_FMAP_44_RSVD_1", - TRQ_SEL_FMAP_44_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_44_QID_MAX", - TRQ_SEL_FMAP_44_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_44_QID_BASE", - TRQ_SEL_FMAP_44_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_45_field_info[] = { - {"TRQ_SEL_FMAP_45_RSVD_1", - TRQ_SEL_FMAP_45_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_45_QID_MAX", - TRQ_SEL_FMAP_45_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_45_QID_BASE", - TRQ_SEL_FMAP_45_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_46_field_info[] = { - {"TRQ_SEL_FMAP_46_RSVD_1", - TRQ_SEL_FMAP_46_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_46_QID_MAX", - TRQ_SEL_FMAP_46_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_46_QID_BASE", - TRQ_SEL_FMAP_46_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_47_field_info[] = { - {"TRQ_SEL_FMAP_47_RSVD_1", - TRQ_SEL_FMAP_47_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_47_QID_MAX", - TRQ_SEL_FMAP_47_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_47_QID_BASE", - TRQ_SEL_FMAP_47_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_48_field_info[] = { - {"TRQ_SEL_FMAP_48_RSVD_1", - TRQ_SEL_FMAP_48_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_48_QID_MAX", - TRQ_SEL_FMAP_48_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_48_QID_BASE", - TRQ_SEL_FMAP_48_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_49_field_info[] = { - {"TRQ_SEL_FMAP_49_RSVD_1", - TRQ_SEL_FMAP_49_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_49_QID_MAX", - TRQ_SEL_FMAP_49_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_49_QID_BASE", - TRQ_SEL_FMAP_49_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4a_field_info[] = { - {"TRQ_SEL_FMAP_4A_RSVD_1", - TRQ_SEL_FMAP_4A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4A_QID_MAX", - TRQ_SEL_FMAP_4A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4A_QID_BASE", - TRQ_SEL_FMAP_4A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4b_field_info[] = { - {"TRQ_SEL_FMAP_4B_RSVD_1", - TRQ_SEL_FMAP_4B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4B_QID_MAX", - TRQ_SEL_FMAP_4B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4B_QID_BASE", - TRQ_SEL_FMAP_4B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4c_field_info[] = { - {"TRQ_SEL_FMAP_4C_RSVD_1", - TRQ_SEL_FMAP_4C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4C_QID_MAX", - TRQ_SEL_FMAP_4C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4C_QID_BASE", - TRQ_SEL_FMAP_4C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4d_field_info[] = { - {"TRQ_SEL_FMAP_4D_RSVD_1", - TRQ_SEL_FMAP_4D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4D_QID_MAX", - TRQ_SEL_FMAP_4D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4D_QID_BASE", - TRQ_SEL_FMAP_4D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4e_field_info[] = { - {"TRQ_SEL_FMAP_4E_RSVD_1", - TRQ_SEL_FMAP_4E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4E_QID_MAX", - TRQ_SEL_FMAP_4E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4E_QID_BASE", - TRQ_SEL_FMAP_4E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4f_field_info[] = { - {"TRQ_SEL_FMAP_4F_RSVD_1", - TRQ_SEL_FMAP_4F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4F_QID_MAX", - TRQ_SEL_FMAP_4F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4F_QID_BASE", - TRQ_SEL_FMAP_4F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_50_field_info[] = { - {"TRQ_SEL_FMAP_50_RSVD_1", - TRQ_SEL_FMAP_50_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_50_QID_MAX", - TRQ_SEL_FMAP_50_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_50_QID_BASE", - TRQ_SEL_FMAP_50_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_51_field_info[] = { - {"TRQ_SEL_FMAP_51_RSVD_1", - TRQ_SEL_FMAP_51_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_51_QID_MAX", - TRQ_SEL_FMAP_51_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_51_QID_BASE", - TRQ_SEL_FMAP_51_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_52_field_info[] = { - {"TRQ_SEL_FMAP_52_RSVD_1", - TRQ_SEL_FMAP_52_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_52_QID_MAX", - TRQ_SEL_FMAP_52_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_52_QID_BASE", - TRQ_SEL_FMAP_52_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_53_field_info[] = { - {"TRQ_SEL_FMAP_53_RSVD_1", - TRQ_SEL_FMAP_53_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_53_QID_MAX", - TRQ_SEL_FMAP_53_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_53_QID_BASE", - TRQ_SEL_FMAP_53_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_54_field_info[] = { - {"TRQ_SEL_FMAP_54_RSVD_1", - TRQ_SEL_FMAP_54_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_54_QID_MAX", - TRQ_SEL_FMAP_54_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_54_QID_BASE", - TRQ_SEL_FMAP_54_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_55_field_info[] = { - {"TRQ_SEL_FMAP_55_RSVD_1", - TRQ_SEL_FMAP_55_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_55_QID_MAX", - TRQ_SEL_FMAP_55_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_55_QID_BASE", - TRQ_SEL_FMAP_55_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_56_field_info[] = { - {"TRQ_SEL_FMAP_56_RSVD_1", - TRQ_SEL_FMAP_56_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_56_QID_MAX", - TRQ_SEL_FMAP_56_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_56_QID_BASE", - TRQ_SEL_FMAP_56_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_57_field_info[] = { - {"TRQ_SEL_FMAP_57_RSVD_1", - TRQ_SEL_FMAP_57_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_57_QID_MAX", - TRQ_SEL_FMAP_57_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_57_QID_BASE", - TRQ_SEL_FMAP_57_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_58_field_info[] = { - {"TRQ_SEL_FMAP_58_RSVD_1", - TRQ_SEL_FMAP_58_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_58_QID_MAX", - TRQ_SEL_FMAP_58_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_58_QID_BASE", - TRQ_SEL_FMAP_58_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_59_field_info[] = { - {"TRQ_SEL_FMAP_59_RSVD_1", - TRQ_SEL_FMAP_59_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_59_QID_MAX", - TRQ_SEL_FMAP_59_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_59_QID_BASE", - TRQ_SEL_FMAP_59_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5a_field_info[] = { - {"TRQ_SEL_FMAP_5A_RSVD_1", - TRQ_SEL_FMAP_5A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5A_QID_MAX", - TRQ_SEL_FMAP_5A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5A_QID_BASE", - TRQ_SEL_FMAP_5A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5b_field_info[] = { - {"TRQ_SEL_FMAP_5B_RSVD_1", - TRQ_SEL_FMAP_5B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5B_QID_MAX", - TRQ_SEL_FMAP_5B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5B_QID_BASE", - TRQ_SEL_FMAP_5B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5c_field_info[] = { - {"TRQ_SEL_FMAP_5C_RSVD_1", - TRQ_SEL_FMAP_5C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5C_QID_MAX", - TRQ_SEL_FMAP_5C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5C_QID_BASE", - TRQ_SEL_FMAP_5C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5d_field_info[] = { - {"TRQ_SEL_FMAP_5D_RSVD_1", - TRQ_SEL_FMAP_5D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5D_QID_MAX", - TRQ_SEL_FMAP_5D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5D_QID_BASE", - TRQ_SEL_FMAP_5D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5e_field_info[] = { - {"TRQ_SEL_FMAP_5E_RSVD_1", - TRQ_SEL_FMAP_5E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5E_QID_MAX", - TRQ_SEL_FMAP_5E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5E_QID_BASE", - TRQ_SEL_FMAP_5E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5f_field_info[] = { - {"TRQ_SEL_FMAP_5F_RSVD_1", - TRQ_SEL_FMAP_5F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5F_QID_MAX", - TRQ_SEL_FMAP_5F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5F_QID_BASE", - TRQ_SEL_FMAP_5F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_60_field_info[] = { - {"TRQ_SEL_FMAP_60_RSVD_1", - TRQ_SEL_FMAP_60_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_60_QID_MAX", - TRQ_SEL_FMAP_60_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_60_QID_BASE", - TRQ_SEL_FMAP_60_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_61_field_info[] = { - {"TRQ_SEL_FMAP_61_RSVD_1", - TRQ_SEL_FMAP_61_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_61_QID_MAX", - TRQ_SEL_FMAP_61_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_61_QID_BASE", - TRQ_SEL_FMAP_61_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_62_field_info[] = { - {"TRQ_SEL_FMAP_62_RSVD_1", - TRQ_SEL_FMAP_62_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_62_QID_MAX", - TRQ_SEL_FMAP_62_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_62_QID_BASE", - TRQ_SEL_FMAP_62_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_63_field_info[] = { - {"TRQ_SEL_FMAP_63_RSVD_1", - TRQ_SEL_FMAP_63_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_63_QID_MAX", - TRQ_SEL_FMAP_63_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_63_QID_BASE", - TRQ_SEL_FMAP_63_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_64_field_info[] = { - {"TRQ_SEL_FMAP_64_RSVD_1", - TRQ_SEL_FMAP_64_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_64_QID_MAX", - TRQ_SEL_FMAP_64_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_64_QID_BASE", - TRQ_SEL_FMAP_64_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_65_field_info[] = { - {"TRQ_SEL_FMAP_65_RSVD_1", - TRQ_SEL_FMAP_65_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_65_QID_MAX", - TRQ_SEL_FMAP_65_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_65_QID_BASE", - TRQ_SEL_FMAP_65_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_66_field_info[] = { - {"TRQ_SEL_FMAP_66_RSVD_1", - TRQ_SEL_FMAP_66_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_66_QID_MAX", - TRQ_SEL_FMAP_66_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_66_QID_BASE", - TRQ_SEL_FMAP_66_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_67_field_info[] = { - {"TRQ_SEL_FMAP_67_RSVD_1", - TRQ_SEL_FMAP_67_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_67_QID_MAX", - TRQ_SEL_FMAP_67_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_67_QID_BASE", - TRQ_SEL_FMAP_67_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_68_field_info[] = { - {"TRQ_SEL_FMAP_68_RSVD_1", - TRQ_SEL_FMAP_68_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_68_QID_MAX", - TRQ_SEL_FMAP_68_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_68_QID_BASE", - TRQ_SEL_FMAP_68_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_69_field_info[] = { - {"TRQ_SEL_FMAP_69_RSVD_1", - TRQ_SEL_FMAP_69_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_69_QID_MAX", - TRQ_SEL_FMAP_69_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_69_QID_BASE", - TRQ_SEL_FMAP_69_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6a_field_info[] = { - {"TRQ_SEL_FMAP_6A_RSVD_1", - TRQ_SEL_FMAP_6A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6A_QID_MAX", - TRQ_SEL_FMAP_6A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6A_QID_BASE", - TRQ_SEL_FMAP_6A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6b_field_info[] = { - {"TRQ_SEL_FMAP_6B_RSVD_1", - TRQ_SEL_FMAP_6B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6B_QID_MAX", - TRQ_SEL_FMAP_6B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6B_QID_BASE", - TRQ_SEL_FMAP_6B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6c_field_info[] = { - {"TRQ_SEL_FMAP_6C_RSVD_1", - TRQ_SEL_FMAP_6C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6C_QID_MAX", - TRQ_SEL_FMAP_6C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6C_QID_BASE", - TRQ_SEL_FMAP_6C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6d_field_info[] = { - {"TRQ_SEL_FMAP_6D_RSVD_1", - TRQ_SEL_FMAP_6D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6D_QID_MAX", - TRQ_SEL_FMAP_6D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6D_QID_BASE", - TRQ_SEL_FMAP_6D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6e_field_info[] = { - {"TRQ_SEL_FMAP_6E_RSVD_1", - TRQ_SEL_FMAP_6E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6E_QID_MAX", - TRQ_SEL_FMAP_6E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6E_QID_BASE", - TRQ_SEL_FMAP_6E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6f_field_info[] = { - {"TRQ_SEL_FMAP_6F_RSVD_1", - TRQ_SEL_FMAP_6F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6F_QID_MAX", - TRQ_SEL_FMAP_6F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6F_QID_BASE", - TRQ_SEL_FMAP_6F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_70_field_info[] = { - {"TRQ_SEL_FMAP_70_RSVD_1", - TRQ_SEL_FMAP_70_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_70_QID_MAX", - TRQ_SEL_FMAP_70_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_70_QID_BASE", - TRQ_SEL_FMAP_70_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_71_field_info[] = { - {"TRQ_SEL_FMAP_71_RSVD_1", - TRQ_SEL_FMAP_71_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_71_QID_MAX", - TRQ_SEL_FMAP_71_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_71_QID_BASE", - TRQ_SEL_FMAP_71_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_72_field_info[] = { - {"TRQ_SEL_FMAP_72_RSVD_1", - TRQ_SEL_FMAP_72_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_72_QID_MAX", - TRQ_SEL_FMAP_72_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_72_QID_BASE", - TRQ_SEL_FMAP_72_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_73_field_info[] = { - {"TRQ_SEL_FMAP_73_RSVD_1", - TRQ_SEL_FMAP_73_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_73_QID_MAX", - TRQ_SEL_FMAP_73_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_73_QID_BASE", - TRQ_SEL_FMAP_73_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_74_field_info[] = { - {"TRQ_SEL_FMAP_74_RSVD_1", - TRQ_SEL_FMAP_74_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_74_QID_MAX", - TRQ_SEL_FMAP_74_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_74_QID_BASE", - TRQ_SEL_FMAP_74_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_75_field_info[] = { - {"TRQ_SEL_FMAP_75_RSVD_1", - TRQ_SEL_FMAP_75_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_75_QID_MAX", - TRQ_SEL_FMAP_75_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_75_QID_BASE", - TRQ_SEL_FMAP_75_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_76_field_info[] = { - {"TRQ_SEL_FMAP_76_RSVD_1", - TRQ_SEL_FMAP_76_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_76_QID_MAX", - TRQ_SEL_FMAP_76_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_76_QID_BASE", - TRQ_SEL_FMAP_76_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_77_field_info[] = { - {"TRQ_SEL_FMAP_77_RSVD_1", - TRQ_SEL_FMAP_77_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_77_QID_MAX", - TRQ_SEL_FMAP_77_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_77_QID_BASE", - TRQ_SEL_FMAP_77_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_78_field_info[] = { - {"TRQ_SEL_FMAP_78_RSVD_1", - TRQ_SEL_FMAP_78_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_78_QID_MAX", - TRQ_SEL_FMAP_78_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_78_QID_BASE", - TRQ_SEL_FMAP_78_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_79_field_info[] = { - {"TRQ_SEL_FMAP_79_RSVD_1", - TRQ_SEL_FMAP_79_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_79_QID_MAX", - TRQ_SEL_FMAP_79_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_79_QID_BASE", - TRQ_SEL_FMAP_79_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7a_field_info[] = { - {"TRQ_SEL_FMAP_7A_RSVD_1", - TRQ_SEL_FMAP_7A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7A_QID_MAX", - TRQ_SEL_FMAP_7A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7A_QID_BASE", - TRQ_SEL_FMAP_7A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7b_field_info[] = { - {"TRQ_SEL_FMAP_7B_RSVD_1", - TRQ_SEL_FMAP_7B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7B_QID_MAX", - TRQ_SEL_FMAP_7B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7B_QID_BASE", - TRQ_SEL_FMAP_7B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7c_field_info[] = { - {"TRQ_SEL_FMAP_7C_RSVD_1", - TRQ_SEL_FMAP_7C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7C_QID_MAX", - TRQ_SEL_FMAP_7C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7C_QID_BASE", - TRQ_SEL_FMAP_7C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7d_field_info[] = { - {"TRQ_SEL_FMAP_7D_RSVD_1", - TRQ_SEL_FMAP_7D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7D_QID_MAX", - TRQ_SEL_FMAP_7D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7D_QID_BASE", - TRQ_SEL_FMAP_7D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7e_field_info[] = { - {"TRQ_SEL_FMAP_7E_RSVD_1", - TRQ_SEL_FMAP_7E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7E_QID_MAX", - TRQ_SEL_FMAP_7E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7E_QID_BASE", - TRQ_SEL_FMAP_7E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7f_field_info[] = { - {"TRQ_SEL_FMAP_7F_RSVD_1", - TRQ_SEL_FMAP_7F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7F_QID_MAX", - TRQ_SEL_FMAP_7F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7F_QID_BASE", - TRQ_SEL_FMAP_7F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_80_field_info[] = { - {"TRQ_SEL_FMAP_80_RSVD_1", - TRQ_SEL_FMAP_80_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_80_QID_MAX", - TRQ_SEL_FMAP_80_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_80_QID_BASE", - TRQ_SEL_FMAP_80_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_81_field_info[] = { - {"TRQ_SEL_FMAP_81_RSVD_1", - TRQ_SEL_FMAP_81_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_81_QID_MAX", - TRQ_SEL_FMAP_81_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_81_QID_BASE", - TRQ_SEL_FMAP_81_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_82_field_info[] = { - {"TRQ_SEL_FMAP_82_RSVD_1", - TRQ_SEL_FMAP_82_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_82_QID_MAX", - TRQ_SEL_FMAP_82_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_82_QID_BASE", - TRQ_SEL_FMAP_82_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_83_field_info[] = { - {"TRQ_SEL_FMAP_83_RSVD_1", - TRQ_SEL_FMAP_83_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_83_QID_MAX", - TRQ_SEL_FMAP_83_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_83_QID_BASE", - TRQ_SEL_FMAP_83_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_84_field_info[] = { - {"TRQ_SEL_FMAP_84_RSVD_1", - TRQ_SEL_FMAP_84_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_84_QID_MAX", - TRQ_SEL_FMAP_84_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_84_QID_BASE", - TRQ_SEL_FMAP_84_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_85_field_info[] = { - {"TRQ_SEL_FMAP_85_RSVD_1", - TRQ_SEL_FMAP_85_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_85_QID_MAX", - TRQ_SEL_FMAP_85_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_85_QID_BASE", - TRQ_SEL_FMAP_85_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_86_field_info[] = { - {"TRQ_SEL_FMAP_86_RSVD_1", - TRQ_SEL_FMAP_86_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_86_QID_MAX", - TRQ_SEL_FMAP_86_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_86_QID_BASE", - TRQ_SEL_FMAP_86_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_87_field_info[] = { - {"TRQ_SEL_FMAP_87_RSVD_1", - TRQ_SEL_FMAP_87_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_87_QID_MAX", - TRQ_SEL_FMAP_87_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_87_QID_BASE", - TRQ_SEL_FMAP_87_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_88_field_info[] = { - {"TRQ_SEL_FMAP_88_RSVD_1", - TRQ_SEL_FMAP_88_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_88_QID_MAX", - TRQ_SEL_FMAP_88_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_88_QID_BASE", - TRQ_SEL_FMAP_88_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_89_field_info[] = { - {"TRQ_SEL_FMAP_89_RSVD_1", - TRQ_SEL_FMAP_89_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_89_QID_MAX", - TRQ_SEL_FMAP_89_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_89_QID_BASE", - TRQ_SEL_FMAP_89_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8a_field_info[] = { - {"TRQ_SEL_FMAP_8A_RSVD_1", - TRQ_SEL_FMAP_8A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8A_QID_MAX", - TRQ_SEL_FMAP_8A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8A_QID_BASE", - TRQ_SEL_FMAP_8A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8b_field_info[] = { - {"TRQ_SEL_FMAP_8B_RSVD_1", - TRQ_SEL_FMAP_8B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8B_QID_MAX", - TRQ_SEL_FMAP_8B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8B_QID_BASE", - TRQ_SEL_FMAP_8B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8c_field_info[] = { - {"TRQ_SEL_FMAP_8C_RSVD_1", - TRQ_SEL_FMAP_8C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8C_QID_MAX", - TRQ_SEL_FMAP_8C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8C_QID_BASE", - TRQ_SEL_FMAP_8C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8d_field_info[] = { - {"TRQ_SEL_FMAP_8D_RSVD_1", - TRQ_SEL_FMAP_8D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8D_QID_MAX", - TRQ_SEL_FMAP_8D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8D_QID_BASE", - TRQ_SEL_FMAP_8D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8e_field_info[] = { - {"TRQ_SEL_FMAP_8E_RSVD_1", - TRQ_SEL_FMAP_8E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8E_QID_MAX", - TRQ_SEL_FMAP_8E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8E_QID_BASE", - TRQ_SEL_FMAP_8E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8f_field_info[] = { - {"TRQ_SEL_FMAP_8F_RSVD_1", - TRQ_SEL_FMAP_8F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8F_QID_MAX", - TRQ_SEL_FMAP_8F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8F_QID_BASE", - TRQ_SEL_FMAP_8F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_90_field_info[] = { - {"TRQ_SEL_FMAP_90_RSVD_1", - TRQ_SEL_FMAP_90_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_90_QID_MAX", - TRQ_SEL_FMAP_90_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_90_QID_BASE", - TRQ_SEL_FMAP_90_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_91_field_info[] = { - {"TRQ_SEL_FMAP_91_RSVD_1", - TRQ_SEL_FMAP_91_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_91_QID_MAX", - TRQ_SEL_FMAP_91_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_91_QID_BASE", - TRQ_SEL_FMAP_91_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_92_field_info[] = { - {"TRQ_SEL_FMAP_92_RSVD_1", - TRQ_SEL_FMAP_92_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_92_QID_MAX", - TRQ_SEL_FMAP_92_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_92_QID_BASE", - TRQ_SEL_FMAP_92_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_93_field_info[] = { - {"TRQ_SEL_FMAP_93_RSVD_1", - TRQ_SEL_FMAP_93_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_93_QID_MAX", - TRQ_SEL_FMAP_93_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_93_QID_BASE", - TRQ_SEL_FMAP_93_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_94_field_info[] = { - {"TRQ_SEL_FMAP_94_RSVD_1", - TRQ_SEL_FMAP_94_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_94_QID_MAX", - TRQ_SEL_FMAP_94_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_94_QID_BASE", - TRQ_SEL_FMAP_94_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_95_field_info[] = { - {"TRQ_SEL_FMAP_95_RSVD_1", - TRQ_SEL_FMAP_95_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_95_QID_MAX", - TRQ_SEL_FMAP_95_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_95_QID_BASE", - TRQ_SEL_FMAP_95_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_96_field_info[] = { - {"TRQ_SEL_FMAP_96_RSVD_1", - TRQ_SEL_FMAP_96_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_96_QID_MAX", - TRQ_SEL_FMAP_96_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_96_QID_BASE", - TRQ_SEL_FMAP_96_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_97_field_info[] = { - {"TRQ_SEL_FMAP_97_RSVD_1", - TRQ_SEL_FMAP_97_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_97_QID_MAX", - TRQ_SEL_FMAP_97_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_97_QID_BASE", - TRQ_SEL_FMAP_97_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_98_field_info[] = { - {"TRQ_SEL_FMAP_98_RSVD_1", - TRQ_SEL_FMAP_98_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_98_QID_MAX", - TRQ_SEL_FMAP_98_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_98_QID_BASE", - TRQ_SEL_FMAP_98_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_99_field_info[] = { - {"TRQ_SEL_FMAP_99_RSVD_1", - TRQ_SEL_FMAP_99_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_99_QID_MAX", - TRQ_SEL_FMAP_99_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_99_QID_BASE", - TRQ_SEL_FMAP_99_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9a_field_info[] = { - {"TRQ_SEL_FMAP_9A_RSVD_1", - TRQ_SEL_FMAP_9A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9A_QID_MAX", - TRQ_SEL_FMAP_9A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9A_QID_BASE", - TRQ_SEL_FMAP_9A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9b_field_info[] = { - {"TRQ_SEL_FMAP_9B_RSVD_1", - TRQ_SEL_FMAP_9B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9B_QID_MAX", - TRQ_SEL_FMAP_9B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9B_QID_BASE", - TRQ_SEL_FMAP_9B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9c_field_info[] = { - {"TRQ_SEL_FMAP_9C_RSVD_1", - TRQ_SEL_FMAP_9C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9C_QID_MAX", - TRQ_SEL_FMAP_9C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9C_QID_BASE", - TRQ_SEL_FMAP_9C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9d_field_info[] = { - {"TRQ_SEL_FMAP_9D_RSVD_1", - TRQ_SEL_FMAP_9D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9D_QID_MAX", - TRQ_SEL_FMAP_9D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9D_QID_BASE", - TRQ_SEL_FMAP_9D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9e_field_info[] = { - {"TRQ_SEL_FMAP_9E_RSVD_1", - TRQ_SEL_FMAP_9E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9E_QID_MAX", - TRQ_SEL_FMAP_9E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9E_QID_BASE", - TRQ_SEL_FMAP_9E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9f_field_info[] = { - {"TRQ_SEL_FMAP_9F_RSVD_1", - TRQ_SEL_FMAP_9F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9F_QID_MAX", - TRQ_SEL_FMAP_9F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9F_QID_BASE", - TRQ_SEL_FMAP_9F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a0_field_info[] = { - {"TRQ_SEL_FMAP_A0_RSVD_1", - TRQ_SEL_FMAP_A0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A0_QID_MAX", - TRQ_SEL_FMAP_A0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A0_QID_BASE", - TRQ_SEL_FMAP_A0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a1_field_info[] = { - {"TRQ_SEL_FMAP_A1_RSVD_1", - TRQ_SEL_FMAP_A1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A1_QID_MAX", - TRQ_SEL_FMAP_A1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A1_QID_BASE", - TRQ_SEL_FMAP_A1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a2_field_info[] = { - {"TRQ_SEL_FMAP_A2_RSVD_1", - TRQ_SEL_FMAP_A2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A2_QID_MAX", - TRQ_SEL_FMAP_A2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A2_QID_BASE", - TRQ_SEL_FMAP_A2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a3_field_info[] = { - {"TRQ_SEL_FMAP_A3_RSVD_1", - TRQ_SEL_FMAP_A3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A3_QID_MAX", - TRQ_SEL_FMAP_A3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A3_QID_BASE", - TRQ_SEL_FMAP_A3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a4_field_info[] = { - {"TRQ_SEL_FMAP_A4_RSVD_1", - TRQ_SEL_FMAP_A4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A4_QID_MAX", - TRQ_SEL_FMAP_A4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A4_QID_BASE", - TRQ_SEL_FMAP_A4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a5_field_info[] = { - {"TRQ_SEL_FMAP_A5_RSVD_1", - TRQ_SEL_FMAP_A5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A5_QID_MAX", - TRQ_SEL_FMAP_A5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A5_QID_BASE", - TRQ_SEL_FMAP_A5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a6_field_info[] = { - {"TRQ_SEL_FMAP_A6_RSVD_1", - TRQ_SEL_FMAP_A6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A6_QID_MAX", - TRQ_SEL_FMAP_A6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A6_QID_BASE", - TRQ_SEL_FMAP_A6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a7_field_info[] = { - {"TRQ_SEL_FMAP_A7_RSVD_1", - TRQ_SEL_FMAP_A7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A7_QID_MAX", - TRQ_SEL_FMAP_A7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A7_QID_BASE", - TRQ_SEL_FMAP_A7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a8_field_info[] = { - {"TRQ_SEL_FMAP_A8_RSVD_1", - TRQ_SEL_FMAP_A8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A8_QID_MAX", - TRQ_SEL_FMAP_A8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A8_QID_BASE", - TRQ_SEL_FMAP_A8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a9_field_info[] = { - {"TRQ_SEL_FMAP_A9_RSVD_1", - TRQ_SEL_FMAP_A9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A9_QID_MAX", - TRQ_SEL_FMAP_A9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A9_QID_BASE", - TRQ_SEL_FMAP_A9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_aa_field_info[] = { - {"TRQ_SEL_FMAP_AA_RSVD_1", - TRQ_SEL_FMAP_AA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AA_QID_MAX", - TRQ_SEL_FMAP_AA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AA_QID_BASE", - TRQ_SEL_FMAP_AA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ab_field_info[] = { - {"TRQ_SEL_FMAP_AB_RSVD_1", - TRQ_SEL_FMAP_AB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AB_QID_MAX", - TRQ_SEL_FMAP_AB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AB_QID_BASE", - TRQ_SEL_FMAP_AB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ac_field_info[] = { - {"TRQ_SEL_FMAP_AC_RSVD_1", - TRQ_SEL_FMAP_AC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AC_QID_MAX", - TRQ_SEL_FMAP_AC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AC_QID_BASE", - TRQ_SEL_FMAP_AC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ad_field_info[] = { - {"TRQ_SEL_FMAP_AD_RSVD_1", - TRQ_SEL_FMAP_AD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AD_QID_MAX", - TRQ_SEL_FMAP_AD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AD_QID_BASE", - TRQ_SEL_FMAP_AD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ae_field_info[] = { - {"TRQ_SEL_FMAP_AE_RSVD_1", - TRQ_SEL_FMAP_AE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AE_QID_MAX", - TRQ_SEL_FMAP_AE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AE_QID_BASE", - TRQ_SEL_FMAP_AE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_af_field_info[] = { - {"TRQ_SEL_FMAP_AF_RSVD_1", - TRQ_SEL_FMAP_AF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AF_QID_MAX", - TRQ_SEL_FMAP_AF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AF_QID_BASE", - TRQ_SEL_FMAP_AF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b0_field_info[] = { - {"TRQ_SEL_FMAP_B0_RSVD_1", - TRQ_SEL_FMAP_B0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B0_QID_MAX", - TRQ_SEL_FMAP_B0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B0_QID_BASE", - TRQ_SEL_FMAP_B0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b1_field_info[] = { - {"TRQ_SEL_FMAP_B1_RSVD_1", - TRQ_SEL_FMAP_B1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B1_QID_MAX", - TRQ_SEL_FMAP_B1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B1_QID_BASE", - TRQ_SEL_FMAP_B1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b2_field_info[] = { - {"TRQ_SEL_FMAP_B2_RSVD_1", - TRQ_SEL_FMAP_B2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B2_QID_MAX", - TRQ_SEL_FMAP_B2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B2_QID_BASE", - TRQ_SEL_FMAP_B2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b3_field_info[] = { - {"TRQ_SEL_FMAP_B3_RSVD_1", - TRQ_SEL_FMAP_B3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B3_QID_MAX", - TRQ_SEL_FMAP_B3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B3_QID_BASE", - TRQ_SEL_FMAP_B3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b4_field_info[] = { - {"TRQ_SEL_FMAP_B4_RSVD_1", - TRQ_SEL_FMAP_B4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B4_QID_MAX", - TRQ_SEL_FMAP_B4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B4_QID_BASE", - TRQ_SEL_FMAP_B4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b5_field_info[] = { - {"TRQ_SEL_FMAP_B5_RSVD_1", - TRQ_SEL_FMAP_B5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B5_QID_MAX", - TRQ_SEL_FMAP_B5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B5_QID_BASE", - TRQ_SEL_FMAP_B5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b6_field_info[] = { - {"TRQ_SEL_FMAP_B6_RSVD_1", - TRQ_SEL_FMAP_B6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B6_QID_MAX", - TRQ_SEL_FMAP_B6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B6_QID_BASE", - TRQ_SEL_FMAP_B6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b7_field_info[] = { - {"TRQ_SEL_FMAP_B7_RSVD_1", - TRQ_SEL_FMAP_B7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B7_QID_MAX", - TRQ_SEL_FMAP_B7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B7_QID_BASE", - TRQ_SEL_FMAP_B7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b8_field_info[] = { - {"TRQ_SEL_FMAP_B8_RSVD_1", - TRQ_SEL_FMAP_B8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B8_QID_MAX", - TRQ_SEL_FMAP_B8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B8_QID_BASE", - TRQ_SEL_FMAP_B8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b9_field_info[] = { - {"TRQ_SEL_FMAP_B9_RSVD_1", - TRQ_SEL_FMAP_B9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B9_QID_MAX", - TRQ_SEL_FMAP_B9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B9_QID_BASE", - TRQ_SEL_FMAP_B9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ba_field_info[] = { - {"TRQ_SEL_FMAP_BA_RSVD_1", - TRQ_SEL_FMAP_BA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BA_QID_MAX", - TRQ_SEL_FMAP_BA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BA_QID_BASE", - TRQ_SEL_FMAP_BA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bb_field_info[] = { - {"TRQ_SEL_FMAP_BB_RSVD_1", - TRQ_SEL_FMAP_BB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BB_QID_MAX", - TRQ_SEL_FMAP_BB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BB_QID_BASE", - TRQ_SEL_FMAP_BB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bc_field_info[] = { - {"TRQ_SEL_FMAP_BC_RSVD_1", - TRQ_SEL_FMAP_BC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BC_QID_MAX", - TRQ_SEL_FMAP_BC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BC_QID_BASE", - TRQ_SEL_FMAP_BC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bd_field_info[] = { - {"TRQ_SEL_FMAP_BD_RSVD_1", - TRQ_SEL_FMAP_BD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BD_QID_MAX", - TRQ_SEL_FMAP_BD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BD_QID_BASE", - TRQ_SEL_FMAP_BD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_be_field_info[] = { - {"TRQ_SEL_FMAP_BE_RSVD_1", - TRQ_SEL_FMAP_BE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BE_QID_MAX", - TRQ_SEL_FMAP_BE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BE_QID_BASE", - TRQ_SEL_FMAP_BE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bf_field_info[] = { - {"TRQ_SEL_FMAP_BF_RSVD_1", - TRQ_SEL_FMAP_BF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BF_QID_MAX", - TRQ_SEL_FMAP_BF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BF_QID_BASE", - TRQ_SEL_FMAP_BF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c0_field_info[] = { - {"TRQ_SEL_FMAP_C0_RSVD_1", - TRQ_SEL_FMAP_C0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C0_QID_MAX", - TRQ_SEL_FMAP_C0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C0_QID_BASE", - TRQ_SEL_FMAP_C0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c1_field_info[] = { - {"TRQ_SEL_FMAP_C1_RSVD_1", - TRQ_SEL_FMAP_C1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C1_QID_MAX", - TRQ_SEL_FMAP_C1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C1_QID_BASE", - TRQ_SEL_FMAP_C1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c2_field_info[] = { - {"TRQ_SEL_FMAP_C2_RSVD_1", - TRQ_SEL_FMAP_C2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C2_QID_MAX", - TRQ_SEL_FMAP_C2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C2_QID_BASE", - TRQ_SEL_FMAP_C2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c3_field_info[] = { - {"TRQ_SEL_FMAP_C3_RSVD_1", - TRQ_SEL_FMAP_C3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C3_QID_MAX", - TRQ_SEL_FMAP_C3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C3_QID_BASE", - TRQ_SEL_FMAP_C3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c4_field_info[] = { - {"TRQ_SEL_FMAP_C4_RSVD_1", - TRQ_SEL_FMAP_C4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C4_QID_MAX", - TRQ_SEL_FMAP_C4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C4_QID_BASE", - TRQ_SEL_FMAP_C4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c5_field_info[] = { - {"TRQ_SEL_FMAP_C5_RSVD_1", - TRQ_SEL_FMAP_C5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C5_QID_MAX", - TRQ_SEL_FMAP_C5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C5_QID_BASE", - TRQ_SEL_FMAP_C5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c6_field_info[] = { - {"TRQ_SEL_FMAP_C6_RSVD_1", - TRQ_SEL_FMAP_C6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C6_QID_MAX", - TRQ_SEL_FMAP_C6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C6_QID_BASE", - TRQ_SEL_FMAP_C6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c7_field_info[] = { - {"TRQ_SEL_FMAP_C7_RSVD_1", - TRQ_SEL_FMAP_C7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C7_QID_MAX", - TRQ_SEL_FMAP_C7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C7_QID_BASE", - TRQ_SEL_FMAP_C7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c8_field_info[] = { - {"TRQ_SEL_FMAP_C8_RSVD_1", - TRQ_SEL_FMAP_C8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C8_QID_MAX", - TRQ_SEL_FMAP_C8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C8_QID_BASE", - TRQ_SEL_FMAP_C8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c9_field_info[] = { - {"TRQ_SEL_FMAP_C9_RSVD_1", - TRQ_SEL_FMAP_C9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C9_QID_MAX", - TRQ_SEL_FMAP_C9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C9_QID_BASE", - TRQ_SEL_FMAP_C9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ca_field_info[] = { - {"TRQ_SEL_FMAP_CA_RSVD_1", - TRQ_SEL_FMAP_CA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CA_QID_MAX", - TRQ_SEL_FMAP_CA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CA_QID_BASE", - TRQ_SEL_FMAP_CA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cb_field_info[] = { - {"TRQ_SEL_FMAP_CB_RSVD_1", - TRQ_SEL_FMAP_CB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CB_QID_MAX", - TRQ_SEL_FMAP_CB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CB_QID_BASE", - TRQ_SEL_FMAP_CB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cc_field_info[] = { - {"TRQ_SEL_FMAP_CC_RSVD_1", - TRQ_SEL_FMAP_CC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CC_QID_MAX", - TRQ_SEL_FMAP_CC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CC_QID_BASE", - TRQ_SEL_FMAP_CC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cd_field_info[] = { - {"TRQ_SEL_FMAP_CD_RSVD_1", - TRQ_SEL_FMAP_CD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CD_QID_MAX", - TRQ_SEL_FMAP_CD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CD_QID_BASE", - TRQ_SEL_FMAP_CD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ce_field_info[] = { - {"TRQ_SEL_FMAP_CE_RSVD_1", - TRQ_SEL_FMAP_CE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CE_QID_MAX", - TRQ_SEL_FMAP_CE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CE_QID_BASE", - TRQ_SEL_FMAP_CE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cf_field_info[] = { - {"TRQ_SEL_FMAP_CF_RSVD_1", - TRQ_SEL_FMAP_CF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CF_QID_MAX", - TRQ_SEL_FMAP_CF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CF_QID_BASE", - TRQ_SEL_FMAP_CF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d0_field_info[] = { - {"TRQ_SEL_FMAP_D0_RSVD_1", - TRQ_SEL_FMAP_D0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D0_QID_MAX", - TRQ_SEL_FMAP_D0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D0_QID_BASE", - TRQ_SEL_FMAP_D0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d1_field_info[] = { - {"TRQ_SEL_FMAP_D1_RSVD_1", - TRQ_SEL_FMAP_D1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D1_QID_MAX", - TRQ_SEL_FMAP_D1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D1_QID_BASE", - TRQ_SEL_FMAP_D1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d2_field_info[] = { - {"TRQ_SEL_FMAP_D2_RSVD_1", - TRQ_SEL_FMAP_D2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D2_QID_MAX", - TRQ_SEL_FMAP_D2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D2_QID_BASE", - TRQ_SEL_FMAP_D2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d3_field_info[] = { - {"TRQ_SEL_FMAP_D3_RSVD_1", - TRQ_SEL_FMAP_D3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D3_QID_MAX", - TRQ_SEL_FMAP_D3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D3_QID_BASE", - TRQ_SEL_FMAP_D3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d4_field_info[] = { - {"TRQ_SEL_FMAP_D4_RSVD_1", - TRQ_SEL_FMAP_D4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D4_QID_MAX", - TRQ_SEL_FMAP_D4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D4_QID_BASE", - TRQ_SEL_FMAP_D4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d5_field_info[] = { - {"TRQ_SEL_FMAP_D5_RSVD_1", - TRQ_SEL_FMAP_D5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D5_QID_MAX", - TRQ_SEL_FMAP_D5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D5_QID_BASE", - TRQ_SEL_FMAP_D5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d6_field_info[] = { - {"TRQ_SEL_FMAP_D6_RSVD_1", - TRQ_SEL_FMAP_D6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D6_QID_MAX", - TRQ_SEL_FMAP_D6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D6_QID_BASE", - TRQ_SEL_FMAP_D6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d7_field_info[] = { - {"TRQ_SEL_FMAP_D7_RSVD_1", - TRQ_SEL_FMAP_D7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D7_QID_MAX", - TRQ_SEL_FMAP_D7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D7_QID_BASE", - TRQ_SEL_FMAP_D7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d8_field_info[] = { - {"TRQ_SEL_FMAP_D8_RSVD_1", - TRQ_SEL_FMAP_D8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D8_QID_MAX", - TRQ_SEL_FMAP_D8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D8_QID_BASE", - TRQ_SEL_FMAP_D8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d9_field_info[] = { - {"TRQ_SEL_FMAP_D9_RSVD_1", - TRQ_SEL_FMAP_D9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D9_QID_MAX", - TRQ_SEL_FMAP_D9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D9_QID_BASE", - TRQ_SEL_FMAP_D9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_da_field_info[] = { - {"TRQ_SEL_FMAP_DA_RSVD_1", - TRQ_SEL_FMAP_DA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DA_QID_MAX", - TRQ_SEL_FMAP_DA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DA_QID_BASE", - TRQ_SEL_FMAP_DA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_db_field_info[] = { - {"TRQ_SEL_FMAP_DB_RSVD_1", - TRQ_SEL_FMAP_DB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DB_QID_MAX", - TRQ_SEL_FMAP_DB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DB_QID_BASE", - TRQ_SEL_FMAP_DB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_dc_field_info[] = { - {"TRQ_SEL_FMAP_DC_RSVD_1", - TRQ_SEL_FMAP_DC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DC_QID_MAX", - TRQ_SEL_FMAP_DC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DC_QID_BASE", - TRQ_SEL_FMAP_DC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_dd_field_info[] = { - {"TRQ_SEL_FMAP_DD_RSVD_1", - TRQ_SEL_FMAP_DD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DD_QID_MAX", - TRQ_SEL_FMAP_DD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DD_QID_BASE", - TRQ_SEL_FMAP_DD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_de_field_info[] = { - {"TRQ_SEL_FMAP_DE_RSVD_1", - TRQ_SEL_FMAP_DE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DE_QID_MAX", - TRQ_SEL_FMAP_DE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DE_QID_BASE", - TRQ_SEL_FMAP_DE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_df_field_info[] = { - {"TRQ_SEL_FMAP_DF_RSVD_1", - TRQ_SEL_FMAP_DF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DF_QID_MAX", - TRQ_SEL_FMAP_DF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DF_QID_BASE", - TRQ_SEL_FMAP_DF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e0_field_info[] = { - {"TRQ_SEL_FMAP_E0_RSVD_1", - TRQ_SEL_FMAP_E0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E0_QID_MAX", - TRQ_SEL_FMAP_E0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E0_QID_BASE", - TRQ_SEL_FMAP_E0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e1_field_info[] = { - {"TRQ_SEL_FMAP_E1_RSVD_1", - TRQ_SEL_FMAP_E1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E1_QID_MAX", - TRQ_SEL_FMAP_E1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E1_QID_BASE", - TRQ_SEL_FMAP_E1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e2_field_info[] = { - {"TRQ_SEL_FMAP_E2_RSVD_1", - TRQ_SEL_FMAP_E2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E2_QID_MAX", - TRQ_SEL_FMAP_E2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E2_QID_BASE", - TRQ_SEL_FMAP_E2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e3_field_info[] = { - {"TRQ_SEL_FMAP_E3_RSVD_1", - TRQ_SEL_FMAP_E3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E3_QID_MAX", - TRQ_SEL_FMAP_E3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E3_QID_BASE", - TRQ_SEL_FMAP_E3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e4_field_info[] = { - {"TRQ_SEL_FMAP_E4_RSVD_1", - TRQ_SEL_FMAP_E4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E4_QID_MAX", - TRQ_SEL_FMAP_E4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E4_QID_BASE", - TRQ_SEL_FMAP_E4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e5_field_info[] = { - {"TRQ_SEL_FMAP_E5_RSVD_1", - TRQ_SEL_FMAP_E5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E5_QID_MAX", - TRQ_SEL_FMAP_E5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E5_QID_BASE", - TRQ_SEL_FMAP_E5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e6_field_info[] = { - {"TRQ_SEL_FMAP_E6_RSVD_1", - TRQ_SEL_FMAP_E6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E6_QID_MAX", - TRQ_SEL_FMAP_E6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E6_QID_BASE", - TRQ_SEL_FMAP_E6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e7_field_info[] = { - {"TRQ_SEL_FMAP_E7_RSVD_1", - TRQ_SEL_FMAP_E7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E7_QID_MAX", - TRQ_SEL_FMAP_E7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E7_QID_BASE", - TRQ_SEL_FMAP_E7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e8_field_info[] = { - {"TRQ_SEL_FMAP_E8_RSVD_1", - TRQ_SEL_FMAP_E8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E8_QID_MAX", - TRQ_SEL_FMAP_E8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E8_QID_BASE", - TRQ_SEL_FMAP_E8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e9_field_info[] = { - {"TRQ_SEL_FMAP_E9_RSVD_1", - TRQ_SEL_FMAP_E9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E9_QID_MAX", - TRQ_SEL_FMAP_E9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E9_QID_BASE", - TRQ_SEL_FMAP_E9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ea_field_info[] = { - {"TRQ_SEL_FMAP_EA_RSVD_1", - TRQ_SEL_FMAP_EA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EA_QID_MAX", - TRQ_SEL_FMAP_EA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EA_QID_BASE", - TRQ_SEL_FMAP_EA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_eb_field_info[] = { - {"TRQ_SEL_FMAP_EB_RSVD_1", - TRQ_SEL_FMAP_EB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EB_QID_MAX", - TRQ_SEL_FMAP_EB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EB_QID_BASE", - TRQ_SEL_FMAP_EB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ec_field_info[] = { - {"TRQ_SEL_FMAP_EC_RSVD_1", - TRQ_SEL_FMAP_EC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EC_QID_MAX", - TRQ_SEL_FMAP_EC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EC_QID_BASE", - TRQ_SEL_FMAP_EC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ed_field_info[] = { - {"TRQ_SEL_FMAP_ED_RSVD_1", - TRQ_SEL_FMAP_ED_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_ED_QID_MAX", - TRQ_SEL_FMAP_ED_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_ED_QID_BASE", - TRQ_SEL_FMAP_ED_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ee_field_info[] = { - {"TRQ_SEL_FMAP_EE_RSVD_1", - TRQ_SEL_FMAP_EE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EE_QID_MAX", - TRQ_SEL_FMAP_EE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EE_QID_BASE", - TRQ_SEL_FMAP_EE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ef_field_info[] = { - {"TRQ_SEL_FMAP_EF_RSVD_1", - TRQ_SEL_FMAP_EF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EF_QID_MAX", - TRQ_SEL_FMAP_EF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EF_QID_BASE", - TRQ_SEL_FMAP_EF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_f0_field_info[] = { - {"TRQ_SEL_FMAP_F0_RSVD_1", - TRQ_SEL_FMAP_F0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_F0_QID_MAX", - TRQ_SEL_FMAP_F0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_F0_QID_BASE", - TRQ_SEL_FMAP_F0_QID_BASE_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_3_field_info[] = { - {"IND_CTXT_DATA_3_DATA", - IND_CTXT_DATA_3_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_2_field_info[] = { - {"IND_CTXT_DATA_2_DATA", - IND_CTXT_DATA_2_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_1_field_info[] = { - {"IND_CTXT_DATA_1_DATA", - IND_CTXT_DATA_1_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_0_field_info[] = { - {"IND_CTXT_DATA_0_DATA", - IND_CTXT_DATA_0_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt3_field_info[] = { - {"IND_CTXT3", - IND_CTXT3_MASK}, -}; - - -static struct regfield_info - ind_ctxt2_field_info[] = { - {"IND_CTXT2", - IND_CTXT2_MASK}, -}; - - -static struct regfield_info - ind_ctxt1_field_info[] = { - {"IND_CTXT1", - IND_CTXT1_MASK}, -}; - - -static struct regfield_info - ind_ctxt0_field_info[] = { - {"IND_CTXT0", - IND_CTXT0_MASK}, -}; - - -static struct regfield_info - ind_ctxt_cmd_field_info[] = { - {"IND_CTXT_CMD_RSVD_1", - IND_CTXT_CMD_RSVD_1_MASK}, - {"IND_CTXT_CMD_QID", - IND_CTXT_CMD_QID_MASK}, - {"IND_CTXT_CMD_OP", - IND_CTXT_CMD_OP_MASK}, - {"IND_CTXT_CMD_SET", - IND_CTXT_CMD_SET_MASK}, - {"IND_CTXT_CMD_BUSY", - IND_CTXT_CMD_BUSY_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_1_field_info[] = { - {"C2H_TIMER_CNT_1_RSVD_1", - C2H_TIMER_CNT_1_RSVD_1_MASK}, - {"C2H_TIMER_CNT_1", - C2H_TIMER_CNT_1_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_2_field_info[] = { - {"C2H_TIMER_CNT_2_RSVD_1", - C2H_TIMER_CNT_2_RSVD_1_MASK}, - {"C2H_TIMER_CNT_2", - C2H_TIMER_CNT_2_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_3_field_info[] = { - {"C2H_TIMER_CNT_3_RSVD_1", - C2H_TIMER_CNT_3_RSVD_1_MASK}, - {"C2H_TIMER_CNT_3", - C2H_TIMER_CNT_3_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_4_field_info[] = { - {"C2H_TIMER_CNT_4_RSVD_1", - C2H_TIMER_CNT_4_RSVD_1_MASK}, - {"C2H_TIMER_CNT_4", - C2H_TIMER_CNT_4_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_5_field_info[] = { - {"C2H_TIMER_CNT_5_RSVD_1", - C2H_TIMER_CNT_5_RSVD_1_MASK}, - {"C2H_TIMER_CNT_5", - C2H_TIMER_CNT_5_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_6_field_info[] = { - {"C2H_TIMER_CNT_6_RSVD_1", - C2H_TIMER_CNT_6_RSVD_1_MASK}, - {"C2H_TIMER_CNT_6", - C2H_TIMER_CNT_6_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_7_field_info[] = { - {"C2H_TIMER_CNT_7_RSVD_1", - C2H_TIMER_CNT_7_RSVD_1_MASK}, - {"C2H_TIMER_CNT_7", - C2H_TIMER_CNT_7_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_8_field_info[] = { - {"C2H_TIMER_CNT_8_RSVD_1", - C2H_TIMER_CNT_8_RSVD_1_MASK}, - {"C2H_TIMER_CNT_8", - C2H_TIMER_CNT_8_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_9_field_info[] = { - {"C2H_TIMER_CNT_9_RSVD_1", - C2H_TIMER_CNT_9_RSVD_1_MASK}, - {"C2H_TIMER_CNT_9", - C2H_TIMER_CNT_9_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_a_field_info[] = { - {"C2H_TIMER_CNT_A_RSVD_1", - C2H_TIMER_CNT_A_RSVD_1_MASK}, - {"C2H_TIMER_CNT_A", - C2H_TIMER_CNT_A_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_b_field_info[] = { - {"C2H_TIMER_CNT_B_RSVD_1", - C2H_TIMER_CNT_B_RSVD_1_MASK}, - {"C2H_TIMER_CNT_B", - C2H_TIMER_CNT_B_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_c_field_info[] = { - {"C2H_TIMER_CNT_C_RSVD_1", - C2H_TIMER_CNT_C_RSVD_1_MASK}, - {"C2H_TIMER_CNT_C", - C2H_TIMER_CNT_C_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_d_field_info[] = { - {"C2H_TIMER_CNT_D_RSVD_1", - C2H_TIMER_CNT_D_RSVD_1_MASK}, - {"C2H_TIMER_CNT_D", - C2H_TIMER_CNT_D_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_e_field_info[] = { - {"C2H_TIMER_CNT_E_RSVD_1", - C2H_TIMER_CNT_E_RSVD_1_MASK}, - {"C2H_TIMER_CNT_E", - C2H_TIMER_CNT_E_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_f_field_info[] = { - {"C2H_TIMER_CNT_F_RSVD_1", - C2H_TIMER_CNT_F_RSVD_1_MASK}, - {"C2H_TIMER_CNT_F", - C2H_TIMER_CNT_F_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_10_field_info[] = { - {"C2H_TIMER_CNT_10_RSVD_1", - C2H_TIMER_CNT_10_RSVD_1_MASK}, - {"C2H_TIMER_CNT_10", - C2H_TIMER_CNT_10_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_1_field_info[] = { - {"C2H_CNT_TH_1_RSVD_1", - C2H_CNT_TH_1_RSVD_1_MASK}, - {"C2H_CNT_TH_1_THESHOLD_CNT", - C2H_CNT_TH_1_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_2_field_info[] = { - {"C2H_CNT_TH_2_RSVD_1", - C2H_CNT_TH_2_RSVD_1_MASK}, - {"C2H_CNT_TH_2_THESHOLD_CNT", - C2H_CNT_TH_2_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_3_field_info[] = { - {"C2H_CNT_TH_3_RSVD_1", - C2H_CNT_TH_3_RSVD_1_MASK}, - {"C2H_CNT_TH_3_THESHOLD_CNT", - C2H_CNT_TH_3_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_4_field_info[] = { - {"C2H_CNT_TH_4_RSVD_1", - C2H_CNT_TH_4_RSVD_1_MASK}, - {"C2H_CNT_TH_4_THESHOLD_CNT", - C2H_CNT_TH_4_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_5_field_info[] = { - {"C2H_CNT_TH_5_RSVD_1", - C2H_CNT_TH_5_RSVD_1_MASK}, - {"C2H_CNT_TH_5_THESHOLD_CNT", - C2H_CNT_TH_5_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_6_field_info[] = { - {"C2H_CNT_TH_6_RSVD_1", - C2H_CNT_TH_6_RSVD_1_MASK}, - {"C2H_CNT_TH_6_THESHOLD_CNT", - C2H_CNT_TH_6_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_7_field_info[] = { - {"C2H_CNT_TH_7_RSVD_1", - C2H_CNT_TH_7_RSVD_1_MASK}, - {"C2H_CNT_TH_7_THESHOLD_CNT", - C2H_CNT_TH_7_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_8_field_info[] = { - {"C2H_CNT_TH_8_RSVD_1", - C2H_CNT_TH_8_RSVD_1_MASK}, - {"C2H_CNT_TH_8_THESHOLD_CNT", - C2H_CNT_TH_8_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_9_field_info[] = { - {"C2H_CNT_TH_9_RSVD_1", - C2H_CNT_TH_9_RSVD_1_MASK}, - {"C2H_CNT_TH_9_THESHOLD_CNT", - C2H_CNT_TH_9_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_a_field_info[] = { - {"C2H_CNT_TH_A_RSVD_1", - C2H_CNT_TH_A_RSVD_1_MASK}, - {"C2H_CNT_TH_A_THESHOLD_CNT", - C2H_CNT_TH_A_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_b_field_info[] = { - {"C2H_CNT_TH_B_RSVD_1", - C2H_CNT_TH_B_RSVD_1_MASK}, - {"C2H_CNT_TH_B_THESHOLD_CNT", - C2H_CNT_TH_B_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_c_field_info[] = { - {"C2H_CNT_TH_C_RSVD_1", - C2H_CNT_TH_C_RSVD_1_MASK}, - {"C2H_CNT_TH_C_THESHOLD_CNT", - C2H_CNT_TH_C_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_d_field_info[] = { - {"C2H_CNT_TH_D_RSVD_1", - C2H_CNT_TH_D_RSVD_1_MASK}, - {"C2H_CNT_TH_D_THESHOLD_CNT", - C2H_CNT_TH_D_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_e_field_info[] = { - {"C2H_CNT_TH_E_RSVD_1", - C2H_CNT_TH_E_RSVD_1_MASK}, - {"C2H_CNT_TH_E_THESHOLD_CNT", - C2H_CNT_TH_E_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_f_field_info[] = { - {"C2H_CNT_TH_F_RSVD_1", - C2H_CNT_TH_F_RSVD_1_MASK}, - {"C2H_CNT_TH_F_THESHOLD_CNT", - C2H_CNT_TH_F_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_10_field_info[] = { - {"C2H_CNT_TH_10_RSVD_1", - C2H_CNT_TH_10_RSVD_1_MASK}, - {"C2H_CNT_TH_10_THESHOLD_CNT", - C2H_CNT_TH_10_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_qid2vec_map_qid_field_info[] = { - {"C2H_QID2VEC_MAP_QID_RSVD_1", - C2H_QID2VEC_MAP_QID_RSVD_1_MASK}, - {"C2H_QID2VEC_MAP_QID_QID", - C2H_QID2VEC_MAP_QID_QID_MASK}, -}; - - -static struct regfield_info - c2h_qid2vec_map_field_info[] = { - {"C2H_QID2VEC_MAP_RSVD_1", - C2H_QID2VEC_MAP_RSVD_1_MASK}, - {"C2H_QID2VEC_MAP_H2C_EN_COAL", - C2H_QID2VEC_MAP_H2C_EN_COAL_MASK}, - {"C2H_QID2VEC_MAP_H2C_VECTOR", - C2H_QID2VEC_MAP_H2C_VECTOR_MASK}, - {"C2H_QID2VEC_MAP_C2H_EN_COAL", - C2H_QID2VEC_MAP_C2H_EN_COAL_MASK}, - {"C2H_QID2VEC_MAP_C2H_VECTOR", - C2H_QID2VEC_MAP_C2H_VECTOR_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED", - C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP", - C2H_STAT_AXIS_PKG_CMP_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ACCEPTED_D", - C2H_STAT_DESC_RSP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_cmp_field_info[] = { - {"C2H_STAT_DESC_RSP_CMP_D", - C2H_STAT_DESC_RSP_CMP_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_wrq_out_field_info[] = { - {"C2H_STAT_WRQ_OUT", - C2H_STAT_WRQ_OUT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wpl_ren_accepted_field_info[] = { - {"C2H_STAT_WPL_REN_ACCEPTED", - C2H_STAT_WPL_REN_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wrq_len_field_info[] = { - {"C2H_STAT_TOTAL_WRQ_LEN", - C2H_STAT_TOTAL_WRQ_LEN_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wpl_len_field_info[] = { - {"C2H_STAT_TOTAL_WPL_LEN", - C2H_STAT_TOTAL_WPL_LEN_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_0_field_info[] = { - {"C2H_BUF_SZ_0_SIZE", - C2H_BUF_SZ_0_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_1_field_info[] = { - {"C2H_BUF_SZ_1_SIZE", - C2H_BUF_SZ_1_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_2_field_info[] = { - {"C2H_BUF_SZ_2_SIZE", - C2H_BUF_SZ_2_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_3_field_info[] = { - {"C2H_BUF_SZ_3_SIZE", - C2H_BUF_SZ_3_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_4_field_info[] = { - {"C2H_BUF_SZ_4_SIZE", - C2H_BUF_SZ_4_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_5_field_info[] = { - {"C2H_BUF_SZ_5_SIZE", - C2H_BUF_SZ_5_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_7_field_info[] = { - {"C2H_BUF_SZ_7_SIZE", - C2H_BUF_SZ_7_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_8_field_info[] = { - {"C2H_BUF_SZ_8_SIZE", - C2H_BUF_SZ_8_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_9_field_info[] = { - {"C2H_BUF_SZ_9_SIZE", - C2H_BUF_SZ_9_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_10_field_info[] = { - {"C2H_BUF_SZ_10_SIZE", - C2H_BUF_SZ_10_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_11_field_info[] = { - {"C2H_BUF_SZ_11_SIZE", - C2H_BUF_SZ_11_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_12_field_info[] = { - {"C2H_BUF_SZ_12_SIZE", - C2H_BUF_SZ_12_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_13_field_info[] = { - {"C2H_BUF_SZ_13_SIZE", - C2H_BUF_SZ_13_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_14_field_info[] = { - {"C2H_BUF_SZ_14_SIZE", - C2H_BUF_SZ_14_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_15_field_info[] = { - {"C2H_BUF_SZ_15_SIZE", - C2H_BUF_SZ_15_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_err_stat_field_info[] = { - {"C2H_ERR_STAT_RSVD_1", - C2H_ERR_STAT_RSVD_1_MASK}, - {"C2H_ERR_STAT_WRB_PRTY_ERR", - C2H_ERR_STAT_WRB_PRTY_ERR_MASK}, - {"C2H_ERR_STAT_WRB_CIDX_ERR", - C2H_ERR_STAT_WRB_CIDX_ERR_MASK}, - {"C2H_ERR_STAT_WRB_QFULL_ERR", - C2H_ERR_STAT_WRB_QFULL_ERR_MASK}, - {"C2H_ERR_STAT_WRB_INV_Q_ERR", - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK}, - {"C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH", - C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH_MASK}, - {"C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH", - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK}, - {"C2H_ERR_STAT_ERR_DESC_CNT", - C2H_ERR_STAT_ERR_DESC_CNT_MASK}, - {"C2H_ERR_STAT_RSVD_2", - C2H_ERR_STAT_RSVD_2_MASK}, - {"C2H_ERR_STAT_MSI_INT_FAIL", - C2H_ERR_STAT_MSI_INT_FAIL_MASK}, - {"C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR", - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_3", - C2H_ERR_STAT_RSVD_3_MASK}, - {"C2H_ERR_STAT_DESC_RSP_ERR", - C2H_ERR_STAT_DESC_RSP_ERR_MASK}, - {"C2H_ERR_STAT_QID_MISMATCH", - C2H_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_ERR_STAT_RSVD_4", - C2H_ERR_STAT_RSVD_4_MASK}, - {"C2H_ERR_STAT_LEN_MISMATCH", - C2H_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_ERR_STAT_MTY_MISMATCH", - C2H_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_err_mask_field_info[] = { - {"C2H_ERR_EN", - C2H_ERR_EN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_stat_field_info[] = { - {"C2H_FATAL_ERR_STAT_RSVD_1", - C2H_FATAL_ERR_STAT_RSVD_1_MASK}, - {"C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR", - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_MISMATCH", - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_RSVD_2", - C2H_FATAL_ERR_STAT_RSVD_2_MASK}, - {"C2H_FATAL_ERR_STAT_LEN_MISMATCH", - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_MTY_MISMATCH", - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_mask_field_info[] = { - {"C2H_FATAL_ERR_C2HEN", - C2H_FATAL_ERR_C2HEN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_enable_field_info[] = { - {"C2H_FATAL_ERR_ENABLE_RSVD_1", - C2H_FATAL_ERR_ENABLE_RSVD_1_MASK}, - {"C2H_FATAL_ERR_ENABLE_WPL_PAR_INV", - C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK}, - {"C2H_FATAL_ERR_ENABLE_WRQ_DIS", - C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK}, -}; - - -static struct regfield_info - glbl_err_int_field_info[] = { - {"GLBL_ERR_INT_RSVD_1", - GLBL_ERR_INT_RSVD_1_MASK}, - {"GLBL_ERR_INT_ARM", - GLBL_ERR_INT_ARM_MASK}, - {"GLBL_ERR_INT_EN_COAL", - GLBL_ERR_INT_EN_COAL_MASK}, - {"GLBL_ERR_INT_VEC", - GLBL_ERR_INT_VEC_MASK}, - {"GLBL_ERR_INT_FUNC", - GLBL_ERR_INT_FUNC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_field_info[] = { - {"C2H_PFCH_CFG_EVT_QCNT_TH", - C2H_PFCH_CFG_EVT_QCNT_TH_MASK}, - {"C2H_PFCH_CFG_QCNT", - C2H_PFCH_CFG_QCNT_MASK}, - {"C2H_PFCH_CFG_NUM", - C2H_PFCH_CFG_NUM_MASK}, - {"C2H_PFCH_CFG_FL_TH", - C2H_PFCH_CFG_FL_TH_MASK}, -}; - - -static struct regfield_info - c2h_int_timer_tick_field_info[] = { - {"C2H_INT_TIMER_TICK", - C2H_INT_TIMER_TICK_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_drop_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_D", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_err_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_D", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_req_field_info[] = { - {"C2H_STAT_DESC_REQ", - C2H_STAT_DESC_REQ_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_0_field_info[] = { - {"C2H_STAT_DMA_ENG_0_RSVD_1", - C2H_STAT_DMA_ENG_0_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_SM_CS", - C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK}, - {"C2H_STAT_DMA_ENG_0_MAIN_SM_CS", - C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_1_field_info[] = { - {"C2H_STAT_DMA_ENG_1_RSVD_1", - C2H_STAT_DMA_ENG_1_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_1_DESC_RSP_LAST", - C2H_STAT_DMA_ENG_1_DESC_RSP_LAST_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_2_field_info[] = { - {"C2H_STAT_DMA_ENG_2_RSVD_1", - C2H_STAT_DMA_ENG_2_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_3_field_info[] = { - {"C2H_STAT_DMA_ENG_3_RSVD_1", - C2H_STAT_DMA_ENG_3_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT", - C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_err_ctxt_field_info[] = { - {"C2H_PFCH_ERR_CTXT_RSVD_1", - C2H_PFCH_ERR_CTXT_RSVD_1_MASK}, - {"C2H_PFCH_ERR_CTXT_ERR_STAT", - C2H_PFCH_ERR_CTXT_ERR_STAT_MASK}, - {"C2H_PFCH_ERR_CTXT_CMD_WR", - C2H_PFCH_ERR_CTXT_CMD_WR_MASK}, - {"C2H_PFCH_ERR_CTXT_QID", - C2H_PFCH_ERR_CTXT_QID_MASK}, - {"C2H_PFCH_ERR_CTXT_DONE", - C2H_PFCH_ERR_CTXT_DONE_MASK}, -}; - - -static struct regfield_info - c2h_first_err_qid_field_info[] = { - {"C2H_FIRST_ERR_QID_RSVD_1", - C2H_FIRST_ERR_QID_RSVD_1_MASK}, - {"C2H_FIRST_ERR_QID_ERR_STAT", - C2H_FIRST_ERR_QID_ERR_STAT_MASK}, - {"C2H_FIRST_ERR_QID_CMD_WR", - C2H_FIRST_ERR_QID_CMD_WR_MASK}, - {"C2H_FIRST_ERR_QID_QID", - C2H_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_in_field_info[] = { - {"STAT_NUM_WRB_IN_RSVD_1", - STAT_NUM_WRB_IN_RSVD_1_MASK}, - {"STAT_NUM_WRB_IN_WRB_CNT", - STAT_NUM_WRB_IN_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_out_field_info[] = { - {"STAT_NUM_WRB_OUT_RSVD_1", - STAT_NUM_WRB_OUT_RSVD_1_MASK}, - {"STAT_NUM_WRB_OUT_WRB_CNT", - STAT_NUM_WRB_OUT_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_drp_field_info[] = { - {"STAT_NUM_WRB_DRP_RSVD_1", - STAT_NUM_WRB_DRP_RSVD_1_MASK}, - {"STAT_NUM_WRB_DRP_WRB_CNT", - STAT_NUM_WRB_DRP_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_stat_desc_out_field_info[] = { - {"STAT_NUM_STAT_DESC_OUT_RSVD_1", - STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK}, - {"STAT_NUM_STAT_DESC_OUT_CNT", - STAT_NUM_STAT_DESC_OUT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_dsc_crdt_sent_field_info[] = { - {"STAT_NUM_DSC_CRDT_SENT_RSVD_1", - STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK}, - {"STAT_NUM_DSC_CRDT_SENT_CNT", - STAT_NUM_DSC_CRDT_SENT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_fch_dsc_rcvd_field_info[] = { - {"STAT_NUM_FCH_DSC_RCVD_RSVD_1", - STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_FCH_DSC_RCVD_DSC_CNT", - STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_byp_dsc_rcvd_field_info[] = { - {"STAT_NUM_BYP_DSC_RCVD_RSVD_1", - STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_BYP_DSC_RCVD_DSC_CNT", - STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_cfg_field_info[] = { - {"C2H_WRB_COAL_CFG_MAX_BUF_SZ", - C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK}, - {"C2H_WRB_COAL_CFG_TICK_VAL", - C2H_WRB_COAL_CFG_TICK_VAL_MASK}, - {"C2H_WRB_COAL_CFG_TICK_CNT", - C2H_WRB_COAL_CFG_TICK_CNT_MASK}, - {"C2H_WRB_COAL_CFG_SET_GLB_FLUSH", - C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK}, - {"C2H_WRB_COAL_CFG_DONE_GLB_FLUSH", - C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_req_field_info[] = { - {"C2H_INTR_H2C_REQ_RSVD_1", - C2H_INTR_H2C_REQ_RSVD_1_MASK}, - {"C2H_INTR_H2C_REQ_CNT", - C2H_INTR_H2C_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_mm_req_field_info[] = { - {"C2H_INTR_C2H_MM_REQ_RSVD_1", - C2H_INTR_C2H_MM_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_MM_REQ_CNT", - C2H_INTR_C2H_MM_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_err_int_req_field_info[] = { - {"C2H_INTR_ERR_INT_REQ_RSVD_1", - C2H_INTR_ERR_INT_REQ_RSVD_1_MASK}, - {"C2H_INTR_ERR_INT_REQ_CNT", - C2H_INTR_ERR_INT_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_req_field_info[] = { - {"C2H_INTR_C2H_ST_REQ_RSVD_1", - C2H_INTR_C2H_ST_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_REQ_CNT", - C2H_INTR_C2H_ST_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_ack_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1", - C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_ACK_CNT", - C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_fail_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1", - C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_FAIL_CNT", - C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_no_msix_field_info[] = { - {"C2H_INTR_C2H_ST_NO_MSIX_RSVD_1", - C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_NO_MSIX_CNT", - C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_ctxt_inval_field_info[] = { - {"C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1", - C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_CTXT_INVAL_CNT", - C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wr_cmp_field_info[] = { - {"C2H_STAT_WR_CMP_RSVD_1", - C2H_STAT_WR_CMP_RSVD_1_MASK}, - {"C2H_STAT_WR_CMP_CNT", - C2H_STAT_WR_CMP_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_4_field_info[] = { - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_5_field_info[] = { - {"C2H_STAT_DMA_ENG_5_RSVD_1", - C2H_STAT_DMA_ENG_5_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD", - C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT", - C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT", - C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT", - C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_qid_field_info[] = { - {"C2H_PFCH_QID_RSVD_1", - C2H_PFCH_QID_RSVD_1_MASK}, - {"C2H_PFCH_QID_ERR_CTXT", - C2H_PFCH_QID_ERR_CTXT_MASK}, - {"C2H_PFCH_QID_TARGET", - C2H_PFCH_QID_TARGET_MASK}, - {"C2H_PFCH_QID_QID_OR_TAG", - C2H_PFCH_QID_QID_OR_TAG_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_field_info[] = { - {"C2H_PFCH_DATA", - C2H_PFCH_DATA_MASK}, -}; - - -static struct regfield_info - c2h_int_dbg_field_info[] = { - {"C2H_INT_RSVD_1", - C2H_INT_RSVD_1_MASK}, - {"C2H_INT_INT_COAL_SM", - C2H_INT_INT_COAL_SM_MASK}, - {"C2H_INT_INT_SM", - C2H_INT_INT_SM_MASK}, -}; - - -static struct regfield_info - c2h_stat_imm_accepted_field_info[] = { - {"C2H_STAT_IMM_ACCEPTED_RSVD_1", - C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_IMM_ACCEPTED_CNT", - C2H_STAT_IMM_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_marker_accepted_field_info[] = { - {"C2H_STAT_MARKER_ACCEPTED_RSVD_1", - C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_MARKER_ACCEPTED_CNT", - C2H_STAT_MARKER_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_disable_cmp_accepted_field_info[] = { - {"C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1", - C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED_CNT", - C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_crdt_cnt_field_info[] = { - {"C2H_PLD_FIFO_CRDT_CNT_RSVD_1", - C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK}, - {"C2H_PLD_FIFO_CRDT_CNT_CNT", - C2H_PLD_FIFO_CRDT_CNT_CNT_MASK}, -}; - - -static struct regfield_info - h2c_err_stat_field_info[] = { - {"H2C_ERR_STAT_RSVD_1", - H2C_ERR_STAT_RSVD_1_MASK}, - {"H2C_ERR_STAT_SBE", - H2C_ERR_STAT_SBE_MASK}, - {"H2C_ERR_STAT_DBE", - H2C_ERR_STAT_DBE_MASK}, - {"H2C_ERR_STAT_NO_DMA_DS", - H2C_ERR_STAT_NO_DMA_DS_MASK}, - {"H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR", - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK}, - {"H2C_ERR_STAT_ZERO_LEN_DS", - H2C_ERR_STAT_ZERO_LEN_DS_MASK}, -}; - - -static struct regfield_info - h2c_err_mask_field_info[] = { - {"H2C_ERR_EN", - H2C_ERR_EN_MASK}, -}; - - -static struct regfield_info - h2c_first_err_qid_field_info[] = { - {"H2C_FIRST_ERR_QID_RSVD_1", - H2C_FIRST_ERR_QID_RSVD_1_MASK}, - {"H2C_FIRST_ERR_QID_ERR_TYPE", - H2C_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"H2C_FIRST_ERR_QID_RSVD_2", - H2C_FIRST_ERR_QID_RSVD_2_MASK}, - {"H2C_FIRST_ERR_QID_QID", - H2C_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg0_field_info[] = { - {"H2C_REG0_NUM_DSC_RCVD", - H2C_REG0_NUM_DSC_RCVD_MASK}, - {"H2C_REG0_NUM_WRB_SENT", - H2C_REG0_NUM_WRB_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg1_field_info[] = { - {"H2C_REG1_NUM_REQ_SENT", - H2C_REG1_NUM_REQ_SENT_MASK}, - {"H2C_REG1_NUM_CMP_SENT", - H2C_REG1_NUM_CMP_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg2_field_info[] = { - {"H2C_REG2_RSVD_1", - H2C_REG2_RSVD_1_MASK}, - {"H2C_REG2_NUM_ERR_DSC_RCVD", - H2C_REG2_NUM_ERR_DSC_RCVD_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg3_field_info[] = { - {"H2C_REG3", - H2C_REG3_MASK}, - {"H2C_REG3_DSCO_FIFO_EMPTY", - H2C_REG3_DSCO_FIFO_EMPTY_MASK}, - {"H2C_REG3_DSCO_FIFO_FULL", - H2C_REG3_DSCO_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RC_STATE", - H2C_REG3_CUR_RC_STATE_MASK}, - {"H2C_REG3_RDREQ_LINES", - H2C_REG3_RDREQ_LINES_MASK}, - {"H2C_REG3_RDATA_LINES_AVAIL", - H2C_REG3_RDATA_LINES_AVAIL_MASK}, - {"H2C_REG3_PEND_FIFO_EMPTY", - H2C_REG3_PEND_FIFO_EMPTY_MASK}, - {"H2C_REG3_PEND_FIFO_FULL", - H2C_REG3_PEND_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RQ_STATE", - H2C_REG3_CUR_RQ_STATE_MASK}, - {"H2C_REG3_DSCI_FIFO_FULL", - H2C_REG3_DSCI_FIFO_FULL_MASK}, - {"H2C_REG3_DSCI_FIFO_EMPTY", - H2C_REG3_DSCI_FIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg4_field_info[] = { - {"H2C_REG4_RDREQ_ADDR", - H2C_REG4_RDREQ_ADDR_MASK}, -}; - - -static struct regfield_info - h2c_fatal_err_en_field_info[] = { - {"H2C_FATAL_ERR_EN_RSVD_1", - H2C_FATAL_ERR_EN_RSVD_1_MASK}, - {"H2C_FATAL_ERR_EN_H2C", - H2C_FATAL_ERR_EN_H2C_MASK}, -}; - - -static struct regfield_info - c2h_channel_ctl_field_info[] = { - {"C2H_CHANNEL_CTL_RSVD_1", - C2H_CHANNEL_CTL_RSVD_1_MASK}, - {"C2H_CHANNEL_CTL_RUN", - C2H_CHANNEL_CTL_RUN_MASK}, -}; - - -static struct regfield_info - c2h_channel_ctl_1_field_info[] = { - {"C2H_CHANNEL_CTL_1_RUN", - C2H_CHANNEL_CTL_1_RUN_MASK}, - {"C2H_CHANNEL_CTL_1_RUN_1", - C2H_CHANNEL_CTL_1_RUN_1_MASK}, -}; - - -static struct regfield_info - c2h_mm_status_field_info[] = { - {"C2H_MM_STATUS_RSVD_1", - C2H_MM_STATUS_RSVD_1_MASK}, - {"C2H_MM_STATUS_RUN", - C2H_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - c2h_channel_cmpl_desc_cnt_field_info[] = { - {"C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO", - C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_enable_mask_field_info[] = { - {"C2H_MM_ERR_CODE_ENABLE_RSVD_1", - C2H_MM_ERR_CODE_ENABLE_RSVD_1_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM", - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UR", - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_FLR", - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RSVD_2", - C2H_MM_ERR_CODE_ENABLE_RSVD_2_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_field_info[] = { - {"C2H_MM_ERR_CODE_RSVD_1", - C2H_MM_ERR_CODE_RSVD_1_MASK}, - {"C2H_MM_ERR_CODE_VALID", - C2H_MM_ERR_CODE_VALID_MASK}, - {"C2H_MM_ERR_CODE_RDWR", - C2H_MM_ERR_CODE_RDWR_MASK}, - {"C2H_MM_ERR_CODE", - C2H_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_info_field_info[] = { - {"C2H_MM_ERR_INFO_RSVD_1", - C2H_MM_ERR_INFO_RSVD_1_MASK}, - {"C2H_MM_ERR_INFO_QID", - C2H_MM_ERR_INFO_QID_MASK}, - {"C2H_MM_ERR_INFO_DIR", - C2H_MM_ERR_INFO_DIR_MASK}, - {"C2H_MM_ERR_INFO_CIDX", - C2H_MM_ERR_INFO_CIDX_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_ctl_field_info[] = { - {"C2H_MM_PERF_MON_CTL_RSVD_1", - C2H_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_START", - C2H_MM_PERF_MON_CTL_IMM_START_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_START", - C2H_MM_PERF_MON_CTL_RUN_START_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_CLEAR", - C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_CLEAR", - C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT0_DCNT", - C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT1_RSVD_1", - C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_DATA_CNT1_DCNT", - C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_dbg_field_info[] = { - {"C2H_MM_RSVD_1", - C2H_MM_RSVD_1_MASK}, - {"C2H_MM_RRQ_ENTRIES", - C2H_MM_RRQ_ENTRIES_MASK}, - {"C2H_MM_DAT_FIFO_SPC", - C2H_MM_DAT_FIFO_SPC_MASK}, - {"C2H_MM_RD_STALL", - C2H_MM_RD_STALL_MASK}, - {"C2H_MM_RRQ_FIFO_FI", - C2H_MM_RRQ_FIFO_FI_MASK}, - {"C2H_MM_WR_STALL", - C2H_MM_WR_STALL_MASK}, - {"C2H_MM_WRQ_FIFO_FI", - C2H_MM_WRQ_FIFO_FI_MASK}, - {"C2H_MM_WBK_STALL", - C2H_MM_WBK_STALL_MASK}, - {"C2H_MM_DSC_FIFO_EP", - C2H_MM_DSC_FIFO_EP_MASK}, - {"C2H_MM_DSC_FIFO_FL", - C2H_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_field_info[] = { - {"H2C_CHANNEL_CTL_RSVD_1", - H2C_CHANNEL_CTL_RSVD_1_MASK}, - {"H2C_CHANNEL_CTL_RUN", - H2C_CHANNEL_CTL_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_1_field_info[] = { - {"H2C_CHANNEL_CTL_1_RUN", - H2C_CHANNEL_CTL_1_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_2_field_info[] = { - {"H2C_CHANNEL_CTL_2_RUN", - H2C_CHANNEL_CTL_2_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_status_field_info[] = { - {"H2C_MM_STATUS_RSVD_1", - H2C_MM_STATUS_RSVD_1_MASK}, - {"H2C_MM_STATUS_RUN", - H2C_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_cmpl_desc_cnt_field_info[] = { - {"H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO", - H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_enable_mask_field_info[] = { - {"H2C_MM_ERR_CODE_ENABLE_RSVD_1", - H2C_MM_ERR_CODE_ENABLE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_2", - H2C_MM_ERR_CODE_ENABLE_RSVD_2_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_3", - H2C_MM_ERR_CODE_ENABLE_RSVD_3_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_4", - H2C_MM_ERR_CODE_ENABLE_RSVD_4_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_5", - H2C_MM_ERR_CODE_ENABLE_RSVD_5_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_UR_CA", - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_6", - H2C_MM_ERR_CODE_ENABLE_RSVD_6_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_field_info[] = { - {"H2C_MM_ERR_CODE_RSVD_1", - H2C_MM_ERR_CODE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_VALID", - H2C_MM_ERR_CODE_VALID_MASK}, - {"H2C_MM_ERR_CODE_RDWR", - H2C_MM_ERR_CODE_RDWR_MASK}, - {"H2C_MM_ERR_CODE", - H2C_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_info_field_info[] = { - {"H2C_MM_ERR_INFO_RSVD_1", - H2C_MM_ERR_INFO_RSVD_1_MASK}, - {"H2C_MM_ERR_INFO_QID", - H2C_MM_ERR_INFO_QID_MASK}, - {"H2C_MM_ERR_INFO_DIR", - H2C_MM_ERR_INFO_DIR_MASK}, - {"H2C_MM_ERR_INFO_CIDX", - H2C_MM_ERR_INFO_CIDX_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_ctl_field_info[] = { - {"H2C_MM_PERF_MON_CTL_RSVD_1", - H2C_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_START", - H2C_MM_PERF_MON_CTL_IMM_START_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_START", - H2C_MM_PERF_MON_CTL_RUN_START_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_CLEAR", - H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_CLEAR", - H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT0_DCNT", - H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT1_RSVD_1", - H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_DATA_CNT1_DCNT", - H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_dbg_field_info[] = { - {"H2C_MM_RSVD_1", - H2C_MM_RSVD_1_MASK}, - {"H2C_MM_RRQ_ENTRIES", - H2C_MM_RRQ_ENTRIES_MASK}, - {"H2C_MM_DAT_FIFO_SPC", - H2C_MM_DAT_FIFO_SPC_MASK}, - {"H2C_MM_RD_STALL", - H2C_MM_RD_STALL_MASK}, - {"H2C_MM_RRQ_FIFO_FI", - H2C_MM_RRQ_FIFO_FI_MASK}, - {"H2C_MM_WR_STALL", - H2C_MM_WR_STALL_MASK}, - {"H2C_MM_WRQ_FIFO_FI", - H2C_MM_WRQ_FIFO_FI_MASK}, - {"H2C_MM_WBK_STALL", - H2C_MM_WBK_STALL_MASK}, - {"H2C_MM_DSC_FIFO_EP", - H2C_MM_DSC_FIFO_EP_MASK}, - {"H2C_MM_DSC_FIFO_FL", - H2C_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - func_status_reg_field_info[] = { - {"FUNC_STATUS_REG_RSVD_1", - FUNC_STATUS_REG_RSVD_1_MASK}, - {"FUNC_STATUS_REG_CUR_SRC_FN", - FUNC_STATUS_REG_CUR_SRC_FN_MASK}, - {"FUNC_STATUS_REG_ACK", - FUNC_STATUS_REG_ACK_MASK}, - {"FUNC_STATUS_REG_O_MSG", - FUNC_STATUS_REG_O_MSG_MASK}, - {"FUNC_STATUS_REG_I_MSG", - FUNC_STATUS_REG_I_MSG_MASK}, -}; - - -static struct regfield_info - func_cmd_reg_field_info[] = { - {"FUNC_CMD_REG_RSVD_1", - FUNC_CMD_REG_RSVD_1_MASK}, - {"FUNC_CMD_REG_RSVD_2", - FUNC_CMD_REG_RSVD_2_MASK}, - {"FUNC_CMD_REG_MSG_RCV", - FUNC_CMD_REG_MSG_RCV_MASK}, - {"FUNC_CMD_REG_MSG_SENT", - FUNC_CMD_REG_MSG_SENT_MASK}, -}; - - -static struct regfield_info - func_interrupt_vector_reg_field_info[] = { - {"FUNC_INTERRUPT_VECTOR_REG_RSVD_1", - FUNC_INTERRUPT_VECTOR_REG_RSVD_1_MASK}, - {"FUNC_INTERRUPT_VECTOR_REG_IN", - FUNC_INTERRUPT_VECTOR_REG_IN_MASK}, -}; - - -static struct regfield_info - target_func_reg_field_info[] = { - {"TARGET_FUNC_REG_RSVD_1", - TARGET_FUNC_REG_RSVD_1_MASK}, - {"TARGET_FUNC_REG_N_ID", - TARGET_FUNC_REG_N_ID_MASK}, -}; - - -static struct regfield_info - func_interrupt_ctl_reg_field_info[] = { - {"FUNC_INTERRUPT_CTL_REG_RSVD_1", - FUNC_INTERRUPT_CTL_REG_RSVD_1_MASK}, - {"FUNC_INTERRUPT_CTL_REG_INT_EN", - FUNC_INTERRUPT_CTL_REG_INT_EN_MASK}, -}; - -static struct xreg_info qdma_cpm4_config_regs[] = { -{"CFG_BLK_IDENTIFIER", 0x00, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_identifier_field_info), - cfg_blk_identifier_field_info -}, -{"CFG_BLK_BUSDEV", 0x04, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_busdev_field_info), - cfg_blk_busdev_field_info -}, -{"CFG_BLK_PCIE_MAX_PLD_SIZE", 0x08, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_pld_size_field_info), - cfg_blk_pcie_max_pld_size_field_info -}, -{"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", 0x0c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_read_req_size_field_info), - cfg_blk_pcie_max_read_req_size_field_info -}, -{"CFG_BLK_SYSTEM_ID", 0x10, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_system_id_field_info), - cfg_blk_system_id_field_info -}, -{"CFG_BLK_MSI_ENABLE", 0x014, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msi_enable_field_info), - cfg_blk_msi_enable_field_info -}, -{"CFG_PCIE_DATA_WIDTH", 0x18, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_data_width_field_info), - cfg_pcie_data_width_field_info -}, -{"CFG_PCIE_CTL", 0x1c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_ctl_field_info), - cfg_pcie_ctl_field_info -}, -{"CFG_AXI_USER_MAX_PLD_SIZE", 0x40, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_pld_size_field_info), - cfg_axi_user_max_pld_size_field_info -}, -{"CFG_AXI_USER_MAX_READ_REQ_SIZE", 0x44, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_read_req_size_field_info), - cfg_axi_user_max_read_req_size_field_info -}, -{"CFG_BLK_MISC_CTL", 0x4c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_misc_ctl_field_info), - cfg_blk_misc_ctl_field_info -}, -{"CFG_BLK_SCRATCH_0", 0x80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_0_field_info), - cfg_blk_scratch_0_field_info -}, -{"CFG_BLK_SCRATCH_1", 0x84, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_1_field_info), - cfg_blk_scratch_1_field_info -}, -{"CFG_BLK_SCRATCH_2", 0x88, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_2_field_info), - cfg_blk_scratch_2_field_info -}, -{"CFG_BLK_SCRATCH_3", 0x8c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_3_field_info), - cfg_blk_scratch_3_field_info -}, -{"CFG_BLK_SCRATCH_4", 0x90, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_4_field_info), - cfg_blk_scratch_4_field_info -}, -{"CFG_BLK_SCRATCH_5", 0x94, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_5_field_info), - cfg_blk_scratch_5_field_info -}, -{"CFG_BLK_SCRATCH_6", 0x98, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_6_field_info), - cfg_blk_scratch_6_field_info -}, -{"CFG_BLK_SCRATCH_7", 0x9c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_7_field_info), - cfg_blk_scratch_7_field_info -}, -{"RAM_SBE_MSK_A", 0xf0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_a_field_info), - ram_sbe_msk_a_field_info -}, -{"RAM_SBE_STS_A", 0xf4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_a_field_info), - ram_sbe_sts_a_field_info -}, -{"RAM_DBE_MSK_A", 0xf8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_a_field_info), - ram_dbe_msk_a_field_info -}, -{"RAM_DBE_STS_A", 0xfc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_a_field_info), - ram_dbe_sts_a_field_info -}, -{"GLBL2_IDENTIFIER", 0x100, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_identifier_field_info), - glbl2_identifier_field_info -}, -{"GLBL2_PF_BARLITE_INT", 0x104, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_barlite_int_field_info), - glbl2_pf_barlite_int_field_info -}, -{"GLBL2_PF_VF_BARLITE_INT", 0x108, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_vf_barlite_int_field_info), - glbl2_pf_vf_barlite_int_field_info -}, -{"GLBL2_PF_BARLITE_EXT", 0x10c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_barlite_ext_field_info), - glbl2_pf_barlite_ext_field_info -}, -{"GLBL2_PF_VF_BARLITE_EXT", 0x110, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_vf_barlite_ext_field_info), - glbl2_pf_vf_barlite_ext_field_info -}, -{"GLBL2_CHANNEL_INST", 0x114, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_inst_field_info), - glbl2_channel_inst_field_info -}, -{"GLBL2_CHANNEL_MDMA", 0x118, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_mdma_field_info), - glbl2_channel_mdma_field_info -}, -{"GLBL2_CHANNEL_STRM", 0x11c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_strm_field_info), - glbl2_channel_strm_field_info -}, -{"GLBL2_CHANNEL_CAP", 0x120, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_cap_field_info), - glbl2_channel_cap_field_info -}, -{"GLBL2_CHANNEL_PASID_CAP", 0x128, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_pasid_cap_field_info), - glbl2_channel_pasid_cap_field_info -}, -{"GLBL2_CHANNEL_FUNC_RET", 0x12c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_func_ret_field_info), - glbl2_channel_func_ret_field_info -}, -{"GLBL2_SYSTEM_ID", 0x130, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_system_id_field_info), - glbl2_system_id_field_info -}, -{"GLBL2_MISC_CAP", 0x134, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_misc_cap_field_info), - glbl2_misc_cap_field_info -}, -{"GLBL2_DBG_PCIE_RQ0", 0x1b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq0_field_info), - glbl2_dbg_pcie_rq0_field_info -}, -{"GLBL2_DBG_PCIE_RQ1", 0x1bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq1_field_info), - glbl2_dbg_pcie_rq1_field_info -}, -{"GLBL2_DBG_AXIMM_WR0", 0x1c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr0_field_info), - glbl2_dbg_aximm_wr0_field_info -}, -{"GLBL2_DBG_AXIMM_WR1", 0x1c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr1_field_info), - glbl2_dbg_aximm_wr1_field_info -}, -{"GLBL2_DBG_AXIMM_RD0", 0x1c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd0_field_info), - glbl2_dbg_aximm_rd0_field_info -}, -{"GLBL2_DBG_AXIMM_RD1", 0x1cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd1_field_info), - glbl2_dbg_aximm_rd1_field_info -}, -{"GLBL_RNG_SZ_1", 0x204, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_1_field_info), - glbl_rng_sz_1_field_info -}, -{"GLBL_RNG_SZ_2", 0x208, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_2_field_info), - glbl_rng_sz_2_field_info -}, -{"GLBL_RNG_SZ_3", 0x20c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_3_field_info), - glbl_rng_sz_3_field_info -}, -{"GLBL_RNG_SZ_4", 0x210, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_4_field_info), - glbl_rng_sz_4_field_info -}, -{"GLBL_RNG_SZ_5", 0x214, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_5_field_info), - glbl_rng_sz_5_field_info -}, -{"GLBL_RNG_SZ_6", 0x218, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_6_field_info), - glbl_rng_sz_6_field_info -}, -{"GLBL_RNG_SZ_7", 0x21c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_7_field_info), - glbl_rng_sz_7_field_info -}, -{"GLBL_RNG_SZ_8", 0x220, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_8_field_info), - glbl_rng_sz_8_field_info -}, -{"GLBL_RNG_SZ_9", 0x224, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_9_field_info), - glbl_rng_sz_9_field_info -}, -{"GLBL_RNG_SZ_A", 0x228, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_a_field_info), - glbl_rng_sz_a_field_info -}, -{"GLBL_RNG_SZ_B", 0x22c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_b_field_info), - glbl_rng_sz_b_field_info -}, -{"GLBL_RNG_SZ_C", 0x230, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_c_field_info), - glbl_rng_sz_c_field_info -}, -{"GLBL_RNG_SZ_D", 0x234, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_d_field_info), - glbl_rng_sz_d_field_info -}, -{"GLBL_RNG_SZ_E", 0x238, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_e_field_info), - glbl_rng_sz_e_field_info -}, -{"GLBL_RNG_SZ_F", 0x23c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_f_field_info), - glbl_rng_sz_f_field_info -}, -{"GLBL_RNG_SZ_10", 0x240, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_10_field_info), - glbl_rng_sz_10_field_info -}, -{"GLBL_ERR_STAT", 0x248, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_stat_field_info), - glbl_err_stat_field_info -}, -{"GLBL_ERR_MASK", 0x24c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_mask_field_info), - glbl_err_mask_field_info -}, -{"GLBL_DSC_CFG", 0x250, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_cfg_field_info), - glbl_dsc_cfg_field_info -}, -{"GLBL_DSC_ERR_STS", 0x254, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_sts_field_info), - glbl_dsc_err_sts_field_info -}, -{"GLBL_DSC_ERR_MSK", 0x258, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_msk_field_info), - glbl_dsc_err_msk_field_info -}, -{"GLBL_DSC_ERR_LOG0", 0x25c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log0_field_info), - glbl_dsc_err_log0_field_info -}, -{"GLBL_DSC_ERR_LOG1", 0x260, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log1_field_info), - glbl_dsc_err_log1_field_info -}, -{"GLBL_TRQ_ERR_STS", 0x264, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_sts_field_info), - glbl_trq_err_sts_field_info -}, -{"GLBL_TRQ_ERR_MSK", 0x268, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_msk_field_info), - glbl_trq_err_msk_field_info -}, -{"GLBL_TRQ_ERR_LOG", 0x26c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_log_field_info), - glbl_trq_err_log_field_info -}, -{"GLBL_DSC_DBG_DAT0", 0x270, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat0_field_info), - glbl_dsc_dbg_dat0_field_info -}, -{"GLBL_DSC_DBG_DAT1", 0x274, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat1_field_info), - glbl_dsc_dbg_dat1_field_info -}, -{"TRQ_SEL_FMAP_0", 0x400, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_0_field_info), - trq_sel_fmap_0_field_info -}, -{"TRQ_SEL_FMAP_1", 0x404, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1_field_info), - trq_sel_fmap_1_field_info -}, -{"TRQ_SEL_FMAP_2", 0x408, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2_field_info), - trq_sel_fmap_2_field_info -}, -{"TRQ_SEL_FMAP_3", 0x40c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3_field_info), - trq_sel_fmap_3_field_info -}, -{"TRQ_SEL_FMAP_4", 0x410, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4_field_info), - trq_sel_fmap_4_field_info -}, -{"TRQ_SEL_FMAP_5", 0x414, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5_field_info), - trq_sel_fmap_5_field_info -}, -{"TRQ_SEL_FMAP_6", 0x418, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6_field_info), - trq_sel_fmap_6_field_info -}, -{"TRQ_SEL_FMAP_7", 0x41c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7_field_info), - trq_sel_fmap_7_field_info -}, -{"TRQ_SEL_FMAP_8", 0x420, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8_field_info), - trq_sel_fmap_8_field_info -}, -{"TRQ_SEL_FMAP_9", 0x424, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9_field_info), - trq_sel_fmap_9_field_info -}, -{"TRQ_SEL_FMAP_A", 0x428, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a_field_info), - trq_sel_fmap_a_field_info -}, -{"TRQ_SEL_FMAP_B", 0x42c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b_field_info), - trq_sel_fmap_b_field_info -}, -{"TRQ_SEL_FMAP_D", 0x430, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d_field_info), - trq_sel_fmap_d_field_info -}, -{"TRQ_SEL_FMAP_E", 0x434, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e_field_info), - trq_sel_fmap_e_field_info -}, -{"TRQ_SEL_FMAP_F", 0x438, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_f_field_info), - trq_sel_fmap_f_field_info -}, -{"TRQ_SEL_FMAP_10", 0x43c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_10_field_info), - trq_sel_fmap_10_field_info -}, -{"TRQ_SEL_FMAP_11", 0x440, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_11_field_info), - trq_sel_fmap_11_field_info -}, -{"TRQ_SEL_FMAP_12", 0x444, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_12_field_info), - trq_sel_fmap_12_field_info -}, -{"TRQ_SEL_FMAP_13", 0x448, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_13_field_info), - trq_sel_fmap_13_field_info -}, -{"TRQ_SEL_FMAP_14", 0x44c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_14_field_info), - trq_sel_fmap_14_field_info -}, -{"TRQ_SEL_FMAP_15", 0x450, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_15_field_info), - trq_sel_fmap_15_field_info -}, -{"TRQ_SEL_FMAP_16", 0x454, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_16_field_info), - trq_sel_fmap_16_field_info -}, -{"TRQ_SEL_FMAP_17", 0x458, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_17_field_info), - trq_sel_fmap_17_field_info -}, -{"TRQ_SEL_FMAP_18", 0x45c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_18_field_info), - trq_sel_fmap_18_field_info -}, -{"TRQ_SEL_FMAP_19", 0x460, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_19_field_info), - trq_sel_fmap_19_field_info -}, -{"TRQ_SEL_FMAP_1A", 0x464, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1a_field_info), - trq_sel_fmap_1a_field_info -}, -{"TRQ_SEL_FMAP_1B", 0x468, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1b_field_info), - trq_sel_fmap_1b_field_info -}, -{"TRQ_SEL_FMAP_1C", 0x46c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1c_field_info), - trq_sel_fmap_1c_field_info -}, -{"TRQ_SEL_FMAP_1D", 0x470, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1d_field_info), - trq_sel_fmap_1d_field_info -}, -{"TRQ_SEL_FMAP_1E", 0x474, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1e_field_info), - trq_sel_fmap_1e_field_info -}, -{"TRQ_SEL_FMAP_1F", 0x478, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1f_field_info), - trq_sel_fmap_1f_field_info -}, -{"TRQ_SEL_FMAP_20", 0x47c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_20_field_info), - trq_sel_fmap_20_field_info -}, -{"TRQ_SEL_FMAP_21", 0x480, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_21_field_info), - trq_sel_fmap_21_field_info -}, -{"TRQ_SEL_FMAP_22", 0x484, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_22_field_info), - trq_sel_fmap_22_field_info -}, -{"TRQ_SEL_FMAP_23", 0x488, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_23_field_info), - trq_sel_fmap_23_field_info -}, -{"TRQ_SEL_FMAP_24", 0x48c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_24_field_info), - trq_sel_fmap_24_field_info -}, -{"TRQ_SEL_FMAP_25", 0x490, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_25_field_info), - trq_sel_fmap_25_field_info -}, -{"TRQ_SEL_FMAP_26", 0x494, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_26_field_info), - trq_sel_fmap_26_field_info -}, -{"TRQ_SEL_FMAP_27", 0x498, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_27_field_info), - trq_sel_fmap_27_field_info -}, -{"TRQ_SEL_FMAP_28", 0x49c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_28_field_info), - trq_sel_fmap_28_field_info -}, -{"TRQ_SEL_FMAP_29", 0x4a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_29_field_info), - trq_sel_fmap_29_field_info -}, -{"TRQ_SEL_FMAP_2A", 0x4a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2a_field_info), - trq_sel_fmap_2a_field_info -}, -{"TRQ_SEL_FMAP_2B", 0x4a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2b_field_info), - trq_sel_fmap_2b_field_info -}, -{"TRQ_SEL_FMAP_2C", 0x4ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2c_field_info), - trq_sel_fmap_2c_field_info -}, -{"TRQ_SEL_FMAP_2D", 0x4b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2d_field_info), - trq_sel_fmap_2d_field_info -}, -{"TRQ_SEL_FMAP_2E", 0x4b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2e_field_info), - trq_sel_fmap_2e_field_info -}, -{"TRQ_SEL_FMAP_2F", 0x4b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2f_field_info), - trq_sel_fmap_2f_field_info -}, -{"TRQ_SEL_FMAP_30", 0x4bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_30_field_info), - trq_sel_fmap_30_field_info -}, -{"TRQ_SEL_FMAP_31", 0x4d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_31_field_info), - trq_sel_fmap_31_field_info -}, -{"TRQ_SEL_FMAP_32", 0x4d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_32_field_info), - trq_sel_fmap_32_field_info -}, -{"TRQ_SEL_FMAP_33", 0x4d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_33_field_info), - trq_sel_fmap_33_field_info -}, -{"TRQ_SEL_FMAP_34", 0x4dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_34_field_info), - trq_sel_fmap_34_field_info -}, -{"TRQ_SEL_FMAP_35", 0x4e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_35_field_info), - trq_sel_fmap_35_field_info -}, -{"TRQ_SEL_FMAP_36", 0x4e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_36_field_info), - trq_sel_fmap_36_field_info -}, -{"TRQ_SEL_FMAP_37", 0x4e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_37_field_info), - trq_sel_fmap_37_field_info -}, -{"TRQ_SEL_FMAP_38", 0x4ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_38_field_info), - trq_sel_fmap_38_field_info -}, -{"TRQ_SEL_FMAP_39", 0x4f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_39_field_info), - trq_sel_fmap_39_field_info -}, -{"TRQ_SEL_FMAP_3A", 0x4f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3a_field_info), - trq_sel_fmap_3a_field_info -}, -{"TRQ_SEL_FMAP_3B", 0x4f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3b_field_info), - trq_sel_fmap_3b_field_info -}, -{"TRQ_SEL_FMAP_3C", 0x4fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3c_field_info), - trq_sel_fmap_3c_field_info -}, -{"TRQ_SEL_FMAP_3D", 0x500, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3d_field_info), - trq_sel_fmap_3d_field_info -}, -{"TRQ_SEL_FMAP_3E", 0x504, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3e_field_info), - trq_sel_fmap_3e_field_info -}, -{"TRQ_SEL_FMAP_3F", 0x508, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3f_field_info), - trq_sel_fmap_3f_field_info -}, -{"TRQ_SEL_FMAP_40", 0x50c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_40_field_info), - trq_sel_fmap_40_field_info -}, -{"TRQ_SEL_FMAP_41", 0x510, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_41_field_info), - trq_sel_fmap_41_field_info -}, -{"TRQ_SEL_FMAP_42", 0x514, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_42_field_info), - trq_sel_fmap_42_field_info -}, -{"TRQ_SEL_FMAP_43", 0x518, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_43_field_info), - trq_sel_fmap_43_field_info -}, -{"TRQ_SEL_FMAP_44", 0x51c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_44_field_info), - trq_sel_fmap_44_field_info -}, -{"TRQ_SEL_FMAP_45", 0x520, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_45_field_info), - trq_sel_fmap_45_field_info -}, -{"TRQ_SEL_FMAP_46", 0x524, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_46_field_info), - trq_sel_fmap_46_field_info -}, -{"TRQ_SEL_FMAP_47", 0x528, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_47_field_info), - trq_sel_fmap_47_field_info -}, -{"TRQ_SEL_FMAP_48", 0x52c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_48_field_info), - trq_sel_fmap_48_field_info -}, -{"TRQ_SEL_FMAP_49", 0x530, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_49_field_info), - trq_sel_fmap_49_field_info -}, -{"TRQ_SEL_FMAP_4A", 0x534, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4a_field_info), - trq_sel_fmap_4a_field_info -}, -{"TRQ_SEL_FMAP_4B", 0x538, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4b_field_info), - trq_sel_fmap_4b_field_info -}, -{"TRQ_SEL_FMAP_4C", 0x53c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4c_field_info), - trq_sel_fmap_4c_field_info -}, -{"TRQ_SEL_FMAP_4D", 0x540, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4d_field_info), - trq_sel_fmap_4d_field_info -}, -{"TRQ_SEL_FMAP_4E", 0x544, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4e_field_info), - trq_sel_fmap_4e_field_info -}, -{"TRQ_SEL_FMAP_4F", 0x548, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4f_field_info), - trq_sel_fmap_4f_field_info -}, -{"TRQ_SEL_FMAP_50", 0x54c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_50_field_info), - trq_sel_fmap_50_field_info -}, -{"TRQ_SEL_FMAP_51", 0x550, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_51_field_info), - trq_sel_fmap_51_field_info -}, -{"TRQ_SEL_FMAP_52", 0x554, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_52_field_info), - trq_sel_fmap_52_field_info -}, -{"TRQ_SEL_FMAP_53", 0x558, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_53_field_info), - trq_sel_fmap_53_field_info -}, -{"TRQ_SEL_FMAP_54", 0x55c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_54_field_info), - trq_sel_fmap_54_field_info -}, -{"TRQ_SEL_FMAP_55", 0x560, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_55_field_info), - trq_sel_fmap_55_field_info -}, -{"TRQ_SEL_FMAP_56", 0x564, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_56_field_info), - trq_sel_fmap_56_field_info -}, -{"TRQ_SEL_FMAP_57", 0x568, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_57_field_info), - trq_sel_fmap_57_field_info -}, -{"TRQ_SEL_FMAP_58", 0x56c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_58_field_info), - trq_sel_fmap_58_field_info -}, -{"TRQ_SEL_FMAP_59", 0x570, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_59_field_info), - trq_sel_fmap_59_field_info -}, -{"TRQ_SEL_FMAP_5A", 0x574, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5a_field_info), - trq_sel_fmap_5a_field_info -}, -{"TRQ_SEL_FMAP_5B", 0x578, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5b_field_info), - trq_sel_fmap_5b_field_info -}, -{"TRQ_SEL_FMAP_5C", 0x57c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5c_field_info), - trq_sel_fmap_5c_field_info -}, -{"TRQ_SEL_FMAP_5D", 0x580, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5d_field_info), - trq_sel_fmap_5d_field_info -}, -{"TRQ_SEL_FMAP_5E", 0x584, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5e_field_info), - trq_sel_fmap_5e_field_info -}, -{"TRQ_SEL_FMAP_5F", 0x588, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5f_field_info), - trq_sel_fmap_5f_field_info -}, -{"TRQ_SEL_FMAP_60", 0x58c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_60_field_info), - trq_sel_fmap_60_field_info -}, -{"TRQ_SEL_FMAP_61", 0x590, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_61_field_info), - trq_sel_fmap_61_field_info -}, -{"TRQ_SEL_FMAP_62", 0x594, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_62_field_info), - trq_sel_fmap_62_field_info -}, -{"TRQ_SEL_FMAP_63", 0x598, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_63_field_info), - trq_sel_fmap_63_field_info -}, -{"TRQ_SEL_FMAP_64", 0x59c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_64_field_info), - trq_sel_fmap_64_field_info -}, -{"TRQ_SEL_FMAP_65", 0x5a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_65_field_info), - trq_sel_fmap_65_field_info -}, -{"TRQ_SEL_FMAP_66", 0x5a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_66_field_info), - trq_sel_fmap_66_field_info -}, -{"TRQ_SEL_FMAP_67", 0x5a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_67_field_info), - trq_sel_fmap_67_field_info -}, -{"TRQ_SEL_FMAP_68", 0x5ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_68_field_info), - trq_sel_fmap_68_field_info -}, -{"TRQ_SEL_FMAP_69", 0x5b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_69_field_info), - trq_sel_fmap_69_field_info -}, -{"TRQ_SEL_FMAP_6A", 0x5b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6a_field_info), - trq_sel_fmap_6a_field_info -}, -{"TRQ_SEL_FMAP_6B", 0x5b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6b_field_info), - trq_sel_fmap_6b_field_info -}, -{"TRQ_SEL_FMAP_6C", 0x5bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6c_field_info), - trq_sel_fmap_6c_field_info -}, -{"TRQ_SEL_FMAP_6D", 0x5c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6d_field_info), - trq_sel_fmap_6d_field_info -}, -{"TRQ_SEL_FMAP_6E", 0x5c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6e_field_info), - trq_sel_fmap_6e_field_info -}, -{"TRQ_SEL_FMAP_6F", 0x5c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6f_field_info), - trq_sel_fmap_6f_field_info -}, -{"TRQ_SEL_FMAP_70", 0x5cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_70_field_info), - trq_sel_fmap_70_field_info -}, -{"TRQ_SEL_FMAP_71", 0x5d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_71_field_info), - trq_sel_fmap_71_field_info -}, -{"TRQ_SEL_FMAP_72", 0x5d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_72_field_info), - trq_sel_fmap_72_field_info -}, -{"TRQ_SEL_FMAP_73", 0x5d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_73_field_info), - trq_sel_fmap_73_field_info -}, -{"TRQ_SEL_FMAP_74", 0x5dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_74_field_info), - trq_sel_fmap_74_field_info -}, -{"TRQ_SEL_FMAP_75", 0x5e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_75_field_info), - trq_sel_fmap_75_field_info -}, -{"TRQ_SEL_FMAP_76", 0x5e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_76_field_info), - trq_sel_fmap_76_field_info -}, -{"TRQ_SEL_FMAP_77", 0x5e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_77_field_info), - trq_sel_fmap_77_field_info -}, -{"TRQ_SEL_FMAP_78", 0x5ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_78_field_info), - trq_sel_fmap_78_field_info -}, -{"TRQ_SEL_FMAP_79", 0x5f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_79_field_info), - trq_sel_fmap_79_field_info -}, -{"TRQ_SEL_FMAP_7A", 0x5f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7a_field_info), - trq_sel_fmap_7a_field_info -}, -{"TRQ_SEL_FMAP_7B", 0x5f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7b_field_info), - trq_sel_fmap_7b_field_info -}, -{"TRQ_SEL_FMAP_7C", 0x5fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7c_field_info), - trq_sel_fmap_7c_field_info -}, -{"TRQ_SEL_FMAP_7D", 0x600, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7d_field_info), - trq_sel_fmap_7d_field_info -}, -{"TRQ_SEL_FMAP_7E", 0x604, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7e_field_info), - trq_sel_fmap_7e_field_info -}, -{"TRQ_SEL_FMAP_7F", 0x608, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7f_field_info), - trq_sel_fmap_7f_field_info -}, -{"TRQ_SEL_FMAP_80", 0x60c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_80_field_info), - trq_sel_fmap_80_field_info -}, -{"TRQ_SEL_FMAP_81", 0x610, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_81_field_info), - trq_sel_fmap_81_field_info -}, -{"TRQ_SEL_FMAP_82", 0x614, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_82_field_info), - trq_sel_fmap_82_field_info -}, -{"TRQ_SEL_FMAP_83", 0x618, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_83_field_info), - trq_sel_fmap_83_field_info -}, -{"TRQ_SEL_FMAP_84", 0x61c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_84_field_info), - trq_sel_fmap_84_field_info -}, -{"TRQ_SEL_FMAP_85", 0x620, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_85_field_info), - trq_sel_fmap_85_field_info -}, -{"TRQ_SEL_FMAP_86", 0x624, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_86_field_info), - trq_sel_fmap_86_field_info -}, -{"TRQ_SEL_FMAP_87", 0x628, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_87_field_info), - trq_sel_fmap_87_field_info -}, -{"TRQ_SEL_FMAP_88", 0x62c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_88_field_info), - trq_sel_fmap_88_field_info -}, -{"TRQ_SEL_FMAP_89", 0x630, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_89_field_info), - trq_sel_fmap_89_field_info -}, -{"TRQ_SEL_FMAP_8A", 0x634, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8a_field_info), - trq_sel_fmap_8a_field_info -}, -{"TRQ_SEL_FMAP_8B", 0x638, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8b_field_info), - trq_sel_fmap_8b_field_info -}, -{"TRQ_SEL_FMAP_8C", 0x63c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8c_field_info), - trq_sel_fmap_8c_field_info -}, -{"TRQ_SEL_FMAP_8D", 0x640, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8d_field_info), - trq_sel_fmap_8d_field_info -}, -{"TRQ_SEL_FMAP_8E", 0x644, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8e_field_info), - trq_sel_fmap_8e_field_info -}, -{"TRQ_SEL_FMAP_8F", 0x648, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8f_field_info), - trq_sel_fmap_8f_field_info -}, -{"TRQ_SEL_FMAP_90", 0x64c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_90_field_info), - trq_sel_fmap_90_field_info -}, -{"TRQ_SEL_FMAP_91", 0x650, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_91_field_info), - trq_sel_fmap_91_field_info -}, -{"TRQ_SEL_FMAP_92", 0x654, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_92_field_info), - trq_sel_fmap_92_field_info -}, -{"TRQ_SEL_FMAP_93", 0x658, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_93_field_info), - trq_sel_fmap_93_field_info -}, -{"TRQ_SEL_FMAP_94", 0x65c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_94_field_info), - trq_sel_fmap_94_field_info -}, -{"TRQ_SEL_FMAP_95", 0x660, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_95_field_info), - trq_sel_fmap_95_field_info -}, -{"TRQ_SEL_FMAP_96", 0x664, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_96_field_info), - trq_sel_fmap_96_field_info -}, -{"TRQ_SEL_FMAP_97", 0x668, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_97_field_info), - trq_sel_fmap_97_field_info -}, -{"TRQ_SEL_FMAP_98", 0x66c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_98_field_info), - trq_sel_fmap_98_field_info -}, -{"TRQ_SEL_FMAP_99", 0x670, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_99_field_info), - trq_sel_fmap_99_field_info -}, -{"TRQ_SEL_FMAP_9A", 0x674, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9a_field_info), - trq_sel_fmap_9a_field_info -}, -{"TRQ_SEL_FMAP_9B", 0x678, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9b_field_info), - trq_sel_fmap_9b_field_info -}, -{"TRQ_SEL_FMAP_9C", 0x67c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9c_field_info), - trq_sel_fmap_9c_field_info -}, -{"TRQ_SEL_FMAP_9D", 0x680, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9d_field_info), - trq_sel_fmap_9d_field_info -}, -{"TRQ_SEL_FMAP_9E", 0x684, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9e_field_info), - trq_sel_fmap_9e_field_info -}, -{"TRQ_SEL_FMAP_9F", 0x688, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9f_field_info), - trq_sel_fmap_9f_field_info -}, -{"TRQ_SEL_FMAP_A0", 0x68c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a0_field_info), - trq_sel_fmap_a0_field_info -}, -{"TRQ_SEL_FMAP_A1", 0x690, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a1_field_info), - trq_sel_fmap_a1_field_info -}, -{"TRQ_SEL_FMAP_A2", 0x694, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a2_field_info), - trq_sel_fmap_a2_field_info -}, -{"TRQ_SEL_FMAP_A3", 0x698, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a3_field_info), - trq_sel_fmap_a3_field_info -}, -{"TRQ_SEL_FMAP_A4", 0x69c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a4_field_info), - trq_sel_fmap_a4_field_info -}, -{"TRQ_SEL_FMAP_A5", 0x6a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a5_field_info), - trq_sel_fmap_a5_field_info -}, -{"TRQ_SEL_FMAP_A6", 0x6a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a6_field_info), - trq_sel_fmap_a6_field_info -}, -{"TRQ_SEL_FMAP_A7", 0x6a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a7_field_info), - trq_sel_fmap_a7_field_info -}, -{"TRQ_SEL_FMAP_A8", 0x6ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a8_field_info), - trq_sel_fmap_a8_field_info -}, -{"TRQ_SEL_FMAP_A9", 0x6b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a9_field_info), - trq_sel_fmap_a9_field_info -}, -{"TRQ_SEL_FMAP_AA", 0x6b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_aa_field_info), - trq_sel_fmap_aa_field_info -}, -{"TRQ_SEL_FMAP_AB", 0x6b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ab_field_info), - trq_sel_fmap_ab_field_info -}, -{"TRQ_SEL_FMAP_AC", 0x6bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ac_field_info), - trq_sel_fmap_ac_field_info -}, -{"TRQ_SEL_FMAP_AD", 0x6d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ad_field_info), - trq_sel_fmap_ad_field_info -}, -{"TRQ_SEL_FMAP_AE", 0x6d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ae_field_info), - trq_sel_fmap_ae_field_info -}, -{"TRQ_SEL_FMAP_AF", 0x6d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_af_field_info), - trq_sel_fmap_af_field_info -}, -{"TRQ_SEL_FMAP_B0", 0x6dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b0_field_info), - trq_sel_fmap_b0_field_info -}, -{"TRQ_SEL_FMAP_B1", 0x6e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b1_field_info), - trq_sel_fmap_b1_field_info -}, -{"TRQ_SEL_FMAP_B2", 0x6e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b2_field_info), - trq_sel_fmap_b2_field_info -}, -{"TRQ_SEL_FMAP_B3", 0x6e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b3_field_info), - trq_sel_fmap_b3_field_info -}, -{"TRQ_SEL_FMAP_B4", 0x6ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b4_field_info), - trq_sel_fmap_b4_field_info -}, -{"TRQ_SEL_FMAP_B5", 0x6f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b5_field_info), - trq_sel_fmap_b5_field_info -}, -{"TRQ_SEL_FMAP_B6", 0x6f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b6_field_info), - trq_sel_fmap_b6_field_info -}, -{"TRQ_SEL_FMAP_B7", 0x6f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b7_field_info), - trq_sel_fmap_b7_field_info -}, -{"TRQ_SEL_FMAP_B8", 0x6fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b8_field_info), - trq_sel_fmap_b8_field_info -}, -{"TRQ_SEL_FMAP_B9", 0x700, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b9_field_info), - trq_sel_fmap_b9_field_info -}, -{"TRQ_SEL_FMAP_BA", 0x704, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ba_field_info), - trq_sel_fmap_ba_field_info -}, -{"TRQ_SEL_FMAP_BB", 0x708, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bb_field_info), - trq_sel_fmap_bb_field_info -}, -{"TRQ_SEL_FMAP_BC", 0x70c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bc_field_info), - trq_sel_fmap_bc_field_info -}, -{"TRQ_SEL_FMAP_BD", 0x710, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bd_field_info), - trq_sel_fmap_bd_field_info -}, -{"TRQ_SEL_FMAP_BE", 0x714, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_be_field_info), - trq_sel_fmap_be_field_info -}, -{"TRQ_SEL_FMAP_BF", 0x718, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bf_field_info), - trq_sel_fmap_bf_field_info -}, -{"TRQ_SEL_FMAP_C0", 0x71c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c0_field_info), - trq_sel_fmap_c0_field_info -}, -{"TRQ_SEL_FMAP_C1", 0x720, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c1_field_info), - trq_sel_fmap_c1_field_info -}, -{"TRQ_SEL_FMAP_C2", 0x734, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c2_field_info), - trq_sel_fmap_c2_field_info -}, -{"TRQ_SEL_FMAP_C3", 0x748, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c3_field_info), - trq_sel_fmap_c3_field_info -}, -{"TRQ_SEL_FMAP_C4", 0x74c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c4_field_info), - trq_sel_fmap_c4_field_info -}, -{"TRQ_SEL_FMAP_C5", 0x750, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c5_field_info), - trq_sel_fmap_c5_field_info -}, -{"TRQ_SEL_FMAP_C6", 0x754, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c6_field_info), - trq_sel_fmap_c6_field_info -}, -{"TRQ_SEL_FMAP_C7", 0x758, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c7_field_info), - trq_sel_fmap_c7_field_info -}, -{"TRQ_SEL_FMAP_C8", 0x75c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c8_field_info), - trq_sel_fmap_c8_field_info -}, -{"TRQ_SEL_FMAP_C9", 0x760, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c9_field_info), - trq_sel_fmap_c9_field_info -}, -{"TRQ_SEL_FMAP_CA", 0x764, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ca_field_info), - trq_sel_fmap_ca_field_info -}, -{"TRQ_SEL_FMAP_CB", 0x768, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cb_field_info), - trq_sel_fmap_cb_field_info -}, -{"TRQ_SEL_FMAP_CC", 0x76c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cc_field_info), - trq_sel_fmap_cc_field_info -}, -{"TRQ_SEL_FMAP_CD", 0x770, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cd_field_info), - trq_sel_fmap_cd_field_info -}, -{"TRQ_SEL_FMAP_CE", 0x774, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ce_field_info), - trq_sel_fmap_ce_field_info -}, -{"TRQ_SEL_FMAP_CF", 0x778, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cf_field_info), - trq_sel_fmap_cf_field_info -}, -{"TRQ_SEL_FMAP_D0", 0x77c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d0_field_info), - trq_sel_fmap_d0_field_info -}, -{"TRQ_SEL_FMAP_D1", 0x780, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d1_field_info), - trq_sel_fmap_d1_field_info -}, -{"TRQ_SEL_FMAP_D2", 0x784, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d2_field_info), - trq_sel_fmap_d2_field_info -}, -{"TRQ_SEL_FMAP_D3", 0x788, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d3_field_info), - trq_sel_fmap_d3_field_info -}, -{"TRQ_SEL_FMAP_D4", 0x78c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d4_field_info), - trq_sel_fmap_d4_field_info -}, -{"TRQ_SEL_FMAP_D5", 0x790, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d5_field_info), - trq_sel_fmap_d5_field_info -}, -{"TRQ_SEL_FMAP_D6", 0x794, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d6_field_info), - trq_sel_fmap_d6_field_info -}, -{"TRQ_SEL_FMAP_D7", 0x798, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d7_field_info), - trq_sel_fmap_d7_field_info -}, -{"TRQ_SEL_FMAP_D8", 0x79c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d8_field_info), - trq_sel_fmap_d8_field_info -}, -{"TRQ_SEL_FMAP_D9", 0x7a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d9_field_info), - trq_sel_fmap_d9_field_info -}, -{"TRQ_SEL_FMAP_DA", 0x7a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_da_field_info), - trq_sel_fmap_da_field_info -}, -{"TRQ_SEL_FMAP_DB", 0x7a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_db_field_info), - trq_sel_fmap_db_field_info -}, -{"TRQ_SEL_FMAP_DC", 0x7ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_dc_field_info), - trq_sel_fmap_dc_field_info -}, -{"TRQ_SEL_FMAP_DD", 0x7b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_dd_field_info), - trq_sel_fmap_dd_field_info -}, -{"TRQ_SEL_FMAP_DE", 0x7b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_de_field_info), - trq_sel_fmap_de_field_info -}, -{"TRQ_SEL_FMAP_DF", 0x7b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_df_field_info), - trq_sel_fmap_df_field_info -}, -{"TRQ_SEL_FMAP_E0", 0x7bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e0_field_info), - trq_sel_fmap_e0_field_info -}, -{"TRQ_SEL_FMAP_E1", 0x7c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e1_field_info), - trq_sel_fmap_e1_field_info -}, -{"TRQ_SEL_FMAP_E2", 0x7c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e2_field_info), - trq_sel_fmap_e2_field_info -}, -{"TRQ_SEL_FMAP_E3", 0x7c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e3_field_info), - trq_sel_fmap_e3_field_info -}, -{"TRQ_SEL_FMAP_E4", 0x7cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e4_field_info), - trq_sel_fmap_e4_field_info -}, -{"TRQ_SEL_FMAP_E5", 0x7d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e5_field_info), - trq_sel_fmap_e5_field_info -}, -{"TRQ_SEL_FMAP_E6", 0x7d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e6_field_info), - trq_sel_fmap_e6_field_info -}, -{"TRQ_SEL_FMAP_E7", 0x7d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e7_field_info), - trq_sel_fmap_e7_field_info -}, -{"TRQ_SEL_FMAP_E8", 0x7dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e8_field_info), - trq_sel_fmap_e8_field_info -}, -{"TRQ_SEL_FMAP_E9", 0x7e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e9_field_info), - trq_sel_fmap_e9_field_info -}, -{"TRQ_SEL_FMAP_EA", 0x7e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ea_field_info), - trq_sel_fmap_ea_field_info -}, -{"TRQ_SEL_FMAP_EB", 0x7e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_eb_field_info), - trq_sel_fmap_eb_field_info -}, -{"TRQ_SEL_FMAP_EC", 0x7ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ec_field_info), - trq_sel_fmap_ec_field_info -}, -{"TRQ_SEL_FMAP_ED", 0x7f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ed_field_info), - trq_sel_fmap_ed_field_info -}, -{"TRQ_SEL_FMAP_EE", 0x7f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ee_field_info), - trq_sel_fmap_ee_field_info -}, -{"TRQ_SEL_FMAP_EF", 0x7f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ef_field_info), - trq_sel_fmap_ef_field_info -}, -{"TRQ_SEL_FMAP_F0", 0x7fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_f0_field_info), - trq_sel_fmap_f0_field_info -}, -{"IND_CTXT_DATA_3", 0x804, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_3_field_info), - ind_ctxt_data_3_field_info -}, -{"IND_CTXT_DATA_2", 0x808, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_2_field_info), - ind_ctxt_data_2_field_info -}, -{"IND_CTXT_DATA_1", 0x80c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_1_field_info), - ind_ctxt_data_1_field_info -}, -{"IND_CTXT_DATA_0", 0x810, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_0_field_info), - ind_ctxt_data_0_field_info -}, -{"IND_CTXT3", 0x814, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt3_field_info), - ind_ctxt3_field_info -}, -{"IND_CTXT2", 0x818, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt2_field_info), - ind_ctxt2_field_info -}, -{"IND_CTXT1", 0x81c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt1_field_info), - ind_ctxt1_field_info -}, -{"IND_CTXT0", 0x820, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt0_field_info), - ind_ctxt0_field_info -}, -{"IND_CTXT_CMD", 0x824, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_cmd_field_info), - ind_ctxt_cmd_field_info -}, -{"C2H_TIMER_CNT_1", 0xa00, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_1_field_info), - c2h_timer_cnt_1_field_info -}, -{"C2H_TIMER_CNT_2", 0xa04, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_2_field_info), - c2h_timer_cnt_2_field_info -}, -{"C2H_TIMER_CNT_3", 0xa08, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_3_field_info), - c2h_timer_cnt_3_field_info -}, -{"C2H_TIMER_CNT_4", 0xa0c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_4_field_info), - c2h_timer_cnt_4_field_info -}, -{"C2H_TIMER_CNT_5", 0xa10, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_5_field_info), - c2h_timer_cnt_5_field_info -}, -{"C2H_TIMER_CNT_6", 0xa14, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_6_field_info), - c2h_timer_cnt_6_field_info -}, -{"C2H_TIMER_CNT_7", 0xa18, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_7_field_info), - c2h_timer_cnt_7_field_info -}, -{"C2H_TIMER_CNT_8", 0xa1c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_8_field_info), - c2h_timer_cnt_8_field_info -}, -{"C2H_TIMER_CNT_9", 0xa20, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_9_field_info), - c2h_timer_cnt_9_field_info -}, -{"C2H_TIMER_CNT_A", 0xa24, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_a_field_info), - c2h_timer_cnt_a_field_info -}, -{"C2H_TIMER_CNT_B", 0xa28, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_b_field_info), - c2h_timer_cnt_b_field_info -}, -{"C2H_TIMER_CNT_C", 0xa2c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_c_field_info), - c2h_timer_cnt_c_field_info -}, -{"C2H_TIMER_CNT_D", 0xa30, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_d_field_info), - c2h_timer_cnt_d_field_info -}, -{"C2H_TIMER_CNT_E", 0xa34, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_e_field_info), - c2h_timer_cnt_e_field_info -}, -{"C2H_TIMER_CNT_F", 0xa38, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_f_field_info), - c2h_timer_cnt_f_field_info -}, -{"C2H_TIMER_CNT_10", 0xa3c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_10_field_info), - c2h_timer_cnt_10_field_info -}, -{"C2H_CNT_TH_1", 0xa40, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_1_field_info), - c2h_cnt_th_1_field_info -}, -{"C2H_CNT_TH_2", 0xa44, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_2_field_info), - c2h_cnt_th_2_field_info -}, -{"C2H_CNT_TH_3", 0xa48, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_3_field_info), - c2h_cnt_th_3_field_info -}, -{"C2H_CNT_TH_4", 0xa4c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_4_field_info), - c2h_cnt_th_4_field_info -}, -{"C2H_CNT_TH_5", 0xa50, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_5_field_info), - c2h_cnt_th_5_field_info -}, -{"C2H_CNT_TH_6", 0xa54, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_6_field_info), - c2h_cnt_th_6_field_info -}, -{"C2H_CNT_TH_7", 0xa58, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_7_field_info), - c2h_cnt_th_7_field_info -}, -{"C2H_CNT_TH_8", 0xa5c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_8_field_info), - c2h_cnt_th_8_field_info -}, -{"C2H_CNT_TH_9", 0xa60, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_9_field_info), - c2h_cnt_th_9_field_info -}, -{"C2H_CNT_TH_A", 0xa64, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_a_field_info), - c2h_cnt_th_a_field_info -}, -{"C2H_CNT_TH_B", 0xa68, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_b_field_info), - c2h_cnt_th_b_field_info -}, -{"C2H_CNT_TH_C", 0xa6c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_c_field_info), - c2h_cnt_th_c_field_info -}, -{"C2H_CNT_TH_D", 0xa70, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_d_field_info), - c2h_cnt_th_d_field_info -}, -{"C2H_CNT_TH_E", 0xa74, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_e_field_info), - c2h_cnt_th_e_field_info -}, -{"C2H_CNT_TH_F", 0xa78, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_f_field_info), - c2h_cnt_th_f_field_info -}, -{"C2H_CNT_TH_10", 0xa7c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_10_field_info), - c2h_cnt_th_10_field_info -}, -{"C2H_QID2VEC_MAP_QID", 0xa80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_qid2vec_map_qid_field_info), - c2h_qid2vec_map_qid_field_info -}, -{"C2H_QID2VEC_MAP", 0xa84, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_qid2vec_map_field_info), - c2h_qid2vec_map_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xa88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_field_info), - c2h_stat_s_axis_c2h_accepted_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED", 0xa8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_field_info), - c2h_stat_s_axis_wrb_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xa90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_field_info), - c2h_stat_desc_rsp_pkt_accepted_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP", 0xa94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_field_info), - c2h_stat_axis_pkg_cmp_field_info -}, -{"C2H_STAT_DESC_RSP_ACCEPTED", 0xa98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_accepted_field_info), - c2h_stat_desc_rsp_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_CMP", 0xa9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_cmp_field_info), - c2h_stat_desc_rsp_cmp_field_info -}, -{"C2H_STAT_WRQ_OUT", 0xaa0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wrq_out_field_info), - c2h_stat_wrq_out_field_info -}, -{"C2H_STAT_WPL_REN_ACCEPTED", 0xaa4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wpl_ren_accepted_field_info), - c2h_stat_wpl_ren_accepted_field_info -}, -{"C2H_STAT_TOTAL_WRQ_LEN", 0xaa8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wrq_len_field_info), - c2h_stat_total_wrq_len_field_info -}, -{"C2H_STAT_TOTAL_WPL_LEN", 0xaac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wpl_len_field_info), - c2h_stat_total_wpl_len_field_info -}, -{"C2H_BUF_SZ_0", 0xab0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_0_field_info), - c2h_buf_sz_0_field_info -}, -{"C2H_BUF_SZ_1", 0xab4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_1_field_info), - c2h_buf_sz_1_field_info -}, -{"C2H_BUF_SZ_2", 0xab8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_2_field_info), - c2h_buf_sz_2_field_info -}, -{"C2H_BUF_SZ_3", 0xabc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_3_field_info), - c2h_buf_sz_3_field_info -}, -{"C2H_BUF_SZ_4", 0xac0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_4_field_info), - c2h_buf_sz_4_field_info -}, -{"C2H_BUF_SZ_5", 0xac4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_5_field_info), - c2h_buf_sz_5_field_info -}, -{"C2H_BUF_SZ_7", 0xac8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_7_field_info), - c2h_buf_sz_7_field_info -}, -{"C2H_BUF_SZ_8", 0xacc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_8_field_info), - c2h_buf_sz_8_field_info -}, -{"C2H_BUF_SZ_9", 0xad0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_9_field_info), - c2h_buf_sz_9_field_info -}, -{"C2H_BUF_SZ_10", 0xad4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_10_field_info), - c2h_buf_sz_10_field_info -}, -{"C2H_BUF_SZ_11", 0xad8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_11_field_info), - c2h_buf_sz_11_field_info -}, -{"C2H_BUF_SZ_12", 0xae0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_12_field_info), - c2h_buf_sz_12_field_info -}, -{"C2H_BUF_SZ_13", 0xae4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_13_field_info), - c2h_buf_sz_13_field_info -}, -{"C2H_BUF_SZ_14", 0xae8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_14_field_info), - c2h_buf_sz_14_field_info -}, -{"C2H_BUF_SZ_15", 0xaec, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_15_field_info), - c2h_buf_sz_15_field_info -}, -{"C2H_ERR_STAT", 0xaf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_stat_field_info), - c2h_err_stat_field_info -}, -{"C2H_ERR_MASK", 0xaf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_mask_field_info), - c2h_err_mask_field_info -}, -{"C2H_FATAL_ERR_STAT", 0xaf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_stat_field_info), - c2h_fatal_err_stat_field_info -}, -{"C2H_FATAL_ERR_MASK", 0xafc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_mask_field_info), - c2h_fatal_err_mask_field_info -}, -{"C2H_FATAL_ERR_ENABLE", 0xb00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_enable_field_info), - c2h_fatal_err_enable_field_info -}, -{"GLBL_ERR_INT", 0xb04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_int_field_info), - glbl_err_int_field_info -}, -{"C2H_PFCH_CFG", 0xb08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_field_info), - c2h_pfch_cfg_field_info -}, -{"C2H_INT_TIMER_TICK", 0xb0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_timer_tick_field_info), - c2h_int_timer_tick_field_info -}, -{"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xb10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_drop_accepted_field_info), - c2h_stat_desc_rsp_drop_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xb14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_err_accepted_field_info), - c2h_stat_desc_rsp_err_accepted_field_info -}, -{"C2H_STAT_DESC_REQ", 0xb18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_req_field_info), - c2h_stat_desc_req_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_0", 0xb1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_0_field_info), - c2h_stat_dbg_dma_eng_0_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_1", 0xb20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_1_field_info), - c2h_stat_dbg_dma_eng_1_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_2", 0xb24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_2_field_info), - c2h_stat_dbg_dma_eng_2_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_3", 0xb28, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_3_field_info), - c2h_stat_dbg_dma_eng_3_field_info -}, -{"C2H_DBG_PFCH_ERR_CTXT", 0xb2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_err_ctxt_field_info), - c2h_dbg_pfch_err_ctxt_field_info -}, -{"C2H_FIRST_ERR_QID", 0xb30, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_first_err_qid_field_info), - c2h_first_err_qid_field_info -}, -{"STAT_NUM_WRB_IN", 0xb34, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_in_field_info), - stat_num_wrb_in_field_info -}, -{"STAT_NUM_WRB_OUT", 0xb38, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_out_field_info), - stat_num_wrb_out_field_info -}, -{"STAT_NUM_WRB_DRP", 0xb3c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_drp_field_info), - stat_num_wrb_drp_field_info -}, -{"STAT_NUM_STAT_DESC_OUT", 0xb40, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_stat_desc_out_field_info), - stat_num_stat_desc_out_field_info -}, -{"STAT_NUM_DSC_CRDT_SENT", 0xb44, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_dsc_crdt_sent_field_info), - stat_num_dsc_crdt_sent_field_info -}, -{"STAT_NUM_FCH_DSC_RCVD", 0xb48, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_fch_dsc_rcvd_field_info), - stat_num_fch_dsc_rcvd_field_info -}, -{"STAT_NUM_BYP_DSC_RCVD", 0xb4c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_byp_dsc_rcvd_field_info), - stat_num_byp_dsc_rcvd_field_info -}, -{"C2H_WRB_COAL_CFG", 0xb50, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_cfg_field_info), - c2h_wrb_coal_cfg_field_info -}, -{"C2H_INTR_H2C_REQ", 0xb54, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_h2c_req_field_info), - c2h_intr_h2c_req_field_info -}, -{"C2H_INTR_C2H_MM_REQ", 0xb58, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_mm_req_field_info), - c2h_intr_c2h_mm_req_field_info -}, -{"C2H_INTR_ERR_INT_REQ", 0xb5c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_err_int_req_field_info), - c2h_intr_err_int_req_field_info -}, -{"C2H_INTR_C2H_ST_REQ", 0xb60, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_req_field_info), - c2h_intr_c2h_st_req_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK", 0xb64, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_ack_field_info), - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL", 0xb68, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_fail_field_info), - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX", 0xb6c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info), - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL", 0xb70, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info), - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_ACK", 0xb74, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_ack_field_info), - c2h_intr_c2h_st_msix_ack_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_FAIL", 0xb78, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_fail_field_info), - c2h_intr_c2h_st_msix_fail_field_info -}, -{"C2H_INTR_C2H_ST_NO_MSIX", 0xb7c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_no_msix_field_info), - c2h_intr_c2h_st_no_msix_field_info -}, -{"C2H_INTR_C2H_ST_CTXT_INVAL", 0xb80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_ctxt_inval_field_info), - c2h_intr_c2h_st_ctxt_inval_field_info -}, -{"C2H_STAT_WR_CMP", 0xb84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wr_cmp_field_info), - c2h_stat_wr_cmp_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_4", 0xb88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_4_field_info), - c2h_stat_dbg_dma_eng_4_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_5", 0xb8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_5_field_info), - c2h_stat_dbg_dma_eng_5_field_info -}, -{"C2H_DBG_PFCH_QID", 0xb90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_qid_field_info), - c2h_dbg_pfch_qid_field_info -}, -{"C2H_DBG_PFCH", 0xb94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_field_info), - c2h_dbg_pfch_field_info -}, -{"C2H_INT_DBG", 0xb98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_dbg_field_info), - c2h_int_dbg_field_info -}, -{"C2H_STAT_IMM_ACCEPTED", 0xb9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_imm_accepted_field_info), - c2h_stat_imm_accepted_field_info -}, -{"C2H_STAT_MARKER_ACCEPTED", 0xba0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_marker_accepted_field_info), - c2h_stat_marker_accepted_field_info -}, -{"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xba4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_disable_cmp_accepted_field_info), - c2h_stat_disable_cmp_accepted_field_info -}, -{"C2H_PLD_FIFO_CRDT_CNT", 0xba8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_crdt_cnt_field_info), - c2h_pld_fifo_crdt_cnt_field_info -}, -{"H2C_ERR_STAT", 0xe00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_stat_field_info), - h2c_err_stat_field_info -}, -{"H2C_ERR_MASK", 0xe04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_mask_field_info), - h2c_err_mask_field_info -}, -{"H2C_FIRST_ERR_QID", 0xe08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_first_err_qid_field_info), - h2c_first_err_qid_field_info -}, -{"H2C_DBG_REG0", 0xe0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg0_field_info), - h2c_dbg_reg0_field_info -}, -{"H2C_DBG_REG1", 0xe10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg1_field_info), - h2c_dbg_reg1_field_info -}, -{"H2C_DBG_REG2", 0xe14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg2_field_info), - h2c_dbg_reg2_field_info -}, -{"H2C_DBG_REG3", 0xe18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg3_field_info), - h2c_dbg_reg3_field_info -}, -{"H2C_DBG_REG4", 0xe1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg4_field_info), - h2c_dbg_reg4_field_info -}, -{"H2C_FATAL_ERR_EN", 0xe20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_fatal_err_en_field_info), - h2c_fatal_err_en_field_info -}, -{"C2H_CHANNEL_CTL", 0x1004, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_ctl_field_info), - c2h_channel_ctl_field_info -}, -{"C2H_CHANNEL_CTL_1", 0x1008, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_ctl_1_field_info), - c2h_channel_ctl_1_field_info -}, -{"C2H_MM_STATUS", 0x1040, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_status_field_info), - c2h_mm_status_field_info -}, -{"C2H_CHANNEL_CMPL_DESC_CNT", 0x1048, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_cmpl_desc_cnt_field_info), - c2h_channel_cmpl_desc_cnt_field_info -}, -{"C2H_MM_ERR_CODE_ENABLE_MASK", 0x1054, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_enable_mask_field_info), - c2h_mm_err_code_enable_mask_field_info -}, -{"C2H_MM_ERR_CODE", 0x1058, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_field_info), - c2h_mm_err_code_field_info -}, -{"C2H_MM_ERR_INFO", 0x105c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_info_field_info), - c2h_mm_err_info_field_info -}, -{"C2H_MM_PERF_MON_CTL", 0x10c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_ctl_field_info), - c2h_mm_perf_mon_ctl_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT0", 0x10c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt0_field_info), - c2h_mm_perf_mon_cycle_cnt0_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT1", 0x10c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt1_field_info), - c2h_mm_perf_mon_cycle_cnt1_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT0", 0x10cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt0_field_info), - c2h_mm_perf_mon_data_cnt0_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT1", 0x10d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt1_field_info), - c2h_mm_perf_mon_data_cnt1_field_info -}, -{"C2H_MM_DBG", 0x10e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_dbg_field_info), - c2h_mm_dbg_field_info -}, -{"H2C_CHANNEL_CTL", 0x1204, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_field_info), - h2c_channel_ctl_field_info -}, -{"H2C_CHANNEL_CTL_1", 0x1208, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_1_field_info), - h2c_channel_ctl_1_field_info -}, -{"H2C_CHANNEL_CTL_2", 0x120c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_2_field_info), - h2c_channel_ctl_2_field_info -}, -{"H2C_MM_STATUS", 0x1240, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_status_field_info), - h2c_mm_status_field_info -}, -{"H2C_CHANNEL_CMPL_DESC_CNT", 0x1248, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_cmpl_desc_cnt_field_info), - h2c_channel_cmpl_desc_cnt_field_info -}, -{"H2C_MM_ERR_CODE_ENABLE_MASK", 0x1254, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_enable_mask_field_info), - h2c_mm_err_code_enable_mask_field_info -}, -{"H2C_MM_ERR_CODE", 0x1258, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_field_info), - h2c_mm_err_code_field_info -}, -{"H2C_MM_ERR_INFO", 0x125c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_info_field_info), - h2c_mm_err_info_field_info -}, -{"H2C_MM_PERF_MON_CTL", 0x12c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_ctl_field_info), - h2c_mm_perf_mon_ctl_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT0", 0x12c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt0_field_info), - h2c_mm_perf_mon_cycle_cnt0_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT1", 0x12c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt1_field_info), - h2c_mm_perf_mon_cycle_cnt1_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT0", 0x12cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt0_field_info), - h2c_mm_perf_mon_data_cnt0_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT1", 0x12d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt1_field_info), - h2c_mm_perf_mon_data_cnt1_field_info -}, -{"H2C_MM_DBG", 0x12e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_dbg_field_info), - h2c_mm_dbg_field_info -}, -{"FUNC_STATUS_REG", 0x2400, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_status_reg_field_info), - func_status_reg_field_info -}, -{"FUNC_CMD_REG", 0x2404, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_cmd_reg_field_info), - func_cmd_reg_field_info -}, -{"FUNC_INTERRUPT_VECTOR_REG", 0x2408, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_interrupt_vector_reg_field_info), - func_interrupt_vector_reg_field_info -}, -{"TARGET_FUNC_REG", 0x240c, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(target_func_reg_field_info), - target_func_reg_field_info -}, -{"FUNC_INTERRUPT_CTL_REG", 0x2410, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_interrupt_ctl_reg_field_info), - func_interrupt_ctl_reg_field_info -}, - -}; - -uint32_t qdma_cpm4_config_num_regs_get(void) -{ - return (sizeof(qdma_cpm4_config_regs)/ - sizeof(qdma_cpm4_config_regs[0])); -} - -struct xreg_info *qdma_cpm4_config_regs_get(void) -{ - return qdma_cpm4_config_regs; -} - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_list.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_list.c deleted file mode 100755 index 6cea8aa..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_list.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma_list.h" - -void qdma_list_init_head(struct qdma_list_head *head) -{ - if (head) - head->prev = head->next = head; -} - -void qdma_list_add_tail(struct qdma_list_head *node, - struct qdma_list_head *head) -{ - head->prev->next = node; - node->next = head; - node->prev = head->prev; - head->prev = node; -} - -void qdma_list_insert_before(struct qdma_list_head *new_node, - struct qdma_list_head *node) -{ - node->prev->next = new_node; - new_node->prev = node->prev; - new_node->next = node; - node->prev = new_node; -} - -void qdma_list_insert_after(struct qdma_list_head *new_node, - struct qdma_list_head *node) -{ - new_node->prev = node; - new_node->next = node->next; - node->next->prev = new_node; - node->next = new_node; -} - - -void qdma_list_del(struct qdma_list_head *node) -{ - if (node) { - if (node->prev) - node->prev->next = node->next; - if (node->next) - node->next->prev = node->prev; - } -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_list.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_list.h deleted file mode 100755 index f4224a4..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_list.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_LIST_H_ -#define __QDMA_LIST_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library provided list implementation definitions - * - * Header file *qdma_list.h* defines APIs for creating and managing list. - */ - -/** - * struct qdma_list_head - data type for creating a list node - */ -struct qdma_list_head { - struct qdma_list_head *prev; - struct qdma_list_head *next; - void *priv; -}; - -#define QDMA_LIST_HEAD_INIT(name) { &(name), &(name), NULL } - -#define QDMA_LIST_HEAD(name) \ - struct qdma_list_head name = QDMA_LIST_HEAD_INIT(name) - -#define QDMA_LIST_GET_DATA(node) (node->priv) -#define QDMA_LIST_SET_DATA(node, data) ((node)->priv = data) - - -#define qdma_list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - - -#define qdma_list_is_last_entry(entry, head) ((entry)->next == (head)) - -#define qdma_list_is_empty(head) ((head)->next == (head)) - -/*****************************************************************************/ -/** - * qdma_list_init_head(): Init the list head - * - * @head: head of the list - * - * Return: None - *****************************************************************************/ -void qdma_list_init_head(struct qdma_list_head *head); - -/*****************************************************************************/ -/** - * qdma_list_add_tail(): add the given @node at the end of the list with @head - * - * @node: new entry which has to be added at the end of the list with @head - * @head: head of the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_add_tail(struct qdma_list_head *node, - struct qdma_list_head *head); - -/*****************************************************************************/ -/** - * qdma_list_insert_before(): add the given @node at the before a @node - * - * @new_node: new entry which has to be added before @node - * @node: reference node in the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_insert_before(struct qdma_list_head *new_node, - struct qdma_list_head *node); - -/*****************************************************************************/ -/** - * qdma_list_insert_after(): add the given @node at the after a @node - * - * @new_node: new entry which has to be added after @node - * @node: reference node in the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_insert_after(struct qdma_list_head *new_node, - struct qdma_list_head *node); - -/*****************************************************************************/ -/** - * qdma_list_del(): delete an node from the list - * - * @node: node in a list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_del(struct qdma_list_head *node); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_LIST_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_mbox_protocol.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_mbox_protocol.c deleted file mode 100755 index 3dbae0d..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_mbox_protocol.c +++ /dev/null @@ -1,2156 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma_mbox_protocol.h" - -/** mailbox function status */ -#define MBOX_FN_STATUS 0x0 -/** shift value for mailbox function status in msg */ -#define S_MBOX_FN_STATUS_IN_MSG 0 -/** mask value for mailbox function status in msg*/ -#define M_MBOX_FN_STATUS_IN_MSG 0x1 -/** face value for mailbox function status in msg */ -#define F_MBOX_FN_STATUS_IN_MSG 0x1 - -/** shift value for out msg */ -#define S_MBOX_FN_STATUS_OUT_MSG 1 -/** mask value for out msg */ -#define M_MBOX_FN_STATUS_OUT_MSG 0x1 -/** face value for out msg */ -#define F_MBOX_FN_STATUS_OUT_MSG (1 << S_MBOX_FN_STATUS_OUT_MSG) -/** shift value for status ack */ -#define S_MBOX_FN_STATUS_ACK 2 /* PF only, ack status */ -/** mask value for status ack */ -#define M_MBOX_FN_STATUS_ACK 0x1 -/** face value for status ack */ -#define F_MBOX_FN_STATUS_ACK (1 << S_MBOX_FN_STATUS_ACK) -/** shift value for status src */ -#define S_MBOX_FN_STATUS_SRC 4 /* PF only, source func.*/ -/** mask value for status src */ -#define M_MBOX_FN_STATUS_SRC 0xFFF -/** face value for status src */ -#define G_MBOX_FN_STATUS_SRC(x) \ - (((x) >> S_MBOX_FN_STATUS_SRC) & M_MBOX_FN_STATUS_SRC) -/** face value for mailbox function status */ -#define MBOX_FN_STATUS_MASK \ - (F_MBOX_FN_STATUS_IN_MSG | \ - F_MBOX_FN_STATUS_OUT_MSG | \ - F_MBOX_FN_STATUS_ACK) - -/** mailbox function commands register */ -#define MBOX_FN_CMD 0x4 -/** shift value for send command */ -#define S_MBOX_FN_CMD_SND 0 -/** mask value for send command */ -#define M_MBOX_FN_CMD_SND 0x1 -/** face value for send command */ -#define F_MBOX_FN_CMD_SND (1 << S_MBOX_FN_CMD_SND) -/** shift value for receive command */ -#define S_MBOX_FN_CMD_RCV 1 -/** mask value for receive command */ -#define M_MBOX_FN_CMD_RCV 0x1 -/** face value for receive command */ -#define F_MBOX_FN_CMD_RCV (1 << S_MBOX_FN_CMD_RCV) -/** shift value for vf reset */ -#define S_MBOX_FN_CMD_VF_RESET 3 /* TBD PF only: reset VF */ -/** mask value for vf reset */ -#define M_MBOX_FN_CMD_VF_RESET 0x1 -/** mailbox isr vector register */ -#define MBOX_ISR_VEC 0x8 -/** shift value for isr vector */ -#define S_MBOX_ISR_VEC 0 -/** mask value for isr vector */ -#define M_MBOX_ISR_VEC 0x1F -/** face value for isr vector */ -#define V_MBOX_ISR_VEC(x) ((x) & M_MBOX_ISR_VEC) -/** mailbox FN target register */ -#define MBOX_FN_TARGET 0xC -/** shift value for FN target id */ -#define S_MBOX_FN_TARGET_ID 0 -/** mask value for FN target id */ -#define M_MBOX_FN_TARGET_ID 0xFFF -/** face value for FN target id */ -#define V_MBOX_FN_TARGET_ID(x) ((x) & M_MBOX_FN_TARGET_ID) -/** mailbox isr enable register */ -#define MBOX_ISR_EN 0x10 -/** shift value for isr enable */ -#define S_MBOX_ISR_EN 0 -/** mask value for isr enable */ -#define M_MBOX_ISR_EN 0x1 -/** face value for isr enable */ -#define F_MBOX_ISR_EN 0x1 -/** pf acknowledge base */ -#define MBOX_PF_ACK_BASE 0x20 -/** pf acknowledge step */ -#define MBOX_PF_ACK_STEP 4 -/** pf acknowledge count */ -#define MBOX_PF_ACK_COUNT 8 -/** mailbox incoming msg base */ -#define MBOX_IN_MSG_BASE 0x800 -/** mailbox outgoing msg base */ -#define MBOX_OUT_MSG_BASE 0xc00 -/** mailbox msg step */ -#define MBOX_MSG_STEP 4 -/** mailbox register max */ -#define MBOX_MSG_REG_MAX 32 - -/** - * enum mbox_msg_op - mailbox messages opcode - */ -#define MBOX_MSG_OP_RSP_OFFSET 0x80 -enum mbox_msg_op { - /** @MBOX_OP_BYE: vf offline, response not required*/ - MBOX_OP_VF_BYE, - /** @MBOX_OP_HELLO: vf online */ - MBOX_OP_HELLO, - /** @: FMAP programming request */ - MBOX_OP_FMAP, - /** @MBOX_OP_CSR: global CSR registers request */ - MBOX_OP_CSR, - /** @MBOX_OP_QREQ: request queues */ - MBOX_OP_QREQ, - /** @MBOX_OP_QADD: notify of queue addition */ - MBOX_OP_QNOTIFY_ADD, - /** @MBOX_OP_QNOTIFY_DEL: notify of queue deletion */ - MBOX_OP_QNOTIFY_DEL, - /** @MBOX_OP_QACTIVE_CNT: get active q count */ - MBOX_OP_GET_QACTIVE_CNT, - /** @MBOX_OP_QCTXT_WRT: queue context write */ - MBOX_OP_QCTXT_WRT, - /** @MBOX_OP_QCTXT_RD: queue context read */ - MBOX_OP_QCTXT_RD, - /** @MBOX_OP_QCTXT_CLR: queue context clear */ - MBOX_OP_QCTXT_CLR, - /** @MBOX_OP_QCTXT_INV: queue context invalidate */ - MBOX_OP_QCTXT_INV, - /** @MBOX_OP_INTR_CTXT_WRT: interrupt context write */ - MBOX_OP_INTR_CTXT_WRT, - /** @MBOX_OP_INTR_CTXT_RD: interrupt context read */ - MBOX_OP_INTR_CTXT_RD, - /** @MBOX_OP_INTR_CTXT_CLR: interrupt context clear */ - MBOX_OP_INTR_CTXT_CLR, - /** @MBOX_OP_INTR_CTXT_INV: interrupt context invalidate */ - MBOX_OP_INTR_CTXT_INV, - /** @MBOX_OP_RESET_PREPARE: PF to VF message for VF reset*/ - MBOX_OP_RESET_PREPARE, - /** @MBOX_OP_RESET_DONE: PF reset done */ - MBOX_OP_RESET_DONE, - /** @MBOX_OP_REG_LIST_READ: Read the register list */ - MBOX_OP_REG_LIST_READ, - /** @MBOX_OP_PF_BYE: pf offline, response required */ - MBOX_OP_PF_BYE, - /** @MBOX_OP_PF_RESET_VF_BYE: VF reset BYE, response required*/ - MBOX_OP_PF_RESET_VF_BYE, - - /** @MBOX_OP_HELLO_RESP: response to @MBOX_OP_HELLO */ - MBOX_OP_HELLO_RESP = 0x81, - /** @MBOX_OP_FMAP_RESP: response to @MBOX_OP_FMAP */ - MBOX_OP_FMAP_RESP, - /** @MBOX_OP_CSR_RESP: response to @MBOX_OP_CSR */ - MBOX_OP_CSR_RESP, - /** @MBOX_OP_QREQ_RESP: response to @MBOX_OP_QREQ */ - MBOX_OP_QREQ_RESP, - /** @MBOX_OP_QADD: notify of queue addition */ - MBOX_OP_QNOTIFY_ADD_RESP, - /** @MBOX_OP_QNOTIFY_DEL: notify of queue deletion */ - MBOX_OP_QNOTIFY_DEL_RESP, - /** @MBOX_OP_QACTIVE_CNT_RESP: get active q count */ - MBOX_OP_GET_QACTIVE_CNT_RESP, - /** @MBOX_OP_QCTXT_WRT_RESP: response to @MBOX_OP_QCTXT_WRT */ - MBOX_OP_QCTXT_WRT_RESP, - /** @MBOX_OP_QCTXT_RD_RESP: response to @MBOX_OP_QCTXT_RD */ - MBOX_OP_QCTXT_RD_RESP, - /** @MBOX_OP_QCTXT_CLR_RESP: response to @MBOX_OP_QCTXT_CLR */ - MBOX_OP_QCTXT_CLR_RESP, - /** @MBOX_OP_QCTXT_INV_RESP: response to @MBOX_OP_QCTXT_INV */ - MBOX_OP_QCTXT_INV_RESP, - /** @MBOX_OP_INTR_CTXT_WRT_RESP: response to @MBOX_OP_INTR_CTXT_WRT */ - MBOX_OP_INTR_CTXT_WRT_RESP, - /** @MBOX_OP_INTR_CTXT_RD_RESP: response to @MBOX_OP_INTR_CTXT_RD */ - MBOX_OP_INTR_CTXT_RD_RESP, - /** @MBOX_OP_INTR_CTXT_CLR_RESP: response to @MBOX_OP_INTR_CTXT_CLR */ - MBOX_OP_INTR_CTXT_CLR_RESP, - /** @MBOX_OP_INTR_CTXT_INV_RESP: response to @MBOX_OP_INTR_CTXT_INV */ - MBOX_OP_INTR_CTXT_INV_RESP, - /** @MBOX_OP_RESET_PREPARE_RESP: response to @MBOX_OP_RESET_PREPARE */ - MBOX_OP_RESET_PREPARE_RESP, - /** @MBOX_OP_RESET_DONE_RESP: response to @MBOX_OP_PF_VF_RESET */ - MBOX_OP_RESET_DONE_RESP, - /** @MBOX_OP_REG_LIST_READ_RESP: response to @MBOX_OP_REG_LIST_READ */ - MBOX_OP_REG_LIST_READ_RESP, - /** @MBOX_OP_PF_BYE_RESP: response to @MBOX_OP_PF_BYE */ - MBOX_OP_PF_BYE_RESP, - /** @MBOX_OP_PF_RESET_VF_BYE_RESP: - * response to @MBOX_OP_PF_RESET_VF_BYE - */ - MBOX_OP_PF_RESET_VF_BYE_RESP, - /** @MBOX_OP_MAX: total mbox opcodes*/ - MBOX_OP_MAX -}; - -/** - * struct mbox_msg_hdr - mailbox message header - */ -struct mbox_msg_hdr { - /** @op: opcode */ - uint8_t op; - /** @status: execution status */ - char status; - /** @src_func_id: src function */ - uint16_t src_func_id; - /** @dst_func_id: dst function */ - uint16_t dst_func_id; -}; - -/** - * struct mbox_msg_fmap - FMAP programming command - */ -struct mbox_msg_hello { - /** @hdr: mailbox message header */ - struct mbox_msg_hdr hdr; - /** @qbase: start queue number in the queue range */ - uint32_t qbase; - /** @qmax: max queue number in the queue range(0-2k) */ - uint32_t qmax; - /** @dev_cap: device capability */ - struct qdma_dev_attributes dev_cap; - /** @dma_device_index: dma_device_index */ - uint32_t dma_device_index; -}; - -/** - * struct mbox_msg_active_qcnt - get active queue count command - */ -struct mbox_msg_active_qcnt { - /** @hdr: mailbox message header */ - struct mbox_msg_hdr hdr; - /** @h2c_queues: number of h2c queues */ - uint32_t h2c_queues; - /** @c2h_queues: number of c2h queues */ - uint32_t c2h_queues; - /** @cmpt_queues: number of cmpt queues */ - uint32_t cmpt_queues; -}; - -/** - * struct mbox_msg_fmap - FMAP programming command - */ -struct mbox_msg_fmap { - /** @hdr: mailbox message header */ - struct mbox_msg_hdr hdr; - /** @qbase: start queue number in the queue range */ - int qbase; - /** @qmax: max queue number in the queue range(0-2k) */ - uint32_t qmax; -}; - -/** - * struct mbox_msg_csr - mailbox csr reading message - */ -struct mbox_msg_csr { - /** @hdr - mailbox message header */ - struct mbox_msg_hdr hdr; - /** @csr_info: csr info data strucutre */ - struct qdma_csr_info csr_info; -}; - -/** - * struct mbox_msg_q_nitfy - queue add/del notify message - */ -struct mbox_msg_q_nitfy { - /** @hdr - mailbox message header */ - struct mbox_msg_hdr hdr; - /** @qid_hw: queue ID */ - uint16_t qid_hw; - /** @q_type: type of q */ - enum qdma_dev_q_type q_type; -}; - -/** - * @struct - mbox_msg_qctxt - * @brief queue context mailbox message header - */ -struct mbox_msg_qctxt { - /** @hdr: mailbox message header*/ - struct mbox_msg_hdr hdr; - /** @qid_hw: queue ID */ - uint16_t qid_hw; - /** @st: streaming mode */ - uint8_t st:1; - /** @c2h: c2h direction */ - uint8_t c2h:1; - /** @cmpt_ctxt_type: completion context type */ - enum mbox_cmpt_ctxt_type cmpt_ctxt_type:2; - /** @rsvd: reserved */ - uint8_t rsvd:4; - /** union compiled_message - complete hw configuration */ - union { - /** @descq_conf: mailbox message for queue context write*/ - struct mbox_descq_conf descq_conf; - /** @descq_ctxt: mailbox message for queue context read*/ - struct qdma_descq_context descq_ctxt; - }; -}; - -/** - * @struct - mbox_intr_ctxt - * @brief queue context mailbox message header - */ -struct mbox_intr_ctxt { - /** @hdr: mailbox message header*/ - struct mbox_msg_hdr hdr; - /** interrupt context mailbox message */ - struct mbox_msg_intr_ctxt ctxt; -}; - -/** - * @struct - mbox_read_reg_list - * @brief read register mailbox message header - */ -struct mbox_read_reg_list { - /** @hdr: mailbox message header*/ - struct mbox_msg_hdr hdr; - /** @group_num: reg group to read */ - uint16_t group_num; - /** @num_regs: number of registers to read */ - uint16_t num_regs; - /** @reg_list: register list */ - struct qdma_reg_data reg_list[QDMA_MAX_REGISTER_DUMP]; -}; - -union qdma_mbox_txrx { - /** mailbox message header*/ - struct mbox_msg_hdr hdr; - /** hello mailbox message */ - struct mbox_msg_hello hello; - /** fmap mailbox message */ - struct mbox_msg_fmap fmap; - /** interrupt context mailbox message */ - struct mbox_intr_ctxt intr_ctxt; - /** queue context mailbox message*/ - struct mbox_msg_qctxt qctxt; - /** global csr mailbox message */ - struct mbox_msg_csr csr; - /** acive q count */ - struct mbox_msg_active_qcnt qcnt; - /** q add/del notify message */ - struct mbox_msg_q_nitfy q_notify; - /** reg list mailbox message */ - struct mbox_read_reg_list reg_read_list; - /** buffer to hold raw data between pf and vf */ - uint32_t raw[MBOX_MSG_REG_MAX]; -}; - - -static inline uint32_t get_mbox_offset(void *dev_hndl, uint8_t is_vf) -{ - uint32_t mbox_base; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - mbox_base = (is_vf) ? - hw->mbox_base_vf : hw->mbox_base_pf; - - return mbox_base; -} - -static inline void mbox_pf_hw_clear_func_ack(void *dev_hndl, uint16_t func_id) -{ - int idx = func_id / 32; /* bitmask, uint32_t reg */ - int bit = func_id % 32; - uint32_t mbox_base = get_mbox_offset(dev_hndl, 0); - - /* clear the function's ack status */ - qdma_reg_write(dev_hndl, - mbox_base + MBOX_PF_ACK_BASE + idx * MBOX_PF_ACK_STEP, - (1 << bit)); -} - -static void qdma_mbox_memcpy(void *to, void *from, uint8_t size) -{ - uint8_t i; - uint8_t *_to = (uint8_t *)to; - uint8_t *_from = (uint8_t *)from; - - for (i = 0; i < size; i++) - _to[i] = _from[i]; -} - -static void qdma_mbox_memset(void *to, uint8_t val, uint8_t size) -{ - uint8_t i; - uint8_t *_to = (uint8_t *)to; - - for (i = 0; i < size; i++) - _to[i] = val; -} - -static int get_ring_idx(void *dev_hndl, uint16_t ring_sz, uint16_t *rng_idx) -{ - uint32_t rng_sz[QDMA_GLOBAL_CSR_ARRAY_SZ] = { 0 }; - int i, rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, rng_sz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ); - - if (rv) - return rv; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (ring_sz == (rng_sz[i] - 1)) { - *rng_idx = i; - return QDMA_SUCCESS; - } - } - - qdma_log_error("%s: Ring size not found, err:%d\n", - __func__, -QDMA_ERR_MBOX_INV_RINGSZ); - return -QDMA_ERR_MBOX_INV_RINGSZ; -} - -static int get_buf_idx(void *dev_hndl, uint16_t buf_sz, uint16_t *buf_idx) -{ - uint32_t c2h_buf_sz[QDMA_GLOBAL_CSR_ARRAY_SZ] = { 0 }; - int i, rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, c2h_buf_sz, - QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_READ); - if (rv) - return rv; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (c2h_buf_sz[i] == buf_sz) { - *buf_idx = i; - return QDMA_SUCCESS; - } - } - - qdma_log_error("%s: Buf index not found, err:%d\n", - __func__, -QDMA_ERR_MBOX_INV_BUFSZ); - return -QDMA_ERR_MBOX_INV_BUFSZ; -} - -static int get_cntr_idx(void *dev_hndl, uint8_t cntr_val, uint8_t *cntr_idx) -{ - uint32_t cntr_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = { 0 }; - int i, rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, cntr_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_READ); - - if (rv) - return rv; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (cntr_th[i] == cntr_val) { - *cntr_idx = i; - return QDMA_SUCCESS; - } - } - - qdma_log_error("%s: Counter val not found, err:%d\n", - __func__, -QDMA_ERR_MBOX_INV_CNTR_TH); - return -QDMA_ERR_MBOX_INV_CNTR_TH; -} - -static int get_tmr_idx(void *dev_hndl, uint8_t tmr_val, uint8_t *tmr_idx) -{ - uint32_t tmr_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = { 0 }; - int i, rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, tmr_th, - QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_READ); - if (rv) - return rv; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (tmr_th[i] == tmr_val) { - *tmr_idx = i; - return QDMA_SUCCESS; - } - } - - qdma_log_error("%s: Timer val not found, err:%d\n", - __func__, -QDMA_ERR_MBOX_INV_TMR_TH); - return -QDMA_ERR_MBOX_INV_TMR_TH; -} - -static int mbox_compose_sw_context(void *dev_hndl, - struct mbox_msg_qctxt *qctxt, - struct qdma_descq_sw_ctxt *sw_ctxt) -{ - uint16_t rng_idx = 0; - int rv = QDMA_SUCCESS; - - if (!qctxt || !sw_ctxt) { - qdma_log_error("%s: qctxt=%p sw_ctxt=%p, err:%d\n", - __func__, - qctxt, sw_ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_ring_idx(dev_hndl, qctxt->descq_conf.ringsz, &rng_idx); - if (rv < 0) { - qdma_log_error("%s: failed to get ring index, err:%d\n", - __func__, rv); - return rv; - } - /* compose sw context */ - sw_ctxt->vec = qctxt->descq_conf.intr_id; - sw_ctxt->intr_aggr = qctxt->descq_conf.intr_aggr; - - sw_ctxt->ring_bs_addr = qctxt->descq_conf.ring_bs_addr; - sw_ctxt->wbi_chk = qctxt->descq_conf.wbi_chk; - sw_ctxt->wbi_intvl_en = qctxt->descq_conf.wbi_intvl_en; - sw_ctxt->rngsz_idx = rng_idx; - sw_ctxt->bypass = qctxt->descq_conf.en_bypass; - sw_ctxt->wbk_en = qctxt->descq_conf.wbk_en; - sw_ctxt->irq_en = qctxt->descq_conf.irq_en; - sw_ctxt->is_mm = ~qctxt->st; - sw_ctxt->mm_chn = 0; - sw_ctxt->qen = 1; - sw_ctxt->frcd_en = qctxt->descq_conf.forced_en; - - sw_ctxt->desc_sz = qctxt->descq_conf.desc_sz; - - /* pidx = 0; irq_ack = 0 */ - sw_ctxt->fnc_id = qctxt->descq_conf.func_id; - sw_ctxt->irq_arm = qctxt->descq_conf.irq_arm; - - if (qctxt->st && qctxt->c2h) { - sw_ctxt->irq_en = 0; - sw_ctxt->irq_arm = 0; - sw_ctxt->wbk_en = 0; - sw_ctxt->wbi_chk = 0; - } - - return QDMA_SUCCESS; -} - -static int mbox_compose_prefetch_context(void *dev_hndl, - struct mbox_msg_qctxt *qctxt, - struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - uint16_t buf_idx = 0; - int rv = QDMA_SUCCESS; - - if (!qctxt || !pfetch_ctxt) { - qdma_log_error("%s: qctxt=%p pfetch_ctxt=%p, err:%d\n", - __func__, - qctxt, - pfetch_ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - rv = get_buf_idx(dev_hndl, qctxt->descq_conf.bufsz, &buf_idx); - if (rv < 0) { - qdma_log_error("%s: failed to get buf index, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return rv; - } - /* prefetch context */ - pfetch_ctxt->valid = 1; - pfetch_ctxt->bypass = qctxt->descq_conf.en_bypass_prefetch; - pfetch_ctxt->bufsz_idx = buf_idx; - pfetch_ctxt->pfch_en = qctxt->descq_conf.pfch_en; - - return QDMA_SUCCESS; -} - - -static int mbox_compose_cmpt_context(void *dev_hndl, - struct mbox_msg_qctxt *qctxt, - struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - uint16_t rng_idx = 0; - uint8_t cntr_idx = 0, tmr_idx = 0; - int rv = QDMA_SUCCESS; - - if (!qctxt || !cmpt_ctxt) { - qdma_log_error("%s: qctxt=%p cmpt_ctxt=%p, err:%d\n", - __func__, qctxt, cmpt_ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - rv = get_cntr_idx(dev_hndl, qctxt->descq_conf.cnt_thres, &cntr_idx); - if (rv < 0) - return rv; - rv = get_tmr_idx(dev_hndl, qctxt->descq_conf.timer_thres, &tmr_idx); - if (rv < 0) - return rv; - rv = get_ring_idx(dev_hndl, qctxt->descq_conf.cmpt_ringsz, &rng_idx); - if (rv < 0) - return rv; - /* writeback context */ - - cmpt_ctxt->bs_addr = qctxt->descq_conf.cmpt_ring_bs_addr; - cmpt_ctxt->en_stat_desc = qctxt->descq_conf.cmpl_stat_en; - cmpt_ctxt->en_int = qctxt->descq_conf.cmpt_int_en; - cmpt_ctxt->trig_mode = qctxt->descq_conf.triggermode; - cmpt_ctxt->fnc_id = qctxt->descq_conf.func_id; - cmpt_ctxt->timer_idx = tmr_idx; - cmpt_ctxt->counter_idx = cntr_idx; - cmpt_ctxt->color = 1; - cmpt_ctxt->ringsz_idx = rng_idx; - - cmpt_ctxt->desc_sz = qctxt->descq_conf.cmpt_desc_sz; - - cmpt_ctxt->valid = 1; - - cmpt_ctxt->ovf_chk_dis = qctxt->descq_conf.dis_overflow_check; - cmpt_ctxt->vec = qctxt->descq_conf.intr_id; - cmpt_ctxt->int_aggr = qctxt->descq_conf.intr_aggr; - - return QDMA_SUCCESS; -} - -static int mbox_clear_queue_contexts(void *dev_hndl, uint8_t dma_device_index, - uint16_t func_id, uint16_t qid_hw, uint8_t st, - uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type) -{ - int rv; - int qbase; - uint32_t qmax; - enum qdma_dev_q_range q_range; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - if (cmpt_ctxt_type == QDMA_MBOX_CMPT_CTXT_ONLY) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } else { - rv = qdma_dev_qinfo_get(dma_device_index, - func_id, &qbase, &qmax); - if (rv < 0) { - qdma_log_error("%s: failed to get qinfo, err:%d\n", - __func__, rv); - return rv; - } - - q_range = qdma_dev_is_queue_in_range(dma_device_index, - func_id, qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) { - qdma_log_error("%s: q_range invalid, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_sw_ctx_conf(dev_hndl, c2h, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear sw_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_hw_ctx_conf(dev_hndl, c2h, qid_hw, NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear hw_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_credit_ctx_conf(dev_hndl, c2h, qid_hw, NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear cr_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - if (st && c2h) { - rv = hw->qdma_pfetch_ctx_conf(dev_hndl, qid_hw, - NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s:clear pfetch ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - if ((cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - } - - return QDMA_SUCCESS; -} - -static int mbox_invalidate_queue_contexts(void *dev_hndl, - uint8_t dma_device_index, uint16_t func_id, - uint16_t qid_hw, uint8_t st, - uint8_t c2h, enum mbox_cmpt_ctxt_type cmpt_ctxt_type) -{ - int rv; - int qbase; - uint32_t qmax; - enum qdma_dev_q_range q_range; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - if (cmpt_ctxt_type == QDMA_MBOX_CMPT_CTXT_ONLY) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: inv cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } else { - rv = qdma_dev_qinfo_get(dma_device_index, func_id, - &qbase, &qmax); - if (rv < 0) { - qdma_log_error("%s: failed to get qinfo, err:%d\n", - __func__, rv); - return rv; - } - - q_range = qdma_dev_is_queue_in_range(dma_device_index, - func_id, qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) { - qdma_log_error("%s: Invalid qrange, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_sw_ctx_conf(dev_hndl, c2h, qid_hw, - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: inv sw ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_hw_ctx_conf(dev_hndl, c2h, qid_hw, NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: clear hw_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_credit_ctx_conf(dev_hndl, c2h, qid_hw, NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: clear cr_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - if (st && c2h) { - rv = hw->qdma_pfetch_ctx_conf(dev_hndl, qid_hw, - NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: inv pfetch ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - if ((cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: inv cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - } - - return QDMA_SUCCESS; -} - -static int mbox_write_queue_contexts(void *dev_hndl, uint8_t dma_device_index, - struct mbox_msg_qctxt *qctxt) -{ - int rv; - int qbase; - uint32_t qmax; - enum qdma_dev_q_range q_range; - struct qdma_descq_context descq_ctxt; - uint16_t qid_hw = qctxt->qid_hw; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = qdma_dev_qinfo_get(dma_device_index, qctxt->descq_conf.func_id, - &qbase, &qmax); - if (rv < 0) - return rv; - - q_range = qdma_dev_is_queue_in_range(dma_device_index, - qctxt->descq_conf.func_id, - qctxt->qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) { - qdma_log_error("%s: Invalid qrange, err:%d\n", - __func__, rv); - return rv; - } - - qdma_mbox_memset(&descq_ctxt, 0, sizeof(struct qdma_descq_context)); - - if (qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_CTXT_ONLY) { - rv = mbox_compose_cmpt_context(dev_hndl, qctxt, - &descq_ctxt.cmpt_ctxt); - if (rv < 0) - return rv; - - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &descq_ctxt.cmpt_ctxt, QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s: write cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - - } else { - rv = mbox_compose_sw_context(dev_hndl, qctxt, - &descq_ctxt.sw_ctxt); - if (rv < 0) - return rv; - - if (qctxt->st && qctxt->c2h) { - rv = mbox_compose_prefetch_context(dev_hndl, qctxt, - &descq_ctxt.pfetch_ctxt); - if (rv < 0) - return rv; - } - - if ((qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = mbox_compose_cmpt_context(dev_hndl, qctxt, - &descq_ctxt.cmpt_ctxt); - if (rv < 0) - return rv; - } - - rv = mbox_clear_queue_contexts(dev_hndl, dma_device_index, - qctxt->descq_conf.func_id, - qctxt->qid_hw, - qctxt->st, - qctxt->c2h, - qctxt->cmpt_ctxt_type); - if (rv < 0) - return rv; - rv = hw->qdma_sw_ctx_conf(dev_hndl, qctxt->c2h, qid_hw, - &descq_ctxt.sw_ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s: write sw ctxt, err:%d\n", - __func__, rv); - return rv; - } - - if (qctxt->st && qctxt->c2h) { - rv = hw->qdma_pfetch_ctx_conf(dev_hndl, qid_hw, - &descq_ctxt.pfetch_ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s:write pfetch ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - if ((qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &descq_ctxt.cmpt_ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s: write cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - } - return QDMA_SUCCESS; -} - -static int mbox_read_queue_contexts(void *dev_hndl, uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - struct qdma_descq_context *ctxt) -{ - int rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = hw->qdma_sw_ctx_conf(dev_hndl, c2h, qid_hw, &ctxt->sw_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read sw ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_hw_ctx_conf(dev_hndl, c2h, qid_hw, &ctxt->hw_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read hw ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_credit_ctx_conf(dev_hndl, c2h, qid_hw, &ctxt->cr_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read credit ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_fmap_conf(dev_hndl, func_id, &ctxt->fmap, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read fmap ctxt, err:%d\n", - __func__, rv); - return rv; - } - - if (st && c2h) { - rv = hw->qdma_pfetch_ctx_conf(dev_hndl, - qid_hw, &ctxt->pfetch_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read pfetch ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - if ((cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, - qid_hw, &ctxt->cmpt_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - return QDMA_SUCCESS; -} - -int qdma_mbox_pf_rcv_msg_handler(void *dev_hndl, uint8_t dma_device_index, - uint16_t func_id, uint32_t *rcv_msg, - uint32_t *resp_msg) -{ - union qdma_mbox_txrx *rcv = (union qdma_mbox_txrx *)rcv_msg; - union qdma_mbox_txrx *resp = (union qdma_mbox_txrx *)resp_msg; - struct mbox_msg_hdr *hdr = &rcv->hdr; - struct qdma_hw_access *hw = NULL; - int rv = QDMA_SUCCESS; - int ret = 0; - - if (!rcv) { - qdma_log_error("%s: rcv_msg=%p failure:%d\n", - __func__, rcv, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - qdma_get_hw_access(dev_hndl, &hw); - - switch (rcv->hdr.op) { - case MBOX_OP_VF_BYE: - { - struct qdma_fmap_cfg fmap; - - fmap.qbase = 0; - fmap.qmax = 0; - rv = hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, &fmap, - QDMA_HW_ACCESS_WRITE); - - qdma_dev_entry_destroy(dma_device_index, hdr->src_func_id); - - ret = QDMA_MBOX_VF_OFFLINE; - } - break; - case MBOX_OP_PF_RESET_VF_BYE: - { - struct qdma_fmap_cfg fmap; - - fmap.qbase = 0; - fmap.qmax = 0; - rv = hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, &fmap, - QDMA_HW_ACCESS_WRITE); - - qdma_dev_entry_destroy(dma_device_index, hdr->src_func_id); - - ret = QDMA_MBOX_VF_RESET_BYE; - } - break; - case MBOX_OP_HELLO: - { - struct mbox_msg_fmap *fmap = &rcv->fmap; - struct qdma_fmap_cfg fmap_cfg; - struct mbox_msg_hello *rsp_hello = &resp->hello; - - rv = qdma_dev_qinfo_get(dma_device_index, hdr->src_func_id, - &fmap->qbase, &fmap->qmax); - if (rv < 0) - rv = qdma_dev_entry_create(dma_device_index, - hdr->src_func_id); - - if (!rv) { - rsp_hello->qbase = fmap->qbase; - rsp_hello->qmax = fmap->qmax; - rsp_hello->dma_device_index = dma_device_index; - hw->qdma_get_device_attributes(dev_hndl, - &rsp_hello->dev_cap); - } - qdma_mbox_memset(&fmap_cfg, 0, - sizeof(struct qdma_fmap_cfg)); - hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, &fmap_cfg, - QDMA_HW_ACCESS_WRITE); - - ret = QDMA_MBOX_VF_ONLINE; - } - break; - case MBOX_OP_FMAP: - { - struct mbox_msg_fmap *fmap = &rcv->fmap; - struct qdma_fmap_cfg fmap_cfg; - - fmap_cfg.qbase = fmap->qbase; - fmap_cfg.qmax = fmap->qmax; - - rv = hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, - &fmap_cfg, QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s: failed to write fmap, err:%d\n", - __func__, rv); - return rv; - } - } - break; - case MBOX_OP_CSR: - { - struct mbox_msg_csr *rsp_csr = &resp->csr; - struct qdma_dev_attributes dev_cap; - - uint32_t ringsz[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - uint32_t bufsz[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - uint32_t tmr_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - uint32_t cntr_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - int i; - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, ringsz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ); - if (rv < 0) - goto exit_func; - - hw->qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) { - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, bufsz, - QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_READ); - if (rv < 0 && - (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) - goto exit_func; - } - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, tmr_th, - QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_READ); - if (rv < 0 && - (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) - goto exit_func; - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, cntr_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_READ); - if (rv < 0 && - (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) - goto exit_func; - } - - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - rsp_csr->csr_info.ringsz[i] = ringsz[i] & - 0xFFFF; - if (!rv) { - rsp_csr->csr_info.bufsz[i] = bufsz[i] & 0xFFFF; - rsp_csr->csr_info.timer_cnt[i] = tmr_th[i] & - 0xFF; - rsp_csr->csr_info.cnt_thres[i] = cntr_th[i] & - 0xFF; - } - } - - if (rv == -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED) - rv = QDMA_SUCCESS; - } - break; - case MBOX_OP_QREQ: - { - struct mbox_msg_fmap *fmap = &rcv->fmap; - - rv = qdma_dev_update(dma_device_index, - hdr->src_func_id, - fmap->qmax, &fmap->qbase); - if (rv == 0) - rv = qdma_dev_qinfo_get(dma_device_index, - hdr->src_func_id, - &resp->fmap.qbase, - &resp->fmap.qmax); - if (rv < 0) - rv = -QDMA_ERR_MBOX_NUM_QUEUES; - else { - struct qdma_fmap_cfg fmap_cfg; - - qdma_mbox_memset(&fmap_cfg, 0, - sizeof(struct qdma_fmap_cfg)); - hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, - &fmap_cfg, QDMA_HW_ACCESS_WRITE); - } - } - break; - case MBOX_OP_QNOTIFY_ADD: - { - struct mbox_msg_q_nitfy *q_notify = &rcv->q_notify; - enum qdma_dev_q_range q_range; - - q_range = qdma_dev_is_queue_in_range( - dma_device_index, - q_notify->hdr.src_func_id, - q_notify->qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) - rv = -QDMA_ERR_MBOX_INV_QID; - else - rv = qdma_dev_increment_active_queue( - dma_device_index, - q_notify->hdr.src_func_id, - q_notify->q_type); - } - break; - case MBOX_OP_QNOTIFY_DEL: - { - struct mbox_msg_q_nitfy *q_notify = &rcv->q_notify; - enum qdma_dev_q_range q_range; - - q_range = qdma_dev_is_queue_in_range( - dma_device_index, - q_notify->hdr.src_func_id, - q_notify->qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) - rv = -QDMA_ERR_MBOX_INV_QID; - else - rv = qdma_dev_decrement_active_queue( - dma_device_index, - q_notify->hdr.src_func_id, - q_notify->q_type); - } - break; - case MBOX_OP_GET_QACTIVE_CNT: - { - rv = qdma_get_device_active_queue_count( - dma_device_index, - rcv->hdr.src_func_id, - QDMA_DEV_Q_TYPE_H2C); - - resp->qcnt.h2c_queues = rv; - - rv = qdma_get_device_active_queue_count( - dma_device_index, - rcv->hdr.src_func_id, - QDMA_DEV_Q_TYPE_C2H); - - resp->qcnt.c2h_queues = rv; - - rv = qdma_get_device_active_queue_count( - dma_device_index, - rcv->hdr.src_func_id, - QDMA_DEV_Q_TYPE_CMPT); - - resp->qcnt.cmpt_queues = rv; - } - break; - case MBOX_OP_INTR_CTXT_WRT: - { - struct mbox_msg_intr_ctxt *ictxt = &rcv->intr_ctxt.ctxt; - struct qdma_indirect_intr_ctxt *ctxt; - uint8_t i; - uint32_t ring_index; - - for (i = 0; i < ictxt->num_rings; i++) { - ring_index = ictxt->ring_index_list[i]; - - ctxt = &ictxt->ictxt[i]; - rv = hw->qdma_indirect_intr_ctx_conf(dev_hndl, - ring_index, - NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) - resp->hdr.status = rv; - rv = hw->qdma_indirect_intr_ctx_conf(dev_hndl, - ring_index, ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) - resp->hdr.status = rv; - } - } - break; - case MBOX_OP_INTR_CTXT_RD: - { - struct mbox_msg_intr_ctxt *rcv_ictxt = &rcv->intr_ctxt.ctxt; - struct mbox_msg_intr_ctxt *rsp_ictxt = &resp->intr_ctxt.ctxt; - uint8_t i; - uint32_t ring_index; - - for (i = 0; i < rcv_ictxt->num_rings; i++) { - ring_index = rcv_ictxt->ring_index_list[i]; - - rv = hw->qdma_indirect_intr_ctx_conf(dev_hndl, - ring_index, - &rsp_ictxt->ictxt[i], - QDMA_HW_ACCESS_READ); - if (rv < 0) - resp->hdr.status = rv; - - } - } - break; - case MBOX_OP_INTR_CTXT_CLR: - { - int i; - struct mbox_msg_intr_ctxt *ictxt = &rcv->intr_ctxt.ctxt; - - for (i = 0; i < ictxt->num_rings; i++) { - rv = hw->qdma_indirect_intr_ctx_conf( - dev_hndl, - ictxt->ring_index_list[i], - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) - resp->hdr.status = rv; - } - } - break; - case MBOX_OP_INTR_CTXT_INV: - { - struct mbox_msg_intr_ctxt *ictxt = &rcv->intr_ctxt.ctxt; - int i; - - for (i = 0; i < ictxt->num_rings; i++) { - rv = hw->qdma_indirect_intr_ctx_conf( - dev_hndl, - ictxt->ring_index_list[i], - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) - resp->hdr.status = rv; - } - } - break; - case MBOX_OP_QCTXT_INV: - { - struct mbox_msg_qctxt *qctxt = &rcv->qctxt; - - rv = mbox_invalidate_queue_contexts(dev_hndl, - dma_device_index, - hdr->src_func_id, - qctxt->qid_hw, - qctxt->st, - qctxt->c2h, - qctxt->cmpt_ctxt_type); - } - break; - case MBOX_OP_QCTXT_CLR: - { - struct mbox_msg_qctxt *qctxt = &rcv->qctxt; - - rv = mbox_clear_queue_contexts(dev_hndl, - dma_device_index, - hdr->src_func_id, - qctxt->qid_hw, - qctxt->st, - qctxt->c2h, - qctxt->cmpt_ctxt_type); - } - break; - case MBOX_OP_QCTXT_RD: - { - struct mbox_msg_qctxt *qctxt = &rcv->qctxt; - - rv = mbox_read_queue_contexts(dev_hndl, hdr->src_func_id, - qctxt->qid_hw, - qctxt->st, - qctxt->c2h, - qctxt->cmpt_ctxt_type, - &resp->qctxt.descq_ctxt); - } - break; - case MBOX_OP_QCTXT_WRT: - { - struct mbox_msg_qctxt *qctxt = &rcv->qctxt; - - qctxt->descq_conf.func_id = hdr->src_func_id; - rv = mbox_write_queue_contexts(dev_hndl, - dma_device_index, qctxt); - } - break; - case MBOX_OP_RESET_PREPARE_RESP: - return QDMA_MBOX_VF_RESET; - case MBOX_OP_RESET_DONE_RESP: - return QDMA_MBOX_PF_RESET_DONE; - case MBOX_OP_REG_LIST_READ: - { - struct mbox_read_reg_list *rcv_read_reg_list = - &rcv->reg_read_list; - struct mbox_read_reg_list *rsp_read_reg_list = - &resp->reg_read_list; - - rv = hw->qdma_read_reg_list((void *)dev_hndl, 1, - rcv_read_reg_list->group_num, - &rsp_read_reg_list->num_regs, - rsp_read_reg_list->reg_list); - - if (rv < 0 || rsp_read_reg_list->num_regs == 0) { - rv = -QDMA_ERR_MBOX_REG_READ_FAILED; - goto exit_func; - } - - } - break; - case MBOX_OP_PF_BYE_RESP: - return QDMA_MBOX_PF_BYE; - default: - qdma_log_error("%s: op=%d invalid, err:%d\n", - __func__, - rcv->hdr.op, - -QDMA_ERR_MBOX_INV_MSG); - return -QDMA_ERR_MBOX_INV_MSG; - break; - } - -exit_func: - resp->hdr.op = rcv->hdr.op + MBOX_MSG_OP_RSP_OFFSET; - resp->hdr.dst_func_id = rcv->hdr.src_func_id; - resp->hdr.src_func_id = func_id; - - resp->hdr.status = rv; - - return ret; -} - -int qmda_mbox_compose_vf_online(uint16_t func_id, - uint16_t qmax, int *qbase, uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_HELLO; - msg->hdr.src_func_id = func_id; - msg->fmap.qbase = (uint32_t)*qbase; - msg->fmap.qmax = qmax; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_offline(uint16_t func_id, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_VF_BYE; - msg->hdr.src_func_id = func_id; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_reset_offline(uint16_t func_id, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_PF_RESET_VF_BYE; - msg->hdr.src_func_id = func_id; - - return QDMA_SUCCESS; -} - - - -int qdma_mbox_compose_vf_qreq(uint16_t func_id, - uint16_t qmax, int qbase, uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QREQ; - msg->hdr.src_func_id = func_id; - msg->fmap.qbase = qbase; - msg->fmap.qmax = qmax; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_notify_qadd(uint16_t func_id, - uint16_t qid_hw, - enum qdma_dev_q_type q_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QNOTIFY_ADD; - msg->hdr.src_func_id = func_id; - msg->q_notify.qid_hw = qid_hw; - msg->q_notify.q_type = q_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_get_device_active_qcnt(uint16_t func_id, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_GET_QACTIVE_CNT; - msg->hdr.src_func_id = func_id; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_notify_qdel(uint16_t func_id, - uint16_t qid_hw, - enum qdma_dev_q_type q_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QNOTIFY_DEL; - msg->hdr.src_func_id = func_id; - msg->q_notify.qid_hw = qid_hw; - msg->q_notify.q_type = q_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_fmap_prog(uint16_t func_id, - uint16_t qmax, int qbase, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_FMAP; - msg->hdr.src_func_id = func_id; - msg->fmap.qbase = (uint32_t)qbase; - msg->fmap.qmax = qmax; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_qctxt_write(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - struct mbox_descq_conf *descq_conf, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QCTXT_WRT; - msg->hdr.src_func_id = func_id; - msg->qctxt.qid_hw = qid_hw; - msg->qctxt.c2h = c2h; - msg->qctxt.st = st; - msg->qctxt.cmpt_ctxt_type = cmpt_ctxt_type; - - qdma_mbox_memcpy(&msg->qctxt.descq_conf, descq_conf, - sizeof(struct mbox_descq_conf)); - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_qctxt_read(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QCTXT_RD; - msg->hdr.src_func_id = func_id; - msg->qctxt.qid_hw = qid_hw; - msg->qctxt.c2h = c2h; - msg->qctxt.st = st; - msg->qctxt.cmpt_ctxt_type = cmpt_ctxt_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_qctxt_invalidate(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QCTXT_INV; - msg->hdr.src_func_id = func_id; - msg->qctxt.qid_hw = qid_hw; - msg->qctxt.c2h = c2h; - msg->qctxt.st = st; - msg->qctxt.cmpt_ctxt_type = cmpt_ctxt_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_qctxt_clear(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QCTXT_CLR; - msg->hdr.src_func_id = func_id; - msg->qctxt.qid_hw = qid_hw; - msg->qctxt.c2h = c2h; - msg->qctxt.st = st; - msg->qctxt.cmpt_ctxt_type = cmpt_ctxt_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_csr_read(uint16_t func_id, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_CSR; - msg->hdr.src_func_id = func_id; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_reg_read(uint16_t func_id, - uint16_t group_num, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_REG_LIST_READ; - msg->hdr.src_func_id = func_id; - msg->reg_read_list.group_num = group_num; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_intr_ctxt_write(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_INTR_CTXT_WRT; - msg->hdr.src_func_id = func_id; - qdma_mbox_memcpy(&msg->intr_ctxt.ctxt, intr_ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_intr_ctxt_read(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_INTR_CTXT_RD; - msg->hdr.src_func_id = func_id; - qdma_mbox_memcpy(&msg->intr_ctxt.ctxt, intr_ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_intr_ctxt_clear(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_INTR_CTXT_CLR; - msg->hdr.src_func_id = func_id; - qdma_mbox_memcpy(&msg->intr_ctxt.ctxt, intr_ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_intr_ctxt_invalidate(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_INTR_CTXT_INV; - msg->hdr.src_func_id = func_id; - qdma_mbox_memcpy(&msg->intr_ctxt.ctxt, intr_ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return QDMA_SUCCESS; -} - -uint8_t qdma_mbox_is_msg_response(uint32_t *send_data, uint32_t *rcv_data) -{ - union qdma_mbox_txrx *tx_msg = (union qdma_mbox_txrx *)send_data; - union qdma_mbox_txrx *rx_msg = (union qdma_mbox_txrx *)rcv_data; - - return ((tx_msg->hdr.op + MBOX_MSG_OP_RSP_OFFSET) == rx_msg->hdr.op) ? - 1 : 0; -} - -int qdma_mbox_vf_response_status(uint32_t *rcv_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - return msg->hdr.status; -} - -uint8_t qdma_mbox_vf_func_id_get(uint32_t *rcv_data, uint8_t is_vf) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - uint16_t func_id; - - if (is_vf) - func_id = msg->hdr.dst_func_id; - else - func_id = msg->hdr.src_func_id; - - return func_id; -} - -int qdma_mbox_vf_active_queues_get(uint32_t *rcv_data, - enum qdma_dev_q_type q_type) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - int queues = 0; - - if (q_type == QDMA_DEV_Q_TYPE_H2C) - queues = msg->qcnt.h2c_queues; - - if (q_type == QDMA_DEV_Q_TYPE_C2H) - queues = msg->qcnt.c2h_queues; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) - queues = msg->qcnt.cmpt_queues; - - return queues; -} - - -uint8_t qdma_mbox_vf_parent_func_id_get(uint32_t *rcv_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - return msg->hdr.src_func_id; -} - -int qdma_mbox_vf_dev_info_get(uint32_t *rcv_data, - struct qdma_dev_attributes *dev_cap, uint32_t *dma_device_index) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - *dev_cap = msg->hello.dev_cap; - *dma_device_index = msg->hello.dma_device_index; - - return msg->hdr.status; -} - -int qdma_mbox_vf_qinfo_get(uint32_t *rcv_data, int *qbase, uint16_t *qmax) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - *qbase = msg->fmap.qbase; - *qmax = msg->fmap.qmax; - - return msg->hdr.status; -} - -int qdma_mbox_vf_csr_get(uint32_t *rcv_data, struct qdma_csr_info *csr) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - qdma_mbox_memcpy(csr, &msg->csr.csr_info, sizeof(struct qdma_csr_info)); - - return msg->hdr.status; - -} - -int qdma_mbox_vf_reg_list_get(uint32_t *rcv_data, - uint16_t *num_regs, struct qdma_reg_data *reg_list) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - *num_regs = msg->reg_read_list.num_regs; - qdma_mbox_memcpy(reg_list, &(msg->reg_read_list.reg_list), - (*num_regs * sizeof(struct qdma_reg_data))); - - return msg->hdr.status; - -} - -int qdma_mbox_vf_context_get(uint32_t *rcv_data, - struct qdma_descq_context *ctxt) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - qdma_mbox_memcpy(ctxt, &msg->qctxt.descq_ctxt, - sizeof(struct qdma_descq_context)); - - return msg->hdr.status; -} - -int qdma_mbox_vf_intr_context_get(uint32_t *rcv_data, - struct mbox_msg_intr_ctxt *ictxt) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - qdma_mbox_memcpy(ictxt, &msg->intr_ctxt.ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return msg->hdr.status; -} - -void qdma_mbox_pf_hw_clear_ack(void *dev_hndl) -{ - uint32_t v; - uint32_t reg; - int i; - uint32_t mbox_base = get_mbox_offset(dev_hndl, 0); - - reg = mbox_base + MBOX_PF_ACK_BASE; - - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - if ((v & F_MBOX_FN_STATUS_ACK) == 0) - return; - - for (i = 0; i < MBOX_PF_ACK_COUNT; i++, reg += MBOX_PF_ACK_STEP) { - v = qdma_reg_read(dev_hndl, reg); - - if (!v) - continue; - - /* clear the ack status */ - qdma_reg_write(dev_hndl, reg, v); - } -} - -int qdma_mbox_send(void *dev_hndl, uint8_t is_vf, uint32_t *raw_data) -{ - int i; - uint32_t reg = MBOX_OUT_MSG_BASE; - uint32_t v; - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - uint16_t dst_func_id = msg->hdr.dst_func_id; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - if (v & F_MBOX_FN_STATUS_OUT_MSG) - return -QDMA_ERR_MBOX_SEND_BUSY; - - if (!is_vf) - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_TARGET, - V_MBOX_FN_TARGET_ID(dst_func_id)); - - for (i = 0; i < MBOX_MSG_REG_MAX; i++, reg += MBOX_MSG_STEP) - qdma_reg_write(dev_hndl, mbox_base + reg, raw_data[i]); - - /* clear the outgoing ack */ - if (!is_vf) - mbox_pf_hw_clear_func_ack(dev_hndl, dst_func_id); - - - qdma_log_debug("%s %s tx from_id=%d, to_id=%d, opcode=0x%x\n", __func__, - is_vf?"VF":"PF", msg->hdr.src_func_id, - msg->hdr.dst_func_id, msg->hdr.op); - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_CMD, F_MBOX_FN_CMD_SND); - - return QDMA_SUCCESS; -} - -int qdma_mbox_rcv(void *dev_hndl, uint8_t is_vf, uint32_t *raw_data) -{ - uint32_t reg = MBOX_IN_MSG_BASE; - uint32_t v = 0; - int all_zero_msg = 1; - int i; - uint32_t from_id = 0; - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - - if (!(v & M_MBOX_FN_STATUS_IN_MSG)) - return -QDMA_ERR_MBOX_NO_MSG_IN; - - if (!is_vf) { - from_id = G_MBOX_FN_STATUS_SRC(v); - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_TARGET, from_id); - } - - for (i = 0; i < MBOX_MSG_REG_MAX; i++, reg += MBOX_MSG_STEP) { - raw_data[i] = qdma_reg_read(dev_hndl, mbox_base + reg); - /* if rcv'ed message is all zero, stop and disable the mbox, - * the h/w mbox is not working properly - */ - if (raw_data[i]) - all_zero_msg = 0; - } - - /* ack'ed the sender */ - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_CMD, F_MBOX_FN_CMD_RCV); - if (all_zero_msg) { - qdma_log_error("%s: Message recv'd is all zeros. failure:%d\n", - __func__, - -QDMA_ERR_MBOX_ALL_ZERO_MSG); - return -QDMA_ERR_MBOX_ALL_ZERO_MSG; - } - - - qdma_log_debug("%s %s fid=%d, opcode=0x%x\n", __func__, - is_vf?"VF":"PF", msg->hdr.dst_func_id, - msg->hdr.op); - if (!is_vf && (from_id != msg->hdr.src_func_id)) - msg->hdr.src_func_id = from_id; - - return QDMA_SUCCESS; -} - -void qdma_mbox_hw_init(void *dev_hndl, uint8_t is_vf) -{ - uint32_t v; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - if (is_vf) { - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - if (v & M_MBOX_FN_STATUS_IN_MSG) - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_CMD, - F_MBOX_FN_CMD_RCV); - } else - qdma_mbox_pf_hw_clear_ack(dev_hndl); -} - -void qdma_mbox_enable_interrupts(void *dev_hndl, uint8_t is_vf) -{ - int vector = 0x0; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - qdma_reg_write(dev_hndl, mbox_base + MBOX_ISR_VEC, vector); - qdma_reg_write(dev_hndl, mbox_base + MBOX_ISR_EN, 0x1); -} - -void qdma_mbox_disable_interrupts(void *dev_hndl, uint8_t is_vf) -{ - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - qdma_reg_write(dev_hndl, mbox_base + MBOX_ISR_EN, 0x0); -} - - -int qdma_mbox_compose_vf_reset_message(uint32_t *raw_data, uint8_t src_funcid, - uint8_t dest_funcid) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) - return -QDMA_ERR_INV_PARAM; - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_RESET_PREPARE; - msg->hdr.src_func_id = src_funcid; - msg->hdr.dst_func_id = dest_funcid; - return 0; -} - -int qdma_mbox_compose_pf_reset_done_message(uint32_t *raw_data, - uint8_t src_funcid, uint8_t dest_funcid) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) - return -QDMA_ERR_INV_PARAM; - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_RESET_DONE; - msg->hdr.src_func_id = src_funcid; - msg->hdr.dst_func_id = dest_funcid; - return 0; -} - -int qdma_mbox_compose_pf_offline(uint32_t *raw_data, uint8_t src_funcid, - uint8_t dest_funcid) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) - return -QDMA_ERR_INV_PARAM; - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_PF_BYE; - msg->hdr.src_func_id = src_funcid; - msg->hdr.dst_func_id = dest_funcid; - return 0; -} - -int qdma_mbox_vf_rcv_msg_handler(uint32_t *rcv_msg, uint32_t *resp_msg) -{ - union qdma_mbox_txrx *rcv = (union qdma_mbox_txrx *)rcv_msg; - union qdma_mbox_txrx *resp = (union qdma_mbox_txrx *)resp_msg; - int rv = 0; - - switch (rcv->hdr.op) { - case MBOX_OP_RESET_PREPARE: - resp->hdr.op = rcv->hdr.op + MBOX_MSG_OP_RSP_OFFSET; - resp->hdr.dst_func_id = rcv->hdr.src_func_id; - resp->hdr.src_func_id = rcv->hdr.dst_func_id; - rv = QDMA_MBOX_VF_RESET; - break; - case MBOX_OP_RESET_DONE: - resp->hdr.op = rcv->hdr.op + MBOX_MSG_OP_RSP_OFFSET; - resp->hdr.dst_func_id = rcv->hdr.src_func_id; - resp->hdr.src_func_id = rcv->hdr.dst_func_id; - rv = QDMA_MBOX_PF_RESET_DONE; - break; - case MBOX_OP_PF_BYE: - resp->hdr.op = rcv->hdr.op + MBOX_MSG_OP_RSP_OFFSET; - resp->hdr.dst_func_id = rcv->hdr.src_func_id; - resp->hdr.src_func_id = rcv->hdr.dst_func_id; - rv = QDMA_MBOX_PF_BYE; - break; - default: - break; - } - return rv; -} - -uint8_t qdma_mbox_out_status(void *dev_hndl, uint8_t is_vf) -{ - uint32_t v; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - if (v & F_MBOX_FN_STATUS_OUT_MSG) - return 1; - else - return 0; -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_mbox_protocol.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_mbox_protocol.h deleted file mode 100755 index 243ee75..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_mbox_protocol.h +++ /dev/null @@ -1,711 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_MBOX_PROTOCOL_H_ -#define __QDMA_MBOX_PROTOCOL_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA message box handling interface definitions - * - * Header file *qdma_mbox_protocol.h* defines data structures and function - * signatures exported for QDMA Mbox message handling. - */ - -#include "qdma_platform.h" -#include "qdma_resource_mgmt.h" - - -#define QDMA_MBOX_VF_ONLINE (1) -#define QDMA_MBOX_VF_OFFLINE (-1) -#define QDMA_MBOX_VF_RESET (2) -#define QDMA_MBOX_PF_RESET_DONE (3) -#define QDMA_MBOX_PF_BYE (4) -#define QDMA_MBOX_VF_RESET_BYE (5) - -/** mailbox register max */ -#define MBOX_MSG_REG_MAX 32 - -#define mbox_invalidate_msg(m) { (m)->hdr.op = MBOX_OP_NOOP; } - -/** - * struct mbox_descq_conf - collective bit-fields of all contexts - */ -struct mbox_descq_conf { - - /** @ring_bs_addr: ring base address */ - uint64_t ring_bs_addr; - /** @cmpt_ring_bs_addr: completion ring base address */ - uint64_t cmpt_ring_bs_addr; - /** @forced_en: enable fetch credit */ - uint32_t forced_en:1; - /** @en_bypass: bypass enable */ - uint32_t en_bypass:1; - /** @irq_arm: arm irq */ - uint32_t irq_arm:1; - /** @wbi_intvl_en: writeback interval enable */ - uint32_t wbi_intvl_en:1; - /** @wbi_chk: writeback pending check */ - uint32_t wbi_chk:1; - /** @at: address translation */ - uint32_t at:1; - /** @wbk_en: writeback enable */ - uint32_t wbk_en:1; - /** @irq_en: irq enable */ - uint32_t irq_en:1; - /** @pfch_en: prefetch enable */ - uint32_t pfch_en:1; - /** @en_bypass_prefetch: prefetch bypass enable */ - uint32_t en_bypass_prefetch:1; - /** @dis_overflow_check: disable overflow check */ - uint32_t dis_overflow_check:1; - /** @cmpt_int_en: completion interrupt enable */ - uint32_t cmpt_int_en:1; - /** @cmpt_at: completion address translation */ - uint32_t cmpt_at:1; - /** @cmpt_color: completion ring initial color bit */ - uint32_t cmpt_color:1; - /** @cmpt_full_upd: completion full update */ - uint32_t cmpt_full_upd:1; - /** @cmpl_stat_en: completion status enable */ - uint32_t cmpl_stat_en:1; - /** @desc_sz: descriptor size */ - uint32_t desc_sz:2; - /** @cmpt_desc_sz: completion ring descriptor size */ - uint32_t cmpt_desc_sz:2; - /** @triggermode: trigger mode */ - uint32_t triggermode:3; - /** @rsvd: reserved */ - uint32_t rsvd:9; - /** @func_id: function ID */ - uint32_t func_id:16; - /** @cnt_thres: counter threshold */ - uint32_t cnt_thres:8; - /** @timer_thres: timer threshold */ - uint32_t timer_thres:8; - /** @intr_id: interrupt id */ - uint16_t intr_id:11; - /** @intr_aggr: interrupt aggregation */ - uint16_t intr_aggr:1; - /** @filler: filler bits */ - uint16_t filler:4; - /** @ringsz: ring size */ - uint16_t ringsz; - /** @bufsz: c2h buffer size */ - uint16_t bufsz; - /** @cmpt_ringsz: completion ring size */ - uint16_t cmpt_ringsz; -}; - -/** - * @enum - mbox_cmpt_ctxt_type - * @brief specifies whether cmpt is enabled with MM/ST - */ -enum mbox_cmpt_ctxt_type { - /** @QDMA_MBOX_CMPT_CTXT_ONLY: only cmpt context programming required */ - QDMA_MBOX_CMPT_CTXT_ONLY, - /** @QDMA_MBOX_CMPT_WITH_MM: completion context with MM */ - QDMA_MBOX_CMPT_WITH_MM, - /** @QDMA_MBOX_CMPT_WITH_ST: complete context with ST */ - QDMA_MBOX_CMPT_WITH_ST, - /** @QDMA_MBOX_CMPT_CTXT_NONE: No completion context */ - QDMA_MBOX_CMPT_CTXT_NONE -}; - -/** - * @struct - mbox_msg_intr_ctxt - * @brief interrupt context mailbox message - */ -struct mbox_msg_intr_ctxt { - /** @num_rings: number of intr context rings be assigned - * for virtual function - */ - uint8_t num_rings; /* 1 ~ 8 */ - /** @ring_index_list: ring index associated for each vector */ - uint32_t ring_index_list[QDMA_NUM_DATA_VEC_FOR_INTR_CXT]; - /** @w: interrupt context data for all rings*/ - struct qdma_indirect_intr_ctxt ictxt[QDMA_NUM_DATA_VEC_FOR_INTR_CXT]; -}; - -/*****************************************************************************/ -/** - * qdma_mbox_hw_init(): Initialize the mobx HW - * - * @dev_hndl: device handle - * @is_vf: is VF mbox - * - * Return: None - *****************************************************************************/ -void qdma_mbox_hw_init(void *dev_hndl, uint8_t is_vf); - -/*****************************************************************************/ -/** - * qdma_mbox_pf_rcv_msg_handler(): handles the raw message received in pf - * - * @dma_device_index: pci bus number - * @dev_hndl: device handle - * @func_id: own function id - * @rcv_msg: received raw message - * @resp_msg: raw response message - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_pf_rcv_msg_handler(void *dev_hndl, uint8_t dma_device_index, - uint16_t func_id, uint32_t *rcv_msg, - uint32_t *resp_msg); - -/*****************************************************************************/ -/** - * qmda_mbox_compose_vf_online(): compose VF online message - * - * @func_id: destination function id - * @qmax: number of queues being requested - * @qbase: q base at which queues are allocated - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qmda_mbox_compose_vf_online(uint16_t func_id, - uint16_t qmax, int *qbase, uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_offline(): compose VF offline message - * - * @func_id: destination function id - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_offline(uint16_t func_id, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_reset_message(): compose VF reset message - * - * @raw_data: output raw message to be sent - * @src_funcid: own function id - * @dest_funcid: destination function id - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_reset_message(uint32_t *raw_data, uint8_t src_funcid, - uint8_t dest_funcid); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_reset_offline(): compose VF BYE for PF initiated RESET - * - * @func_id: own function id - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_reset_offline(uint16_t func_id, - uint32_t *raw_data); -/*****************************************************************************/ -/** - * qdma_mbox_compose_pf_reset_done_message(): compose PF reset done message - * - * @raw_data: output raw message to be sent - * @src_funcid: own function id - * @dest_funcid: destination function id - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_pf_reset_done_message(uint32_t *raw_data, - uint8_t src_funcid, uint8_t dest_funcid); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_pf_offline(): compose PF offline message - * - * @raw_data: output raw message to be sent - * @src_funcid: own function id - * @dest_funcid: destination function id - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_pf_offline(uint32_t *raw_data, uint8_t src_funcid, - uint8_t dest_funcid); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qreq(): compose message to request queues - * - * @func_id: destination function id - * @qmax: number of queues being requested - * @qbase: q base at which queues are allocated - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qreq(uint16_t func_id, - uint16_t qmax, int qbase, uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_notify_qadd(): compose message to notify queue add - * - * @func_id: destination function id - * @qid_hw: number of queues being requested - * @q_type: direction of the of queue - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_notify_qadd(uint16_t func_id, - uint16_t qid_hw, - enum qdma_dev_q_type q_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_notify_qdel(): compose message to notify queue delete - * - * @func_id: destination function id - * @qid_hw: number of queues being requested - * @q_type: direction of the of queue - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_notify_qdel(uint16_t func_id, - uint16_t qid_hw, - enum qdma_dev_q_type q_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_notify_qdel(): compose message to get the active - * queue count - * - * @func_id: destination function id - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_get_device_active_qcnt(uint16_t func_id, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_fmap_prog(): handles the raw message received - * - * @func_id: destination function id - * @qmax: number of queues being requested - * @qbase: q base at which queues are allocated - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_fmap_prog(uint16_t func_id, - uint16_t qmax, int qbase, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_write(): compose queue configuration data for - * compose and program - * - * @func_id: destination function id - * @qid_hw: HW queue for which the context has to be read - * @st: is st mode - * @c2h: is c2h direction - * @cmpt_ctxt_type: completion context type - * @descq_conf: pointer to queue config data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qctxt_write(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - struct mbox_descq_conf *descq_conf, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_read(): compose message to read context data of a - * queue - * - * @func_id: destination function id - * @qid_hw: HW queue for which the context has to be read - * @st: is st mode - * @c2h: is c2h direction - * @cmpt_ctxt_type: completion context type - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qctxt_read(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_invalidate(): compose queue context invalidate - * message - * - * @func_id: destination function id - * @qid_hw: HW queue for which the context has to be invalidated - * @st: is st mode - * @c2h: is c2h direction - * @cmpt_ctxt_type: completion context type - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qctxt_invalidate(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_clear(): compose queue context clear message - * - * @func_id: destination function id - * @qid_hw: HW queue for which the context has to be cleared - * @st: is st mode - * @c2h: is c2h direction - * @cmpt_ctxt_type: completion context type - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qctxt_clear(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_csr_read(): compose message to read csr info - * - * @func_id: destination function id - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_csr_read(uint16_t func_id, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_reg_read(): compose message to read the register values - * - * @func_id: destination function id - * @group_num: group number for the registers to read - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_reg_read(uint16_t func_id, uint16_t group_num, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_intr_ctxt_write(): compose interrupt ring context - * programming message - * - * @func_id: destination function id - * @intr_ctxt: pointer to interrupt context data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_intr_ctxt_write(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_intr_ctxt_read(): handles the raw message received - * - * @func_id: destination function id - * @intr_ctxt: pointer to interrupt context data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_intr_ctxt_read(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_intr_ctxt_clear(): compose interrupt ring context - * clear message - * - * @func_id: destination function id - * @intr_ctxt: pointer to interrupt context data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_intr_ctxt_clear(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_invalidate(): compose interrupt ring context - * invalidate message - * - * @func_id: destination function id - * @intr_ctxt: pointer to interrupt context data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_intr_ctxt_invalidate(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_is_msg_response(): check if the received msg opcode is response - * sent message opcode - * - * @send_data: mbox message sent - * @rcv_data: mbox message recieved - * - * Return: 1 : match and 0: does not match - *****************************************************************************/ -uint8_t qdma_mbox_is_msg_response(uint32_t *send_data, uint32_t *rcv_data); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_response_status(): return the response received for the sent msg - * - * @rcv_data: mbox message recieved - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_response_status(uint32_t *rcv_data); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_func_id_get(): return the vf function id - * - * @rcv_data: mbox message recieved - * @is_vf: is VF mbox - * - * Return: vf function id - *****************************************************************************/ -uint8_t qdma_mbox_vf_func_id_get(uint32_t *rcv_data, uint8_t is_vf); - -int qdma_mbox_vf_active_queues_get(uint32_t *rcv_data, - enum qdma_dev_q_type q_type); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_parent_func_id_get(): return the vf parent function id - * - * @rcv_data: mbox message recieved - * - * Return: vf function id - *****************************************************************************/ -uint8_t qdma_mbox_vf_parent_func_id_get(uint32_t *rcv_data); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_dev_info_get(): get dev info from received message - * - * @rcv_data: mbox message recieved - * @dev_cap: device capability information - * @dma_device_index: DMA Identifier to be read using the mbox. - * - * Return: response status with dev info received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_dev_info_get(uint32_t *rcv_data, - struct qdma_dev_attributes *dev_cap, - uint32_t *dma_device_index); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_qinfo_get(): get qinfo from received message - * - * @rcv_data: mbox message recieved - * @qmax: number of queues - * @qbase: q base at which queues are allocated - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_qinfo_get(uint32_t *rcv_data, int *qbase, uint16_t *qmax); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_csr_get(): get csr info from received message - * - * @rcv_data: mbox message recieved - * @csr: pointer to the csr info - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_csr_get(uint32_t *rcv_data, struct qdma_csr_info *csr); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_reg_list_get(): get reg info from received message - * - * @rcv_data: mbox message recieved - * @num_regs: number of register read - * @reg_list: pointer to the register info - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_reg_list_get(uint32_t *rcv_data, - uint16_t *num_regs, struct qdma_reg_data *reg_list); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_context_get(): get queue context info from received message - * - * @rcv_data: mbox message recieved - * @ctxt: pointer to the queue context info - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_context_get(uint32_t *rcv_data, - struct qdma_descq_context *ctxt); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_context_get(): get intr context info from received message - * - * @rcv_data: mbox message recieved - * @ctxt: pointer to the intr context info - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_intr_context_get(uint32_t *rcv_data, - struct mbox_msg_intr_ctxt *ictxt); - - -/*****************************************************************************/ -/** - * qdma_mbox_pf_hw_clear_ack() - clear the HW ack - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_mbox_pf_hw_clear_ack(void *dev_hndl); - -/*****************************************************************************/ -/** - * qdma_mbox_send() - function to send raw data via qdma mailbox - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @raw_data: pointer to message being sent - * - * The function sends the raw_data to the outgoing mailbox memory and if PF, - * then assert the acknowledge status register bit. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_mbox_send(void *dev_hndl, uint8_t is_vf, uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_rcv() - function to receive raw data via qdma mailbox - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @raw_data: pointer to the message being received - * - * The function receives the raw_data from the incoming mailbox memory and - * then acknowledge the sender by setting msg_rcv field in the command - * register. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_mbox_rcv(void *dev_hndl, uint8_t is_vf, uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_enable_interrupts() - Enable the QDMA mailbox interrupt - * - * @dev_hndl: pointer to xlnx_dma_dev - * @is_vf: Whether PF or VF - * - * @return none - *****************************************************************************/ -void qdma_mbox_enable_interrupts(void *dev_hndl, uint8_t is_vf); - -/*****************************************************************************/ -/** - * qdma_mbox_disable_interrupts() - Disable the QDMA mailbox interrupt - * - * @dev_hndl: pointer to xlnx_dma_dev - * @is_vf: Whether PF or VF - * - * @return none - *****************************************************************************/ -void qdma_mbox_disable_interrupts(void *dev_hndl, uint8_t is_vf); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_rcv_msg_handler(): handles the raw message received in VF - * - * @rcv_msg: received raw message - * @resp_msg: raw response message - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_vf_rcv_msg_handler(uint32_t *rcv_msg, uint32_t *resp_msg); - -/*****************************************************************************/ -/** - * qdma_mbox_out_status(): - * - * @dev_hndl: pointer to xlnx_dma_dev - * @is_vf: Whether PF or VF - * - * Return: 0 if MBOX outbox is empty, 1 if MBOX is not empty - *****************************************************************************/ -uint8_t qdma_mbox_out_status(void *dev_hndl, uint8_t is_vf); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_MBOX_PROTOCOL_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_platform.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_platform.h deleted file mode 100755 index f44bd59..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_platform.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_PLATFORM_H_ -#define __QDMA_PLATFORM_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA platform specific interface definitions - * - * Header file *qdma_platform_env.h* defines function signatures that are - * required to be implemented by platform specific drivers. - */ - -#include "qdma_access_common.h" - -/*****************************************************************************/ -/** - * qdma_calloc(): allocate memory and initialize with 0 - * - * @num_blocks: number of blocks of contiguous memory of @size - * @size: size of each chunk of memory - * - * Return: pointer to the memory block created on success and NULL on failure - *****************************************************************************/ -void *qdma_calloc(uint32_t num_blocks, uint32_t size); - -/*****************************************************************************/ -/** - * qdma_memfree(): free the memory - * - * @memptr: pointer to the memory block - * - * Return: None - *****************************************************************************/ -void qdma_memfree(void *memptr); - -/*****************************************************************************/ -/** - * qdma_resource_lock_init() - Init lock to access resource management APIs - * - * @return None - *****************************************************************************/ -int qdma_resource_lock_init(void); - -/*****************************************************************************/ -/** - * qdma_resource_lock_take() - take lock to access resource management APIs - * - * @return None - *****************************************************************************/ -void qdma_resource_lock_take(void); - -/*****************************************************************************/ -/** - * qdma_resource_lock_give() - release lock after accessing resource management - * APIs - * - * @return None - *****************************************************************************/ -void qdma_resource_lock_give(void); - -/*****************************************************************************/ -/** - * qdma_reg_write() - Register write API. - * - * @dev_hndl: device handle - * @reg_offst: QDMA Config bar register offset to write - * @val: value to be written - * - * Return: Nothing - *****************************************************************************/ -void qdma_reg_write(void *dev_hndl, uint32_t reg_offst, uint32_t val); - -/*****************************************************************************/ -/** - * qdma_reg_read() - Register read API. - * - * @dev_hndl: device handle - * @reg_offst: QDMA Config bar register offset to be read - * - * Return: Value read - *****************************************************************************/ -uint32_t qdma_reg_read(void *dev_hndl, uint32_t reg_offst); - -/*****************************************************************************/ -/** - * qdma_reg_access_lock() - Lock function for Register access - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_reg_access_lock(void *dev_hndl); - -/*****************************************************************************/ -/** - * qdma_reg_access_release() - Release function for Register access - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_reg_access_release(void *dev_hndl); - -/*****************************************************************************/ -/** - * qdma_udelay() - delay function to be used in the common library - * - * @delay_usec: delay in microseconds - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_udelay(uint32_t delay_usec); - -/*****************************************************************************/ -/** - * qdma_get_hw_access() - function to get the qdma_hw_access - * - * @dev_hndl: device handle - * @dev_cap: pointer to hold qdma_hw_access structure - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_get_hw_access(void *dev_hndl, struct qdma_hw_access **hw); - -/*****************************************************************************/ -/** - * qdma_strncpy(): copy n size string from source to destination buffer - * - * @memptr: pointer to the memory block - * - * Return: None - *****************************************************************************/ -void qdma_strncpy(char *dest, const char *src, size_t n); - - -/*****************************************************************************/ -/** - * qdma_get_err_code() - function to get the qdma access mapped error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_err_code(int acc_err_code); - -/*****************************************************************************/ -/** - * qdma_io_wmb() - Write memory barrier for IO device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_io_wmb(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_PLATFORM_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_reg_dump.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_reg_dump.h deleted file mode 100755 index b1a63c0..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_reg_dump.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_REG_DUMP_H__ -#define __QDMA_REG_DUMP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform_env.h" -#include "qdma_access_common.h" - -#define DEBUGFS_DEV_INFO_SZ (300) - -#define QDMA_REG_NAME_LENGTH 64 -#define DEBUGFS_INTR_CNTX_SZ (2048 * 2) -#define DBGFS_ERR_BUFLEN (64) -#define DEBGFS_LINE_SZ (81) -#define DEBGFS_GEN_NAME_SZ (40) -#define REG_DUMP_SIZE_PER_LINE (256) - -#define MAX_QDMA_CFG_REGS (200) - -#define QDMA_MM_EN_SHIFT 0 -#define QDMA_CMPT_EN_SHIFT 1 -#define QDMA_ST_EN_SHIFT 2 -#define QDMA_MAILBOX_EN_SHIFT 3 - -#define QDMA_MM_MODE (1 << QDMA_MM_EN_SHIFT) -#define QDMA_COMPLETION_MODE (1 << QDMA_CMPT_EN_SHIFT) -#define QDMA_ST_MODE (1 << QDMA_ST_EN_SHIFT) -#define QDMA_MAILBOX (1 << QDMA_MAILBOX_EN_SHIFT) - - -#define QDMA_MM_ST_MODE \ - (QDMA_MM_MODE | QDMA_COMPLETION_MODE | QDMA_ST_MODE) - -#define GET_CAPABILITY_MASK(mm_en, st_en, mm_cmpt_en, mailbox_en) \ - ((mm_en << QDMA_MM_EN_SHIFT) | \ - ((mm_cmpt_en | st_en) << QDMA_CMPT_EN_SHIFT) | \ - (st_en << QDMA_ST_EN_SHIFT) | \ - (mailbox_en << QDMA_MAILBOX_EN_SHIFT)) - - -struct regfield_info { - const char *field_name; - uint32_t field_mask; -}; - -struct xreg_info { - const char *name; - uint32_t addr; - uint32_t repeat; - uint32_t step; - uint8_t shift; - uint8_t len; - uint8_t is_debug_reg; - uint8_t mode; - uint8_t read_type; - uint8_t num_bitfields; - struct regfield_info *bitfields; -}; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_resource_mgmt.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_resource_mgmt.c deleted file mode 100755 index d903859..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_resource_mgmt.c +++ /dev/null @@ -1,811 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma_resource_mgmt.h" -#include "qdma_platform.h" -#include "qdma_list.h" -#include "qdma_access_errors.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_resource_mgmt.tmh" -#endif - -struct qdma_resource_entry { - int qbase; - uint32_t total_q; - struct qdma_list_head node; -}; - -/** per function entry */ -struct qdma_dev_entry { - uint16_t func_id; - uint32_t active_h2c_qcnt; - uint32_t active_c2h_qcnt; - uint32_t active_cmpt_qcnt; - struct qdma_resource_entry entry; -}; - -/** for hodling the qconf_entry structure */ -struct qdma_resource_master { - /** DMA device index this resource belongs to */ - uint32_t dma_device_index; - /** starting pci bus number this resource belongs to */ - uint32_t pci_bus_start; - /** ending pci bus number this resource belongs to */ - uint32_t pci_bus_end; - /** total queue this resource manager handles */ - uint32_t total_q; - /** queue base from which this resource manger handles */ - int qbase; - /** for attaching to master resource list */ - struct qdma_list_head node; - /** for holding device entries */ - struct qdma_list_head dev_list; - /** for holding free resource list */ - struct qdma_list_head free_list; - /** active queue count per resource*/ - uint32_t active_qcnt; -}; - -static QDMA_LIST_HEAD(master_resource_list); - -static struct qdma_resource_master *qdma_find_master_resource_entry( - uint32_t bus_start, uint32_t bus_end) -{ - struct qdma_list_head *entry, *tmp; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &master_resource_list) { - struct qdma_resource_master *q_resource = - (struct qdma_resource_master *) - QDMA_LIST_GET_DATA(entry); - - if (q_resource->pci_bus_start == bus_start && - q_resource->pci_bus_end == bus_end) { - qdma_resource_lock_give(); - return q_resource; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_resource_master *qdma_get_master_resource_entry( - uint32_t dma_device_index) -{ - struct qdma_list_head *entry, *tmp; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &master_resource_list) { - struct qdma_resource_master *q_resource = - (struct qdma_resource_master *) - QDMA_LIST_GET_DATA(entry); - - if (q_resource->dma_device_index == dma_device_index) { - qdma_resource_lock_give(); - return q_resource; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_dev_entry *qdma_get_dev_entry(uint32_t dma_device_index, - uint16_t func_id) -{ - struct qdma_list_head *entry, *tmp; - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - - if (!q_resource) - return NULL; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &q_resource->dev_list) { - struct qdma_dev_entry *dev_entry = (struct qdma_dev_entry *) - QDMA_LIST_GET_DATA(entry); - - if (dev_entry->func_id == func_id) { - qdma_resource_lock_give(); - return dev_entry; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_resource_entry *qdma_free_entry_create(int q_base, - uint32_t total_q) -{ - struct qdma_resource_entry *entry = (struct qdma_resource_entry *) - qdma_calloc(1, sizeof(struct qdma_resource_master)); - if (entry == NULL) - return NULL; - - entry->total_q = total_q; - entry->qbase = q_base; - - return entry; -} - -static void qdma_submit_to_free_list(struct qdma_dev_entry *dev_entry, - struct qdma_list_head *head) -{ - struct qdma_resource_entry *streach_node = NULL; - struct qdma_list_head *entry, *tmp; - /* create a new node to be added to empty free list */ - struct qdma_resource_entry *new_node = NULL; - - if (!dev_entry->entry.total_q) - return; - - if (qdma_list_is_empty(head)) { - new_node = qdma_free_entry_create(dev_entry->entry.qbase, - dev_entry->entry.total_q); - if (new_node == NULL) - return; - QDMA_LIST_SET_DATA(&new_node->node, new_node); - qdma_list_add_tail(&new_node->node, head); - /* reset device entry q resource params */ - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - } else { - qdma_list_for_each_safe(entry, tmp, head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *) - QDMA_LIST_GET_DATA(entry); - - /* insert the free slot at appropriate place */ - if ((node->qbase > dev_entry->entry.qbase) || - qdma_list_is_last_entry(entry, head)) { - new_node = qdma_free_entry_create( - dev_entry->entry.qbase, - dev_entry->entry.total_q); - if (new_node == NULL) - return; - QDMA_LIST_SET_DATA(&new_node->node, new_node); - if (node->qbase > dev_entry->entry.qbase) - qdma_list_insert_before(&new_node->node, - &node->node); - else - qdma_list_add_tail(&new_node->node, - head); - /* reset device entry q resource params */ - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - break; - } - } - } - - /* de-fragment (merge contiguous resource chunks) if possible */ - qdma_list_for_each_safe(entry, tmp, head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if (!streach_node) - streach_node = node; - else { - if ((streach_node->qbase + streach_node->total_q) == - (uint32_t)node->qbase) { - streach_node->total_q += node->total_q; - qdma_list_del(&node->node); - qdma_memfree(node); - } else - streach_node = node; - } - } -} - -/** - * qdma_resource_entry() - return the best free list entry node that can - * accommodate the new request - */ -static struct qdma_resource_entry *qdma_get_resource_node(uint32_t qmax, - int qbase, - struct qdma_list_head *free_list_head) -{ - struct qdma_list_head *entry, *tmp; - struct qdma_resource_entry *best_fit_node = NULL; - - /* try to honor requested qbase */ - if (qbase >= 0) { - qdma_list_for_each_safe(entry, tmp, free_list_head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if ((qbase >= node->qbase) && - (node->qbase + node->total_q) >= - (qbase + qmax)) { - best_fit_node = node; - goto fragment_free_list; - } - } - } - best_fit_node = NULL; - - /* find a best node to accommodate q resource request */ - qdma_list_for_each_safe(entry, tmp, free_list_head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if (node->total_q >= qmax) { - if (!best_fit_node || (best_fit_node->total_q >= - node->total_q)) { - best_fit_node = node; - qbase = best_fit_node->qbase; - } - } - } - -fragment_free_list: - if (!best_fit_node) - return NULL; - - if ((qbase == best_fit_node->qbase) && - (qmax == best_fit_node->total_q)) - return best_fit_node; - - /* split free resource node accordingly */ - if ((qbase == best_fit_node->qbase) && - (qmax != best_fit_node->total_q)) { - /* - * create an extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase + qmax; - uint32_t lqmax = best_fit_node->total_q - qmax; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_after(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q -= lqmax; - } else if ((qbase > best_fit_node->qbase) && - ((qbase + qmax) == (best_fit_node->qbase + - best_fit_node->total_q))) { - /* - * create an extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase; - uint32_t lqmax = qbase - best_fit_node->qbase; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_before(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q = qmax; - best_fit_node->qbase = qbase; - } else { - /* - * create two extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase; - uint32_t lqmax = qbase - best_fit_node->qbase; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_before(&new_entry->node, - &best_fit_node->node); - - best_fit_node->qbase = qbase; - best_fit_node->total_q -= lqmax; - - lqbase = best_fit_node->qbase + qmax; - lqmax = best_fit_node->total_q - qmax; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_after(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q = qmax; - } - - return best_fit_node; -} - -static int qdma_request_q_resource(struct qdma_dev_entry *dev_entry, - uint32_t new_qmax, int new_qbase, - struct qdma_list_head *free_list_head) -{ - uint32_t qmax = dev_entry->entry.total_q; - int qbase = dev_entry->entry.qbase; - struct qdma_resource_entry *free_entry_node = NULL; - int rv = QDMA_SUCCESS; - - /* submit already allocated queues back to free list before requesting - * new resource - */ - qdma_submit_to_free_list(dev_entry, free_list_head); - - if (!new_qmax) - return 0; - /* check if the request can be accomodated */ - free_entry_node = qdma_get_resource_node(new_qmax, new_qbase, - free_list_head); - if (free_entry_node == NULL) { - /* request cannot be accommodated. Restore the dev_entry */ - free_entry_node = qdma_get_resource_node(qmax, qbase, - free_list_head); - rv = -QDMA_ERR_RM_NO_QUEUES_LEFT; - qdma_log_error("%s: Not enough queues, err:%d\n", __func__, - -QDMA_ERR_RM_NO_QUEUES_LEFT); - if (free_entry_node == NULL) { - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - - return rv; - } - } - - dev_entry->entry.qbase = free_entry_node->qbase; - dev_entry->entry.total_q = free_entry_node->total_q; - - qdma_list_del(&free_entry_node->node); - qdma_memfree(free_entry_node); - - return rv; -} - -int qdma_master_resource_create(uint32_t bus_start, uint32_t bus_end, - int q_base, uint32_t total_q, uint32_t *dma_device_index) -{ - struct qdma_resource_master *q_resource; - struct qdma_resource_entry *free_entry; - static int index; - - q_resource = qdma_find_master_resource_entry(bus_start, bus_end); - if (q_resource) { - *dma_device_index = q_resource->dma_device_index; - qdma_log_debug("%s: Resource already created", __func__); - qdma_log_debug("for this device(%d)\n", - q_resource->dma_device_index); - return -QDMA_ERR_RM_RES_EXISTS; - } - - *dma_device_index = index; - - q_resource = (struct qdma_resource_master *)qdma_calloc(1, - sizeof(struct qdma_resource_master)); - if (!q_resource) { - qdma_log_error("%s: no memory for q_resource, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - free_entry = (struct qdma_resource_entry *) - qdma_calloc(1, sizeof(struct qdma_resource_entry)); - if (!free_entry) { - qdma_memfree(q_resource); - qdma_log_error("%s: no memory for free_entry, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_resource_lock_take(); - q_resource->dma_device_index = index; - q_resource->pci_bus_start = bus_start; - q_resource->pci_bus_end = bus_end; - q_resource->total_q = total_q; - q_resource->qbase = q_base; - qdma_list_init_head(&q_resource->dev_list); - qdma_list_init_head(&q_resource->free_list); - QDMA_LIST_SET_DATA(&q_resource->node, q_resource); - QDMA_LIST_SET_DATA(&q_resource->free_list, q_resource); - qdma_list_add_tail(&q_resource->node, &master_resource_list); - - - free_entry->total_q = total_q; - free_entry->qbase = q_base; - QDMA_LIST_SET_DATA(&free_entry->node, free_entry); - qdma_list_add_tail(&free_entry->node, &q_resource->free_list); - qdma_resource_lock_give(); - - qdma_log_debug("%s: New master resource created at %d", - __func__, index); - ++index; - - return QDMA_SUCCESS; -} - -void qdma_master_resource_destroy(uint32_t dma_device_index) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_list_head *entry, *tmp; - - if (!q_resource) - return; - qdma_resource_lock_take(); - if (!qdma_list_is_empty(&q_resource->dev_list)) { - qdma_resource_lock_give(); - return; - } - qdma_list_for_each_safe(entry, tmp, &q_resource->free_list) { - struct qdma_resource_entry *free_entry = - (struct qdma_resource_entry *) - QDMA_LIST_GET_DATA(entry); - - qdma_list_del(&free_entry->node); - qdma_memfree(free_entry); - } - qdma_list_del(&q_resource->node); - qdma_memfree(q_resource); - qdma_resource_lock_give(); -} - - -int qdma_dev_entry_create(uint32_t dma_device_index, uint16_t func_id) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, - -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - if (!dev_entry) { - qdma_resource_lock_take(); - dev_entry = (struct qdma_dev_entry *) - qdma_calloc(1, sizeof(struct qdma_dev_entry)); - if (dev_entry == NULL) { - qdma_resource_lock_give(); - qdma_log_error("%s: Insufficient memory, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - dev_entry->func_id = func_id; - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - QDMA_LIST_SET_DATA(&dev_entry->entry.node, dev_entry); - qdma_list_add_tail(&dev_entry->entry.node, - &q_resource->dev_list); - qdma_resource_lock_give(); - qdma_log_info("%s: Created the dev entry successfully\n", - __func__); - } else { - qdma_log_error("%s: Dev entry already created, err = %d\n", - __func__, - -QDMA_ERR_RM_DEV_EXISTS); - return -QDMA_ERR_RM_DEV_EXISTS; - } - - return QDMA_SUCCESS; -} - -void qdma_dev_entry_destroy(uint32_t dma_device_index, uint16_t func_id) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found.\n", __func__); - return; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found\n", __func__); - return; - } - qdma_resource_lock_take(); - qdma_submit_to_free_list(dev_entry, &q_resource->free_list); - - qdma_list_del(&dev_entry->entry.node); - qdma_memfree(dev_entry); - qdma_resource_lock_give(); -} - -int qdma_dev_update(uint32_t dma_device_index, uint16_t func_id, - uint32_t qmax, int *qbase) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev Entry not found, err: %d\n", - __func__, - -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - - /* if any active queue on device, no more new qmax - * configuration allowed - */ - if (dev_entry->active_h2c_qcnt || - dev_entry->active_c2h_qcnt || - dev_entry->active_cmpt_qcnt) { - qdma_resource_lock_give(); - qdma_log_error("%s: Qs active. Config blocked, err: %d\n", - __func__, -QDMA_ERR_RM_QMAX_CONF_REJECTED); - return -QDMA_ERR_RM_QMAX_CONF_REJECTED; - } - - rv = qdma_request_q_resource(dev_entry, qmax, *qbase, - &q_resource->free_list); - - *qbase = dev_entry->entry.qbase; - qdma_resource_lock_give(); - - - return rv; -} - -int qdma_dev_qinfo_get(uint32_t dma_device_index, uint16_t func_id, - int *qbase, uint32_t *qmax) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_debug("%s: Dev Entry not created yet\n", __func__); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - *qbase = dev_entry->entry.qbase; - *qmax = dev_entry->entry.total_q; - qdma_resource_lock_give(); - - return QDMA_SUCCESS; -} - -enum qdma_dev_q_range qdma_dev_is_queue_in_range(uint32_t dma_device_index, - uint16_t func_id, - uint32_t qid_hw) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - uint32_t qmax; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return QDMA_DEV_Q_OUT_OF_RANGE; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found, err: %d\n", - __func__, -QDMA_ERR_RM_DEV_NOT_EXISTS); - return QDMA_DEV_Q_OUT_OF_RANGE; - } - - qdma_resource_lock_take(); - qmax = dev_entry->entry.qbase + dev_entry->entry.total_q; - if (dev_entry->entry.total_q && (qid_hw < qmax) && - ((int)qid_hw >= dev_entry->entry.qbase)) { - qdma_resource_lock_give(); - return QDMA_DEV_Q_IN_RANGE; - } - qdma_resource_lock_give(); - - return QDMA_DEV_Q_OUT_OF_RANGE; -} - -int qdma_dev_increment_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv = QDMA_SUCCESS; - uint32_t *active_qcnt = NULL; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev Entry not found, err: %d\n", - __func__, - -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - active_qcnt = &dev_entry->active_h2c_qcnt; - break; - case QDMA_DEV_Q_TYPE_C2H: - active_qcnt = &dev_entry->active_c2h_qcnt; - break; - case QDMA_DEV_Q_TYPE_CMPT: - active_qcnt = &dev_entry->active_cmpt_qcnt; - break; - default: - rv = -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - if (active_qcnt && (dev_entry->entry.total_q < ((*active_qcnt) + 1))) { - qdma_resource_lock_give(); - return -QDMA_ERR_RM_NO_QUEUES_LEFT; - } - - if (active_qcnt) { - *active_qcnt = (*active_qcnt) + 1; - q_resource->active_qcnt++; - } - qdma_resource_lock_give(); - - return rv; -} - - -int qdma_dev_decrement_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv = QDMA_SUCCESS; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, - -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found, err: %d\n", - __func__, -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - if (dev_entry->active_h2c_qcnt) - dev_entry->active_h2c_qcnt--; - break; - case QDMA_DEV_Q_TYPE_C2H: - if (dev_entry->active_c2h_qcnt) - dev_entry->active_c2h_qcnt--; - break; - case QDMA_DEV_Q_TYPE_CMPT: - if (dev_entry->active_cmpt_qcnt) - dev_entry->active_cmpt_qcnt--; - break; - default: - rv = -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - q_resource->active_qcnt--; - qdma_resource_lock_give(); - - return rv; -} - -uint32_t qdma_get_active_queue_count(uint32_t dma_device_index) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - uint32_t q_cnt; - - if (!q_resource) - return QDMA_SUCCESS; - - qdma_resource_lock_take(); - q_cnt = q_resource->active_qcnt; - qdma_resource_lock_give(); - - return q_cnt; -} - -int qdma_get_device_active_queue_count(uint32_t dma_device_index, - uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - uint32_t dev_active_qcnt = 0; - - if (!q_resource) - return -QDMA_ERR_RM_RES_NOT_EXISTS; - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - dev_active_qcnt = dev_entry->active_h2c_qcnt; - break; - case QDMA_DEV_Q_TYPE_C2H: - dev_active_qcnt = dev_entry->active_c2h_qcnt; - break; - case QDMA_DEV_Q_TYPE_CMPT: - dev_active_qcnt = dev_entry->active_cmpt_qcnt; - break; - default: - dev_active_qcnt = 0; - } - qdma_resource_lock_give(); - - return dev_active_qcnt; -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_resource_mgmt.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_resource_mgmt.h deleted file mode 100755 index 3361f16..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_resource_mgmt.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_RESOURCE_MGMT_H_ -#define __QDMA_RESOURCE_MGMT_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA resource management interface definitions - * - * Header file *qdma_resource_mgmt.h* defines data structures and function - * signatures exported for QDMA queue management. - */ - -#include "qdma_platform_env.h" -#include "qdma_access_export.h" - -/** - * enum qdma_dev_q_range: Q ranage check - */ -enum qdma_dev_q_range { - /** @QDMA_DEV_Q_IN_RANGE: Q belongs to dev */ - QDMA_DEV_Q_IN_RANGE, - /** @QDMA_DEV_Q_OUT_OF_RANGE: Q does not belong to dev */ - QDMA_DEV_Q_OUT_OF_RANGE, - /** @QDMA_DEV_Q_RANGE_MAX: total Q validity states */ - QDMA_DEV_Q_RANGE_MAX -}; - -/*****************************************************************************/ -/** - * qdma_master_resource_create(): create the master q resource - * - * @bus_start: Bus number of the device i.e. pdev->bus->number - * @bus_end: Ending bus number i.e. the subordinate bus number of the - * parent bridge - * @q_base: base from which this master resource needs to be created - * @total_q: total queues in this master resource - * @dma_device_index: DMA device identifier assigned by resource manager to - * track the number of devices - * - * A master resource per driver per board is created to manage the queues - * allocated to this driver. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_master_resource_create(uint32_t bus_start, uint32_t bus_end, - int q_base, uint32_t total_q, uint32_t *dma_device_index); - -/*****************************************************************************/ -/** - * qdma_master_resource_destroy(): destroy the master q resource - * - * @dma_device_index: DMA device identifier this master resource belongs to - * - * Return: None - *****************************************************************************/ -void qdma_master_resource_destroy(uint32_t dma_device_index); - -/*****************************************************************************/ -/** - * qdma_dev_entry_create(): create a device entry for @func_id - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * - * A device entry is to be created on every function probe. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_entry_create(uint32_t dma_device_index, uint16_t func_id); - -/*****************************************************************************/ -/** - * qdma_dev_entry_destroy(): destroy device entry for @func_id - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * - * Return: None - *****************************************************************************/ -void qdma_dev_entry_destroy(uint32_t dma_device_index, uint16_t func_id); - -/*****************************************************************************/ -/** - * qdma_dev_update(): update qmax for the device - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @dev_type: device type - * @qmax: qmax for this device - * @qbase: output qbase for this device - * - * This API is to be called for update request of qmax of any function. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_update(uint32_t dma_device_index, uint16_t func_id, - uint32_t qmax, int *qbase); - -/*****************************************************************************/ -/** - * qdma_dev_qinfo_get(): get device info - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @dev_type: device type - * @qmax: output qmax for this device - * @qbase: output qbase for this device - * - * This API can be used get the qbase and qmax for any function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_qinfo_get(uint32_t dma_device_index, uint16_t func_id, - int *qbase, uint32_t *qmax); - -/*****************************************************************************/ -/** - * qdma_dev_is_queue_in_range(): check if queue belongs to this device - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @qid_hw: hardware queue id - * - * This API checks if the queue ID is in valid range for function specified - * - * Return: @QDMA_DEV_Q_IN_RANGE : valid and - * @QDMA_DEV_Q_OUT_OF_RANGE: invalid - *****************************************************************************/ -enum qdma_dev_q_range qdma_dev_is_queue_in_range(uint32_t dma_device_index, - uint16_t func_id, - uint32_t qid_hw); - -/*****************************************************************************/ -/** - * qdma_dev_increment_active_queue(): increment active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to increment the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_increment_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type); - -/*****************************************************************************/ -/** - * qdma_dev_decrement_active_queue(): increment active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to increment the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_decrement_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type); - -/*****************************************************************************/ -/** - * qdma_is_active_queue(): check if any queue is active - * - * @dma_device_index: DMA device identifier that this resource belongs to - * - * This API is used to check if any active queue is present. - * - * Return: active queue count - *****************************************************************************/ -uint32_t qdma_get_active_queue_count(uint32_t dma_device_index); - -/*****************************************************************************/ -/** - * qdma_get_device_active_queue_count(): get device active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to get the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_get_device_active_queue_count(uint32_t dma_device_index, - uint16_t func_id, - enum qdma_dev_q_type q_type); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_RESOURCE_MGMT_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_access.c b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_access.c deleted file mode 100755 index 2c14a85..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_access.c +++ /dev/null @@ -1,6255 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma_soft_access.h" -#include "qdma_soft_reg.h" -#include "qdma_reg_dump.h" - - -#ifdef ENABLE_WPP_TRACING -#include "qdma_soft_access.tmh" -#endif - -/** QDMA Context array size */ -#define QDMA_FMAP_NUM_WORDS 2 -#define QDMA_SW_CONTEXT_NUM_WORDS 5 -#define QDMA_PFETCH_CONTEXT_NUM_WORDS 2 -#define QDMA_CMPT_CONTEXT_NUM_WORDS 5 -#define QDMA_HW_CONTEXT_NUM_WORDS 2 -#define QDMA_CR_CONTEXT_NUM_WORDS 1 -#define QDMA_IND_INTR_CONTEXT_NUM_WORDS 3 -#define QDMA_REG_IND_CTXT_REG_COUNT 8 - - -#define QDMA_REG_GROUP_1_START_ADDR 0x000 -#define QDMA_REG_GROUP_2_START_ADDR 0x400 -#define QDMA_REG_GROUP_3_START_ADDR 0xB00 -#define QDMA_REG_GROUP_4_START_ADDR 0x1014 - -#define QDMA_DEFAULT_PFCH_STOP_THRESH 256 - -static void qdma_hw_st_h2c_err_process(void *dev_hndl); -static void qdma_hw_st_c2h_err_process(void *dev_hndl); -static void qdma_hw_desc_err_process(void *dev_hndl); -static void qdma_hw_trq_err_process(void *dev_hndl); -static void qdma_hw_ram_sbe_err_process(void *dev_hndl); -static void qdma_hw_ram_dbe_err_process(void *dev_hndl); - -static struct xreg_info qdma_config_regs[] = { - - /* QDMA_TRQ_SEL_GLBL1 (0x00000) */ - {"CFG_BLOCK_ID", - 0x00, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_BUSDEV", - 0x04, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_MAX_PL_SZ", - 0x08, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_MAX_RDRQ_SZ", - 0x0C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_SYS_ID", - 0x10, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_MSI_EN", - 0x14, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_DATA_WIDTH", - 0x18, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_CTRL", - 0x1C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_AXI_USR_MAX_PL_SZ", - 0x40, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_AXI_USR_MAX_RDRQ_SZ", - 0x44, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_MISC_CTRL", - 0x4C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_SCRATCH_REG", - 0x80, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_SBE_MSK_A", - 0xF0, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_SBE_STS_A", - 0xF4, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_DBE_MSK_A", - 0xF8, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_DBE_STS_A", - 0xFC, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_GLBL2 (0x00100) */ - {"GLBL2_ID", - 0x100, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_BL_INT", - 0x104, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_VF_BL_INT", - 0x108, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_BL_EXT", - 0x10C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_VF_BL_EXT", - 0x110, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_INST", - 0x114, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_QDMA", - 0x118, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_STRM", - 0x11C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_QDMA_CAP", - 0x120, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PASID_CAP", - 0x128, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_FUNC_RET", - 0x12C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_SYS_ID", - 0x130, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_MISC_CAP", - 0x134, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_PCIE_RQ", - 0x1B8, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_AXIMM_WR", - 0x1C0, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_AXIMM_RD", - 0x1C8, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_GLBL (0x00200) */ - {"GLBL_RNGSZ", - 0x204, 16, 1, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL_ERR_STAT", - 0x248, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_ERR_MASK", - 0x24C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_CFG", - 0x250, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_STS", - 0x254, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_MSK", - 0x258, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_LOG", - 0x25C, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_STS", - 0x264, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_MSK", - 0x268, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_LOG", - 0x26C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_DBG_DAT", - 0x270, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_LOG2", - 0x27C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_INTERRUPT_CFG", - 0x288, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - - /* QDMA_TRQ_SEL_FMAP (0x00400 - 0x7FC) */ - /* TODO: max 256, display 4 for now */ - {"TRQ_SEL_FMAP", - 0x400, 4, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_IND (0x00800) */ - {"IND_CTXT_DATA", - 0x804, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"IND_CTXT_MASK", - 0x824, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"IND_CTXT_CMD", - 0x844, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_C2H (0x00A00) */ - {"C2H_TIMER_CNT", - 0xA00, 16, 0, 0, 0, 0, - QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CNT_THRESH", - 0xA40, 16, 0, 0, 0, 0, - QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - 0xA88, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_S_AXIS_CMPT_ACCEPTED", - 0xA8C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED", - 0xA90, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_AXIS_PKG_CMP", - 0xA94, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_ACCEPTED", - 0xA98, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_CMP", - 0xA9C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WRQ_OUT", - 0xAA0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WPL_REN_ACCEPTED", - 0xAA4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_TOTAL_WRQ_LEN", - 0xAA8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_TOTAL_WPL_LEN", - 0xAAC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_BUF_SZ", - 0xAB0, 16, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_ERR_STAT", - 0xAF0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_ERR_MASK", - 0xAF4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_STAT", - 0xAF8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_MASK", - 0xAFC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_ENABLE", - 0xB00, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_ERR_INT", - 0xB04, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_PFCH_CFG", - 0xB08, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INT_TIMER_TICK", - 0xB0C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED", - 0xB10, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED", - 0xB14, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_REQ", - 0xB18, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG", - 0xB1C, 4, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH_ERR_CTXT", - 0xB2C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_FIRST_ERR_QID", - 0xB30, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"STAT_NUM_CMPT_IN", - 0xB34, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_CMPT_OUT", - 0xB38, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_CMPT_DRP", - 0xB3C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_STAT_DESC_OUT", - 0xB40, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_DSC_CRDT_SENT", - 0xB44, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_FCH_DSC_RCVD", - 0xB48, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_BYP_DSC_RCVD", - 0xB4C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CMPT_COAL_CFG", - 0xB50, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_REQ", - 0xB54, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_MM_REQ", - 0xB58, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_ERR_INT_REQ", - 0xB5C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_REQ", - 0xB60, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_MSIX_ACK", - 0xB64, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_MSIX_FAIL", - 0xB68, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_NO_MSIX", - 0xB6C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_CTXT_INVAL", - 0xB70, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_C2H_ST_MSIX_ACK", - 0xB74, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_MSIX_FAIL", - 0xB78, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_NO_MSIX", - 0xB7C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_C2H_ST_CTXT_INVAL", - 0xB80, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WR_CMP", - 0xB84, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG_4", - 0xB88, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG_5", - 0xB8C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH_QID", - 0xB90, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH", - 0xB94, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INT_DEBUG", - 0xB98, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_IMM_ACCEPTED", - 0xB9C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_MARKER_ACCEPTED", - 0xBA0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED", - 0xBA4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_C2H_PAYLOAD_FIFO_CRDT_CNT", - 0xBA8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_DYN_REQ", - 0xBAC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_DYN_MSIX", - 0xBB0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_LEN_MISMATCH", - 0xBB4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_DESC_RSP_LEN", - 0xBB8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_QID_FIFO_LEN", - 0xBBC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_PAYLOAD_CNT", - 0xBC0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_C2H_CMPT_FORMAT", - 0xBC4, 7, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_PFCH_CACHE_DEPTH", - 0xBE0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CMPT_COAL_BUF_DEPTH", - 0xBE4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_PFCH_CRDT", - 0xBE8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_H2C(0x00E00) Register Space*/ - {"H2C_ERR_STAT", - 0xE00, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_ERR_MASK", - 0xE04, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_FIRST_ERR_QID", - 0xE08, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_DBG_REG", - 0xE0C, 5, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_FATAL_ERR_EN", - 0xE20, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_REQ_THROT", - 0xE24, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_ALN_DBG_REG0", - 0xE28, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_C2H_MM (0x1000) */ - {"C2H_MM_CONTROL", - 0x1004, 3, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_STATUS", - 0x1040, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_CMPL_DSC_CNT", - 0x1048, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_CODE_EN_MASK", - 0x1054, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_CODE", - 0x1058, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_INFO", - 0x105C, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_CTRL", - 0x10C0, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_CY_CNT", - 0x10C4, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_DATA_CNT", - 0x10CC, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_DBG_INFO", - 0x10E8, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_H2C_MM (0x1200)*/ - {"H2C_MM_CONTROL", - 0x1204, 3, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_STATUS", - 0x1240, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_CMPL_DSC_CNT", - 0x1248, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_CODE_EN_MASK", - 0x1254, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_CODE", - 0x1258, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_INFO", - 0x125C, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_CTRL", - 0x12C0, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_CY_CNT", - 0x12C4, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_DATA_CNT", - 0x12CC, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_DBG_INFO", - 0x12E8, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_REQ_THROT", - 0x12EC, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_PF_MAILBOX (0x2400) */ - {"FUNC_STATUS", - 0x2400, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FUNC_CMD", - 0x2404, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FUNC_INTR_VEC", - 0x2408, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"TARGET_FUNC", - 0x240C, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"INTR_CTRL", - 0x2410, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"PF_ACK", - 0x2420, 8, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FLR_CTRL_STATUS", - 0x2500, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"MSG_IN", - 0x2800, 32, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"MSG_OUT", - 0x2C00, 32, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - {"", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL } -}; - - -static struct qdma_hw_err_info qdma_err_info[QDMA_ERRS_ALL] = { - /* Descriptor errors */ - { - QDMA_DSC_ERR_POISON, - "Poison error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_POISON_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_UR_CA_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_PARAM, - "Parameter mismatch error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_PARAM_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_ADDR, - "Address mismatch error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_ADDR_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_TAG, - "Unexpected tag error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_TAG_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_FLR, - "FLR error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_FLR_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_TIMEOUT, - "Timed out error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_TIMEOUT_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DAT_POISON, - "Poison data error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DAT_POISON_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_FLR_CANCEL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DMA, - "DMA engine error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DMA_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DSC, - "Invalid PIDX update error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DSC_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_RQ_CANCEL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DBE_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_SBE_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_ALL, - "All Descriptor errors", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_ALL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - - /* TRQ errors */ - { - QDMA_TRQ_ERR_UNMAPPED, - "Access targeted unmapped register space error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_UNMAPPED_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_QID_RANGE, - "Qid range error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_QID_RANGE_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_VF_ACCESS, - "Invalid VF access error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_VF_ACCESS_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_TCP_TIMEOUT, - "Timeout on request error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_TCP_TIMEOUT_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_ALL, - "All TRQ errors", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_ALL_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - - /* C2H Errors*/ - { - QDMA_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_MTY_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_LEN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_QID_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_DESC_RSP_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ENG_WPL_DATA_PAR_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_MSI_INT_FAIL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ERR_DESC_CNT_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_PORTID_CTXT_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - "Port id in packet and bypass interface mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_PORTID_BYP_IN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - "Writeback on invalid queue error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_INV_Q_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - "Completion queue gets full error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_QFULL_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - "Bad CIDX update by the software error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_CIDX_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - "C2H completion Parity error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_PRTY_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ALL, - "All C2h errors", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_MTY_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_LEN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_QID_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_TIMER_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PFCH_II_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_CMPT_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PFCH_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_INT_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_TUSER_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_QID_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_WPL_DATA_PAR, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_WPL_DATA_PAR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_ALL, - "All fatal errors", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - "Zero length descriptor error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_ZERO_LEN_DESC_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_CSI_MOP, - "Non EOP descriptor received error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_CSI_MOP_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_NO_DMA_DSC_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_SBE_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_DBE_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_ALL, - "All H2C errors", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - QDMA_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_MI_H2C0_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_MI_C2H0_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_C2H_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_C2H_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_FUNC_MAP_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_HW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CRD_RCV_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_SW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CPLI_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CPLD_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PASID_CTXT_RAM, - "PASID configuration RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PASID_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_TIMER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_QID_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_TUSER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_WRB_COAL_DATA_RAM, - "Completion Coalescing RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_WRB_COAL_DATA_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_INT_QID2VEC_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_INT_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PFCH_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_WRB_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PFCH_LL_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_PEND_FIFO, - "H2C ST pending fifo RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_PEND_FIFO_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_ALL, - "All SBE errors", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_ALL_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - - - /* DBE Errors */ - { - QDMA_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_MI_H2C0_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_MI_C2H0_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_C2H_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_C2H_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_FUNC_MAP, - "Function map RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_FUNC_MAP_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_HW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CRD_RCV_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_SW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CPLI_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CPLD_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PASID_CTXT_RAM, - "PASID configuration RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PASID_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_TIMER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_QID_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_TUSER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_WRB_COAL_DATA_RAM, - "Completion Coalescing RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_WRB_COAL_DATA_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_INT_QID2VEC_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_INT_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PFCH_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_WRB_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PFCH_LL_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_PEND_FIFO, - "H2C pending fifo RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_PEND_FIFO_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_ALL, - "All DBE errors", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_ALL_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - } -}; - -static int32_t all_hw_errs[TOTAL_LEAF_ERROR_AGGREGATORS] = { - - QDMA_DSC_ERR_ALL, - QDMA_TRQ_ERR_ALL, - QDMA_ST_C2H_ERR_ALL, - QDMA_ST_FATAL_ERR_ALL, - QDMA_ST_H2C_ERR_ALL, - QDMA_SBE_ERR_ALL, - QDMA_DBE_ERR_ALL -}; - -static int qdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int qdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - - -static struct qctx_entry sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Function Id", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Address Translation", 0}, - {"Fetch Max", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, -}; - -static struct qctx_entry hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Address (Low)", 0}, - {"Base Address (High)", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, - {"Over Flow Check Disable", 0}, - {"Address Translation", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, -}; - -static struct qctx_entry c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry fmap_ctxt_entries[] = { - {"Queue Base", 0}, - {"Queue Max", 0}, -}; - -static struct qctx_entry ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, - {"at", 0}, -}; - -uint32_t qdma_soft_reg_dump_buf_len(void) -{ - uint32_t length = ((sizeof(qdma_config_regs) / - sizeof(qdma_config_regs[0])) + 1) * - REG_DUMP_SIZE_PER_LINE; - return length; -} - -uint32_t qdma_get_config_num_regs(void) -{ - return (sizeof(qdma_config_regs)/ - sizeof(qdma_config_regs[0])); -} - -struct xreg_info *qdma_get_config_regs(void) -{ - return qdma_config_regs; -} - -int qdma_soft_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - uint32_t len = 0; - int rv = 0; - - *buflen = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(cmpt_ctxt_entries) / - sizeof(cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(sw_ctxt_entries) / - sizeof(sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(hw_ctxt_entries) / - sizeof(hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(credit_ctxt_entries) / - sizeof(credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(fmap_ctxt_entries) / - sizeof(fmap_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(cmpt_ctxt_entries) / - sizeof(cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(c2h_pftch_ctxt_entries) / - sizeof(c2h_pftch_ctxt_entries[0])) - + 1) * REG_DUMP_SIZE_PER_LINE); - } - } - - *buflen = len; - return rv; -} - -/* - * qdma_acc_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void qdma_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - sw_ctxt_entries[0].value = sw_ctxt->pidx; - sw_ctxt_entries[1].value = sw_ctxt->irq_arm; - sw_ctxt_entries[2].value = sw_ctxt->fnc_id; - sw_ctxt_entries[3].value = sw_ctxt->qen; - sw_ctxt_entries[4].value = sw_ctxt->frcd_en; - sw_ctxt_entries[5].value = sw_ctxt->wbi_chk; - sw_ctxt_entries[6].value = sw_ctxt->wbi_intvl_en; - sw_ctxt_entries[7].value = sw_ctxt->at; - sw_ctxt_entries[8].value = sw_ctxt->fetch_max; - sw_ctxt_entries[9].value = sw_ctxt->rngsz_idx; - sw_ctxt_entries[10].value = sw_ctxt->desc_sz; - sw_ctxt_entries[11].value = sw_ctxt->bypass; - sw_ctxt_entries[12].value = sw_ctxt->mm_chn; - sw_ctxt_entries[13].value = sw_ctxt->wbk_en; - sw_ctxt_entries[14].value = sw_ctxt->irq_en; - sw_ctxt_entries[15].value = sw_ctxt->port_id; - sw_ctxt_entries[16].value = sw_ctxt->irq_no_last; - sw_ctxt_entries[17].value = sw_ctxt->err; - sw_ctxt_entries[18].value = sw_ctxt->err_wb_sent; - sw_ctxt_entries[19].value = sw_ctxt->irq_req; - sw_ctxt_entries[20].value = sw_ctxt->mrkr_dis; - sw_ctxt_entries[21].value = sw_ctxt->is_mm; - sw_ctxt_entries[22].value = sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - sw_ctxt_entries[23].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; - sw_ctxt_entries[24].value = sw_ctxt->vec; - sw_ctxt_entries[25].value = sw_ctxt->intr_aggr; -} - -/* - * qdma_acc_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void qdma_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - cmpt_ctxt_entries[0].value = cmpt_ctxt->en_stat_desc; - cmpt_ctxt_entries[1].value = cmpt_ctxt->en_int; - cmpt_ctxt_entries[2].value = cmpt_ctxt->trig_mode; - cmpt_ctxt_entries[3].value = cmpt_ctxt->fnc_id; - cmpt_ctxt_entries[4].value = cmpt_ctxt->counter_idx; - cmpt_ctxt_entries[5].value = cmpt_ctxt->timer_idx; - cmpt_ctxt_entries[6].value = cmpt_ctxt->in_st; - cmpt_ctxt_entries[7].value = cmpt_ctxt->color; - cmpt_ctxt_entries[8].value = cmpt_ctxt->ringsz_idx; - cmpt_ctxt_entries[9].value = cmpt_ctxt->bs_addr & 0xFFFFFFFF; - cmpt_ctxt_entries[10].value = - (cmpt_ctxt->bs_addr >> 32) & 0xFFFFFFFF; - cmpt_ctxt_entries[11].value = cmpt_ctxt->desc_sz; - cmpt_ctxt_entries[12].value = cmpt_ctxt->pidx; - cmpt_ctxt_entries[13].value = cmpt_ctxt->cidx; - cmpt_ctxt_entries[14].value = cmpt_ctxt->valid; - cmpt_ctxt_entries[15].value = cmpt_ctxt->err; - cmpt_ctxt_entries[16].value = cmpt_ctxt->user_trig_pend; - cmpt_ctxt_entries[17].value = cmpt_ctxt->timer_running; - cmpt_ctxt_entries[18].value = cmpt_ctxt->full_upd; - cmpt_ctxt_entries[19].value = cmpt_ctxt->ovf_chk_dis; - cmpt_ctxt_entries[20].value = cmpt_ctxt->at; - cmpt_ctxt_entries[21].value = cmpt_ctxt->vec; - cmpt_ctxt_entries[22].value = cmpt_ctxt->int_aggr; -} - -/* - * qdma_acc_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void qdma_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - hw_ctxt_entries[0].value = hw_ctxt->cidx; - hw_ctxt_entries[1].value = hw_ctxt->crd_use; - hw_ctxt_entries[2].value = hw_ctxt->dsc_pend; - hw_ctxt_entries[3].value = hw_ctxt->idl_stp_b; - hw_ctxt_entries[4].value = hw_ctxt->evt_pnd; - hw_ctxt_entries[5].value = hw_ctxt->fetch_pnd; -} - -/* - * qdma_acc_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void qdma_fill_credit_ctxt(struct qdma_descq_credit_ctxt *cr_ctxt) -{ - credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * qdma_acc_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void qdma_fill_pfetch_ctxt(struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - c2h_pftch_ctxt_entries[0].value = pfetch_ctxt->bypass; - c2h_pftch_ctxt_entries[1].value = pfetch_ctxt->bufsz_idx; - c2h_pftch_ctxt_entries[2].value = pfetch_ctxt->port_id; - c2h_pftch_ctxt_entries[3].value = pfetch_ctxt->err; - c2h_pftch_ctxt_entries[4].value = pfetch_ctxt->pfch_en; - c2h_pftch_ctxt_entries[5].value = pfetch_ctxt->pfch; - c2h_pftch_ctxt_entries[6].value = pfetch_ctxt->sw_crdt; - c2h_pftch_ctxt_entries[7].value = pfetch_ctxt->valid; -} - -/* - * qdma_acc_fill_fmap_ctxt() - Helper function to fill fmap context - * into structure - * - */ -static void qdma_fill_fmap_ctxt(struct qdma_fmap_cfg *fmap_ctxt) -{ - fmap_ctxt_entries[0].value = fmap_ctxt->qbase; - fmap_ctxt_entries[1].value = fmap_ctxt->qmax; -} - -/* - * dump_soft_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_soft_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - qdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_H2C) { - qdma_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_fill_credit_ctxt(&queue_context->cr_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_C2H) { - qdma_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_fill_credit_ctxt(&queue_context->cr_ctxt); - if (st) { - qdma_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - qdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - } - - qdma_fill_fmap_ctxt(&queue_context->fmap); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - /* SW context dump */ - n = sizeof(sw_ctxt_entries) / sizeof((sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - sw_ctxt_entries[i].name, - sw_ctxt_entries[i].value, - sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(hw_ctxt_entries) / sizeof((hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - hw_ctxt_entries[i].name, - hw_ctxt_entries[i].value, - hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(credit_ctxt_entries) / - sizeof((credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - credit_ctxt_entries[i].name, - credit_ctxt_entries[i].value, - credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(cmpt_ctxt_entries) / sizeof((cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - cmpt_ctxt_entries[i].name, - cmpt_ctxt_entries[i].value, - cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(c2h_pftch_ctxt_entries) / - sizeof(c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - c2h_pftch_ctxt_entries[i].name, - c2h_pftch_ctxt_entries[i].value, - c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* Fmap context dump */ - n = sizeof(fmap_ctxt_entries) / - sizeof(fmap_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Fmap Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - fmap_ctxt_entries[i].name, - fmap_ctxt_entries[i].value, - fmap_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * qdma_indirect_reg_invalidate() - helper function to invalidate indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = QDMA_OFFSET_IND_CTXT_DATA; - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_IND_CTXT_DATA_NUM_REGS; index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = QDMA_OFFSET_IND_CTXT_DATA; - - for (index = 0; index < ((2 * QDMA_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_version() - Function to get the qdma version - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @version_info: pointer to hold the version info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_VERSION : - QDMA_OFFSET_GLBL2_MISC_CAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - qdma_fetch_version_details(dev_hndl, is_vf, reg_val, version_info); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_fmap_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap[QDMA_FMAP_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - fmap[num_words_count++] = - FIELD_SET(QDMA_FMAP_CTXT_W0_QID_MASK, config->qbase); - fmap[num_words_count++] = - FIELD_SET(QDMA_FMAP_CTXT_W1_QID_MAX_MASK, config->qmax); - - return qdma_indirect_reg_write(dev_hndl, sel, func_id, - fmap, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_fmap_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - int rv = QDMA_SUCCESS; - uint32_t fmap[QDMA_FMAP_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, func_id, - QDMA_FMAP_NUM_WORDS, fmap); - if (rv < 0) - return rv; - - config->qbase = FIELD_GET(QDMA_FMAP_CTXT_W0_QID_MASK, fmap[0]); - config->qmax = FIELD_GET(QDMA_FMAP_CTXT_W1_QID_MAX_MASK, fmap[1]); - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_fmap_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_clear(void *dev_hndl, uint16_t func_id) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu\n", __func__, func_id); - return qdma_indirect_reg_clear(dev_hndl, sel, func_id); -} - -/*****************************************************************************/ -/** - * qdma_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_fmap_read(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_fmap_write(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_fmap_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[QDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W0_PIDX, ctxt->pidx) | - FIELD_SET(QDMA_SW_CTXT_W0_IRQ_ARM_MASK, ctxt->irq_arm) | - FIELD_SET(QDMA_SW_CTXT_W0_FUNC_ID_MASK, ctxt->fnc_id); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x\n", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(QDMA_SW_CTXT_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(QDMA_SW_CTXT_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(QDMA_SW_CTXT_W1_WB_INT_EN_MASK, ctxt->wbi_intvl_en) | - FIELD_SET(QDMA_SW_CTXT_W1_AT_MASK, ctxt->at) | - FIELD_SET(QDMA_SW_CTXT_W1_FETCH_MAX_MASK, ctxt->fetch_max) | - FIELD_SET(QDMA_SW_CTXT_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(QDMA_SW_CTXT_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(QDMA_SW_CTXT_W1_BYP_MASK, ctxt->bypass) | - FIELD_SET(QDMA_SW_CTXT_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(QDMA_SW_CTXT_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(QDMA_SW_CTXT_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK, ctxt->irq_no_last) | - FIELD_SET(QDMA_SW_CTXT_W1_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK, ctxt->err_wb_sent) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(QDMA_SW_CTXT_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(QDMA_SW_CTXT_W1_IS_MM_MASK, ctxt->is_mm); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,err=%x", - __func__, ctxt->port_id, ctxt->irq_no_last, ctxt->err); - qdma_log_debug(", err_wb_sent=%x\n", ctxt->err_wb_sent); - - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(QDMA_SW_CTXT_W4_INTR_AGGR_MASK, ctxt->intr_aggr); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t sw_ctxt[QDMA_SW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(QDMA_SW_CTXT_W0_PIDX, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W0_IRQ_ARM_MASK, sw_ctxt[0])); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W0_FUNC_ID_MASK, sw_ctxt[0])); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - ctxt->qen = FIELD_GET(QDMA_SW_CTXT_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(QDMA_SW_CTXT_W1_FCRD_EN_MASK, sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(QDMA_SW_CTXT_W1_WBI_CHK_MASK, sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(QDMA_SW_CTXT_W1_WB_INT_EN_MASK, sw_ctxt[1]); - ctxt->at = FIELD_GET(QDMA_SW_CTXT_W1_AT_MASK, sw_ctxt[1]); - ctxt->fetch_max = - FIELD_GET(QDMA_SW_CTXT_W1_FETCH_MAX_MASK, sw_ctxt[1]); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_RNG_SZ_MASK, sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_DSC_SZ_MASK, sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_BYP_MASK, sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_MM_CHN_MASK, sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_WBK_EN_MASK, sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_EN_MASK, sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_PORT_ID_MASK, sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_REQ_MASK, sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_MRKR_DIS_MASK, sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IS_MM_MASK, sw_ctxt[1])); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,", - __func__, ctxt->port_id, ctxt->irq_no_last); - qdma_log_debug(" err=%x, err_wb_sent=%x\n", - ctxt->err, ctxt->err_wb_sent); - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - ctxt->vec = FIELD_GET(QDMA_SW_CTXT_W4_VEC_MASK, sw_ctxt[4]); - ctxt->intr_aggr = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W4_INTR_AGGR_MASK, - sw_ctxt[4])); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_sw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_sw_context_write(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_sw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[QDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(QDMA_PFTCH_CTXT_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK, ctxt->pfch) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK, sw_crdt_l); - - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(QDMA_PFTCH_CTXT_W1_VALID_MASK, ctxt->valid); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t pfetch_ctxt[QDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - FIELD_GET(QDMA_PFTCH_CTXT_W0_BYPASS_MASK, pfetch_ctxt[0]); - ctxt->bufsz_idx = - FIELD_GET(QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK, pfetch_ctxt[0]); - ctxt->port_id = - FIELD_GET(QDMA_PFTCH_CTXT_W0_PORT_ID_MASK, pfetch_ctxt[0]); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK, pfetch_ctxt[0]); - - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK, pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_pfetch_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_pfetch_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_pfetch_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[QDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h, pidx_l, pidx_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR) { - qdma_log_error("%s: trig_mode(%d) > (%d) is invalid, err:%d\n", - __func__, - ctxt->trig_mode, - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_COMPL_CTXT_BADDR_GET_L_MASK, - ctxt->bs_addr); - baddr_h = (uint32_t)FIELD_GET(QDMA_COMPL_CTXT_BADDR_GET_H_MASK, - ctxt->bs_addr); - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, ctxt->pidx); - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, ctxt->pidx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(QDMA_COMPL_CTXT_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(QDMA_COMPL_CTXT_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK, - ctxt->counter_idx) | - FIELD_SET(QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK, ctxt->timer_idx) | - FIELD_SET(QDMA_COMPL_CTXT_W0_INT_ST_MASK, ctxt->in_st) | - FIELD_SET(QDMA_COMPL_CTXT_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(QDMA_COMPL_CTXT_W0_RING_SZ_MASK, ctxt->ringsz_idx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK, baddr_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK, baddr_h) | - FIELD_SET(QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK, ctxt->desc_sz) | - FIELD_SET(QDMA_COMPL_CTXT_W2_PIDX_L_MASK, pidx_l); - - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W3_PIDX_H_MASK, pidx_h) | - FIELD_SET(QDMA_COMPL_CTXT_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(QDMA_COMPL_CTXT_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(QDMA_COMPL_CTXT_W3_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK, - ctxt->user_trig_pend); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W4_TMR_RUN_MASK, - ctxt->timer_running) | - FIELD_SET(QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK, ctxt->full_upd) | - FIELD_SET(QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK, - ctxt->ovf_chk_dis) | - FIELD_SET(QDMA_COMPL_CTXT_W4_AT_MASK, ctxt->at) | - FIELD_SET(QDMA_COMPL_CTXT_W4_INTR_VEC_MASK, ctxt->vec) | - FIELD_SET(QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK, ctxt->int_aggr); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cmpt_ctxt[QDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr_l, baddr_h, pidx_l, pidx_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(QDMA_COMPL_CTXT_W0_EN_INT_MASK, cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_RING_SZ_MASK, - cmpt_ctxt[0])); - - baddr_l = FIELD_GET(QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK, cmpt_ctxt[1]); - - baddr_h = FIELD_GET(QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK, cmpt_ctxt[2]); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_W2_PIDX_L_MASK, cmpt_ctxt[2]); - - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_W3_PIDX_H_MASK, cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_ERR_MASK, cmpt_ctxt[3])); - ctxt->user_trig_pend = (uint8_t) - (FIELD_GET(QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK, cmpt_ctxt[3])); - - ctxt->timer_running = - FIELD_GET(QDMA_COMPL_CTXT_W4_TMR_RUN_MASK, cmpt_ctxt[4]); - ctxt->full_upd = - FIELD_GET(QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK, cmpt_ctxt[4]); - ctxt->ovf_chk_dis = - FIELD_GET(QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK, cmpt_ctxt[4]); - ctxt->at = FIELD_GET(QDMA_COMPL_CTXT_W4_AT_MASK, cmpt_ctxt[4]); - ctxt->vec = FIELD_GET(QDMA_COMPL_CTXT_W4_INTR_VEC_MASK, cmpt_ctxt[4]); - ctxt->int_aggr = (uint8_t) - (FIELD_GET(QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK, cmpt_ctxt[4])); - - ctxt->bs_addr = - FIELD_SET(QDMA_COMPL_CTXT_BADDR_GET_L_MASK, (uint64_t)baddr_l) | - FIELD_SET(QDMA_COMPL_CTXT_BADDR_GET_H_MASK, (uint64_t)baddr_h); - - ctxt->pidx = - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, pidx_l) | - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, pidx_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cmpt_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_cmpt_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_cmpt_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t hw_ctxt[QDMA_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or hw_ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(QDMA_HW_CTXT_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(QDMA_HW_CTXT_W0_CRD_USE_MASK, hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_DSC_PND_MASK, hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->evt_pnd = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_EVENT_PEND_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = (uint8_t) - (FIELD_GET(QDMA_HW_CTXT_W1_FETCH_PEND_MASK, hw_ctxt[1])); - - qdma_log_debug("%s: cidx=%hu, crd_use=%hu, dsc_pend=%x\n", - __func__, ctxt->cidx, ctxt->crd_use, ctxt->dsc_pend); - qdma_log_debug("%s: idl_stp_b=%x, evt_pnd=%x, fetch_pnd=%x\n", - __func__, ctxt->idl_stp_b, ctxt->evt_pnd, - ctxt->fetch_pnd); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_hw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_hw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[QDMA_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(QDMA_CR_CTXT_W0_CREDT_MASK, cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_credit_ctx_conf() - configure credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_credit_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_credit_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_write() - create indirect interrupt context - * and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_write(void *dev_hndl, uint16_t ring_index, - const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[QDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint32_t baddr_l, baddr_m, baddr_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_m = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, - ctxt->baddr_4k); - baddr_h = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(QDMA_INTR_CTXT_W0_VEC_ID_MASK, ctxt->vec) | - FIELD_SET(QDMA_INTR_CTXT_W0_INT_ST_MASK, ctxt->int_st) | - FIELD_SET(QDMA_INTR_CTXT_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(QDMA_INTR_CTXT_W0_BADDR_64_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W1_BADDR_64_MASK, baddr_m); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W2_BADDR_64_MASK, baddr_h) | - FIELD_SET(QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK, ctxt->page_size) | - FIELD_SET(QDMA_INTR_CTXT_W2_PIDX_MASK, ctxt->pidx) | - FIELD_SET(QDMA_INTR_CTXT_W2_AT_MASK, ctxt->at); - - return qdma_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_read(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t intr_ctxt[QDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_m, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, ring_index, - QDMA_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(QDMA_INTR_CTXT_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(QDMA_INTR_CTXT_W0_VEC_ID_MASK, intr_ctxt[0]); - ctxt->int_st = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W0_INT_ST_MASK, - intr_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W0_COLOR_MASK, - intr_ctxt[0])); - - baddr_l = FIELD_GET(QDMA_INTR_CTXT_W0_BADDR_64_MASK, intr_ctxt[0]); - - baddr_m = FIELD_GET(QDMA_INTR_CTXT_W1_BADDR_64_MASK, intr_ctxt[1]); - - baddr_h = FIELD_GET(QDMA_INTR_CTXT_W2_BADDR_64_MASK, intr_ctxt[2]); - ctxt->page_size = - FIELD_GET(QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK, intr_ctxt[2]); - ctxt->pidx = - (uint16_t)(FIELD_GET(QDMA_INTR_CTXT_W2_PIDX_MASK, - intr_ctxt[2])); - ctxt->at = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W2_AT_MASK, intr_ctxt[2])); - - ctxt->baddr_4k = - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, baddr_m) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_clear() - clear indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_clear(void *dev_hndl, uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_invalidate() - invalidate indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_indirect_intr_context_read(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_indirect_intr_context_write(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_indirect_intr_context_invalidate(dev_hndl, - ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_set_default_global_csr() - function to set the global CSR register to - * default values. The value can be modified later by using the set/get csr - * functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t cfg_val = 0, reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, 385, - 513, 769, 1025, 1537, 3073, 4097, 6145, 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, 32, 48, 64, - 80, 96, 112, 128, 144, 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 8192, - 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_TIMER_CNT, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(QDMA_GLBL_DSC_CFG_MAX_DSC_FETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG, reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_C2H_PFETCH_CACHE_DEPTH); - reg_val = - FIELD_SET(QDMA_C2H_PFCH_FL_TH_MASK, - QDMA_DEFAULT_PFCH_STOP_THRESH) | - FIELD_SET(QDMA_C2H_NUM_PFCH_MASK, - DEFAULT_PFCH_NUM_ENTRIES_PER_Q) | - FIELD_SET(QDMA_C2H_PFCH_QCNT_MASK, (cfg_val >> 1)) | - FIELD_SET(QDMA_C2H_EVT_QCNT_TH_MASK, - ((cfg_val >> 1) - 2)); - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_PFETCH_CFG, reg_val); - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_INT_TIMER_TICK, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_C2H_CMPT_COAL_BUF_DEPTH); - reg_val = - FIELD_SET(QDMA_C2H_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(QDMA_C2H_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(QDMA_C2H_MAX_BUF_SZ_MASK, cfg_val); - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_WRB_COAL_CFG, reg_val); - - /* H2C throttle Configuration*/ - reg_val = - FIELD_SET(QDMA_H2C_DATA_THRESH_MASK, - QDMA_H2C_THROT_DATA_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_DATA_MASK, - QDMA_THROT_EN_DATA) | - FIELD_SET(QDMA_H2C_REQ_THRESH_MASK, - QDMA_H2C_THROT_REQ_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_REQ_MASK, - QDMA_THROT_EN_REQ); - qdma_reg_write(dev_hndl, QDMA_OFFSET_H2C_REQ_THROT, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_pidx_update() - function to update the desc PIDX - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @reg_info: data needed for the PIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info) -{ - uint32_t reg_addr = 0; - uint32_t reg_val = 0; - - if (!dev_hndl || !reg_info) { - qdma_log_error("%s: dev_hndl:(%p), reg_info:(%p), err:%d\n", - __func__, dev_hndl, reg_info, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!is_vf) { - reg_addr = (is_c2h) ? QDMA_OFFSET_DMAP_SEL_C2H_DSC_PIDX : - QDMA_OFFSET_DMAP_SEL_H2C_DSC_PIDX; - } else { - reg_addr = (is_c2h) ? QDMA_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX : - QDMA_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX; - } - - reg_addr += (qid * QDMA_PIDX_STEP); - - reg_val = FIELD_SET(QDMA_DMA_SEL_DESC_PIDX_MASK, reg_info->pidx) | - FIELD_SET(QDMA_DMA_SEL_IRQ_EN_MASK, - reg_info->irq_en); - - /* Make sure writes to the H2C/C2H descriptors are synchronized - * before updating PIDX - */ - qdma_io_wmb(); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_cmpt_cidx_update() - function to update the CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_OFFSET_DMAP_SEL_CMPT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl || !reg_info) { - qdma_log_error("%s: dev_handle (%p) reg_info (%p) , err:%d\n", - __func__, dev_hndl, reg_info, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += (qid * QDMA_CMPT_CIDX_STEP); - - reg_val = - FIELD_SET(QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK, - reg_info->wrb_cidx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_info->counter_idx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK, - reg_info->timer_idx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK, - reg_info->trig_mode) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_info->wrb_en) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK, reg_info->irq_en); - - /* Make sure writes to the CMPT ring are synchronized - * before updating CIDX - */ - qdma_io_wmb(); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_intr_cidx_update() - function to update the CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_INT_CIDX : - QDMA_OFFSET_DMAP_SEL_INT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl || !reg_info) { - qdma_log_error("%s: dev_handle (%p) reg_info (%p), err:%d\n", - __func__, dev_hndl, reg_info, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += qid * QDMA_INT_CIDX_STEP; - - reg_val = - FIELD_SET(QDMA_DMA_SEL_INT_SW_CIDX_MASK, reg_info->sw_cidx) | - FIELD_SET(QDMA_DMA_SEL_INT_RING_IDX_MASK, reg_info->rng_idx); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_user_bar() - Function to get the - * AXI Master Lite(user bar) number - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_USER_BAR_ID : - QDMA_OFFSET_GLBL2_PF_BARLITE_EXT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: user_bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - - if (!is_vf) - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - else - user_bar_id = user_bar_id & 0x3F; - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, vf:%d, usrbar:%d, err:%d\n", - __func__, - is_vf, - *user_bar, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_device_attributes() - Function to get the qdma device attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_PF_BARLITE_INT); - if (FIELD_GET(QDMA_GLBL2_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_CHANNEL_QDMA_CAP); - dev_info->num_qs = FIELD_GET(QDMA_GLBL2_MULTQ_MAX_MASK, reg_val); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_MISC_CAP); - dev_info->mailbox_en = FIELD_GET(QDMA_GLBL2_MAILBOX_EN_MASK, reg_val); - dev_info->flr_present = FIELD_GET(QDMA_GLBL2_FLR_PRESENT_MASK, reg_val); - dev_info->mm_cmpt_en = FIELD_GET(QDMA_GLBL2_MM_CMPT_EN_MASK, reg_val); - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_CHANNEL_MDMA); - dev_info->mm_en = (FIELD_GET(QDMA_GLBL2_MM_C2H_MASK, reg_val) - && FIELD_GET(QDMA_GLBL2_MM_H2C_MASK, reg_val)) ? 1 : 0; - dev_info->st_en = (FIELD_GET(QDMA_GLBL2_ST_C2H_MASK, reg_val) - && FIELD_GET(QDMA_GLBL2_ST_H2C_MASK, reg_val)) ? 1 : 0; - - /* num of mm channels */ - /* TODO : Register not yet defined for this. Hard coding it to 1.*/ - dev_info->mm_channel_max = 1; - - dev_info->debug_mode = 0; - dev_info->desc_eng_mode = 0; - dev_info->qid2vec_ctx = 0; - dev_info->cmpt_ovf_chk_dis = 1; - dev_info->mailbox_intr = 1; - dev_info->sw_desc_64b = 1; - dev_info->cmpt_desc_64b = 1; - dev_info->dynamic_bar = 1; - dev_info->legacy_intr = 1; - dev_info->cmpt_trig_count_timer = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_ram_sbe_err_process() - Function to dump SBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_ram_sbe_err_process(void *dev_hndl) -{ - qdma_dump_reg_info(dev_hndl, QDMA_OFFSET_RAM_SBE_STAT, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_hw_ram_dbe_err_process() - Function to dump DBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_ram_dbe_err_process(void *dev_hndl) -{ - qdma_dump_reg_info(dev_hndl, QDMA_OFFSET_RAM_DBE_STAT, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_hw_desc_err_process() - Function to dump Descriptor Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - QDMA_OFFSET_GLBL_DSC_ERR_STS, - QDMA_OFFSET_GLBL_DSC_ERR_LOG0, - QDMA_OFFSET_GLBL_DSC_ERR_LOG1, - QDMA_OFFSET_GLBL_DSC_DBG_DAT0, - QDMA_OFFSET_GLBL_DSC_DBG_DAT1, - QDMA_OFFSET_GLBL_DSC_ERR_LOG2 - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * qdma_hw_trq_err_process() - Function to dump Target Access Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - QDMA_OFFSET_GLBL_TRQ_ERR_STS, - QDMA_OFFSET_GLBL_TRQ_ERR_LOG - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } - - -} - -/*****************************************************************************/ -/** - * qdma_hw_st_h2c_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_OFFSET_H2C_FIRST_ERR_QID, - QDMA_OFFSET_H2C_DBG_REG0, - QDMA_OFFSET_H2C_DBG_REG1, - QDMA_OFFSET_H2C_DBG_REG2, - QDMA_OFFSET_H2C_DBG_REG3, - QDMA_OFFSET_H2C_DBG_REG4 - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, st_h2c_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_hw_st_c2h_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_OFFSET_C2H_FIRST_ERR_QID, - QDMA_OFFSET_C2H_STAT_S_AXIS_C2H_ACCEPTED, - QDMA_OFFSET_C2H_STAT_S_AXIS_CMPT_ACCEPTED, - QDMA_OFFSET_C2H_STAT_DESC_RSP_PKT_ACCEPTED, - QDMA_OFFSET_C2H_STAT_AXIS_PKG_CMP, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_0, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_1, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_2, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_3, - QDMA_OFFSET_C2H_STAT_DESC_RSP_DROP_ACCEPTED, - QDMA_OFFSET_C2H_STAT_DESC_RSP_ERR_ACCEPTED - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, st_c2h_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_hw_get_error_name() - Function to get the error in string format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *qdma_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= QDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, (enum qdma_error_idx)err_idx); - return NULL; - } - - return qdma_err_info[(enum qdma_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t bit = 0, i = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[TOTAL_LEAF_ERROR_AGGREGATORS] = { - QDMA_DSC_ERR_POISON, - QDMA_TRQ_ERR_UNMAPPED, - QDMA_ST_C2H_ERR_MTY_MISMATCH, - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - QDMA_SBE_ERR_MI_H2C0_DAT, - QDMA_DBE_ERR_MI_H2C0_DAT - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_STAT); - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - qdma_log_info("addr = 0x%08x val = 0x%08x", - QDMA_OFFSET_GLBL_ERR_STAT, - glbl_err_stat); - for (i = 0; i < TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - bit = hw_err_position[i]; - - if ((!dev_cap.st_en) && (bit == QDMA_ST_C2H_ERR_MTY_MISMATCH || - bit == QDMA_ST_FATAL_ERR_MTY_MISMATCH || - bit == QDMA_ST_H2C_ERR_ZERO_LEN_DESC)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - qdma_err_info[bit].stat_reg_addr); - - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - qdma_err_info[bit].stat_reg_addr, - err_stat); - - qdma_err_info[bit].qdma_hw_err_process( - dev_hndl); - - for (idx = bit; idx < all_hw_errs[i]; idx++) { - /* call the platform specific handler */ - if (err_stat & qdma_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s", - __func__, - qdma_hw_get_error_name(idx)); - } - - qdma_reg_write(dev_hndl, - qdma_err_info[bit].stat_reg_addr, - err_stat); - - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_STAT, glbl_err_stat); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > QDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == QDMA_ERRS_ALL) { - for (i = 0; i < TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - - idx = all_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == QDMA_ST_C2H_ERR_ALL || - idx == QDMA_ST_FATAL_ERR_ALL || - idx == QDMA_ST_H2C_ERR_ALL) - continue; - } - - reg_val = qdma_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - qdma_err_info[idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_GLBL_ERR_MASK); - reg_val |= FIELD_SET( - qdma_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= QDMA_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= QDMA_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - qdma_err_info[err_idx].mask_reg_addr); - reg_val |= FIELD_SET(qdma_err_info[err_idx].leaf_err_mask, 1); - qdma_reg_write(dev_hndl, - qdma_err_info[err_idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK); - reg_val |= FIELD_SET(qdma_err_info[err_idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK, reg_val); - } - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_soft_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs) / sizeof((qdma_config_regs)[0]); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < qdma_soft_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = qdma_config_regs; - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", reg_info[i].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/* - * qdma_fill_intr_ctxt() - Helper function to fill interrupt context - * into structure - * - */ -static void qdma_fill_intr_ctxt(struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - ind_intr_ctxt_entries[0].value = intr_ctxt->valid; - ind_intr_ctxt_entries[1].value = intr_ctxt->vec; - ind_intr_ctxt_entries[2].value = intr_ctxt->int_st; - ind_intr_ctxt_entries[3].value = intr_ctxt->color; - ind_intr_ctxt_entries[4].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - ind_intr_ctxt_entries[5].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - ind_intr_ctxt_entries[6].value = intr_ctxt->page_size; - ind_intr_ctxt_entries[7].value = intr_ctxt->pidx; - ind_intr_ctxt_entries[8].value = intr_ctxt->at; -} - - -static uint32_t qdma_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(ind_intr_ctxt_entries) / - sizeof(ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * dump_intr_context() - Helper function to dump interrupt context into string - * - * return len - length of the string copied into buffer - */ -static int dump_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - qdma_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(ind_intr_ctxt_entries) / - sizeof((ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - ind_intr_ctxt_entries[i].name, - ind_intr_ctxt_entries[i].value, - ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - - -/*****************************************************************************/ -/** - * qdma_dump_intr_context() - Function to get qdma interrupt context dump in a - * buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - req_buflen = qdma_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_soft_dump_queue_context() - Function to get qdma queue context dump in a - * buffer - * - * @dev_hndl: device handle - * @st: Queue Mode (ST or MM) - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_soft_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error( - "%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_soft_context(ctxt_data, st, q_type, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_read_dump_queue_context() - Function to read and dump the queue - * context in the user-provided buffer. This API is valid only for PF and - * should not be used for VFs. For VF's use qdma_dump_queue_context() API - * after reading the context through mailbox. - * - * @dev_hndl: device handle - * @is_vf: VF or PF - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT)* - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_soft_context_buf_len(st, q_type, &req_buflen); - - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error( - "%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = qdma_sw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.sw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:sw ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_hw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.hw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:hw ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, - &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:cr ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = qdma_pfetch_ctx_conf(dev_hndl, - qid_hw, &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s:pftch ctxt read fail, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s:cmpt ctxt read fail, err = %d", - __func__, rv); - return rv; - } - } - - rv = qdma_fmap_conf(dev_hndl, func_id, - &(context.fmap), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s:fmap ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - rv = dump_soft_context(&context, st, q_type, buf, buflen); - - return rv; -} -/*****************************************************************************/ -/** - * qdma_is_legacy_intr_pend() - function to get legacy_intr_pending status bit - * - * @dev_hndl: device handle - * - * Return: legacy interrupt pending status bit value - *****************************************************************************/ -int qdma_is_legacy_intr_pend(void *dev_hndl) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - if (FIELD_GET(QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK, reg_val)) - return QDMA_SUCCESS; - - qdma_log_error("%s: no pending legacy intr, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR; -} - -/*****************************************************************************/ -/** - * qdma_clear_pend_legacy_intr() - function to clear legacy_intr_pending bit - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -int qdma_clear_pend_legacy_intr(void *dev_hndl) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_legacy_intr_conf() - function to disable/enable legacy interrupt - * - * @dev_hndl: device handle - * @enable: enable/disable flag. 1 - enable, 0 - disable - * - * Return: void - *****************************************************************************/ -int qdma_legacy_intr_conf(void *dev_hndl, enum status_type enable) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_INTR_CFG_EN_LGCY_INTR_MASK, enable); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_init_ctxt_memory() - function to initialize the context memory - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - qdma_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = qdma_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - qdma_indirect_reg_clear(dev_hndl, - QDMA_CTXT_SEL_FMAP, i); - -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return QDMA_SUCCESS; - -} - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs)/ - sizeof((qdma_config_regs)[0]); - - reg_info = qdma_config_regs; - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_soft_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_soft_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = qdma_config_regs; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (reg_count = 0; - (reg_count < total_regs);) { - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs)/ - sizeof((qdma_config_regs)[0]); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_group) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = QDMA_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = QDMA_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = QDMA_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = QDMA_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid group received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - reg_info = &qdma_config_regs[reg_index]; - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * qdma_write_global_ring_sizes() - function to set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_ring_sizes() - function to get the global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_TIMER_CNT, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_OFFSET_C2H_TIMER_CNT, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_counter_threshold() - function to get the counter threshold - * values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_write() - function to set the writeback - * interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_read() - function to get the writeback - * interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_global_writeback_interval_write(dev_hndl, *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? QDMA_OFFSET_C2H_MM_CONTROL : - QDMA_OFFSET_H2C_MM_CONTROL; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) { - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - } - - return QDMA_SUCCESS; -} - - -int qdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = qdma_get_config_num_regs(); - struct xreg_info *config_regs = qdma_get_config_regs(); - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; - -} - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_access.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_access.h deleted file mode 100755 index 6640987..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_access.h +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_SOFT_ACCESS_H_ -#define __QDMA_SOFT_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library interface definitions - * - * Header file *qdma_access.h* defines data structures and function signatures - * exported by QDMA common library. - */ - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum qdma_error_idx { - /* Descriptor errors */ - QDMA_DSC_ERR_POISON, - QDMA_DSC_ERR_UR_CA, - QDMA_DSC_ERR_PARAM, - QDMA_DSC_ERR_ADDR, - QDMA_DSC_ERR_TAG, - QDMA_DSC_ERR_FLR, - QDMA_DSC_ERR_TIMEOUT, - QDMA_DSC_ERR_DAT_POISON, - QDMA_DSC_ERR_FLR_CANCEL, - QDMA_DSC_ERR_DMA, - QDMA_DSC_ERR_DSC, - QDMA_DSC_ERR_RQ_CANCEL, - QDMA_DSC_ERR_DBE, - QDMA_DSC_ERR_SBE, - QDMA_DSC_ERR_ALL, - - /* TRQ Errors */ - QDMA_TRQ_ERR_UNMAPPED, - QDMA_TRQ_ERR_QID_RANGE, - QDMA_TRQ_ERR_VF_ACCESS, - QDMA_TRQ_ERR_TCP_TIMEOUT, - QDMA_TRQ_ERR_ALL, - - /* C2H Errors */ - QDMA_ST_C2H_ERR_MTY_MISMATCH, - QDMA_ST_C2H_ERR_LEN_MISMATCH, - QDMA_ST_C2H_ERR_QID_MISMATCH, - QDMA_ST_C2H_ERR_DESC_RSP_ERR, - QDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - QDMA_ST_C2H_ERR_MSI_INT_FAIL, - QDMA_ST_C2H_ERR_ERR_DESC_CNT, - QDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - QDMA_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - QDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - QDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - QDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - QDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - QDMA_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_ST_FATAL_ERR_LEN_MISMATCH, - QDMA_ST_FATAL_ERR_QID_MISMATCH, - QDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - QDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - QDMA_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_WPL_DATA_PAR, - QDMA_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - QDMA_ST_H2C_ERR_CSI_MOP, - QDMA_ST_H2C_ERR_NO_DMA_DSC, - QDMA_ST_H2C_ERR_SBE, - QDMA_ST_H2C_ERR_DBE, - QDMA_ST_H2C_ERR_ALL, - - /* Single bit errors */ - QDMA_SBE_ERR_MI_H2C0_DAT, - QDMA_SBE_ERR_MI_C2H0_DAT, - QDMA_SBE_ERR_H2C_RD_BRG_DAT, - QDMA_SBE_ERR_H2C_WR_BRG_DAT, - QDMA_SBE_ERR_C2H_RD_BRG_DAT, - QDMA_SBE_ERR_C2H_WR_BRG_DAT, - QDMA_SBE_ERR_FUNC_MAP, - QDMA_SBE_ERR_DSC_HW_CTXT, - QDMA_SBE_ERR_DSC_CRD_RCV, - QDMA_SBE_ERR_DSC_SW_CTXT, - QDMA_SBE_ERR_DSC_CPLI, - QDMA_SBE_ERR_DSC_CPLD, - QDMA_SBE_ERR_PASID_CTXT_RAM, - QDMA_SBE_ERR_TIMER_FIFO_RAM, - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_SBE_ERR_QID_FIFO_RAM, - QDMA_SBE_ERR_TUSER_FIFO_RAM, - QDMA_SBE_ERR_WRB_COAL_DATA_RAM, - QDMA_SBE_ERR_INT_QID2VEC_RAM, - QDMA_SBE_ERR_INT_CTXT_RAM, - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_SBE_ERR_PFCH_CTXT_RAM, - QDMA_SBE_ERR_WRB_CTXT_RAM, - QDMA_SBE_ERR_PFCH_LL_RAM, - QDMA_SBE_ERR_H2C_PEND_FIFO, - QDMA_SBE_ERR_ALL, - - /* Double bit Errors */ - QDMA_DBE_ERR_MI_H2C0_DAT, - QDMA_DBE_ERR_MI_C2H0_DAT, - QDMA_DBE_ERR_H2C_RD_BRG_DAT, - QDMA_DBE_ERR_H2C_WR_BRG_DAT, - QDMA_DBE_ERR_C2H_RD_BRG_DAT, - QDMA_DBE_ERR_C2H_WR_BRG_DAT, - QDMA_DBE_ERR_FUNC_MAP, - QDMA_DBE_ERR_DSC_HW_CTXT, - QDMA_DBE_ERR_DSC_CRD_RCV, - QDMA_DBE_ERR_DSC_SW_CTXT, - QDMA_DBE_ERR_DSC_CPLI, - QDMA_DBE_ERR_DSC_CPLD, - QDMA_DBE_ERR_PASID_CTXT_RAM, - QDMA_DBE_ERR_TIMER_FIFO_RAM, - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_DBE_ERR_QID_FIFO_RAM, - QDMA_DBE_ERR_TUSER_FIFO_RAM, - QDMA_DBE_ERR_WRB_COAL_DATA_RAM, - QDMA_DBE_ERR_INT_QID2VEC_RAM, - QDMA_DBE_ERR_INT_CTXT_RAM, - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_DBE_ERR_PFCH_CTXT_RAM, - QDMA_DBE_ERR_WRB_CTXT_RAM, - QDMA_DBE_ERR_PFCH_LL_RAM, - QDMA_DBE_ERR_H2C_PEND_FIFO, - QDMA_DBE_ERR_ALL, - - QDMA_ERRS_ALL -}; - -struct qdma_hw_err_info { - enum qdma_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*qdma_hw_err_process)(void *dev_hndl); -}; - - -int qdma_set_default_global_csr(void *dev_hndl); - -int qdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - -int qdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int qdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info); - -int qdma_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info); - -int qdma_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info); - -int qdma_init_ctxt_memory(void *dev_hndl); - -int qdma_legacy_intr_conf(void *dev_hndl, enum status_type enable); - -int qdma_clear_pend_legacy_intr(void *dev_hndl); - -int qdma_is_legacy_intr_pend(void *dev_hndl); - -int qdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -uint32_t qdma_soft_reg_dump_buf_len(void); - -uint32_t qdma_get_config_num_regs(void); - -struct xreg_info *qdma_get_config_regs(void); - -int qdma_soft_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int qdma_soft_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int qdma_soft_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -int qdma_soft_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int qdma_hw_error_process(void *dev_hndl); - -const char *qdma_hw_get_error_name(uint32_t err_idx); - -int qdma_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int qdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -int qdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - -int qdma_soft_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int qdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int qdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int qdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int qdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable); - -int qdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_SOFT_ACCESS_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_reg.h b/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_reg.h deleted file mode 100755 index 53671a6..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_access/qdma_soft_access/qdma_soft_reg.h +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * BSD LICENSE - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_SOFT_REG_H__ -#define __QDMA_SOFT_REG_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * User defined helper macros for masks and shifts. If the same macros are - * defined in linux kernel code , then undefined them and used the user - * defined macros - */ -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - - -#define DEBGFS_LINE_SZ (81) - - -#define QDMA_H2C_THROT_DATA_THRESH 0x4000 -#define QDMA_THROT_EN_DATA 1 -#define QDMA_THROT_EN_REQ 0 -#define QDMA_H2C_THROT_REQ_THRESH 0x60 - -/* - * Q Context programming (indirect) - */ - -#define QDMA_REG_IND_CTXT_REG_COUNT 8 -#define QDMA_REG_IND_CTXT_WCNT_1 1 -#define QDMA_REG_IND_CTXT_WCNT_2 2 -#define QDMA_REG_IND_CTXT_WCNT_3 3 -#define QDMA_REG_IND_CTXT_WCNT_4 4 -#define QDMA_REG_IND_CTXT_WCNT_5 5 -#define QDMA_REG_IND_CTXT_WCNT_6 6 -#define QDMA_REG_IND_CTXT_WCNT_7 7 -#define QDMA_REG_IND_CTXT_WCNT_8 8 - -/* ------------------------- QDMA_TRQ_SEL_IND (0x00800) ----------------*/ -#define QDMA_OFFSET_IND_CTXT_DATA 0x804 -#define QDMA_OFFSET_IND_CTXT_MASK 0x824 -#define QDMA_OFFSET_IND_CTXT_CMD 0x844 -#define QDMA_IND_CTXT_CMD_BUSY_MASK 0x1 - -/** QDMA_IND_REG_SEL_FMAP */ -#define QDMA_FMAP_CTXT_W1_QID_MAX_MASK GENMASK(11, 0) -#define QDMA_FMAP_CTXT_W0_QID_MASK GENMASK(10, 0) - -/** QDMA_IND_REG_SEL_SW_C2H */ -/** QDMA_IND_REG_SEL_SW_H2C */ -#define QDMA_SW_CTXT_W4_INTR_AGGR_MASK BIT(11) -#define QDMA_SW_CTXT_W4_VEC_MASK GENMASK(10, 0) -#define QDMA_SW_CTXT_W3_DSC_H_MASK GENMASK(31, 0) -#define QDMA_SW_CTXT_W2_DSC_L_MASK GENMASK(31, 0) -#define QDMA_SW_CTXT_W1_IS_MM_MASK BIT(31) -#define QDMA_SW_CTXT_W1_MRKR_DIS_MASK BIT(30) -#define QDMA_SW_CTXT_W1_IRQ_REQ_MASK BIT(29) -#define QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK BIT(28) -#define QDMA_SW_CTXT_W1_ERR_MASK GENMASK(27, 26) -#define QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK BIT(25) -#define QDMA_SW_CTXT_W1_PORT_ID_MASK GENMASK(24, 22) -#define QDMA_SW_CTXT_W1_IRQ_EN_MASK BIT(21) -#define QDMA_SW_CTXT_W1_WBK_EN_MASK BIT(20) -#define QDMA_SW_CTXT_W1_MM_CHN_MASK BIT(19) -#define QDMA_SW_CTXT_W1_BYP_MASK BIT(18) -#define QDMA_SW_CTXT_W1_DSC_SZ_MASK GENMASK(17, 16) -#define QDMA_SW_CTXT_W1_RNG_SZ_MASK GENMASK(15, 12) -#define QDMA_SW_CTXT_W1_FETCH_MAX_MASK GENMASK(7, 5) -#define QDMA_SW_CTXT_W1_AT_MASK BIT(4) -#define QDMA_SW_CTXT_W1_WB_INT_EN_MASK BIT(3) -#define QDMA_SW_CTXT_W1_WBI_CHK_MASK BIT(2) -#define QDMA_SW_CTXT_W1_FCRD_EN_MASK BIT(1) -#define QDMA_SW_CTXT_W1_QEN_MASK BIT(0) -#define QDMA_SW_CTXT_W0_FUNC_ID_MASK GENMASK(24, 17) -#define QDMA_SW_CTXT_W0_IRQ_ARM_MASK BIT(16) -#define QDMA_SW_CTXT_W0_PIDX GENMASK(15, 0) - - - -#define QDMA_PFTCH_CTXT_W1_VALID_MASK BIT(13) -#define QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK BIT(28) -#define QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK BIT(27) -#define QDMA_PFTCH_CTXT_W0_ERR_MASK BIT(26) -#define QDMA_PFTCH_CTXT_W0_PORT_ID_MASK GENMASK(7, 5) -#define QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK GENMASK(4, 1) -#define QDMA_PFTCH_CTXT_W0_BYPASS_MASK BIT(0) - - - - -#define QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK BIT(15) -#define QDMA_COMPL_CTXT_W4_INTR_VEC_MASK GENMASK(14, 4) -#define QDMA_COMPL_CTXT_W4_AT_MASK BIT(3) -#define QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK BIT(2) -#define QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK BIT(1) -#define QDMA_COMPL_CTXT_W4_TMR_RUN_MASK BIT(0) -#define QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK BIT(31) -#define QDMA_COMPL_CTXT_W3_ERR_MASK GENMASK(30, 29) -#define QDMA_COMPL_CTXT_W3_VALID_MASK BIT(28) -#define QDMA_COMPL_CTXT_W3_CIDX_MASK GENMASK(27, 12) -#define QDMA_COMPL_CTXT_W3_PIDX_H_MASK GENMASK(11, 0) -#define QDMA_COMPL_CTXT_W2_PIDX_L_MASK GENMASK(31, 28) -#define QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK GENMASK(27, 26) -#define QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK GENMASK(25, 0) -#define QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK GENMASK(31, 6) -#define QDMA_COMPL_CTXT_W0_RING_SZ_MASK GENMASK(31, 28) -#define QDMA_COMPL_CTXT_W0_COLOR_MASK BIT(27) -#define QDMA_COMPL_CTXT_W0_INT_ST_MASK GENMASK(26, 25) -#define QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK GENMASK(24, 21) -#define QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK GENMASK(20, 17) -#define QDMA_COMPL_CTXT_W0_FNC_ID_MASK GENMASK(12, 5) -#define QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define QDMA_COMPL_CTXT_W0_EN_INT_MASK BIT(1) -#define QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK BIT(0) - -/** QDMA_IND_REG_SEL_HW_C2H */ -/** QDMA_IND_REG_SEL_HW_H2C */ -#define QDMA_HW_CTXT_W1_FETCH_PEND_MASK GENMASK(14, 11) -#define QDMA_HW_CTXT_W1_EVENT_PEND_MASK BIT(10) -#define QDMA_HW_CTXT_W1_IDL_STP_B_MASK BIT(9) -#define QDMA_HW_CTXT_W1_DSC_PND_MASK BIT(8) -#define QDMA_HW_CTXT_W0_CRD_USE_MASK GENMASK(31, 16) -#define QDMA_HW_CTXT_W0_CIDX_MASK GENMASK(15, 0) - -/** QDMA_IND_REG_SEL_CR_C2H */ -/** QDMA_IND_REG_SEL_CR_H2C */ -#define QDMA_CR_CTXT_W0_CREDT_MASK GENMASK(15, 0) - -/** QDMA_IND_REG_SEL_INTR */ - - -#define QDMA_INTR_CTXT_W2_AT_MASK BIT(18) -#define QDMA_INTR_CTXT_W2_PIDX_MASK GENMASK(17, 6) -#define QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK GENMASK(5, 3) -#define QDMA_INTR_CTXT_W2_BADDR_64_MASK GENMASK(2, 0) -#define QDMA_INTR_CTXT_W1_BADDR_64_MASK GENMASK(31, 0) -#define QDMA_INTR_CTXT_W0_BADDR_64_MASK GENMASK(31, 15) -#define QDMA_INTR_CTXT_W0_COLOR_MASK BIT(14) -#define QDMA_INTR_CTXT_W0_INT_ST_MASK BIT(13) -#define QDMA_INTR_CTXT_W0_VEC_ID_MASK GENMASK(11, 1) -#define QDMA_INTR_CTXT_W0_VALID_MASK BIT(0) - - - - - -/* ------------------------ QDMA_TRQ_SEL_GLBL (0x00200)-------------------*/ -#define QDMA_OFFSET_GLBL_RNG_SZ 0x204 -#define QDMA_OFFSET_GLBL_SCRATCH 0x244 -#define QDMA_OFFSET_GLBL_ERR_STAT 0x248 -#define QDMA_OFFSET_GLBL_ERR_MASK 0x24C -#define QDMA_OFFSET_GLBL_DSC_CFG 0x250 -#define QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define QDMA_GLBL_DSC_CFG_MAX_DSC_FETCH_MASK GENMASK(5, 3) -#define QDMA_OFFSET_GLBL_DSC_ERR_STS 0x254 -#define QDMA_OFFSET_GLBL_DSC_ERR_MSK 0x258 -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG0 0x25C -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG1 0x260 -#define QDMA_OFFSET_GLBL_TRQ_ERR_STS 0x264 -#define QDMA_OFFSET_GLBL_TRQ_ERR_MSK 0x268 -#define QDMA_OFFSET_GLBL_TRQ_ERR_LOG 0x26C -#define QDMA_OFFSET_GLBL_DSC_DBG_DAT0 0x270 -#define QDMA_OFFSET_GLBL_DSC_DBG_DAT1 0x274 -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG2 0x27C -#define QDMA_OFFSET_GLBL_INTERRUPT_CFG 0x2C4 -#define QDMA_GLBL_INTR_CFG_EN_LGCY_INTR_MASK BIT(0) -#define QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK BIT(1) - -/* ------------------------- QDMA_TRQ_SEL_C2H (0x00A00) ------------------*/ -#define QDMA_OFFSET_C2H_TIMER_CNT 0xA00 -#define QDMA_OFFSET_C2H_CNT_TH 0xA40 -#define QDMA_OFFSET_C2H_QID2VEC_MAP_QID 0xA80 -#define QDMA_OFFSET_C2H_QID2VEC_MAP 0xA84 -#define QDMA_OFFSET_C2H_STAT_S_AXIS_C2H_ACCEPTED 0xA88 -#define QDMA_OFFSET_C2H_STAT_S_AXIS_CMPT_ACCEPTED 0xA8C -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_PKT_ACCEPTED 0xA90 -#define QDMA_OFFSET_C2H_STAT_AXIS_PKG_CMP 0xA94 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_ACCEPTED 0xA98 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_CMP 0xA9C -#define QDMA_OFFSET_C2H_STAT_WRQ_OUT 0xAA0 -#define QDMA_OFFSET_C2H_STAT_WPL_REN_ACCEPTED 0xAA4 -#define QDMA_OFFSET_C2H_STAT_TOTAL_WRQ_LEN 0xAA8 -#define QDMA_OFFSET_C2H_STAT_TOTAL_WPL_LEN 0xAAC -#define QDMA_OFFSET_C2H_BUF_SZ 0xAB0 -#define QDMA_OFFSET_C2H_ERR_STAT 0xAF0 -#define QDMA_OFFSET_C2H_ERR_MASK 0xAF4 -#define QDMA_OFFSET_C2H_FATAL_ERR_STAT 0xAF8 -#define QDMA_OFFSET_C2H_FATAL_ERR_MASK 0xAFC -#define QDMA_OFFSET_C2H_FATAL_ERR_ENABLE 0xB00 -#define QDMA_OFFSET_C2H_ERR_INT 0xB04 -#define QDMA_OFFSET_C2H_PFETCH_CFG 0xB08 -#define QDMA_C2H_EVT_QCNT_TH_MASK GENMASK(31, 25) -#define QDMA_C2H_PFCH_QCNT_MASK GENMASK(24, 18) -#define QDMA_C2H_NUM_PFCH_MASK GENMASK(17, 9) -#define QDMA_C2H_PFCH_FL_TH_MASK GENMASK(8, 0) -#define QDMA_OFFSET_C2H_INT_TIMER_TICK 0xB0C -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_DROP_ACCEPTED 0xB10 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_ERR_ACCEPTED 0xB14 -#define QDMA_OFFSET_C2H_STAT_DESC_REQ 0xB18 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_0 0xB1C -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_1 0xB20 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_2 0xB24 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_3 0xB28 -#define QDMA_OFFSET_C2H_DBG_PFCH_ERR_CTXT 0xB2C -#define QDMA_OFFSET_C2H_FIRST_ERR_QID 0xB30 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_IN 0xB34 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_OUT 0xB38 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_DRP 0xB3C -#define QDMA_OFFSET_C2H_STAT_NUM_STAT_DESC_OUT 0xB40 -#define QDMA_OFFSET_C2H_STAT_NUM_DSC_CRDT_SENT 0xB44 -#define QDMA_OFFSET_C2H_STAT_NUM_FCH_DSC_RCVD 0xB48 -#define QDMA_OFFSET_C2H_STAT_NUM_BYP_DSC_RCVD 0xB4C -#define QDMA_OFFSET_C2H_WRB_COAL_CFG 0xB50 -#define QDMA_C2H_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define QDMA_C2H_TICK_VAL_MASK GENMASK(25, 14) -#define QDMA_C2H_TICK_CNT_MASK GENMASK(13, 2) -#define QDMA_C2H_SET_GLB_FLUSH_MASK BIT(1) -#define QDMA_C2H_DONE_GLB_FLUSH_MASK BIT(0) -#define QDMA_OFFSET_C2H_INTR_H2C_REQ 0xB54 -#define QDMA_OFFSET_C2H_INTR_C2H_MM_REQ 0xB58 -#define QDMA_OFFSET_C2H_INTR_ERR_INT_REQ 0xB5C -#define QDMA_OFFSET_C2H_INTR_C2H_ST_REQ 0xB60 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK 0xB64 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL 0xB68 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX 0xB6C -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL 0xB70 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_MSIX_ACK 0xB74 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_MSIX_FAIL 0xB78 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_NO_MSIX 0xB7C -#define QDMA_OFFSET_C2H_INTR_C2H_ST_CTXT_INVAL 0xB80 -#define QDMA_OFFSET_C2H_STAT_WR_CMP 0xB84 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_4 0xB88 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_5 0xB8C -#define QDMA_OFFSET_C2H_DBG_PFCH_QID 0xB90 -#define QDMA_OFFSET_C2H_DBG_PFCH 0xB94 -#define QDMA_OFFSET_C2H_INT_DEBUG 0xB98 -#define QDMA_OFFSET_C2H_STAT_IMM_ACCEPTED 0xB9C -#define QDMA_OFFSET_C2H_STAT_MARKER_ACCEPTED 0xBA0 -#define QDMA_OFFSET_C2H_STAT_DISABLE_CMP_ACCEPTED 0xBA4 -#define QDMA_OFFSET_C2H_PAYLOAD_FIFO_CRDT_CNT 0xBA8 -#define QDMA_OFFSET_C2H_PFETCH_CACHE_DEPTH 0xBE0 -#define QDMA_OFFSET_C2H_CMPT_COAL_BUF_DEPTH 0xBE4 - -/* ------------------------- QDMA_TRQ_SEL_H2C (0x00E00) ------------------*/ -#define QDMA_OFFSET_H2C_ERR_STAT 0xE00 -#define QDMA_OFFSET_H2C_ERR_MASK 0xE04 -#define QDMA_OFFSET_H2C_FIRST_ERR_QID 0xE08 -#define QDMA_OFFSET_H2C_DBG_REG0 0xE0C -#define QDMA_OFFSET_H2C_DBG_REG1 0xE10 -#define QDMA_OFFSET_H2C_DBG_REG2 0xE14 -#define QDMA_OFFSET_H2C_DBG_REG3 0xE18 -#define QDMA_OFFSET_H2C_DBG_REG4 0xE1C -#define QDMA_OFFSET_H2C_FATAL_ERR_EN 0xE20 -#define QDMA_OFFSET_H2C_REQ_THROT 0xE24 -#define QDMA_H2C_REQ_THROT_EN_REQ_MASK BIT(31) -#define QDMA_H2C_REQ_THRESH_MASK GENMASK(25, 17) -#define QDMA_H2C_REQ_THROT_EN_DATA_MASK BIT(16) -#define QDMA_H2C_DATA_THRESH_MASK GENMASK(15, 0) - - -/* ------------------------- QDMA_TRQ_SEL_H2C_MM (0x1200) ----------------*/ -#define QDMA_OFFSET_H2C_MM_CONTROL 0x1204 -#define QDMA_OFFSET_H2C_MM_CONTROL_W1S 0x1208 -#define QDMA_OFFSET_H2C_MM_CONTROL_W1C 0x120C -#define QDMA_OFFSET_H2C_MM_STATUS 0x1240 -#define QDMA_OFFSET_H2C_MM_STATUS_RC 0x1244 -#define QDMA_OFFSET_H2C_MM_COMPLETED_DESC_COUNT 0x1248 -#define QDMA_OFFSET_H2C_MM_ERR_CODE_EN_MASK 0x1254 -#define QDMA_OFFSET_H2C_MM_ERR_CODE 0x1258 -#define QDMA_OFFSET_H2C_MM_ERR_INFO 0x125C -#define QDMA_OFFSET_H2C_MM_PERF_MON_CONTROL 0x12C0 -#define QDMA_OFFSET_H2C_MM_PERF_MON_CYCLE_COUNT_0 0x12C4 -#define QDMA_OFFSET_H2C_MM_PERF_MON_CYCLE_COUNT_1 0x12C8 -#define QDMA_OFFSET_H2C_MM_PERF_MON_DATA_COUNT_0 0x12CC -#define QDMA_OFFSET_H2C_MM_PERF_MON_DATA_COUNT_1 0x12D0 -#define QDMA_OFFSET_H2C_MM_DEBUG 0x12E8 - -/* ------------------------- QDMA_TRQ_SEL_C2H_MM (0x1000) ----------------*/ -#define QDMA_OFFSET_C2H_MM_CONTROL 0x1004 -#define QDMA_OFFSET_C2H_MM_CONTROL_W1S 0x1008 -#define QDMA_OFFSET_C2H_MM_CONTROL_W1C 0x100C -#define QDMA_OFFSET_C2H_MM_STATUS 0x1040 -#define QDMA_OFFSET_C2H_MM_STATUS_RC 0x1044 -#define QDMA_OFFSET_C2H_MM_COMPLETED_DESC_COUNT 0x1048 -#define QDMA_OFFSET_C2H_MM_ERR_CODE_EN_MASK 0x1054 -#define QDMA_OFFSET_C2H_MM_ERR_CODE 0x1058 -#define QDMA_OFFSET_C2H_MM_ERR_INFO 0x105C -#define QDMA_OFFSET_C2H_MM_PERF_MON_CONTROL 0x10C0 -#define QDMA_OFFSET_C2H_MM_PERF_MON_CYCLE_COUNT_0 0x10C4 -#define QDMA_OFFSET_C2H_MM_PERF_MON_CYCLE_COUNT_1 0x10C8 -#define QDMA_OFFSET_C2H_MM_PERF_MON_DATA_COUNT_0 0x10CC -#define QDMA_OFFSET_C2H_MM_PERF_MON_DATA_COUNT_1 0x10D0 -#define QDMA_OFFSET_C2H_MM_DEBUG 0x10E8 - -/* ------------------------- QDMA_TRQ_SEL_GLBL1 (0x0) -----------------*/ -#define QDMA_OFFSET_CONFIG_BLOCK_ID 0x0 -#define QDMA_CONFIG_BLOCK_ID_MASK GENMASK(31, 16) - - -/* ------------------------- QDMA_TRQ_SEL_GLBL2 (0x00100) ----------------*/ -#define QDMA_OFFSET_GLBL2_ID 0x100 -#define QDMA_OFFSET_GLBL2_PF_BARLITE_INT 0x104 -#define QDMA_GLBL2_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define QDMA_GLBL2_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define QDMA_GLBL2_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define QDMA_GLBL2_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_OFFSET_GLBL2_PF_VF_BARLITE_INT 0x108 -#define QDMA_OFFSET_GLBL2_PF_BARLITE_EXT 0x10C -#define QDMA_OFFSET_GLBL2_PF_VF_BARLITE_EXT 0x110 -#define QDMA_OFFSET_GLBL2_CHANNEL_INST 0x114 -#define QDMA_OFFSET_GLBL2_CHANNEL_MDMA 0x118 -#define QDMA_GLBL2_ST_C2H_MASK BIT(17) -#define QDMA_GLBL2_ST_H2C_MASK BIT(16) -#define QDMA_GLBL2_MM_C2H_MASK BIT(8) -#define QDMA_GLBL2_MM_H2C_MASK BIT(0) -#define QDMA_OFFSET_GLBL2_CHANNEL_STRM 0x11C -#define QDMA_OFFSET_GLBL2_CHANNEL_QDMA_CAP 0x120 -#define QDMA_GLBL2_MULTQ_MAX_MASK GENMASK(11, 0) -#define QDMA_OFFSET_GLBL2_CHANNEL_PASID_CAP 0x128 -#define QDMA_OFFSET_GLBL2_CHANNEL_FUNC_RET 0x12C -#define QDMA_OFFSET_GLBL2_SYSTEM_ID 0x130 -#define QDMA_OFFSET_GLBL2_MISC_CAP 0x134 - -#define QDMA_GLBL2_DEVICE_ID_MASK GENMASK(31, 28) -#define QDMA_GLBL2_VIVADO_RELEASE_MASK GENMASK(27, 24) -#define QDMA_GLBL2_VERSAL_IP_MASK GENMASK(23, 20) -#define QDMA_GLBL2_RTL_VERSION_MASK GENMASK(19, 16) -#define QDMA_OFFSET_GLBL2_DBG_PCIE_RQ0 0x1B8 -#define QDMA_OFFSET_GLBL2_DBG_PCIE_RQ1 0x1BC -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_WR0 0x1C0 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_WR1 0x1C4 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_RD0 0x1C8 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_RD1 0x1CC - -/* used for VF bars identification */ -#define QDMA_OFFSET_VF_USER_BAR_ID 0x1018 -#define QDMA_OFFSET_VF_CONFIG_BAR_ID 0x1014 - -/* FLR programming */ -#define QDMA_OFFSET_VF_REG_FLR_STATUS 0x1100 -#define QDMA_OFFSET_PF_REG_FLR_STATUS 0x2500 -#define QDMA_FLR_STATUS_MASK 0x1 - -/* VF qdma version */ -#define QDMA_OFFSET_VF_VERSION 0x1014 -#define QDMA_OFFSET_PF_VERSION 0x2414 -#define QDMA_GLBL2_VF_UNIQUE_ID_MASK GENMASK(31, 16) -#define QDMA_GLBL2_VF_DEVICE_ID_MASK GENMASK(15, 12) -#define QDMA_GLBL2_VF_VIVADO_RELEASE_MASK GENMASK(11, 8) -#define QDMA_GLBL2_VF_VERSAL_IP_MASK GENMASK(7, 4) -#define QDMA_GLBL2_VF_RTL_VERSION_MASK GENMASK(3, 0) - - -/* ------------------------- QDMA_TRQ_SEL_QUEUE_PF (0x18000) ----------------*/ - -#define QDMA_OFFSET_DMAP_SEL_INT_CIDX 0x18000 -#define QDMA_OFFSET_DMAP_SEL_H2C_DSC_PIDX 0x18004 -#define QDMA_OFFSET_DMAP_SEL_C2H_DSC_PIDX 0x18008 -#define QDMA_OFFSET_DMAP_SEL_CMPT_CIDX 0x1800C - -#define QDMA_OFFSET_VF_DMAP_SEL_INT_CIDX 0x3000 -#define QDMA_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX 0x3004 -#define QDMA_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX 0x3008 -#define QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX 0x300C - -#define QDMA_DMA_SEL_INT_SW_CIDX_MASK GENMASK(15, 0) -#define QDMA_DMA_SEL_INT_RING_IDX_MASK GENMASK(23, 16) -#define QDMA_DMA_SEL_DESC_PIDX_MASK GENMASK(15, 0) -#define QDMA_DMA_SEL_IRQ_EN_MASK BIT(16) -#define QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK BIT(28) -#define QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK BIT(27) -#define QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK GENMASK(26, 24) -#define QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK GENMASK(23, 20) -#define QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK GENMASK(19, 16) -#define QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK GENMASK(15, 0) - -/* ------------------------- Hardware Errors ------------------------------ */ -#define TOTAL_LEAF_ERROR_AGGREGATORS 7 - -#define QDMA_OFFSET_GLBL_ERR_INT 0xB04 -#define QDMA_GLBL_ERR_FUNC_MASK GENMASK(7, 0) -#define QDMA_GLBL_ERR_VEC_MASK GENMASK(22, 12) -#define QDMA_GLBL_ERR_ARM_MASK BIT(24) - -#define QDMA_OFFSET_GLBL_ERR_STAT 0x248 -#define QDMA_OFFSET_GLBL_ERR_MASK 0x24C -#define QDMA_GLBL_ERR_RAM_SBE_MASK BIT(0) -#define QDMA_GLBL_ERR_RAM_DBE_MASK BIT(1) -#define QDMA_GLBL_ERR_DSC_MASK BIT(2) -#define QDMA_GLBL_ERR_TRQ_MASK BIT(3) -#define QDMA_GLBL_ERR_ST_C2H_MASK BIT(8) -#define QDMA_GLBL_ERR_ST_H2C_MASK BIT(11) - -#define QDMA_OFFSET_C2H_ERR_STAT 0xAF0 -#define QDMA_OFFSET_C2H_ERR_MASK 0xAF4 -#define QDMA_C2H_ERR_MTY_MISMATCH_MASK BIT(0) -#define QDMA_C2H_ERR_LEN_MISMATCH_MASK BIT(1) -#define QDMA_C2H_ERR_QID_MISMATCH_MASK BIT(3) -#define QDMA_C2H_ERR_DESC_RSP_ERR_MASK BIT(4) -#define QDMA_C2H_ERR_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define QDMA_C2H_ERR_MSI_INT_FAIL_MASK BIT(7) -#define QDMA_C2H_ERR_ERR_DESC_CNT_MASK BIT(9) -#define QDMA_C2H_ERR_PORTID_CTXT_MISMATCH_MASK BIT(10) -#define QDMA_C2H_ERR_PORTID_BYP_IN_MISMATCH_MASK BIT(11) -#define QDMA_C2H_ERR_CMPT_INV_Q_ERR_MASK BIT(12) -#define QDMA_C2H_ERR_CMPT_QFULL_ERR_MASK BIT(13) -#define QDMA_C2H_ERR_CMPT_CIDX_ERR_MASK BIT(14) -#define QDMA_C2H_ERR_CMPT_PRTY_ERR_MASK BIT(15) -#define QDMA_C2H_ERR_ALL_MASK 0xFEDB - -#define QDMA_OFFSET_C2H_FATAL_ERR_STAT 0xAF8 -#define QDMA_OFFSET_C2H_FATAL_ERR_MASK 0xAFC -#define QDMA_C2H_FATAL_ERR_MTY_MISMATCH_MASK BIT(0) -#define QDMA_C2H_FATAL_ERR_LEN_MISMATCH_MASK BIT(1) -#define QDMA_C2H_FATAL_ERR_QID_MISMATCH_MASK BIT(3) -#define QDMA_C2H_FATAL_ERR_TIMER_FIFO_RAM_RDBE_MASK BIT(4) -#define QDMA_C2H_FATAL_ERR_PFCH_II_RAM_RDBE_MASK BIT(8) -#define QDMA_C2H_FATAL_ERR_CMPT_CTXT_RAM_RDBE_MASK BIT(9) -#define QDMA_C2H_FATAL_ERR_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define QDMA_C2H_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define QDMA_C2H_FATAL_ERR_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define QDMA_C2H_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define QDMA_C2H_FATAL_ERR_TUSER_FIFO_RAM_RDBE_MASK BIT(15) -#define QDMA_C2H_FATAL_ERR_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define QDMA_C2H_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE_MASK BIT(17) -#define QDMA_C2H_FATAL_ERR_WPL_DATA_PAR_MASK BIT(18) -#define QDMA_C2H_FATAL_ERR_ALL_MASK 0x7DF1B - -#define QDMA_OFFSET_H2C_ERR_STAT 0xE00 -#define QDMA_OFFSET_H2C_ERR_MASK 0xE04 -#define QDMA_H2C_ERR_ZERO_LEN_DESC_MASK BIT(0) -#define QDMA_H2C_ERR_CSI_MOP_MASK BIT(1) -#define QDMA_H2C_ERR_NO_DMA_DSC_MASK BIT(2) -#define QDMA_H2C_ERR_SBE_MASK BIT(3) -#define QDMA_H2C_ERR_DBE_MASK BIT(4) -#define QDMA_H2C_ERR_ALL_MASK 0x1F - -#define QDMA_OFFSET_GLBL_DSC_ERR_STAT 0x254 -#define QDMA_OFFSET_GLBL_DSC_ERR_MASK 0x258 -#define QDMA_GLBL_DSC_ERR_POISON_MASK BIT(0) -#define QDMA_GLBL_DSC_ERR_UR_CA_MASK BIT(1) -#define QDMA_GLBL_DSC_ERR_PARAM_MASK BIT(2) -#define QDMA_GLBL_DSC_ERR_ADDR_MASK BIT(3) -#define QDMA_GLBL_DSC_ERR_TAG_MASK BIT(4) -#define QDMA_GLBL_DSC_ERR_FLR_MASK BIT(5) -#define QDMA_GLBL_DSC_ERR_TIMEOUT_MASK BIT(9) -#define QDMA_GLBL_DSC_ERR_DAT_POISON_MASK BIT(16) -#define QDMA_GLBL_DSC_ERR_FLR_CANCEL_MASK BIT(19) -#define QDMA_GLBL_DSC_ERR_DMA_MASK BIT(20) -#define QDMA_GLBL_DSC_ERR_DSC_MASK BIT(21) -#define QDMA_GLBL_DSC_ERR_RQ_CANCEL_MASK BIT(22) -#define QDMA_GLBL_DSC_ERR_DBE_MASK BIT(23) -#define QDMA_GLBL_DSC_ERR_SBE_MASK BIT(24) -#define QDMA_GLBL_DSC_ERR_ALL_MASK 0x1F9023F - -#define QDMA_OFFSET_GLBL_TRQ_ERR_STAT 0x264 -#define QDMA_OFFSET_GLBL_TRQ_ERR_MASK 0x268 -#define QDMA_GLBL_TRQ_ERR_UNMAPPED_MASK BIT(0) -#define QDMA_GLBL_TRQ_ERR_QID_RANGE_MASK BIT(1) -#define QDMA_GLBL_TRQ_ERR_VF_ACCESS_MASK BIT(2) -#define QDMA_GLBL_TRQ_ERR_TCP_TIMEOUT_MASK BIT(3) -#define QDMA_GLBL_TRQ_ERR_ALL_MASK 0xF - -#define QDMA_OFFSET_RAM_SBE_STAT 0xF4 -#define QDMA_OFFSET_RAM_SBE_MASK 0xF0 -#define QDMA_SBE_ERR_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_SBE_ERR_MI_C2H0_DAT_MASK BIT(4) -#define QDMA_SBE_ERR_H2C_RD_BRG_DAT_MASK BIT(9) -#define QDMA_SBE_ERR_H2C_WR_BRG_DAT_MASK BIT(10) -#define QDMA_SBE_ERR_C2H_RD_BRG_DAT_MASK BIT(11) -#define QDMA_SBE_ERR_C2H_WR_BRG_DAT_MASK BIT(12) -#define QDMA_SBE_ERR_FUNC_MAP_MASK BIT(13) -#define QDMA_SBE_ERR_DSC_HW_CTXT_MASK BIT(14) -#define QDMA_SBE_ERR_DSC_CRD_RCV_MASK BIT(15) -#define QDMA_SBE_ERR_DSC_SW_CTXT_MASK BIT(16) -#define QDMA_SBE_ERR_DSC_CPLI_MASK BIT(17) -#define QDMA_SBE_ERR_DSC_CPLD_MASK BIT(18) -#define QDMA_SBE_ERR_PASID_CTXT_RAM_MASK BIT(19) -#define QDMA_SBE_ERR_TIMER_FIFO_RAM_MASK BIT(20) -#define QDMA_SBE_ERR_PAYLOAD_FIFO_RAM_MASK BIT(21) -#define QDMA_SBE_ERR_QID_FIFO_RAM_MASK BIT(22) -#define QDMA_SBE_ERR_TUSER_FIFO_RAM_MASK BIT(23) -#define QDMA_SBE_ERR_WRB_COAL_DATA_RAM_MASK BIT(24) -#define QDMA_SBE_ERR_INT_QID2VEC_RAM_MASK BIT(25) -#define QDMA_SBE_ERR_INT_CTXT_RAM_MASK BIT(26) -#define QDMA_SBE_ERR_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define QDMA_SBE_ERR_PFCH_CTXT_RAM_MASK BIT(28) -#define QDMA_SBE_ERR_WRB_CTXT_RAM_MASK BIT(29) -#define QDMA_SBE_ERR_PFCH_LL_RAM_MASK BIT(30) -#define QDMA_SBE_ERR_H2C_PEND_FIFO_MASK BIT(31) -#define QDMA_SBE_ERR_ALL_MASK 0xFFFFFF11 - -#define QDMA_OFFSET_RAM_DBE_STAT 0xFC -#define QDMA_OFFSET_RAM_DBE_MASK 0xF8 -#define QDMA_DBE_ERR_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_DBE_ERR_MI_C2H0_DAT_MASK BIT(4) -#define QDMA_DBE_ERR_H2C_RD_BRG_DAT_MASK BIT(9) -#define QDMA_DBE_ERR_H2C_WR_BRG_DAT_MASK BIT(10) -#define QDMA_DBE_ERR_C2H_RD_BRG_DAT_MASK BIT(11) -#define QDMA_DBE_ERR_C2H_WR_BRG_DAT_MASK BIT(12) -#define QDMA_DBE_ERR_FUNC_MAP_MASK BIT(13) -#define QDMA_DBE_ERR_DSC_HW_CTXT_MASK BIT(14) -#define QDMA_DBE_ERR_DSC_CRD_RCV_MASK BIT(15) -#define QDMA_DBE_ERR_DSC_SW_CTXT_MASK BIT(16) -#define QDMA_DBE_ERR_DSC_CPLI_MASK BIT(17) -#define QDMA_DBE_ERR_DSC_CPLD_MASK BIT(18) -#define QDMA_DBE_ERR_PASID_CTXT_RAM_MASK BIT(19) -#define QDMA_DBE_ERR_TIMER_FIFO_RAM_MASK BIT(20) -#define QDMA_DBE_ERR_PAYLOAD_FIFO_RAM_MASK BIT(21) -#define QDMA_DBE_ERR_QID_FIFO_RAM_MASK BIT(22) -#define QDMA_DBE_ERR_TUSER_FIFO_RAM_MASK BIT(23) -#define QDMA_DBE_ERR_WRB_COAL_DATA_RAM_MASK BIT(24) -#define QDMA_DBE_ERR_INT_QID2VEC_RAM_MASK BIT(25) -#define QDMA_DBE_ERR_INT_CTXT_RAM_MASK BIT(26) -#define QDMA_DBE_ERR_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define QDMA_DBE_ERR_PFCH_CTXT_RAM_MASK BIT(28) -#define QDMA_DBE_ERR_WRB_CTXT_RAM_MASK BIT(29) -#define QDMA_DBE_ERR_PFCH_LL_RAM_MASK BIT(30) -#define QDMA_DBE_ERR_H2C_PEND_FIFO_MASK BIT(31) -#define QDMA_DBE_ERR_ALL_MASK 0xFFFFFF11 - -#define QDMA_OFFSET_MBOX_BASE_VF 0x1000 -#define QDMA_OFFSET_MBOX_BASE_PF 0x2400 - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_SOFT_REG_H__ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_common.c b/QDMA/DPDK/drivers/net/qdma/qdma_common.c deleted file mode 100755 index a25127e..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_common.c +++ /dev/null @@ -1,657 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdint.h> -#include <rte_malloc.h> -#include <rte_common.h> -#include <rte_cycles.h> -#include <rte_kvargs.h> -#include "qdma.h" -#include "qdma_access_common.h" -#include <fcntl.h> -#include <unistd.h> - -/* Read register */ -uint32_t qdma_read_reg(uint64_t reg_addr) -{ - uint32_t val; - - val = *((volatile uint32_t *)(reg_addr)); - return val; -} - -/* Write register */ -void qdma_write_reg(uint64_t reg_addr, uint32_t val) -{ - *((volatile uint32_t *)(reg_addr)) = val; -} - -uint32_t qdma_pci_read_reg(struct rte_eth_dev *dev, uint32_t bar, uint32_t reg) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint64_t baseaddr; - uint32_t val; - - if (bar >= (QDMA_NUM_BARS - 1)) { - printf("Error: PCI BAR number:%u not supported\n" - "Please enter valid BAR number\n", bar); - return -1; - } - - baseaddr = (uint64_t)qdma_dev->bar_addr[bar]; - if (!baseaddr) { - printf("Error: PCI BAR number:%u not mapped\n", bar); - return -1; - } - -#ifdef TANDEM_BOOT_SUPPORTED - val = *((volatile uint64_t *)(baseaddr + reg)); -#else - val = *((volatile uint32_t *)(baseaddr + reg)); -#endif - - return val; -} - -void qdma_pci_write_reg(struct rte_eth_dev *dev, uint32_t bar, - uint32_t reg, uint32_t val) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint64_t baseaddr; - - if (bar >= (QDMA_NUM_BARS - 1)) { - printf("Error: PCI BAR index:%u not supported\n" - "Please enter valid BAR index\n", bar); - return; - } - - baseaddr = (uint64_t)qdma_dev->bar_addr[bar]; - if (!baseaddr) { - printf("Error: PCI BAR number:%u not mapped\n", bar); - return; - } - -#ifdef TANDEM_BOOT_SUPPORTED - *((volatile uint64_t *)(baseaddr + reg)) = val; -#else - *((volatile uint32_t *)(baseaddr + reg)) = val; -#endif -} - -void qdma_reset_rx_queue(struct qdma_rx_queue *rxq) -{ - uint32_t i; - uint32_t sz; - - rxq->rx_tail = 0; - rxq->q_pidx_info.pidx = 0; - - /* Zero out HW ring memory, For MM Descriptor */ - if (rxq->st_mode) { /** if ST-mode **/ - sz = rxq->cmpt_desc_len; - for (i = 0; i < (sz * rxq->nb_rx_cmpt_desc); i++) - ((volatile char *)rxq->cmpt_ring)[i] = 0; - - sz = sizeof(struct qdma_ul_st_c2h_desc); - for (i = 0; i < (sz * rxq->nb_rx_desc); i++) - ((volatile char *)rxq->rx_ring)[i] = 0; - - } else { - sz = sizeof(struct qdma_ul_mm_desc); - for (i = 0; i < (sz * rxq->nb_rx_desc); i++) - ((volatile char *)rxq->rx_ring)[i] = 0; - } - - /* Initialize SW ring entries */ - for (i = 0; i < rxq->nb_rx_desc; i++) - rxq->sw_ring[i] = NULL; -} - -void qdma_inv_rx_queue_ctxts(struct rte_eth_dev *dev, - uint32_t qid, uint32_t mode) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_descq_sw_ctxt q_sw_ctxt; - struct qdma_descq_prefetch_ctxt q_prefetch_ctxt; - struct qdma_descq_cmpt_ctxt q_cmpt_ctxt; - struct qdma_descq_hw_ctxt q_hw_ctxt; - struct qdma_descq_credit_ctxt q_credit_ctxt; - struct qdma_hw_access *hw_access = qdma_dev->hw_access; - - hw_access->qdma_sw_ctx_conf(dev, 1, qid, &q_sw_ctxt, - QDMA_HW_ACCESS_INVALIDATE); - hw_access->qdma_hw_ctx_conf(dev, 1, qid, &q_hw_ctxt, - QDMA_HW_ACCESS_INVALIDATE); - if (mode) { /** ST-mode **/ - hw_access->qdma_pfetch_ctx_conf(dev, qid, - &q_prefetch_ctxt, QDMA_HW_ACCESS_INVALIDATE); - hw_access->qdma_cmpt_ctx_conf(dev, qid, - &q_cmpt_ctxt, QDMA_HW_ACCESS_INVALIDATE); - hw_access->qdma_credit_ctx_conf(dev, 1, qid, - &q_credit_ctxt, QDMA_HW_ACCESS_INVALIDATE); - } -} - -/** - * Clears the Rx queue contexts. - * - * @param dev - * Pointer to Ethernet device structure. - * - * @return - * Nothing. - */ -void qdma_clr_rx_queue_ctxts(struct rte_eth_dev *dev, - uint32_t qid, uint32_t mode) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_descq_prefetch_ctxt q_prefetch_ctxt; - struct qdma_descq_cmpt_ctxt q_cmpt_ctxt; - struct qdma_descq_hw_ctxt q_hw_ctxt; - struct qdma_descq_credit_ctxt q_credit_ctxt; - struct qdma_descq_sw_ctxt q_sw_ctxt; - struct qdma_hw_access *hw_access = qdma_dev->hw_access; - - hw_access->qdma_sw_ctx_conf(dev, 1, qid, &q_sw_ctxt, - QDMA_HW_ACCESS_CLEAR); - hw_access->qdma_hw_ctx_conf(dev, 1, qid, &q_hw_ctxt, - QDMA_HW_ACCESS_CLEAR); - if (mode) { /** ST-mode **/ - hw_access->qdma_pfetch_ctx_conf(dev, qid, - &q_prefetch_ctxt, QDMA_HW_ACCESS_CLEAR); - hw_access->qdma_cmpt_ctx_conf(dev, qid, - &q_cmpt_ctxt, QDMA_HW_ACCESS_CLEAR); - hw_access->qdma_credit_ctx_conf(dev, 1, qid, - &q_credit_ctxt, QDMA_HW_ACCESS_CLEAR); - } -} - -int qdma_init_rx_queue(struct qdma_rx_queue *rxq) -{ - struct rte_mbuf *mb; - void *obj = NULL; - uint64_t phys_addr; - uint16_t i; - struct qdma_ul_st_c2h_desc *rx_ring_st = NULL; - - /* allocate new buffers for the Rx descriptor ring */ - if (rxq->st_mode) { /** ST-mode **/ - rx_ring_st = (struct qdma_ul_st_c2h_desc *)rxq->rx_ring; -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(INFO, "%s(): %d: queue id %d, mbuf_avail_count =%d," - "mbuf_in_use_count = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); -#endif //DUMP_MEMPOOL_USAGE_STATS - for (i = 0; i < (rxq->nb_rx_desc - 2); i++) { - if (rte_mempool_get(rxq->mb_pool, &obj) != 0) { - PMD_DRV_LOG(ERR, "qdma-start-rx-queue(): " - "rte_mempool_get: failed"); - goto fail; - } - - if (obj != NULL) - mb = obj; - else { - PMD_DRV_LOG(ERR, "%s(): %d: qid %d, rte_mempool_get failed", - __func__, __LINE__, rxq->queue_id); - goto fail; - } - - phys_addr = (uint64_t)mb->buf_iova + - RTE_PKTMBUF_HEADROOM; - - mb->data_off = RTE_PKTMBUF_HEADROOM; - rxq->sw_ring[i] = mb; - rx_ring_st[i].dst_addr = phys_addr; - } -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(INFO, "%s(): %d: qid %d, mbuf_avail_count = %d," - "mbuf_in_use_count = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); -#endif //DUMP_MEMPOOL_USAGE_STATS - } - - /* initialize tail */ - rxq->rx_tail = 0; - - return 0; -fail: - return -ENOMEM; -} - -/* - * Tx queue reset - */ -void qdma_reset_tx_queue(struct qdma_tx_queue *txq) -{ - uint32_t i; - uint32_t sz; - - txq->tx_fl_tail = 0; - if (txq->st_mode) { /** ST-mode **/ - sz = sizeof(struct qdma_ul_st_h2c_desc); - /* Zero out HW ring memory */ - for (i = 0; i < (sz * (txq->nb_tx_desc)); i++) - ((volatile char *)txq->tx_ring)[i] = 0; - } else { - sz = sizeof(struct qdma_ul_mm_desc); - /* Zero out HW ring memory */ - for (i = 0; i < (sz * (txq->nb_tx_desc)); i++) - ((volatile char *)txq->tx_ring)[i] = 0; - } - - /* Initialize SW ring entries */ - for (i = 0; i < txq->nb_tx_desc; i++) - txq->sw_ring[i] = NULL; -} - -void qdma_inv_tx_queue_ctxts(struct rte_eth_dev *dev, - uint32_t qid, uint32_t mode) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_descq_sw_ctxt q_sw_ctxt; - struct qdma_descq_hw_ctxt q_hw_ctxt; - struct qdma_descq_credit_ctxt q_credit_ctxt; - struct qdma_hw_access *hw_access = qdma_dev->hw_access; - - hw_access->qdma_sw_ctx_conf(dev, 0, qid, &q_sw_ctxt, - QDMA_HW_ACCESS_INVALIDATE); - hw_access->qdma_hw_ctx_conf(dev, 0, qid, &q_hw_ctxt, - QDMA_HW_ACCESS_INVALIDATE); - - if (mode) { /** ST-mode **/ - hw_access->qdma_credit_ctx_conf(dev, 0, qid, - &q_credit_ctxt, QDMA_HW_ACCESS_INVALIDATE); - } -} - -/** - * Clear Tx queue contexts - * - * @param dev - * Pointer to Ethernet device structure. - * - * @return - * Nothing. - */ -void qdma_clr_tx_queue_ctxts(struct rte_eth_dev *dev, - uint32_t qid, uint32_t mode) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_descq_sw_ctxt q_sw_ctxt; - struct qdma_descq_credit_ctxt q_credit_ctxt; - struct qdma_descq_hw_ctxt q_hw_ctxt; - struct qdma_hw_access *hw_access = qdma_dev->hw_access; - - hw_access->qdma_sw_ctx_conf(dev, 0, qid, &q_sw_ctxt, - QDMA_HW_ACCESS_CLEAR); - hw_access->qdma_hw_ctx_conf(dev, 0, qid, &q_hw_ctxt, - QDMA_HW_ACCESS_CLEAR); - if (mode) { /** ST-mode **/ - hw_access->qdma_credit_ctx_conf(dev, 0, qid, - &q_credit_ctxt, QDMA_HW_ACCESS_CLEAR); - } -} - -/* Utility function to find index of an element in an array */ -int index_of_array(uint32_t *arr, uint32_t n, uint32_t element) -{ - int index = 0; - - for (index = 0; (uint32_t)index < n; index++) { - if (*(arr + index) == element) - return index; - } - return -1; -} - -static int pfetch_check_handler(__rte_unused const char *key, - const char *value, void *opaque) -{ - struct qdma_pci_dev *qdma_dev = (struct qdma_pci_dev *)opaque; - char *end = NULL; - uint8_t desc_prefetch; - - PMD_DRV_LOG(INFO, "QDMA devargs desc_prefetch is: %s\n", value); - desc_prefetch = (uint8_t)strtoul(value, &end, 10); - if (desc_prefetch > 1) { - PMD_DRV_LOG(INFO, "QDMA devargs prefetch should be 1 or 0," - " setting to 1.\n"); - } - qdma_dev->en_desc_prefetch = desc_prefetch ? 1 : 0; - return 0; -} - -static int cmpt_desc_len_check_handler(__rte_unused const char *key, - const char *value, void *opaque) -{ - struct qdma_pci_dev *qdma_dev = (struct qdma_pci_dev *)opaque; - char *end = NULL; - - PMD_DRV_LOG(INFO, "QDMA devargs cmpt_desc_len is: %s\n", value); - qdma_dev->cmpt_desc_len = (uint8_t)strtoul(value, &end, 10); - if (qdma_dev->cmpt_desc_len != RTE_PMD_QDMA_CMPT_DESC_LEN_8B && - qdma_dev->cmpt_desc_len != RTE_PMD_QDMA_CMPT_DESC_LEN_16B && - qdma_dev->cmpt_desc_len != RTE_PMD_QDMA_CMPT_DESC_LEN_32B && - (qdma_dev->cmpt_desc_len != RTE_PMD_QDMA_CMPT_DESC_LEN_64B || - !qdma_dev->dev_cap.cmpt_desc_64b)) { - PMD_DRV_LOG(INFO, "QDMA devargs incorrect cmpt_desc_len = %d " - "specified\n", - qdma_dev->cmpt_desc_len); - return -1; - } - - return 0; -} - -static int trigger_mode_handler(__rte_unused const char *key, - const char *value, void *opaque) -{ - struct qdma_pci_dev *qdma_dev = (struct qdma_pci_dev *)opaque; - char *end = NULL; - - PMD_DRV_LOG(INFO, "QDMA devargs trigger mode: %s\n", value); - qdma_dev->trigger_mode = (uint8_t)strtoul(value, &end, 10); - - if (qdma_dev->trigger_mode >= RTE_PMD_QDMA_TRIG_MODE_MAX) { - qdma_dev->trigger_mode = RTE_PMD_QDMA_TRIG_MODE_MAX; - PMD_DRV_LOG(INFO, "QDMA devargs trigger mode invalid," - "reset to default: %d\n", - qdma_dev->trigger_mode); - } - return 0; -} - -static int config_bar_idx_handler(__rte_unused const char *key, - const char *value, void *opaque) -{ - struct qdma_pci_dev *qdma_dev = (struct qdma_pci_dev *)opaque; - char *end = NULL; - - PMD_DRV_LOG(INFO, "QDMA devargs trigger mode: %s\n", value); - qdma_dev->config_bar_idx = (int)strtoul(value, &end, 10); - - if (qdma_dev->config_bar_idx >= QDMA_NUM_BARS || - qdma_dev->config_bar_idx < 0) { - PMD_DRV_LOG(INFO, "QDMA devargs config bar idx invalid: %d\n", - qdma_dev->config_bar_idx); - return -1; - } - return 0; -} - -static int c2h_byp_mode_check_handler(__rte_unused const char *key, - const char *value, void *opaque) -{ - struct qdma_pci_dev *qdma_dev = (struct qdma_pci_dev *)opaque; - char *end = NULL; - - PMD_DRV_LOG(INFO, "QDMA devargs c2h_byp_mode is: %s\n", value); - qdma_dev->c2h_bypass_mode = (uint8_t)strtoul(value, &end, 10); - - if (qdma_dev->c2h_bypass_mode >= RTE_PMD_QDMA_RX_BYPASS_MAX) { - PMD_DRV_LOG(INFO, "QDMA devargs incorrect " - "c2h_byp_mode= %d specified\n", - qdma_dev->c2h_bypass_mode); - return -1; - } - - return 0; -} - -static int h2c_byp_mode_check_handler(__rte_unused const char *key, - const char *value, void *opaque) -{ - struct qdma_pci_dev *qdma_dev = (struct qdma_pci_dev *)opaque; - char *end = NULL; - - PMD_DRV_LOG(INFO, "QDMA devargs h2c_byp_mode is: %s\n", value); - qdma_dev->h2c_bypass_mode = (uint8_t)strtoul(value, &end, 10); - - if (qdma_dev->h2c_bypass_mode > 1) { - PMD_DRV_LOG(INFO, "QDMA devargs incorrect" - " h2c_byp_mode =%d specified\n", - qdma_dev->h2c_bypass_mode); - return -1; - } - - return 0; -} -#ifdef TANDEM_BOOT_SUPPORTED -static int en_st_mode_check_handler(__rte_unused const char *key, - const char *value, void *opaque) -{ - struct qdma_pci_dev *qdma_dev = (struct qdma_pci_dev *)opaque; - char *end = NULL; - - PMD_DRV_LOG(INFO, "QDMA devargs en_st is: %s\n", value); - qdma_dev->en_st_mode = (uint8_t)strtoul(value, &end, 10); - - if (qdma_dev->en_st_mode > 1) { - PMD_DRV_LOG(INFO, "QDMA devargs incorrect" - " en_st_mode =%d specified\n", - qdma_dev->en_st_mode); - return -1; - } - - return 0; -} -#endif -/* Process the all devargs */ -int qdma_check_kvargs(struct rte_devargs *devargs, - struct qdma_pci_dev *qdma_dev) -{ - struct rte_kvargs *kvlist; - const char *pfetch_key = "desc_prefetch"; - const char *cmpt_desc_len_key = "cmpt_desc_len"; - const char *trigger_mode_key = "trigger_mode"; - const char *config_bar_key = "config_bar"; - const char *c2h_byp_mode_key = "c2h_byp_mode"; - const char *h2c_byp_mode_key = "h2c_byp_mode"; -#ifdef TANDEM_BOOT_SUPPORTED - const char *en_st_key = "en_st"; -#endif - int ret = 0; - - if (!devargs) - return 0; - - kvlist = rte_kvargs_parse(devargs->args, NULL); - if (!kvlist) - return 0; - - /* process the desc_prefetch*/ - if (rte_kvargs_count(kvlist, pfetch_key)) { - ret = rte_kvargs_process(kvlist, pfetch_key, - pfetch_check_handler, qdma_dev); - if (ret) { - rte_kvargs_free(kvlist); - return ret; - } - } - - /* process the cmpt_desc_len*/ - if (rte_kvargs_count(kvlist, cmpt_desc_len_key)) { - ret = rte_kvargs_process(kvlist, cmpt_desc_len_key, - cmpt_desc_len_check_handler, qdma_dev); - if (ret) { - rte_kvargs_free(kvlist); - return ret; - } - } - - /* process the trigger_mode*/ - if (rte_kvargs_count(kvlist, trigger_mode_key)) { - ret = rte_kvargs_process(kvlist, trigger_mode_key, - trigger_mode_handler, qdma_dev); - if (ret) { - rte_kvargs_free(kvlist); - return ret; - } - } - - /* process the config bar*/ - if (rte_kvargs_count(kvlist, config_bar_key)) { - ret = rte_kvargs_process(kvlist, config_bar_key, - config_bar_idx_handler, qdma_dev); - if (ret) { - rte_kvargs_free(kvlist); - return ret; - } - } - - /* process c2h_byp_mode*/ - if (rte_kvargs_count(kvlist, c2h_byp_mode_key)) { - ret = rte_kvargs_process(kvlist, c2h_byp_mode_key, - c2h_byp_mode_check_handler, qdma_dev); - if (ret) { - rte_kvargs_free(kvlist); - return ret; - } - } - - /* process h2c_byp_mode*/ - if (rte_kvargs_count(kvlist, h2c_byp_mode_key)) { - ret = rte_kvargs_process(kvlist, h2c_byp_mode_key, - h2c_byp_mode_check_handler, qdma_dev); - if (ret) { - rte_kvargs_free(kvlist); - return ret; - } - } - -#ifdef TANDEM_BOOT_SUPPORTED - /* Enable ST */ - if (rte_kvargs_count(kvlist, en_st_key)) { - ret = rte_kvargs_process(kvlist, en_st_key, - en_st_mode_check_handler, qdma_dev); - if (ret) { - rte_kvargs_free(kvlist); - return ret; - } - } -#endif - - rte_kvargs_free(kvlist); - return ret; -} - -int qdma_identify_bars(struct rte_eth_dev *dev) -{ - int bar_len, i, ret; - uint8_t usr_bar; - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - struct qdma_pci_dev *dma_priv; - - dma_priv = (struct qdma_pci_dev *)dev->data->dev_private; - - /* Config bar */ - bar_len = pci_dev->mem_resource[dma_priv->config_bar_idx].len; - if (!bar_len) { - PMD_DRV_LOG(INFO, "QDMA config BAR index :%d is not enabled", - dma_priv->config_bar_idx); - return -1; - } - - /* Find AXI Master Lite(user bar) */ - ret = dma_priv->hw_access->qdma_get_user_bar(dev, - dma_priv->is_vf, dma_priv->func_id, &usr_bar); - if ((ret != QDMA_SUCCESS) || - (pci_dev->mem_resource[usr_bar].len == 0)) { - if (dma_priv->ip_type == QDMA_VERSAL_HARD_IP) { - if (pci_dev->mem_resource[1].len == 0) - dma_priv->user_bar_idx = 2; - else - dma_priv->user_bar_idx = 1; - } else { - dma_priv->user_bar_idx = -1; - PMD_DRV_LOG(INFO, "Cannot find AXI Master Lite BAR"); - } - } else - dma_priv->user_bar_idx = usr_bar; - - /* Find AXI Bridge Master bar(bypass bar) */ - for (i = 0; i < QDMA_NUM_BARS; i++) { - bar_len = pci_dev->mem_resource[i].len; - if (!bar_len) /* Bar not enabled ? */ - continue; - if (dma_priv->user_bar_idx != i && - dma_priv->config_bar_idx != i) { - dma_priv->bypass_bar_idx = i; - break; - } - } - - PMD_DRV_LOG(INFO, "QDMA config bar idx :%d\n", - dma_priv->config_bar_idx); - PMD_DRV_LOG(INFO, "QDMA AXI Master Lite bar idx :%d\n", - dma_priv->user_bar_idx); - PMD_DRV_LOG(INFO, "QDMA AXI Bridge Master bar idx :%d\n", - dma_priv->bypass_bar_idx); - - return 0; -} -int qdma_get_hw_version(struct rte_eth_dev *dev) -{ - int ret; - struct qdma_pci_dev *dma_priv; - struct qdma_hw_version_info version_info; - - dma_priv = (struct qdma_pci_dev *)dev->data->dev_private; - ret = dma_priv->hw_access->qdma_get_version(dev, - dma_priv->is_vf, &version_info); - if (ret < 0) - return dma_priv->hw_access->qdma_get_error_code(ret); - - dma_priv->rtl_version = version_info.rtl_version; - dma_priv->vivado_rel = version_info.vivado_release; - dma_priv->device_type = version_info.device_type; - dma_priv->ip_type = version_info.ip_type; - - PMD_DRV_LOG(INFO, "QDMA RTL VERSION : %s\n", - version_info.qdma_rtl_version_str); - PMD_DRV_LOG(INFO, "QDMA DEVICE TYPE : %s\n", - version_info.qdma_device_type_str); - PMD_DRV_LOG(INFO, "QDMA VIVADO RELEASE ID : %s\n", - version_info.qdma_vivado_release_id_str); - if (version_info.ip_type == QDMA_VERSAL_HARD_IP) { - PMD_DRV_LOG(INFO, "QDMA VERSAL IP TYPE : %s\n", - version_info.qdma_ip_type_str); - } - - return 0; -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_devops.c b/QDMA/DPDK/drivers/net/qdma/qdma_devops.c deleted file mode 100755 index 45c9b4f..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_devops.c +++ /dev/null @@ -1,1984 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdint.h> -#include <sys/mman.h> -#include <sys/fcntl.h> -#include <rte_memzone.h> -#include <rte_string_fns.h> -#include <rte_malloc.h> -#include <rte_dev.h> -#include <rte_pci.h> -#include <rte_ether.h> -#include <rte_ethdev.h> -#include <rte_alarm.h> -#include <rte_cycles.h> -#include <rte_atomic.h> -#include <unistd.h> -#include <string.h> -#include "qdma.h" -#include "qdma_access_common.h" -#include "qdma_mbox_protocol.h" -#include "qdma_mbox.h" -#include "qdma_reg_dump.h" -#include "qdma_platform.h" -#include "qdma_devops.h" - -#ifdef QDMA_LATENCY_OPTIMIZED -static void qdma_sort_c2h_cntr_th_values(struct qdma_pci_dev *qdma_dev) -{ - uint8_t i, idx = 0, j = 0; - uint8_t c2h_cntr_val = qdma_dev->g_c2h_cnt_th[0]; - uint8_t least_max = 0; - int ref_idx = -1; - -get_next_idx: - for (i = 0; i < QDMA_NUM_C2H_COUNTERS; i++) { - if ((ref_idx >= 0) && (ref_idx == i)) - continue; - if (qdma_dev->g_c2h_cnt_th[i] < least_max) - continue; - c2h_cntr_val = qdma_dev->g_c2h_cnt_th[i]; - idx = i; - break; - } - for (; i < QDMA_NUM_C2H_COUNTERS; i++) { - if ((ref_idx >= 0) && (ref_idx == i)) - continue; - if (qdma_dev->g_c2h_cnt_th[i] < least_max) - continue; - if (c2h_cntr_val >= qdma_dev->g_c2h_cnt_th[i]) { - c2h_cntr_val = qdma_dev->g_c2h_cnt_th[i]; - idx = i; - } - } - qdma_dev->sorted_idx_c2h_cnt_th[j] = idx; - ref_idx = idx; - j++; - idx = j; - least_max = c2h_cntr_val; - if (j < QDMA_NUM_C2H_COUNTERS) - goto get_next_idx; -} -#endif //QDMA_LATENCY_OPTIMIZED - -int qdma_vf_csr_read(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - int rv, i; - struct qdma_csr_info csr_info; - - if (!m) - return -ENOMEM; - - qdma_mbox_compose_csr_read(qdma_dev->func_id, m->raw_data); - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) - goto free_msg; - - rv = qdma_mbox_vf_csr_get(m->raw_data, &csr_info); - if (rv < 0) - goto free_msg; - for (i = 0; i < QDMA_NUM_RING_SIZES; i++) { - qdma_dev->g_ring_sz[i] = (uint32_t)csr_info.ringsz[i]; - qdma_dev->g_c2h_buf_sz[i] = (uint32_t)csr_info.bufsz[i]; - qdma_dev->g_c2h_timer_cnt[i] = (uint32_t)csr_info.timer_cnt[i]; - qdma_dev->g_c2h_cnt_th[i] = (uint32_t)csr_info.cnt_thres[i]; -#ifdef QDMA_LATENCY_OPTIMIZED - qdma_sort_c2h_cntr_th_values(qdma_dev); -#endif //QDMA_LATENCY_OPTIMIZED - } - - -free_msg: - qdma_mbox_msg_free(m); - return rv; -} - -int qdma_pf_csr_read(struct rte_eth_dev *dev) -{ - int ret = 0; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_hw_access *hw_access = qdma_dev->hw_access; - - ret = hw_access->qdma_global_csr_conf(dev, 0, - QDMA_NUM_RING_SIZES, qdma_dev->g_ring_sz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ); - if (ret != QDMA_SUCCESS) - PMD_DRV_LOG(ERR, "qdma_global_csr_conf for ring size " - "returned %d", ret); - if (qdma_dev->dev_cap.st_en || qdma_dev->dev_cap.mm_cmpt_en) { - ret = hw_access->qdma_global_csr_conf(dev, 0, - QDMA_NUM_C2H_TIMERS, qdma_dev->g_c2h_timer_cnt, - QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_READ); - if (ret != QDMA_SUCCESS) - PMD_DRV_LOG(ERR, "qdma_global_csr_conf for timer count " - "returned %d", ret); - - ret = hw_access->qdma_global_csr_conf(dev, 0, - QDMA_NUM_C2H_COUNTERS, qdma_dev->g_c2h_cnt_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_READ); - if (ret != QDMA_SUCCESS) - PMD_DRV_LOG(ERR, "qdma_global_csr_conf for counter threshold " - "returned %d", ret); -#ifdef QDMA_LATENCY_OPTIMIZED - qdma_sort_c2h_cntr_th_values(qdma_dev); -#endif //QDMA_LATENCY_OPTIMIZED - } - - if (qdma_dev->dev_cap.st_en) { - ret = hw_access->qdma_global_csr_conf(dev, 0, - QDMA_NUM_C2H_BUFFER_SIZES, - qdma_dev->g_c2h_buf_sz, - QDMA_CSR_BUF_SZ, - QDMA_HW_ACCESS_READ); - if (ret != QDMA_SUCCESS) - PMD_DRV_LOG(ERR, "qdma_global_csr_conf for buffer sizes " - "returned %d", ret); - } - - if (ret < 0) - return qdma_dev->hw_access->qdma_get_error_code(ret); - - return ret; -} - -static int qdma_pf_fmap_prog(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_fmap_cfg fmap_cfg; - int ret = 0; - - memset(&fmap_cfg, 0, sizeof(struct qdma_fmap_cfg)); - - /** FMAP configuration **/ - fmap_cfg.qbase = qdma_dev->queue_base; - fmap_cfg.qmax = qdma_dev->qsets_en; - ret = qdma_dev->hw_access->qdma_fmap_conf(dev, - qdma_dev->func_id, &fmap_cfg, QDMA_HW_ACCESS_WRITE); - if (ret < 0) - return qdma_dev->hw_access->qdma_get_error_code(ret); - - return ret; -} - -int qdma_dev_notify_qadd(struct rte_eth_dev *dev, uint32_t qidx_hw, - enum qdma_dev_q_type q_type) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m; - int rv = 0; - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_notify_qadd(qdma_dev->func_id, qidx_hw, - q_type, m->raw_data); - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - - qdma_mbox_msg_free(m); - return rv; -} - -int qdma_dev_notify_qdel(struct rte_eth_dev *dev, uint32_t qidx_hw, - enum qdma_dev_q_type q_type) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m; - int rv = 0; - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_notify_qdel(qdma_dev->func_id, qidx_hw, - q_type, m->raw_data); - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - - qdma_mbox_msg_free(m); - return rv; -} - -uint8_t qmda_get_desc_sz_idx(enum rte_pmd_qdma_bypass_desc_len size) -{ - return ((size == RTE_PMD_QDMA_BYPASS_DESC_LEN_64B) ? 3 : - (size == RTE_PMD_QDMA_BYPASS_DESC_LEN_32B) ? 2 : - (size == RTE_PMD_QDMA_BYPASS_DESC_LEN_16B) ? 1 : - /* (size == RTE_PMD_QDMA_BYPASS_DESC_LEN_8B) */0); -} - -static inline int -qdma_rxq_default_mbuf_init(struct qdma_rx_queue *rxq) -{ - uintptr_t p; - struct rte_mbuf mb = { .buf_addr = 0 }; - - mb.nb_segs = 1; - mb.data_off = RTE_PKTMBUF_HEADROOM; - mb.port = rxq->port_id; - rte_mbuf_refcnt_set(&mb, 1); - - /* prevent compiler reordering */ - rte_compiler_barrier(); - p = (uintptr_t)&mb.rearm_data; - rxq->mbuf_initializer = *(uint64_t *)p; - return 0; -} - -/** - * DPDK callback to configure a RX queue. - * - * @param dev - * Pointer to Ethernet device structure. - * @param rx_queue_id - * RX queue index. - * @param nb_rx_desc - * Number of descriptors to configure in queue. - * @param socket_id - * NUMA socket on which memory must be allocated. - * @param[in] rx_conf - * Thresholds parameters. - * @param mp_pool - * Memory pool for buffer allocations. - * - * @return - * 0 on success, - * -ENOMEM when memory allocation fails - * -ENOTSUP when HW doesn't support the required configuration - * -EINVAL on other failure. - */ -int qdma_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, - uint16_t nb_rx_desc, unsigned int socket_id, - const struct rte_eth_rxconf *rx_conf, - struct rte_mempool *mb_pool) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_rx_queue *rxq = NULL; - struct qdma_ul_mm_desc *rx_ring_mm; - uint32_t sz; - uint8_t *rx_ring_bypass; - int err = 0; - - PMD_DRV_LOG(INFO, "Configuring Rx queue id:%d\n", rx_queue_id); - - if (nb_rx_desc == 0) { - PMD_DRV_LOG(ERR, "Invalid descriptor ring size %d\n", - nb_rx_desc); - return -EINVAL; - } - - if (!qdma_dev->dev_configured) { - PMD_DRV_LOG(ERR, - "Device for Rx queue id %d is not configured yet\n", - rx_queue_id); - return -EINVAL; - } - - if (!qdma_dev->is_vf) { - err = qdma_dev_increment_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_C2H); - if (err != QDMA_SUCCESS) - return -EINVAL; - - if (qdma_dev->q_info[rx_queue_id].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) { - err = qdma_dev_increment_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_CMPT); - if (err != QDMA_SUCCESS) { - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_C2H); - return -EINVAL; - } - } - } else { - err = qdma_dev_notify_qadd(dev, rx_queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_C2H); - if (err < 0) - return -EINVAL; - - if (qdma_dev->q_info[rx_queue_id].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) { - err = qdma_dev_notify_qadd(dev, rx_queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_CMPT); - if (err < 0) { - qdma_dev_notify_qdel(dev, rx_queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_C2H); - return -EINVAL; - } - } - } - if (!qdma_dev->init_q_range) { - if (qdma_dev->is_vf) { - err = qdma_vf_csr_read(dev); - if (err < 0) - goto rx_setup_err; - } else { - err = qdma_pf_csr_read(dev); - if (err < 0) - goto rx_setup_err; - } - qdma_dev->init_q_range = 1; - } - - /* allocate rx queue data structure */ - rxq = rte_zmalloc_socket("QDMA_RxQ", sizeof(struct qdma_rx_queue), - RTE_CACHE_LINE_SIZE, socket_id); - if (!rxq) { - PMD_DRV_LOG(ERR, "Unable to allocate structure rxq of " - "size %d\n", - (int)(sizeof(struct qdma_rx_queue))); - err = -ENOMEM; - goto rx_setup_err; - } - - rxq->queue_id = rx_queue_id; - rxq->port_id = dev->data->port_id; - rxq->func_id = qdma_dev->func_id; - rxq->mb_pool = mb_pool; - rxq->dev = dev; - rxq->st_mode = qdma_dev->q_info[rx_queue_id].queue_mode; - - rxq->nb_rx_desc = (nb_rx_desc + 1); - /* <= 2018.2 IP - * double the cmpl ring size to avoid run out of cmpl entry while - * desc. ring still have free entries - */ - rxq->nb_rx_cmpt_desc = ((nb_rx_desc * 2) + 1); - rxq->en_prefetch = qdma_dev->q_info[rx_queue_id].en_prefetch; - rxq->cmpt_desc_len = qdma_dev->q_info[rx_queue_id].cmpt_desc_sz; - if ((rxq->cmpt_desc_len == RTE_PMD_QDMA_CMPT_DESC_LEN_64B) && - !qdma_dev->dev_cap.cmpt_desc_64b) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) 64B completion entry size is " - "not supported in this design\n", qdma_dev->func_id); - return -ENOTSUP; - } - rxq->triggermode = qdma_dev->q_info[rx_queue_id].trigger_mode; - rxq->rx_deferred_start = rx_conf->rx_deferred_start; - rxq->dump_immediate_data = - qdma_dev->q_info[rx_queue_id].immediate_data_state; - rxq->dis_overflow_check = - qdma_dev->q_info[rx_queue_id].dis_cmpt_ovf_chk; - - if (qdma_dev->q_info[rx_queue_id].rx_bypass_mode == - RTE_PMD_QDMA_RX_BYPASS_CACHE || - qdma_dev->q_info[rx_queue_id].rx_bypass_mode == - RTE_PMD_QDMA_RX_BYPASS_SIMPLE) - rxq->en_bypass = 1; - if (qdma_dev->q_info[rx_queue_id].rx_bypass_mode == - RTE_PMD_QDMA_RX_BYPASS_SIMPLE) - rxq->en_bypass_prefetch = 1; - - if (qdma_dev->ip_type == EQDMA_SOFT_IP && - qdma_dev->vivado_rel >= QDMA_VIVADO_2020_2) { - if (qdma_dev->dev_cap.desc_eng_mode == - QDMA_DESC_ENG_BYPASS_ONLY) { - PMD_DRV_LOG(ERR, - "Bypass only mode design " - "is not supported\n"); - return -ENOTSUP; - } - - if (rxq->en_bypass && - (qdma_dev->dev_cap.desc_eng_mode == - QDMA_DESC_ENG_INTERNAL_ONLY)) { - PMD_DRV_LOG(ERR, - "Rx qid %d config in bypass " - "mode not supported on " - "internal only mode design\n", - rx_queue_id); - return -ENOTSUP; - } - } - - if (rxq->en_bypass) { - rxq->bypass_desc_sz = - qdma_dev->q_info[rx_queue_id].rx_bypass_desc_sz; - if ((rxq->bypass_desc_sz == RTE_PMD_QDMA_BYPASS_DESC_LEN_64B) - && !qdma_dev->dev_cap.sw_desc_64b) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) C2H bypass descriptor " - "size of 64B is not supported in this design:\n", - qdma_dev->func_id); - return -ENOTSUP; - } - } - /* Calculate the ring index, completion queue ring size, - * buffer index and threshold index. - * If index is not found , by default use the index as 0 - */ - - /* Find C2H queue ring size index */ - rxq->ringszidx = index_of_array(qdma_dev->g_ring_sz, - QDMA_NUM_RING_SIZES, rxq->nb_rx_desc); - if (rxq->ringszidx < 0) { - PMD_DRV_LOG(ERR, "Expected Ring size %d not found\n", - rxq->nb_rx_desc); - err = -EINVAL; - goto rx_setup_err; - } - - /* Find completion ring size index */ - rxq->cmpt_ringszidx = index_of_array(qdma_dev->g_ring_sz, - QDMA_NUM_RING_SIZES, - rxq->nb_rx_cmpt_desc); - if (rxq->cmpt_ringszidx < 0) { - PMD_DRV_LOG(ERR, "Expected completion ring size %d not found\n", - rxq->nb_rx_cmpt_desc); - err = -EINVAL; - goto rx_setup_err; - } - - /* Find Threshold index */ - rxq->threshidx = index_of_array(qdma_dev->g_c2h_cnt_th, - QDMA_NUM_C2H_COUNTERS, - rx_conf->rx_thresh.wthresh); - if (rxq->threshidx < 0) { - PMD_DRV_LOG(WARNING, "Expected Threshold %d not found," - " using the value %d at index 7\n", - rx_conf->rx_thresh.wthresh, - qdma_dev->g_c2h_cnt_th[7]); - rxq->threshidx = 7; - } - -#ifdef QDMA_LATENCY_OPTIMIZED - uint8_t next_idx; - - /* Initialize sorted_c2h_cntr_idx */ - rxq->sorted_c2h_cntr_idx = index_of_array( - qdma_dev->sorted_idx_c2h_cnt_th, - QDMA_NUM_C2H_COUNTERS, - qdma_dev->g_c2h_cnt_th[rxq->threshidx]); - - if (rxq->sorted_c2h_cntr_idx < 0) { - PMD_DRV_LOG(ERR, - "Expected counter threshold %d not found\n", - qdma_dev->g_c2h_cnt_th[rxq->threshidx]); - err = -EINVAL; - goto rx_setup_err; - } - - /* Initialize pend_pkt_moving_avg */ - rxq->pend_pkt_moving_avg = qdma_dev->g_c2h_cnt_th[rxq->threshidx]; - - /* Initialize pend_pkt_avg_thr_hi */ - if (rxq->sorted_c2h_cntr_idx < (QDMA_NUM_C2H_COUNTERS - 1)) - next_idx = qdma_dev->sorted_idx_c2h_cnt_th[ - rxq->sorted_c2h_cntr_idx + 1]; - else - next_idx = qdma_dev->sorted_idx_c2h_cnt_th[ - rxq->sorted_c2h_cntr_idx]; - - rxq->pend_pkt_avg_thr_hi = qdma_dev->g_c2h_cnt_th[next_idx]; - - /* Initialize pend_pkt_avg_thr_lo */ - if (rxq->sorted_c2h_cntr_idx > 0) - next_idx = qdma_dev->sorted_idx_c2h_cnt_th[ - rxq->sorted_c2h_cntr_idx - 1]; - else - next_idx = qdma_dev->sorted_idx_c2h_cnt_th[ - rxq->sorted_c2h_cntr_idx]; - - rxq->pend_pkt_avg_thr_lo = qdma_dev->g_c2h_cnt_th[next_idx]; -#endif //QDMA_LATENCY_OPTIMIZED - - /* Find Timer index */ - rxq->timeridx = index_of_array(qdma_dev->g_c2h_timer_cnt, - QDMA_NUM_C2H_TIMERS, - qdma_dev->q_info[rx_queue_id].timer_count); - if (rxq->timeridx < 0) { - PMD_DRV_LOG(WARNING, "Expected timer %d not found, " - "using the value %d at index 1\n", - qdma_dev->q_info[rx_queue_id].timer_count, - qdma_dev->g_c2h_timer_cnt[1]); - rxq->timeridx = 1; - } - - rxq->rx_buff_size = (uint16_t) - (rte_pktmbuf_data_room_size(rxq->mb_pool) - - RTE_PKTMBUF_HEADROOM); - /* Allocate memory for Rx descriptor ring */ - if (rxq->st_mode) { - if (!qdma_dev->dev_cap.st_en) { - PMD_DRV_LOG(ERR, "Streaming mode not enabled " - "in the hardware\n"); - err = -EINVAL; - goto rx_setup_err; - } - /* Find Buffer size index */ - rxq->buffszidx = index_of_array(qdma_dev->g_c2h_buf_sz, - QDMA_NUM_C2H_BUFFER_SIZES, - rxq->rx_buff_size); - if (rxq->buffszidx < 0) { - PMD_DRV_LOG(ERR, "Expected buffer size %d not found\n", - rxq->rx_buff_size); - err = -EINVAL; - goto rx_setup_err; - } - - if (rxq->en_bypass && - (rxq->bypass_desc_sz != 0)) - sz = (rxq->nb_rx_desc) * (rxq->bypass_desc_sz); - else - sz = (rxq->nb_rx_desc) * - sizeof(struct qdma_ul_st_c2h_desc); - - rxq->rx_mz = qdma_zone_reserve(dev, "RxHwRn", rx_queue_id, - sz, socket_id); - if (!rxq->rx_mz) { - PMD_DRV_LOG(ERR, "Unable to allocate rxq->rx_mz " - "of size %d\n", sz); - err = -ENOMEM; - goto rx_setup_err; - } - rxq->rx_ring = rxq->rx_mz->addr; - memset(rxq->rx_ring, 0, sz); - - /* Allocate memory for Rx completion(CMPT) descriptor ring */ - sz = (rxq->nb_rx_cmpt_desc) * rxq->cmpt_desc_len; - rxq->rx_cmpt_mz = qdma_zone_reserve(dev, "RxHwCmptRn", - rx_queue_id, sz, socket_id); - if (!rxq->rx_cmpt_mz) { - PMD_DRV_LOG(ERR, "Unable to allocate rxq->rx_cmpt_mz " - "of size %d\n", sz); - err = -ENOMEM; - goto rx_setup_err; - } - rxq->cmpt_ring = - (union qdma_ul_st_cmpt_ring *)rxq->rx_cmpt_mz->addr; - - /* Write-back status structure */ - rxq->wb_status = (struct wb_status *)((uint64_t)rxq->cmpt_ring + - (((uint64_t)rxq->nb_rx_cmpt_desc - 1) * - rxq->cmpt_desc_len)); - memset(rxq->cmpt_ring, 0, sz); - } else { - if (!qdma_dev->dev_cap.mm_en) { - PMD_DRV_LOG(ERR, "Memory mapped mode not enabled " - "in the hardware\n"); - err = -EINVAL; - goto rx_setup_err; - } - - if (rxq->en_bypass && - (rxq->bypass_desc_sz != 0)) - sz = (rxq->nb_rx_desc) * (rxq->bypass_desc_sz); - else - sz = (rxq->nb_rx_desc) * sizeof(struct qdma_ul_mm_desc); - rxq->rx_mz = qdma_zone_reserve(dev, "RxHwRn", - rx_queue_id, sz, socket_id); - if (!rxq->rx_mz) { - PMD_DRV_LOG(ERR, "Unable to allocate rxq->rx_mz " - "of size %d\n", sz); - err = -ENOMEM; - goto rx_setup_err; - } - rxq->rx_ring = rxq->rx_mz->addr; - rx_ring_mm = (struct qdma_ul_mm_desc *)rxq->rx_mz->addr; - memset(rxq->rx_ring, 0, sz); - - rx_ring_bypass = (uint8_t *)rxq->rx_mz->addr; - if (rxq->en_bypass && - (rxq->bypass_desc_sz != 0)) - rxq->wb_status = (struct wb_status *)& - (rx_ring_bypass[(rxq->nb_rx_desc - 1) * - (rxq->bypass_desc_sz)]); - else - rxq->wb_status = (struct wb_status *)& - (rx_ring_mm[rxq->nb_rx_desc - 1]); - } - - /* allocate memory for RX software ring */ - sz = (rxq->nb_rx_desc) * sizeof(struct rte_mbuf *); - rxq->sw_ring = rte_zmalloc_socket("RxSwRn", sz, - RTE_CACHE_LINE_SIZE, socket_id); - if (!rxq->sw_ring) { - PMD_DRV_LOG(ERR, "Unable to allocate rxq->sw_ring of size %d\n", - sz); - err = -ENOMEM; - goto rx_setup_err; - } - - qdma_rxq_default_mbuf_init(rxq); - - dev->data->rx_queues[rx_queue_id] = rxq; - -#ifdef LATENCY_MEASUREMENT - err = qdma_rx_qstats_clear(dev, rx_queue_id); - if (err) { - PMD_DRV_LOG(ERR, - "Failed to clear QDMA Rx queue stats for qid: %d\n", - rx_queue_id); - return err; - } -#endif - - return 0; - -rx_setup_err: - if (!qdma_dev->is_vf) { - qdma_dev_decrement_active_queue(qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_C2H); - - if (qdma_dev->q_info[rx_queue_id].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_CMPT); - } else { - qdma_dev_notify_qdel(dev, rx_queue_id + - qdma_dev->queue_base, QDMA_DEV_Q_TYPE_C2H); - - if (qdma_dev->q_info[rx_queue_id].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) - qdma_dev_notify_qdel(dev, rx_queue_id + - qdma_dev->queue_base, QDMA_DEV_Q_TYPE_CMPT); - } - - if (rxq) { - if (rxq->rx_mz) - rte_memzone_free(rxq->rx_mz); - if (rxq->sw_ring) - rte_free(rxq->sw_ring); - rte_free(rxq); - } - return err; -} - -/** - * DPDK callback to configure a TX queue. - * - * @param dev - * Pointer to Ethernet device structure. - * @param tx_queue_id - * TX queue index. - * @param nb_tx_desc - * Number of descriptors to configure in queue. - * @param socket_id - * NUMA socket on which memory must be allocated. - * @param[in] tx_conf - * Thresholds parameters. - * - * @return - * 0 on success - * -ENOMEM when memory allocation fails - * -EINVAL on other failure. - */ -int qdma_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, - uint16_t nb_tx_desc, unsigned int socket_id, - const struct rte_eth_txconf *tx_conf) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_tx_queue *txq = NULL; - struct qdma_ul_mm_desc *tx_ring_mm; - struct qdma_ul_st_h2c_desc *tx_ring_st; - uint32_t sz; - uint8_t *tx_ring_bypass; - int err = 0; - - PMD_DRV_LOG(INFO, "Configuring Tx queue id:%d with %d desc\n", - tx_queue_id, nb_tx_desc); - - if (!qdma_dev->is_vf) { - err = qdma_dev_increment_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_H2C); - if (err != QDMA_SUCCESS) - return -EINVAL; - } else { - err = qdma_dev_notify_qadd(dev, tx_queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_H2C); - if (err < 0) - return -EINVAL; - } - if (!qdma_dev->init_q_range) { - if (qdma_dev->is_vf) { - err = qdma_vf_csr_read(dev); - if (err < 0) { - PMD_DRV_LOG(ERR, "CSR read failed\n"); - goto tx_setup_err; - } - } else { - err = qdma_pf_csr_read(dev); - if (err < 0) { - PMD_DRV_LOG(ERR, "CSR read failed\n"); - goto tx_setup_err; - } - } - qdma_dev->init_q_range = 1; - } - /* allocate rx queue data structure */ - txq = rte_zmalloc_socket("QDMA_TxQ", sizeof(struct qdma_tx_queue), - RTE_CACHE_LINE_SIZE, socket_id); - if (txq == NULL) { - PMD_DRV_LOG(ERR, "Memory allocation failed for " - "Tx queue SW structure\n"); - err = -ENOMEM; - goto tx_setup_err; - } - - txq->st_mode = qdma_dev->q_info[tx_queue_id].queue_mode; - - txq->en_bypass = (qdma_dev->q_info[tx_queue_id].tx_bypass_mode) ? 1 : 0; - txq->bypass_desc_sz = qdma_dev->q_info[tx_queue_id].tx_bypass_desc_sz; - - txq->nb_tx_desc = (nb_tx_desc + 1); - txq->queue_id = tx_queue_id; - txq->dev = dev; - txq->port_id = dev->data->port_id; - txq->func_id = qdma_dev->func_id; - txq->num_queues = dev->data->nb_tx_queues; - txq->tx_deferred_start = tx_conf->tx_deferred_start; - - txq->ringszidx = index_of_array(qdma_dev->g_ring_sz, - QDMA_NUM_RING_SIZES, txq->nb_tx_desc); - if (txq->ringszidx < 0) { - PMD_DRV_LOG(ERR, "Expected Ring size %d not found\n", - txq->nb_tx_desc); - err = -EINVAL; - goto tx_setup_err; - } - - if (qdma_dev->ip_type == EQDMA_SOFT_IP && - qdma_dev->vivado_rel >= QDMA_VIVADO_2020_2) { - if (qdma_dev->dev_cap.desc_eng_mode == - QDMA_DESC_ENG_BYPASS_ONLY) { - PMD_DRV_LOG(ERR, - "Bypass only mode design " - "is not supported\n"); - return -ENOTSUP; - } - - if (txq->en_bypass && - (qdma_dev->dev_cap.desc_eng_mode == - QDMA_DESC_ENG_INTERNAL_ONLY)) { - PMD_DRV_LOG(ERR, - "Tx qid %d config in bypass " - "mode not supported on " - "internal only mode design\n", - tx_queue_id); - return -ENOTSUP; - } - } - - /* Allocate memory for TX descriptor ring */ - if (txq->st_mode) { - if (!qdma_dev->dev_cap.st_en) { - PMD_DRV_LOG(ERR, "Streaming mode not enabled " - "in the hardware\n"); - err = -EINVAL; - goto tx_setup_err; - } - - if (txq->en_bypass && - (txq->bypass_desc_sz != 0)) - sz = (txq->nb_tx_desc) * (txq->bypass_desc_sz); - else - sz = (txq->nb_tx_desc) * - sizeof(struct qdma_ul_st_h2c_desc); - txq->tx_mz = qdma_zone_reserve(dev, "TxHwRn", tx_queue_id, sz, - socket_id); - if (!txq->tx_mz) { - PMD_DRV_LOG(ERR, "Couldn't reserve memory for " - "ST H2C ring of size %d\n", sz); - err = -ENOMEM; - goto tx_setup_err; - } - - txq->tx_ring = txq->tx_mz->addr; - tx_ring_st = (struct qdma_ul_st_h2c_desc *)txq->tx_ring; - - tx_ring_bypass = (uint8_t *)txq->tx_ring; - /* Write-back status structure */ - if (txq->en_bypass && - (txq->bypass_desc_sz != 0)) - txq->wb_status = (struct wb_status *)& - tx_ring_bypass[(txq->nb_tx_desc - 1) * - (txq->bypass_desc_sz)]; - else - txq->wb_status = (struct wb_status *)& - tx_ring_st[txq->nb_tx_desc - 1]; - } else { - if (!qdma_dev->dev_cap.mm_en) { - PMD_DRV_LOG(ERR, "Memory mapped mode not " - "enabled in the hardware\n"); - err = -EINVAL; - goto tx_setup_err; - } - - if (txq->en_bypass && - (txq->bypass_desc_sz != 0)) - sz = (txq->nb_tx_desc) * (txq->bypass_desc_sz); - else - sz = (txq->nb_tx_desc) * sizeof(struct qdma_ul_mm_desc); - txq->tx_mz = qdma_zone_reserve(dev, "TxHwRn", tx_queue_id, - sz, socket_id); - if (!txq->tx_mz) { - PMD_DRV_LOG(ERR, "Couldn't reserve memory for " - "MM H2C ring of size %d\n", sz); - err = -ENOMEM; - goto tx_setup_err; - } - - txq->tx_ring = txq->tx_mz->addr; - tx_ring_mm = (struct qdma_ul_mm_desc *)txq->tx_ring; - - /* Write-back status structure */ - - tx_ring_bypass = (uint8_t *)txq->tx_ring; - if (txq->en_bypass && - (txq->bypass_desc_sz != 0)) - txq->wb_status = (struct wb_status *)& - tx_ring_bypass[(txq->nb_tx_desc - 1) * - (txq->bypass_desc_sz)]; - else - txq->wb_status = (struct wb_status *)& - tx_ring_mm[txq->nb_tx_desc - 1]; - } - - PMD_DRV_LOG(INFO, "Tx ring phys addr: 0x%lX, Tx Ring virt addr: 0x%lX", - (uint64_t)txq->tx_mz->iova, (uint64_t)txq->tx_ring); - - /* Allocate memory for TX software ring */ - sz = txq->nb_tx_desc * sizeof(struct rte_mbuf *); - txq->sw_ring = rte_zmalloc_socket("TxSwRn", sz, - RTE_CACHE_LINE_SIZE, socket_id); - if (txq->sw_ring == NULL) { - PMD_DRV_LOG(ERR, "Memory allocation failed for " - "Tx queue SW ring\n"); - err = -ENOMEM; - goto tx_setup_err; - } - - rte_spinlock_init(&txq->pidx_update_lock); - dev->data->tx_queues[tx_queue_id] = txq; - -#ifdef LATENCY_MEASUREMENT - err = qdma_tx_qstats_clear(dev, tx_queue_id); - if (err) { - PMD_DRV_LOG(ERR, - "Failed to clear QDMA Tx queue stats for qid: %d\n", - tx_queue_id); - return err; - } -#endif - - return 0; - -tx_setup_err: - PMD_DRV_LOG(ERR, " Tx queue setup failed"); - if (!qdma_dev->is_vf) - qdma_dev_decrement_active_queue(qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_H2C); - else - qdma_dev_notify_qdel(dev, tx_queue_id + - qdma_dev->queue_base, QDMA_DEV_Q_TYPE_H2C); - if (txq) { - if (txq->tx_mz) - rte_memzone_free(txq->tx_mz); - if (txq->sw_ring) - rte_free(txq->sw_ring); - rte_free(txq); - } - return err; -} - -#if (MIN_TX_PIDX_UPDATE_THRESHOLD > 1) -void qdma_txq_pidx_update(void *arg) -{ - struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_tx_queue *txq; - uint32_t qid; - - for (qid = 0; qid < dev->data->nb_tx_queues; qid++) { - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - if (txq->tx_desc_pend) { - rte_spinlock_lock(&txq->pidx_update_lock); - if (txq->tx_desc_pend) { - qdma_dev->hw_access->qdma_queue_pidx_update(dev, - qdma_dev->is_vf, - qid, 0, &txq->q_pidx_info); - - txq->tx_desc_pend = 0; - } - rte_spinlock_unlock(&txq->pidx_update_lock); - } - } - rte_eal_alarm_set(QDMA_TXQ_PIDX_UPDATE_INTERVAL, - qdma_txq_pidx_update, (void *)arg); -} -#endif - -/** - * DPDK callback to start the device. - * - * Start the device by configuring the Rx/Tx descriptor and device registers. - * - * @param dev - * Pointer to Ethernet device structure. - * - * @return - * 0 on success, negative errno value on failure. - */ -int qdma_dev_start(struct rte_eth_dev *dev) -{ - struct qdma_tx_queue *txq; - struct qdma_rx_queue *rxq; - uint32_t qid; - int err; - - PMD_DRV_LOG(INFO, "qdma-dev-start: Starting\n"); - - /* prepare descriptor rings for operation */ - for (qid = 0; qid < dev->data->nb_tx_queues; qid++) { - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - - /*Deferred Queues should not start with dev_start*/ - if (!txq->tx_deferred_start) { - err = qdma_dev_tx_queue_start(dev, qid); - if (err != 0) - return err; - } - } - - for (qid = 0; qid < dev->data->nb_rx_queues; qid++) { - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - - /*Deferred Queues should not start with dev_start*/ - if (!rxq->rx_deferred_start) { - err = qdma_dev_rx_queue_start(dev, qid); - if (err != 0) - return err; - } - } - -#if (MIN_TX_PIDX_UPDATE_THRESHOLD > 1) - rte_eal_alarm_set(QDMA_TXQ_PIDX_UPDATE_INTERVAL, - qdma_txq_pidx_update, (void *)dev); -#endif - return 0; -} - -/** - * DPDK callback to retrieve the physical link information. - * - * @param dev - * Pointer to Ethernet device structure. - * @param wait_to_complete - * wait_to_complete field is ignored. - */ -int qdma_dev_link_update(struct rte_eth_dev *dev, - __rte_unused int wait_to_complete) -{ - dev->data->dev_link.link_status = ETH_LINK_UP; - dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX; - - /* TODO: Configure link speed by reading hardware capabilities */ - dev->data->dev_link.link_speed = ETH_SPEED_NUM_200G; - - PMD_DRV_LOG(INFO, "Link update done\n"); - return 0; -} - -/** - * DPDK callback to get information about the device. - * - * @param dev - * Pointer to Ethernet device structure. - * @param[out] dev_info - * Device information structure output buffer. - */ -int qdma_dev_infos_get(struct rte_eth_dev *dev, - struct rte_eth_dev_info *dev_info) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - dev_info->max_rx_queues = qdma_dev->dev_cap.num_qs; - dev_info->max_tx_queues = qdma_dev->dev_cap.num_qs; - - dev_info->min_rx_bufsize = QDMA_MIN_RXBUFF_SIZE; - dev_info->max_rx_pktlen = DMA_BRAM_SIZE; - dev_info->max_mac_addrs = 1; - - return 0; -} - -/** - * DPDK callback to stop the device. - * - * Stop the device by clearing all configured Rx/Tx queue - * descriptors and registers. - * - * @param dev - * Pointer to Ethernet device structure. - */ -int qdma_dev_stop(struct rte_eth_dev *dev) -{ -#ifdef RTE_LIBRTE_QDMA_DEBUG_DRIVER - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; -#endif - uint32_t qid; - - /* reset driver's internal queue structures to default values */ - PMD_DRV_LOG(INFO, "PF-%d(DEVFN) Stop H2C & C2H queues", - qdma_dev->func_id); - for (qid = 0; qid < dev->data->nb_tx_queues; qid++) - qdma_dev_tx_queue_stop(dev, qid); - for (qid = 0; qid < dev->data->nb_rx_queues; qid++) - qdma_dev_rx_queue_stop(dev, qid); - -#if (MIN_TX_PIDX_UPDATE_THRESHOLD > 1) - /* Cancel pending PIDX updates */ - rte_eal_alarm_cancel(qdma_txq_pidx_update, (void *)dev); -#endif - - return 0; -} - -/** - * DPDK callback to close the device. - * - * Destroy all queues and objects, free memory. - * - * @param dev - * Pointer to Ethernet device structure. - */ -int qdma_dev_close(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_tx_queue *txq; - struct qdma_rx_queue *rxq; - struct qdma_cmpt_queue *cmptq; - uint32_t qid; - struct qdma_fmap_cfg fmap_cfg; - int ret = 0; - - PMD_DRV_LOG(INFO, "PF-%d(DEVFN) DEV Close\n", qdma_dev->func_id); - - if (dev->data->dev_started) - qdma_dev_stop(dev); - - memset(&fmap_cfg, 0, sizeof(struct qdma_fmap_cfg)); - qdma_dev->hw_access->qdma_fmap_conf(dev, - qdma_dev->func_id, &fmap_cfg, QDMA_HW_ACCESS_CLEAR); - - /* iterate over rx queues */ - for (qid = 0; qid < dev->data->nb_rx_queues; ++qid) { - rxq = dev->data->rx_queues[qid]; - if (rxq) { - PMD_DRV_LOG(INFO, "Remove C2H queue: %d", qid); - - if (rxq->sw_ring) - rte_free(rxq->sw_ring); - if (rxq->st_mode) { /** if ST-mode **/ - if (rxq->rx_cmpt_mz) - rte_memzone_free(rxq->rx_cmpt_mz); - } - - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_C2H); - - if (rxq->st_mode) - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_CMPT); - - if (rxq->rx_mz) - rte_memzone_free(rxq->rx_mz); - rte_free(rxq); - PMD_DRV_LOG(INFO, "C2H queue %d removed", qid); - } - } - - /* iterate over tx queues */ - for (qid = 0; qid < dev->data->nb_tx_queues; ++qid) { - txq = dev->data->tx_queues[qid]; - if (txq) { - PMD_DRV_LOG(INFO, "Remove H2C queue: %d", qid); - - if (txq->sw_ring) - rte_free(txq->sw_ring); - if (txq->tx_mz) - rte_memzone_free(txq->tx_mz); - rte_free(txq); - PMD_DRV_LOG(INFO, "H2C queue %d removed", qid); - - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_H2C); - } - } - if (qdma_dev->dev_cap.mm_cmpt_en) { - /* iterate over cmpt queues */ - for (qid = 0; qid < qdma_dev->qsets_en; ++qid) { - cmptq = qdma_dev->cmpt_queues[qid]; - if (cmptq != NULL) { - PMD_DRV_LOG(INFO, "PF-%d(DEVFN) Remove CMPT queue: %d", - qdma_dev->func_id, qid); - if (cmptq->cmpt_mz) - rte_memzone_free(cmptq->cmpt_mz); - rte_free(cmptq); - PMD_DRV_LOG(INFO, "PF-%d(DEVFN) CMPT queue %d removed", - qdma_dev->func_id, qid); - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_CMPT); - } - } - - if (qdma_dev->cmpt_queues != NULL) { - rte_free(qdma_dev->cmpt_queues); - qdma_dev->cmpt_queues = NULL; - } - } - qdma_dev->qsets_en = 0; - ret = qdma_dev_update(qdma_dev->dma_device_index, qdma_dev->func_id, - qdma_dev->qsets_en, (int *)&qdma_dev->queue_base); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) qmax update failed: %d\n", - qdma_dev->func_id, ret); - return 0; - } - - qdma_dev->init_q_range = 0; - rte_free(qdma_dev->q_info); - qdma_dev->q_info = NULL; - qdma_dev->dev_configured = 0; - - /* cancel pending polls*/ - if (qdma_dev->is_master) - rte_eal_alarm_cancel(qdma_check_errors, (void *)dev); - - return 0; -} - -/** - * DPDK callback to reset the device. - * - * Uninitialze PF device after waiting for all its VFs to shutdown. - * Initialize back PF device and then send Reset done mailbox - * message to all its VFs to come online again. - * - * @param dev - * Pointer to Ethernet device structure. - * - * @return - * 0 on success, negative errno value on failure. - */ -int qdma_dev_reset(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - struct qdma_mbox_msg *m = NULL; - uint32_t vf_device_count = 0; - uint32_t i = 0; - int ret = 0; - - /* Get the number of active VFs for this PF device */ - vf_device_count = qdma_dev->vf_online_count; - qdma_dev->reset_in_progress = 1; - - /* Uninitialze PCI device */ - ret = qdma_eth_dev_uninit(dev); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) uninitialization failed: %d\n", - qdma_dev->func_id, ret); - return -1; - } - - /* Initialize PCI device */ - ret = qdma_eth_dev_init(dev); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) initialization failed: %d\n", - qdma_dev->func_id, ret); - return -1; - } - - /* Send "PF_RESET_DONE" mailbox message from PF to all its VFs, - * so that VFs can come online again - */ - for (i = 0; i < pci_dev->max_vfs; i++) { - if (qdma_dev->vfinfo[i].func_id == QDMA_FUNC_ID_INVALID) - continue; - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - qdma_mbox_compose_pf_reset_done_message(m->raw_data, - qdma_dev->func_id, - qdma_dev->vfinfo[i].func_id); - ret = qdma_mbox_msg_send(dev, m, 0); - if (ret < 0) - PMD_DRV_LOG(ERR, "Sending reset failed from PF:%d to VF:%d\n", - qdma_dev->func_id, - qdma_dev->vfinfo[i].func_id); - - /* Mark VFs with invalid function id mapping, - * and this gets updated when VF comes online again - */ - qdma_dev->vfinfo[i].func_id = QDMA_FUNC_ID_INVALID; - } - - /* Start waiting for a maximum of 60 secs to get all its VFs - * to come online that were active before PF reset - */ - i = 0; - while (i < RESET_TIMEOUT) { - if (qdma_dev->vf_online_count == vf_device_count) { - PMD_DRV_LOG(INFO, - "%s: Reset completed for PF-%d(DEVFN)\n", - __func__, qdma_dev->func_id); - break; - } - rte_delay_ms(1); - i++; - } - - if (i >= RESET_TIMEOUT) { - PMD_DRV_LOG(ERR, "%s: Failed reset for PF-%d(DEVFN)\n", - __func__, qdma_dev->func_id); - } - - return ret; -} - -/** - * DPDK callback for Ethernet device configuration. - * - * @param dev - * Pointer to Ethernet device structure. - * - * @return - * 0 on success, negative errno value on failure. - */ -int qdma_dev_configure(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint16_t qid = 0; - int ret = 0, queue_base = -1; - uint8_t stat_id; - - PMD_DRV_LOG(INFO, "Configure the qdma engines\n"); - - qdma_dev->qsets_en = RTE_MAX(dev->data->nb_rx_queues, - dev->data->nb_tx_queues); - if (qdma_dev->qsets_en > qdma_dev->dev_cap.num_qs) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) Error: Number of Queues to be" - " configured are greater than the queues" - " supported by the hardware\n", - qdma_dev->func_id); - qdma_dev->qsets_en = 0; - return -1; - } - - /* Request queue base from the resource manager */ - ret = qdma_dev_update(qdma_dev->dma_device_index, qdma_dev->func_id, - qdma_dev->qsets_en, &queue_base); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) queue allocation failed: %d\n", - qdma_dev->func_id, ret); - return -1; - } - - ret = qdma_dev_qinfo_get(qdma_dev->dma_device_index, qdma_dev->func_id, - (int *)&qdma_dev->queue_base, - &qdma_dev->qsets_en); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, "%s: Error %d querying qbase\n", - __func__, ret); - return -1; - } - PMD_DRV_LOG(INFO, "Bus: 0x%x, PF-%d(DEVFN) queue_base: %d\n", - qdma_dev->dma_device_index, - qdma_dev->func_id, - qdma_dev->queue_base); - - qdma_dev->q_info = rte_zmalloc("qinfo", sizeof(struct queue_info) * - (qdma_dev->qsets_en), 0); - if (!qdma_dev->q_info) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) Cannot allocate " - "memory for queue info\n", qdma_dev->func_id); - return (-ENOMEM); - } - - /* Reserve memory for cmptq ring pointers - * Max completion queues can be maximum of rx and tx queues. - */ - qdma_dev->cmpt_queues = rte_zmalloc("cmpt_queues", - sizeof(qdma_dev->cmpt_queues[0]) * - qdma_dev->qsets_en, - RTE_CACHE_LINE_SIZE); - if (qdma_dev->cmpt_queues == NULL) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) cmpt ring pointers memory " - "allocation failed:\n", qdma_dev->func_id); - rte_free(qdma_dev->q_info); - qdma_dev->q_info = NULL; - return -(ENOMEM); - } - - for (qid = 0 ; qid < qdma_dev->qsets_en; qid++) { - /* Initialize queue_modes to all 1's ( i.e. Streaming) */ - qdma_dev->q_info[qid].queue_mode = RTE_PMD_QDMA_STREAMING_MODE; - - /* Disable the cmpt over flow check by default */ - qdma_dev->q_info[qid].dis_cmpt_ovf_chk = 0; - - qdma_dev->q_info[qid].trigger_mode = qdma_dev->trigger_mode; - qdma_dev->q_info[qid].timer_count = - qdma_dev->timer_count; - } - - for (qid = 0 ; qid < dev->data->nb_rx_queues; qid++) { - qdma_dev->q_info[qid].cmpt_desc_sz = qdma_dev->cmpt_desc_len; - qdma_dev->q_info[qid].rx_bypass_mode = - qdma_dev->c2h_bypass_mode; - qdma_dev->q_info[qid].en_prefetch = qdma_dev->en_desc_prefetch; - qdma_dev->q_info[qid].immediate_data_state = 0; - } - - for (qid = 0 ; qid < dev->data->nb_tx_queues; qid++) - qdma_dev->q_info[qid].tx_bypass_mode = - qdma_dev->h2c_bypass_mode; - for (stat_id = 0, qid = 0; - stat_id < RTE_ETHDEV_QUEUE_STAT_CNTRS; - stat_id++, qid++) { - /* Initialize map with qid same as stat_id */ - qdma_dev->tx_qid_statid_map[stat_id] = - (qid < dev->data->nb_tx_queues) ? qid : -1; - qdma_dev->rx_qid_statid_map[stat_id] = - (qid < dev->data->nb_rx_queues) ? qid : -1; - } - - ret = qdma_pf_fmap_prog(dev); - if (ret < 0) { - PMD_DRV_LOG(ERR, "FMAP programming failed\n"); - rte_free(qdma_dev->q_info); - qdma_dev->q_info = NULL; - rte_free(qdma_dev->cmpt_queues); - qdma_dev->cmpt_queues = NULL; - return ret; - } - - qdma_dev->dev_configured = 1; - - return 0; -} - -int qdma_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_tx_queue *txq; - uint32_t queue_base = qdma_dev->queue_base; - int err, bypass_desc_sz_idx; - struct qdma_descq_sw_ctxt q_sw_ctxt; - struct qdma_hw_access *hw_access = qdma_dev->hw_access; - - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - - memset(&q_sw_ctxt, 0, sizeof(struct qdma_descq_sw_ctxt)); - - bypass_desc_sz_idx = qmda_get_desc_sz_idx(txq->bypass_desc_sz); - - qdma_reset_tx_queue(txq); - qdma_clr_tx_queue_ctxts(dev, (qid + queue_base), txq->st_mode); - - if (txq->st_mode) { - q_sw_ctxt.desc_sz = SW_DESC_CNTXT_H2C_STREAM_DMA; - } else { - q_sw_ctxt.desc_sz = SW_DESC_CNTXT_MEMORY_MAP_DMA; - q_sw_ctxt.is_mm = 1; - } - q_sw_ctxt.wbi_chk = 1; - q_sw_ctxt.wbi_intvl_en = 1; - q_sw_ctxt.fnc_id = txq->func_id; - q_sw_ctxt.qen = 1; - q_sw_ctxt.rngsz_idx = txq->ringszidx; - q_sw_ctxt.bypass = txq->en_bypass; - q_sw_ctxt.wbk_en = 1; - q_sw_ctxt.ring_bs_addr = (uint64_t)txq->tx_mz->iova; - - if (txq->en_bypass && - (txq->bypass_desc_sz != 0)) - q_sw_ctxt.desc_sz = bypass_desc_sz_idx; - - /* Set SW Context */ - err = hw_access->qdma_sw_ctx_conf(dev, 0, - (qid + queue_base), &q_sw_ctxt, - QDMA_HW_ACCESS_WRITE); - if (err < 0) - return qdma_dev->hw_access->qdma_get_error_code(err); - - txq->q_pidx_info.pidx = 0; - hw_access->qdma_queue_pidx_update(dev, qdma_dev->is_vf, - qid, 0, &txq->q_pidx_info); - - dev->data->tx_queue_state[qid] = RTE_ETH_QUEUE_STATE_STARTED; - txq->status = RTE_ETH_QUEUE_STATE_STARTED; - return 0; -} - - -int qdma_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_rx_queue *rxq; - uint32_t queue_base = qdma_dev->queue_base; - uint8_t cmpt_desc_fmt; - int err, bypass_desc_sz_idx; - struct qdma_descq_sw_ctxt q_sw_ctxt; - struct qdma_descq_cmpt_ctxt q_cmpt_ctxt; - struct qdma_descq_prefetch_ctxt q_prefetch_ctxt; - struct qdma_hw_access *hw_access = qdma_dev->hw_access; - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - - memset(&q_sw_ctxt, 0, sizeof(struct qdma_descq_sw_ctxt)); - - qdma_reset_rx_queue(rxq); - qdma_clr_rx_queue_ctxts(dev, (qid + queue_base), rxq->st_mode); - - bypass_desc_sz_idx = qmda_get_desc_sz_idx(rxq->bypass_desc_sz); - - switch (rxq->cmpt_desc_len) { - case RTE_PMD_QDMA_CMPT_DESC_LEN_8B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_8B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_16B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_16B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_32B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_32B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_64B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_64B; - break; - default: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_8B; - break; - } - - err = qdma_init_rx_queue(rxq); - if (err != 0) - return err; - - if (rxq->st_mode) { - memset(&q_cmpt_ctxt, 0, sizeof(struct qdma_descq_cmpt_ctxt)); - memset(&q_prefetch_ctxt, 0, - sizeof(struct qdma_descq_prefetch_ctxt)); - - q_prefetch_ctxt.bypass = (rxq->en_bypass_prefetch) ? 1 : 0; - q_prefetch_ctxt.bufsz_idx = rxq->buffszidx; - q_prefetch_ctxt.pfch_en = (rxq->en_prefetch) ? 1 : 0; - q_prefetch_ctxt.valid = 1; - -#ifdef QDMA_LATENCY_OPTIMIZED - q_cmpt_ctxt.full_upd = 1; -#endif //QDMA_LATENCY_OPTIMIZED - q_cmpt_ctxt.en_stat_desc = 1; - q_cmpt_ctxt.trig_mode = rxq->triggermode; - q_cmpt_ctxt.fnc_id = rxq->func_id; - q_cmpt_ctxt.counter_idx = rxq->threshidx; - q_cmpt_ctxt.timer_idx = rxq->timeridx; - q_cmpt_ctxt.color = CMPT_DEFAULT_COLOR_BIT; - q_cmpt_ctxt.ringsz_idx = rxq->cmpt_ringszidx; - q_cmpt_ctxt.bs_addr = (uint64_t)rxq->rx_cmpt_mz->iova; - q_cmpt_ctxt.desc_sz = cmpt_desc_fmt; - q_cmpt_ctxt.valid = 1; - if (qdma_dev->dev_cap.cmpt_ovf_chk_dis) - q_cmpt_ctxt.ovf_chk_dis = rxq->dis_overflow_check; - - - q_sw_ctxt.desc_sz = SW_DESC_CNTXT_C2H_STREAM_DMA; - q_sw_ctxt.frcd_en = 1; - } else { - q_sw_ctxt.desc_sz = SW_DESC_CNTXT_MEMORY_MAP_DMA; - q_sw_ctxt.is_mm = 1; - q_sw_ctxt.wbi_chk = 1; - q_sw_ctxt.wbi_intvl_en = 1; - } - - q_sw_ctxt.fnc_id = rxq->func_id; - q_sw_ctxt.qen = 1; - q_sw_ctxt.rngsz_idx = rxq->ringszidx; - q_sw_ctxt.bypass = rxq->en_bypass; - q_sw_ctxt.wbk_en = 1; - q_sw_ctxt.ring_bs_addr = (uint64_t)rxq->rx_mz->iova; - - if (rxq->en_bypass && - (rxq->bypass_desc_sz != 0)) - q_sw_ctxt.desc_sz = bypass_desc_sz_idx; - - /* Set SW Context */ - err = hw_access->qdma_sw_ctx_conf(dev, 1, (qid + queue_base), - &q_sw_ctxt, QDMA_HW_ACCESS_WRITE); - if (err < 0) - return qdma_dev->hw_access->qdma_get_error_code(err); - - if (rxq->st_mode) { - /* Set Prefetch Context */ - err = hw_access->qdma_pfetch_ctx_conf(dev, (qid + queue_base), - &q_prefetch_ctxt, QDMA_HW_ACCESS_WRITE); - if (err < 0) - return qdma_dev->hw_access->qdma_get_error_code(err); - - /* Set Completion Context */ - err = hw_access->qdma_cmpt_ctx_conf(dev, (qid + queue_base), - &q_cmpt_ctxt, QDMA_HW_ACCESS_WRITE); - if (err < 0) - return qdma_dev->hw_access->qdma_get_error_code(err); - - rte_wmb(); - /* enable status desc , loading the triggermode, - * thresidx and timeridx passed from the user - */ - - rxq->cmpt_cidx_info.counter_idx = rxq->threshidx; - rxq->cmpt_cidx_info.timer_idx = rxq->timeridx; - rxq->cmpt_cidx_info.trig_mode = rxq->triggermode; - rxq->cmpt_cidx_info.wrb_en = 1; - rxq->cmpt_cidx_info.wrb_cidx = 0; - hw_access->qdma_queue_cmpt_cidx_update(dev, qdma_dev->is_vf, - qid, &rxq->cmpt_cidx_info); - - rxq->q_pidx_info.pidx = (rxq->nb_rx_desc - 2); - hw_access->qdma_queue_pidx_update(dev, qdma_dev->is_vf, qid, - 1, &rxq->q_pidx_info); - } - - dev->data->rx_queue_state[qid] = RTE_ETH_QUEUE_STATE_STARTED; - rxq->status = RTE_ETH_QUEUE_STATE_STARTED; - return 0; -} - -int qdma_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_rx_queue *rxq; - uint32_t queue_base = qdma_dev->queue_base; - int i = 0; - int cnt = 0; - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - - rxq->status = RTE_ETH_QUEUE_STATE_STOPPED; - - /* Wait for queue to recv all packets. */ - if (rxq->st_mode) { /** ST-mode **/ - /* For eqdma, c2h marker takes care to drain the pipeline */ - if (!(qdma_dev->ip_type == EQDMA_SOFT_IP)) { - while (rxq->wb_status->pidx != - rxq->cmpt_cidx_info.wrb_cidx) { - rte_delay_us_block(10); - if (cnt++ > 10000) - break; - } - } - } else { /* MM mode */ - while (rxq->wb_status->cidx != rxq->q_pidx_info.pidx) { - rte_delay_us_block(10); - if (cnt++ > 10000) - break; - } - } - - qdma_inv_rx_queue_ctxts(dev, (qid + queue_base), rxq->st_mode); - - if (rxq->st_mode) { /** ST-mode **/ -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(INFO, "%s(): %d: queue id %d," - "mbuf_avail_count = %d, mbuf_in_use_count = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); -#endif //DUMP_MEMPOOL_USAGE_STATS - for (i = 0; i < rxq->nb_rx_desc - 1; i++) { - rte_pktmbuf_free(rxq->sw_ring[i]); - rxq->sw_ring[i] = NULL; - } -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(INFO, "%s(): %d: queue id %d," - "mbuf_avail_count = %d, mbuf_in_use_count = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); -#endif //DUMP_MEMPOOL_USAGE_STATS - } - - qdma_reset_rx_queue(rxq); - - dev->data->rx_queue_state[qid] = RTE_ETH_QUEUE_STATE_STOPPED; - - return 0; -} - -int qdma_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint32_t queue_base = qdma_dev->queue_base; - struct qdma_tx_queue *txq; - int cnt = 0; - uint16_t count; - - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - - txq->status = RTE_ETH_QUEUE_STATE_STOPPED; - /* Wait for TXQ to send out all packets. */ - while (txq->wb_status->cidx != txq->q_pidx_info.pidx) { - rte_delay_us_block(10); - if (cnt++ > 10000) - break; - } - - qdma_inv_tx_queue_ctxts(dev, (qid + queue_base), txq->st_mode); - - /* Relinquish pending mbufs */ - for (count = 0; count < txq->nb_tx_desc - 1; count++) { - rte_pktmbuf_free(txq->sw_ring[count]); - txq->sw_ring[count] = NULL; - } - qdma_reset_tx_queue(txq); - - dev->data->tx_queue_state[qid] = RTE_ETH_QUEUE_STATE_STOPPED; - - return 0; -} - -/** - * DPDK callback to retrieve device registers and - * register attributes (number of registers and register size) - * - * @param dev - * Pointer to Ethernet device structure. - * @param regs - * Pointer to rte_dev_reg_info structure to fill in. If regs->data is - * NULL the function fills in the width and length fields. If non-NULL - * the registers are put into the buffer pointed at by the data field. - * - * @return - * 0 on success, -ENOTSUP on failure. - */ -int -qdma_dev_get_regs(struct rte_eth_dev *dev, - struct rte_dev_reg_info *regs) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint32_t *data = regs->data; - uint32_t reg_length = 0; - int ret = 0; - - ret = qdma_acc_get_num_config_regs(dev, - (enum qdma_ip_type)qdma_dev->ip_type, - (enum qdma_device_type)qdma_dev->device_type, - ®_length); - if (ret < 0 || reg_length == 0) { - PMD_DRV_LOG(ERR, "%s: Failed to get number of config registers\n", - __func__); - return ret; - } - - if (data == NULL) { - regs->length = reg_length - 1; - regs->width = sizeof(uint32_t); - return 0; - } - - /* Support only full register dump */ - if ((regs->length == 0) || - (regs->length == (reg_length - 1))) { - regs->version = 1; - ret = qdma_acc_get_config_regs(dev, qdma_dev->is_vf, - (enum qdma_ip_type)qdma_dev->ip_type, - (enum qdma_device_type)qdma_dev->device_type, data); - if (ret < 0) { - PMD_DRV_LOG(ERR, "%s: Failed to get config registers\n", - __func__); - } - return ret; - } - - PMD_DRV_LOG(ERR, "%s: Unsupported length (0x%x) requested\n", - __func__, regs->length); - return -ENOTSUP; -} - -/** - * DPDK callback to set a queue statistics mapping for - * a tx/rx queue of an Ethernet device. - * - * @param dev - * Pointer to Ethernet device structure. - * @param queue_id - * Index of the queue for which a queue stats mapping is required. - * @param stat_idx - * The per-queue packet statistics functionality number that - * the queue_id is to be assigned. - * @param is_rx - * Whether queue is a Rx or a Tx queue. - * - * @return - * 0 on success, -EINVAL on failure. - */ -int qdma_dev_queue_stats_mapping(struct rte_eth_dev *dev, - uint16_t queue_id, - uint8_t stat_idx, - uint8_t is_rx) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - if (is_rx && (queue_id >= dev->data->nb_rx_queues)) { - PMD_DRV_LOG(ERR, "%s: Invalid Rx qid %d\n", - __func__, queue_id); - return -EINVAL; - } - - if (!is_rx && (queue_id >= dev->data->nb_tx_queues)) { - PMD_DRV_LOG(ERR, "%s: Invalid Tx qid %d\n", - __func__, queue_id); - return -EINVAL; - } - - if (stat_idx >= RTE_ETHDEV_QUEUE_STAT_CNTRS) { - PMD_DRV_LOG(ERR, "%s: Invalid stats index %d\n", - __func__, stat_idx); - return -EINVAL; - } - - if (is_rx) - qdma_dev->rx_qid_statid_map[stat_idx] = queue_id; - else - qdma_dev->tx_qid_statid_map[stat_idx] = queue_id; - - return 0; -} - -/** - * DPDK callback for retrieving Port statistics. - * - * @param dev - * Pointer to Ethernet device structure. - * @param eth_stats - * Pointer to structure containing statistics. - * - * @return - * Returns 0 i.e. success - */ -int qdma_dev_stats_get(struct rte_eth_dev *dev, - struct rte_eth_stats *eth_stats) -{ - uint32_t i; - int qid; - struct qdma_rx_queue *rxq; - struct qdma_tx_queue *txq; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - memset(eth_stats, 0, sizeof(struct rte_eth_stats)); - for (i = 0; i < dev->data->nb_rx_queues; i++) { - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[i]; - eth_stats->ipackets += rxq->stats.pkts; - eth_stats->ibytes += rxq->stats.bytes; - } - - for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) { - qid = qdma_dev->rx_qid_statid_map[i]; - if (qid >= 0) { - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - eth_stats->q_ipackets[i] = rxq->stats.pkts; - eth_stats->q_ibytes[i] = rxq->stats.bytes; - } - } - - for (i = 0; i < dev->data->nb_tx_queues; i++) { - txq = (struct qdma_tx_queue *)dev->data->tx_queues[i]; - eth_stats->opackets += txq->stats.pkts; - eth_stats->obytes += txq->stats.bytes; - } - - for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) { - qid = qdma_dev->tx_qid_statid_map[i]; - if (qid >= 0) { - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - eth_stats->q_opackets[i] = txq->stats.pkts; - eth_stats->q_obytes[i] = txq->stats.bytes; - } - } - return 0; -} - -/** - * DPDK callback to reset Port statistics. - * - * @param dev - * Pointer to Ethernet device structure. - * - */ -int qdma_dev_stats_reset(struct rte_eth_dev *dev) -{ - uint32_t i; - - for (i = 0; i < dev->data->nb_rx_queues; i++) { - struct qdma_rx_queue *rxq = - (struct qdma_rx_queue *)dev->data->rx_queues[i]; - rxq->stats.pkts = 0; - rxq->stats.bytes = 0; - } - - for (i = 0; i < dev->data->nb_tx_queues; i++) { - struct qdma_tx_queue *txq = - (struct qdma_tx_queue *)dev->data->tx_queues[i]; - txq->stats.pkts = 0; - txq->stats.bytes = 0; - } - return 0; -} - -/** - * DPDK callback to get Rx Queue info of an Ethernet device. - * - * @param dev - * Pointer to Ethernet device structure. - * @param rx_queue_id - * The RX queue on the Ethernet device for which information will be - * retrieved - * @param qinfo - * A pointer to a structure of type rte_eth_rxq_info_info to be filled with - * the information of given Rx queue. - */ -void -qdma_dev_rxq_info_get(struct rte_eth_dev *dev, uint16_t rx_queue_id, - struct rte_eth_rxq_info *qinfo) -{ - struct qdma_pci_dev *dma_priv; - struct qdma_rx_queue *rxq = NULL; - - if (!qinfo) - return; - - dma_priv = (struct qdma_pci_dev *)dev->data->dev_private; - - rxq = dev->data->rx_queues[rx_queue_id]; - memset(qinfo, 0, sizeof(struct rte_eth_rxq_info)); - qinfo->mp = rxq->mb_pool; - qinfo->conf.rx_deferred_start = rxq->rx_deferred_start; - qinfo->conf.rx_drop_en = 1; - qinfo->conf.rx_thresh.wthresh = dma_priv->g_c2h_cnt_th[rxq->threshidx]; - qinfo->scattered_rx = 1; - qinfo->nb_desc = rxq->nb_rx_desc - 1; -} - -/** - * DPDK callback to get Tx Queue info of an Ethernet device. - * - * @param dev - * Pointer to Ethernet device structure. - * @param tx_queue_id - * The TX queue on the Ethernet device for which information will be - * retrieved - * @param qinfo - * A pointer to a structure of type rte_eth_txq_info_info to be filled with - * the information of given Tx queue. - */ -void -qdma_dev_txq_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id, - struct rte_eth_txq_info *qinfo) -{ - struct qdma_tx_queue *txq = NULL; - - if (!qinfo) - return; - - txq = dev->data->tx_queues[tx_queue_id]; - qinfo->conf.offloads = txq->offloads; - qinfo->conf.tx_deferred_start = txq->tx_deferred_start; - qinfo->conf.tx_rs_thresh = 0; - qinfo->nb_desc = txq->nb_tx_desc - 1; - -} - -static struct eth_dev_ops qdma_eth_dev_ops = { - .dev_configure = qdma_dev_configure, - .dev_infos_get = qdma_dev_infos_get, - .dev_start = qdma_dev_start, - .dev_stop = qdma_dev_stop, - .dev_close = qdma_dev_close, - .dev_reset = qdma_dev_reset, - .link_update = qdma_dev_link_update, - .rx_queue_setup = qdma_dev_rx_queue_setup, - .tx_queue_setup = qdma_dev_tx_queue_setup, - .rx_queue_release = qdma_dev_rx_queue_release, - .tx_queue_release = qdma_dev_tx_queue_release, - .rx_queue_start = qdma_dev_rx_queue_start, - .rx_queue_stop = qdma_dev_rx_queue_stop, - .tx_queue_start = qdma_dev_tx_queue_start, - .tx_queue_stop = qdma_dev_tx_queue_stop, - .tx_done_cleanup = qdma_dev_tx_done_cleanup, - .queue_stats_mapping_set = qdma_dev_queue_stats_mapping, - .get_reg = qdma_dev_get_regs, - .stats_get = qdma_dev_stats_get, - .stats_reset = qdma_dev_stats_reset, - .rxq_info_get = qdma_dev_rxq_info_get, - .txq_info_get = qdma_dev_txq_info_get, -}; - -void qdma_dev_ops_init(struct rte_eth_dev *dev) -{ - dev->dev_ops = &qdma_eth_dev_ops; - if (rte_eal_process_type() == RTE_PROC_PRIMARY) { - qdma_set_rx_function(dev); - qdma_set_tx_function(dev); - dev->rx_queue_count = &qdma_dev_rx_queue_count; - dev->rx_descriptor_status = &qdma_dev_rx_descriptor_status; - dev->tx_descriptor_status = &qdma_dev_tx_descriptor_status; - } -} - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_devops.h b/QDMA/DPDK/drivers/net/qdma/qdma_devops.h deleted file mode 100755 index 56c0d28..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_devops.h +++ /dev/null @@ -1,515 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2020-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_DEVOPS_H__ -#define __QDMA_DEVOPS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup dpdk_devops_func Functions - */ - -/** - * DPDK callback to register an Ethernet PCIe device. - * - * The Following actions are performed by this function: - * - Parse and validate device arguments - * - Identify PCIe BARs present in the device - * - Register device operations - * - Enable MM C2H and H2C channels - * - Register PCIe device with Queue Resource Manager - * - Program the QDMA IP global registers (by 1st PF that was probed) - * - Enable HW errors and launch QDMA HW error monitoring thread - * (by 1st PF that was probed) - * - If VF is enabled, then enable Mailbox interrupt and register - * Rx message handling function as interrupt handler - * - * @param dev Pointer to Ethernet device structure - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_eth_dev_init(struct rte_eth_dev *dev); - -/** - * DPDK callback for Ethernet device configuration. - * - * This API requests the queue base from Queue Resource Manager and programs - * the queue base and queue count in function map (FMAP) - * - * @param dev Pointer to Ethernet device structure - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_configure(struct rte_eth_dev *dev); - -/** - * DPDK callback to get information about the device - * - * @param dev Pointer to Ethernet device structure - * @param dev_info: Pointer to Device information structure - * - * @ingroup dpdk_devops_func - */ -int qdma_dev_infos_get(struct rte_eth_dev *dev, - struct rte_eth_dev_info *dev_info); - -/** - * DPDK callback to retrieve the physical link information - * - * @param dev - * Pointer to Ethernet device structure - * @param wait_to_complete - * wait_to_complete field is ignored - * - * @ingroup dpdk_devops_func - */ -int qdma_dev_link_update(struct rte_eth_dev *dev, - __rte_unused int wait_to_complete); - -/** - * DPDK callback to configure a RX queue. - * - * This API validates queue parameters and allocates C2H ring and - * Streaming CMPT ring from the DPDK reserved hugepage memory zones - * - * @param dev Pointer to Ethernet device structure. - * @param rx_queue_id RX queue index relative to the PCIe function - * pointed by dev - * @param nb_rx_desc Number of C2H descriptors to configure for this queue - * @param socket_id NUMA socket on which memory must be allocated - * @param rx_conf Rx queue configuration parameters - * @param mb_pool Memory pool to use for buffer allocations on this queue - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id, - uint16_t nb_rx_desc, unsigned int socket_id, - const struct rte_eth_rxconf *rx_conf, - struct rte_mempool *mb_pool); - -/** - * DPDK callback to configure a TX queue. - * - * This API validates queue parameters and allocates H2C ring from the - * DPDK reserved hugepage memory zone - * - * @param dev Pointer to Ethernet device structure - * @param tx_queue_id TX queue index - * @param nb_tx_desc Number of descriptors to configure in queue - * @param socket_id NUMA socket on which memory must be allocated - * @param tx_conf Tx queue configuration parameters - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, - uint16_t nb_tx_desc, unsigned int socket_id, - const struct rte_eth_txconf *tx_conf); - -/** - * DPDK callback to get Rx queue info of an Ethernet device - * - * @param dev - * Pointer to Ethernet device structure - * @param rx_queue_id - * The RX queue on the Ethernet device for which information will be - * retrieved - * @param qinfo - * A pointer to a structure of type rte_eth_rxq_info_info to be filled with - * the information of given Rx queue - * - * @ingroup dpdk_devops_func - */ -void -qdma_dev_rxq_info_get(struct rte_eth_dev *dev, uint16_t rx_queue_id, - struct rte_eth_rxq_info *qinfo); - -/** - * DPDK callback to get Tx queue info of an Ethernet device - * - * @param dev - * Pointer to Ethernet device structure - * @param tx_queue_id - * The TX queue on the Ethernet device for which information will be - * retrieved - * @param qinfo - * A pointer to a structure of type rte_eth_txq_info_info to be filled with - * the information of given Tx queue - * - * @ingroup dpdk_devops_func - */ -void -qdma_dev_txq_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id, - struct rte_eth_txq_info *qinfo); - -/** - * DPDK callback to start the device. - * - * This API starts the Ethernet device by initializing Rx, Tx descriptors - * and device registers. For the Port queues whose start is not deferred, - * it calls qdma_dev_tx_queue_start and qdma_dev_rx_queue_start to start - * the queues for packet processing. - * - * @param dev Pointer to Ethernet device structure - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_start(struct rte_eth_dev *dev); - -/** - * DPDK callback to start a C2H queue which has been deferred start. - * - * This API clears and then programs the Software, Prefetch and - * Completion context of the C2H queue - * - * @param dev Pointer to Ethernet device structure - * @param qid Rx queue index - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t qid); - -/** - * DPDK callback to start a H2C queue which has been deferred start. - * - * This API clears and then programs the Software context of the H2C queue - * - * @param dev Pointer to Ethernet device structure - * @param qid Tx queue index - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qid); - -/** - * DPDK callback for receiving packets in burst. - * - * This API does following operations: - * - Process the Completion ring to determine and store packet information - * - Update CMPT CIDX - * - Process C2H ring to retrieve rte_mbuf pointers corresponding to - * received packets and store in rx_pkts array. - * - Populate C2H ring with new pointers for packet buffers - * - Update C2H ring PIDX - * - * @param rx_queue Generic pointer to Rx queue structure - * @param rx_pkts The address of an array of pointers to rte_mbuf structures - * that must be large enough to store nb_pkts pointers in it - * @param nb_pkts Maximum number of packets to retrieve - * - * @return Number of packets successfully received (<= nb_pkts) - * @ingroup dpdk_devops_func - * - */ -uint16_t qdma_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - uint16_t nb_pkts); - -/** - * DPDK callback for transmitting packets in burst. - * - * This API does following operations: - * - Free rte_mbuf pointers to previous transmitted packets, - * back to the memory pool - * - Retrieve packet buffer pointer from tx_pkts and populate H2C ring - * with pointers to new packet buffers. - * - Update H2C ring PIDX - * - * @param tx_queue Generic pointer to Tx queue structure - * @param tx_pkts The address of an array of nb_pkts pointers to - * rte_mbuf structures which contain the output packets - * @param nb_pkts The maximum number of packets to transmit - * - * @return Number of packets successfully transmitted (<= nb_pkts) - * @ingroup dpdk_devops_func - * - */ -uint16_t qdma_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, - uint16_t nb_pkts); - -/** - * DPDK callback for retrieving Port statistics. - * - * This API updates Port statistics in rte_eth_stats structure parameters - * - * @param dev Pointer to Ethernet device structure - * @param eth_stats Pointer to structure containing statistics - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_stats_get(struct rte_eth_dev *dev, - struct rte_eth_stats *eth_stats); - -/** - * DPDK callback to reset Port statistics. - * - * @param dev - * Pointer to Ethernet device structure. - * - * @ingroup dpdk_devops_func - */ -int qdma_dev_stats_reset(struct rte_eth_dev *dev); - -/** - * DPDK callback to set a queue statistics mapping for - * a tx/rx queue of an Ethernet device. - * - * @param dev - * Pointer to Ethernet device structure - * @param queue_id - * Index of the queue for which a queue stats mapping is required - * @param stat_idx - * The per-queue packet statistics functionality number that - * the queue_id is to be assigned - * @param is_rx - * Whether queue is a Rx or a Tx queue - * - * @return - * 0 on success, -EINVAL on failure - * @ingroup dpdk_devops_func - */ -int qdma_dev_queue_stats_mapping(struct rte_eth_dev *dev, - uint16_t queue_id, - uint8_t stat_idx, - uint8_t is_rx); - - -/** - * DPDK callback to check the status of a Rx descriptor in the queue - * - * @param rx_queue - * Pointer to Rx queue specific data structure - * @param offset - * The offset of the descriptor starting from tail (0 is the next - * packet to be received by the driver) - * - * @return - * - (RTE_ETH_RX_DESC_AVAIL): Descriptor is available for the hardware to - * receive a packet. - * - (RTE_ETH_RX_DESC_DONE): Descriptor is done, it is filled by hw, but - * not yet processed by the driver (i.e. in the receive queue). - * - (RTE_ETH_RX_DESC_UNAVAIL): Descriptor is unavailable, either hold by - * the driver and not yet returned to hw, or reserved by the hw. - * - (-EINVAL) bad descriptor offset. - * @ingroup dpdk_devops_func - */ -int -qdma_dev_rx_descriptor_status(void *rx_queue, uint16_t offset); - -/** - * DPDK callback to check the status of a Tx descriptor in the queue - * - * @param tx_queue - * Pointer to Tx queue specific data structure - * @param offset - * The offset of the descriptor starting from tail (0 is the place where - * the next packet will be send) - * - * @return - * - (RTE_ETH_TX_DESC_FULL) Descriptor is being processed by the hw, i.e. - * in the transmit queue. - * - (RTE_ETH_TX_DESC_DONE) Hardware is done with this descriptor, it can - * be reused by the driver. - * - (RTE_ETH_TX_DESC_UNAVAIL): Descriptor is unavailable, reserved by the - * driver or the hardware. - * - (-EINVAL) bad descriptor offset. - * @ingroup dpdk_devops_func - */ -int -qdma_dev_tx_descriptor_status(void *tx_queue, uint16_t offset); - -/** - * DPDK callback to request the driver to free mbufs - * currently cached by the driver - * - * @param tx_queue - * Pointer to Tx queue specific data structure - * @param free_cnt - * Maximum number of packets to free. Use 0 to indicate all possible packets - * should be freed. Note that a packet may be using multiple mbufs. - * - * @return - * - Failure: < 0 - * - Success: >= 0 - * 0-n: Number of packets freed. More packets may still remain in ring that - * are in use. - * @ingroup dpdk_devops_func - */ -int -qdma_dev_tx_done_cleanup(void *tx_queue, uint32_t free_cnt); - -/** - * DPDK callback to retrieve device registers and - * register attributes (number of registers and register size) - * - * @param dev - * Pointer to Ethernet device structure - * @param regs - * Pointer to rte_dev_reg_info structure to fill in. If regs->data is - * NULL the function fills in the width and length fields. If non-NULL - * the registers are put into the buffer pointed at by the data field. - * - * @return - * 0 on success, -ENOTSUP on failure - * @ingroup dpdk_devops_func - */ -int -qdma_dev_get_regs(struct rte_eth_dev *dev, - struct rte_dev_reg_info *regs); - -/** - * DPDK callback to stop a C2H queue - * - * This API invalidates Hardware, Software, Prefetch and completion contexts - * of C2H queue. It also free the rte_mbuf pointers assigned to descriptors - * prepared for packet reception. - * - * @param dev Pointer to Ethernet device structure - * @param qid Rx queue index - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qid); - -/** - * qdma_dev_tx_queue_stop() - DPDK callback to stop a queue in H2C direction - * - * This API invalidates Hardware, Software contexts of H2C queue. It also free - * the rte_mbuf pointers assigned to descriptors that are pending transmission. - * - * @param dev Pointer to Ethernet device structure - * @param qid TX queue index - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qid); - - -/** - * DPDK callback to stop the device. - * - * This API stops the device by invalidating all the contexts of all the queues - * belonging to the port by calling qdma_dev_tx_queue_stop() and - * qdma_dev_rx_queue_stop() for all the queues of the port. - * - * @param dev Pointer to Ethernet device structure - * - * @ingroup dpdk_devops_func - * - */ -int qdma_dev_stop(struct rte_eth_dev *dev); - -/** - * DPDK callback to close the device. - * - * This API frees the descriptor rings and objects beonging to all the queues - * of the given port. It also clears the FMAP. - * - * @param dev Pointer to Ethernet device structure - * - * @ingroup dpdk_devops_func - */ -int qdma_dev_close(struct rte_eth_dev *dev); - -/** - * DPDK callback to close the VF device. - * - * This API frees the descriptor rings and objects beonging to all the queues - * of the given port. It also clears the FMAP. - * - * @param dev Pointer to Ethernet device structure - * - * @ingroup dpdk_devops_func - */ -int qdma_vf_dev_close(struct rte_eth_dev *dev); - -/** - * DPDK callback to reset the device. - * - * This callback is invoked when applcation calls rte_eth_dev_reset() API - * to reset a device. This callback uninitialzes PF device after waiting for - * all its VFs to shutdown. It initialize back PF device and then send - * Reset done mailbox message to all its VFs to come online again. - * - * @param dev - * Pointer to Ethernet device structure - * - * @return - * 0 on success, negative errno value on failure - * @ingroup dpdk_devops_func - */ -int qdma_dev_reset(struct rte_eth_dev *dev); - -/** - * DPDK callback to deregister a PCI device. - * - * The Following actions are performed by this function: - * - Flushes out pending actions from the Tx Mailbox List - * - Terminate Tx Mailbox thread - * - Disable Mailbox interrupt and unregister interrupt handler - * - Unregister PCIe device from Queue Resource Manager - * - Cancel QDMA HW error monitoring thread if created by this device - * - Disable MM C2H and H2C channels - * - * @param dev Pointer to Ethernet device structure - * - * @return 0 on success, < 0 on failure - * @ingroup dpdk_devops_func - * - */ -int qdma_eth_dev_uninit(struct rte_eth_dev *dev); - -#ifdef __cplusplus -} -#endif -#endif /* ifndef __QDMA_DEVOPS_H__ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.c b/QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.c deleted file mode 100755 index 1b4e767..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.c +++ /dev/null @@ -1,316 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <sys/mman.h> -#include <sys/fcntl.h> -#include <rte_memzone.h> -#include <rte_string_fns.h> -#include <rte_malloc.h> -#include <rte_dev.h> -#include <rte_pci.h> -#include <rte_ether.h> -#include <rte_ethdev.h> -#include <rte_alarm.h> -#include <rte_cycles.h> -#include <rte_atomic.h> -#include <unistd.h> -#include <string.h> -#include "qdma.h" -#include "qdma_access_common.h" -#include "qdma_mbox_protocol.h" -#include "qdma_mbox.h" -#include "qdma_reg_dump.h" -#include "qdma_platform.h" -#include "qdma_devops.h" - - -#if defined(QDMA_DPDK_21_11) || defined(QDMA_DPDK_22_11) - -void qdma_dev_tx_queue_release(struct rte_eth_dev *dev, - uint16_t queue_id) -{ - struct qdma_tx_queue *txq = - (struct qdma_tx_queue *)dev->data->tx_queues[queue_id]; - struct qdma_pci_dev *qdma_dev; - - if (txq != NULL) { - PMD_DRV_LOG(INFO, "Remove H2C queue: %d", txq->queue_id); - qdma_dev = txq->dev->data->dev_private; - - if (!qdma_dev->is_vf) - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_H2C); - else - qdma_dev_notify_qdel(txq->dev, txq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_H2C); - if (txq->sw_ring) - rte_free(txq->sw_ring); - if (txq->tx_mz) - rte_memzone_free(txq->tx_mz); - rte_free(txq); - PMD_DRV_LOG(INFO, "H2C queue %d removed", txq->queue_id); - } -} - -void qdma_dev_rx_queue_release(struct rte_eth_dev *dev, - uint16_t queue_id) -{ - struct qdma_rx_queue *rxq = - (struct qdma_rx_queue *)dev->data->rx_queues[queue_id]; - struct qdma_pci_dev *qdma_dev = NULL; - - if (rxq != NULL) { - PMD_DRV_LOG(INFO, "Remove C2H queue: %d", rxq->queue_id); - qdma_dev = rxq->dev->data->dev_private; - - if (!qdma_dev->is_vf) { - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_C2H); - - if (rxq->st_mode) - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_CMPT); - } else { - qdma_dev_notify_qdel(rxq->dev, rxq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_C2H); - - if (rxq->st_mode) - qdma_dev_notify_qdel(rxq->dev, rxq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_CMPT); - } - - if (rxq->sw_ring) - rte_free(rxq->sw_ring); - if (rxq->st_mode) { /** if ST-mode **/ - if (rxq->rx_cmpt_mz) - rte_memzone_free(rxq->rx_cmpt_mz); - } - if (rxq->rx_mz) - rte_memzone_free(rxq->rx_mz); - rte_free(rxq); - PMD_DRV_LOG(INFO, "C2H queue %d removed", rxq->queue_id); - } -} - -/** - * DPDK callback to get the number of receive queue. - * - * @param dev - * Generic pointer to receive queue - * - * @return - * The number of receieve queue count. - */ -uint32_t -qdma_dev_rx_queue_count(void *rx_queue) -{ - struct qdma_rx_queue *rxq = rx_queue; - return rx_queue_count(rxq); -} - -#endif - -#ifdef QDMA_DPDK_20_11 -void qdma_dev_tx_queue_release(void *tqueue) -{ - struct qdma_tx_queue *txq = (struct qdma_tx_queue *)tqueue; - struct qdma_pci_dev *qdma_dev; - if (txq != NULL) { - PMD_DRV_LOG(INFO, "Remove H2C queue: %d", txq->queue_id); - qdma_dev = txq->dev->data->dev_private; - if (!qdma_dev->is_vf) - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_H2C); - else - qdma_dev_notify_qdel(txq->dev, txq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_H2C); - if (txq->sw_ring) - rte_free(txq->sw_ring); - if (txq->tx_mz) - rte_memzone_free(txq->tx_mz); - rte_free(txq); - PMD_DRV_LOG(INFO, "H2C queue %d removed", txq->queue_id); - } -} - -void qdma_dev_rx_queue_release(void *rqueue) -{ - struct qdma_rx_queue *rxq = (struct qdma_rx_queue *)rqueue; - struct qdma_pci_dev *qdma_dev = NULL; - if (rxq != NULL) { - PMD_DRV_LOG(INFO, "Remove C2H queue: %d", rxq->queue_id); - qdma_dev = rxq->dev->data->dev_private; - if (!qdma_dev->is_vf) { - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_C2H); - if (rxq->st_mode) - qdma_dev_decrement_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_CMPT); - } else { - qdma_dev_notify_qdel(rxq->dev, rxq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_C2H); - if (rxq->st_mode) - qdma_dev_notify_qdel(rxq->dev, rxq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_CMPT); - } - if (rxq->sw_ring) - rte_free(rxq->sw_ring); - if (rxq->st_mode) { /** if ST-mode **/ - if (rxq->rx_cmpt_mz) - rte_memzone_free(rxq->rx_cmpt_mz); - } - if (rxq->rx_mz) - rte_memzone_free(rxq->rx_mz); - rte_free(rxq); - PMD_DRV_LOG(INFO, "C2H queue %d removed", rxq->queue_id); - } -} - -/** - * DPDK callback to get the number of used descriptors of a rx queue. - * - * @param dev - * Pointer to Ethernet device structure. - * @param rx_queue_id - * The RX queue on the Ethernet device for which information will be - * retrieved - * - * @return - * The number of used descriptors in the specific queue. - */ -uint32_t -qdma_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id) -{ - return rx_queue_count(dev->data->rx_queues[rx_queue_id]); -} - -#endif - -void rte_pmd_qdma_compat_memzone_reserve_aligned(void) -{ - const struct rte_memzone *mz = 0; - - mz = rte_memzone_reserve_aligned("eth_devices", RTE_MAX_ETHPORTS * - sizeof(*rte_eth_devices), 0, 0, 4096); - - if (mz == NULL) - rte_exit(EXIT_FAILURE, "Failed to allocate aligned memzone\n"); - - memcpy(mz->addr, &rte_eth_devices[0], RTE_MAX_ETHPORTS * - sizeof(*rte_eth_devices)); -} - -void rte_pmd_qdma_get_bdf(uint32_t m_id, uint32_t *bus, - uint32_t *dev, uint32_t *fn) -{ - struct rte_pci_device *pci_dev; - pci_dev = RTE_ETH_DEV_TO_PCI(&rte_eth_devices[m_id]); - *bus = pci_dev->addr.bus; - *dev = pci_dev->addr.devid; - *fn = pci_dev->addr.function; -} - -int rte_pmd_qdma_dev_remove(int port_id) -{ - struct rte_device *dev; - dev = rte_eth_devices[port_id].device; - return rte_dev_remove(dev); -} - -struct rte_device *rte_pmd_qdma_get_device(int port_id) -{ - struct rte_device *dev; - dev = rte_eth_devices[port_id].device; - return dev; -} - -bool rte_pmd_qdma_validate_dev(int port_id) -{ - struct rte_device *device = rte_pmd_qdma_get_device(port_id); - - if (device && ((!strcmp(device->driver->name, "net_qdma")) || - (!strcmp(device->driver->name, "net_qdma_vf")))) - return true; - else - return false; -} - -uint16_t rte_pmd_qdma_get_dev_id(int port_id) -{ - struct rte_pci_device *pci_dev; - pci_dev = RTE_ETH_DEV_TO_PCI(&rte_eth_devices[port_id]); - return pci_dev->id.device_id; -} - -struct rte_pci_device *rte_pmd_qdma_eth_dev_to_pci(int port_id) -{ - return RTE_ETH_DEV_TO_PCI(&rte_eth_devices[port_id]); -} - -unsigned int rte_pmd_qdma_compat_pci_read_reg(int port_id, - unsigned int bar, unsigned int offset) -{ - return qdma_pci_read_reg(&rte_eth_devices[port_id], bar, offset); -} - -void rte_pmd_qdma_compat_pci_write_reg(int port_id, uint32_t bar, - uint32_t offset, uint32_t reg_val) -{ - qdma_pci_write_reg(&rte_eth_devices[port_id], bar, offset, reg_val); -} - -void rte_pmd_qdma_dev_started(int port_id, bool status) -{ - struct rte_eth_dev *dev; - dev = &rte_eth_devices[port_id]; - dev->data->dev_started = status; -} - -int rte_pmd_qdma_dev_fp_ops_config(int port_id) -{ -#if (defined(QDMA_DPDK_21_11) || defined(QDMA_DPDK_22_11)) - struct rte_eth_dev *dev; - struct rte_eth_fp_ops *fpo = rte_eth_fp_ops; - - if (port_id < 0 || port_id >= rte_eth_dev_count_avail()) { - PMD_DRV_LOG(ERR, - "%s:%d Wrong port id %d\n", - __func__, __LINE__, port_id); - return -ENOTSUP; - } - dev = &rte_eth_devices[port_id]; - - fpo[port_id].rx_pkt_burst = dev->rx_pkt_burst; - fpo[port_id].tx_pkt_burst = dev->tx_pkt_burst; - fpo[port_id].rx_queue_count = dev->rx_queue_count; - fpo[port_id].rx_descriptor_status = dev->rx_descriptor_status; - fpo[port_id].tx_descriptor_status = dev->tx_descriptor_status; - fpo[port_id].rxq.data = dev->data->rx_queues; - fpo[port_id].txq.data = dev->data->tx_queues; - - return 0; -#endif - -#ifdef QDMA_DPDK_20_11 - RTE_SET_USED(port_id); - return 0; -#endif -} - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.h b/QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.h deleted file mode 100755 index dfe3586..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_dpdk_compat.h +++ /dev/null @@ -1,118 +0,0 @@ -#ifndef __QDMA_DPDK_COMPAT_H__ -#define __QDMA_DPDK_COMPAT_H__ - -#if (defined(QDMA_DPDK_21_11) || defined(QDMA_DPDK_22_11)) -#include <ethdev_driver.h> -#include <ethdev_pci.h> - -#define ETH_LINK_UP RTE_ETH_LINK_UP -#define ETH_LINK_FULL_DUPLEX RTE_ETH_LINK_FULL_DUPLEX -#define ETH_SPEED_NUM_200G RTE_ETH_SPEED_NUM_200G -#define pci_dev_intr_handle pci_dev->intr_handle -#define qdma_dev_rx_queue_count qdma_dev_rx_queue_count_v2122 -#define qdma_dev_rx_queue_release qdma_dev_rx_queue_release_v2122 -#define qdma_dev_tx_queue_release qdma_dev_tx_queue_release_v2122 - -#ifdef QDMA_DPDK_21_11 -#include <rte_bus_pci.h> -#else //QDMA_DPDK_22_11 -#include <bus_pci_driver.h> -#endif - -/** - * DPDK callback to get the number of rx_queue - * - * @param rx_queue - * Generic recieve queue pointer - * @return - * The number of receive queues - * @ingroup dpdk_devops_func - */ -uint32_t -qdma_dev_rx_queue_count(void *rx_queue); - -/** - * DPDK callback to release a Rx queue. - * - * @param dev - * Pointer to Ethernet device structure - * @param rx_queue_id - * The RX queue on the Ethernet device for which information will be - * retrieved - * - * @ingroup dpdk_devops_func - */ -void qdma_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t queue_id); - -/** - * DPDK callback to release a Tx queue. - * - * @param dev - * Pointer to Ethernet device structure - * @param queue_id - * The Tx queue on the Ethernet device for which information will be - * retrieved - * - * @ingroup dpdk_devops_func - */ - -void qdma_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t queue_id); -#endif - -#ifdef QDMA_DPDK_20_11 - -#include <rte_ethdev_pci.h> -#include <rte_ethdev_driver.h> -#define pci_dev_intr_handle (&pci_dev->intr_handle) -#define qdma_dev_rx_queue_count qdma_dev_rx_queue_count_v2011 -#define qdma_dev_rx_queue_release qdma_dev_rx_queue_release_v2011 -#define qdma_dev_tx_queue_release qdma_dev_tx_queue_release_v2011 - -/** - * DPDK callback to get the number of used descriptors of a rx queue - * - * @param dev - * Pointer to Ethernet device structure - * @param rx_queue_id - * The RX queue on the Ethernet device for which information will be - * retrieved - * - * @return - * The number of used descriptors in the specific queue - * @ingroup dpdk_devops_func - */ -uint32_t -qdma_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id); - -/** - * DPDK callback to release a Tx queue. - * - * This API releases the descriptor rings and any additional memory allocated - * for given H2C queue - * - * @param tqueue: Generic Tx queue pointer - * - * @ingroup dpdk_devops_func - */ -void qdma_dev_tx_queue_release(void *tqueue); - -/** - * DPDK callback to release a Rx queue. - * - * This API releases the descriptor rings and any additional memory allocated - * for given C2H queue - * - * @param rqueue: Generic Rx queue pointer - * - * @ingroup dpdk_devops_func - */ -void qdma_dev_rx_queue_release(void *rqueue); - -#endif - - -#endif /* ifndef __QDMA_DPDK_COMPAT_H__ */ - - - - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_ethdev.c b/QDMA/DPDK/drivers/net/qdma/qdma_ethdev.c deleted file mode 100755 index 6bd6147..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_ethdev.c +++ /dev/null @@ -1,976 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdint.h> -#include <stdbool.h> -#include <sys/mman.h> -#include <sys/fcntl.h> -#include <rte_memzone.h> -#include <rte_string_fns.h> -#include <rte_malloc.h> -#include <rte_dev.h> -#include <rte_pci.h> -#include <rte_ether.h> -#include <rte_ethdev.h> -#include <rte_alarm.h> -#include <rte_cycles.h> -#include <dirent.h> -#include <unistd.h> -#include <string.h> - -#include "qdma.h" -#include "version.h" -#include "qdma_access_common.h" -#include "qdma_access_export.h" -#include "qdma_mbox.h" -#include "qdma_devops.h" - -/* Poll for QDMA errors every 1 second */ -#define QDMA_ERROR_POLL_FRQ (1000000) - -#define PCI_CONFIG_BRIDGE_DEVICE (6) -#define PCI_CONFIG_CLASS_CODE_SHIFT (16) - -#define MAX_PCIE_CAPABILITY (48) - -#ifdef LATENCY_MEASUREMENT -const struct rte_memzone *txq_lat_buf_mz; -const struct rte_memzone *rxq_lat_buf_mz; -double (*h2c_pidx_to_hw_cidx_lat)[LATENCY_CNT] = NULL; -double (*c2h_pidx_to_cmpt_pidx_lat)[LATENCY_CNT] = NULL; -#endif - -static void qdma_device_attributes_get(struct rte_eth_dev *dev); - -/* Poll for any QDMA errors */ -void qdma_check_errors(void *arg) -{ - struct qdma_pci_dev *qdma_dev; - qdma_dev = ((struct rte_eth_dev *)arg)->data->dev_private; - qdma_dev->hw_access->qdma_hw_error_process(arg); - rte_eal_alarm_set(QDMA_ERROR_POLL_FRQ, qdma_check_errors, arg); -} - -/* - * The set of PCI devices this driver supports - */ -static struct rte_pci_id qdma_pci_id_tbl[] = { -#define RTE_PCI_DEV_ID_DECL(vend, dev) {RTE_PCI_DEVICE(vend, dev)}, -#ifndef PCI_VENDOR_ID_XILINX -#define PCI_VENDOR_ID_XILINX 0x10ee -#endif - - /** Gen 1 PF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9011) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9111) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9211) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9311) /** PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9014) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9114) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9214) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9314) /** PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9018) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9118) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9218) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9318) /** PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x901f) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x911f) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x921f) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x931f) /** PF 3 */ - - /** Gen 2 PF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9021) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9121) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9221) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9321) /** PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9024) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9124) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9224) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9324) /** PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9028) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9128) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9228) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9328) /** PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x902f) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x912f) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x922f) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x932f) /** PF 3 */ - - /** Gen 3 PF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9031) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9131) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9231) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9331) /** PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9034) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9134) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9234) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9334) /** PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9038) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9138) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9238) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9338) /** PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x903f) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x913f) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x923f) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x933f) /** PF 3 */ - - /** Gen 4 PF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9041) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9141) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9241) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9341) /** PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9044) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9144) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9244) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9344) /** PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9048) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9148) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9248) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0x9348) /** PF 3 */ - - /** Versal */ - /** Gen 1 PF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb011) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb111) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb211) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb311) /** PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb014) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb114) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb214) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb314) /** PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb018) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb118) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb218) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb318) /** PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb01f) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb11f) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb21f) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb31f) /** PF 3 */ - - /** Gen 2 PF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb021) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb121) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb221) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb321) /** PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb024) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb124) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb224) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb324) /** PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb028) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb128) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb228) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb328) /** PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb02f) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb12f) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb22f) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb32f) /** PF 3 */ - - /** Gen 3 PF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb031) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb131) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb231) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb331) /** PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb034) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb134) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb234) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb334) /** PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb038) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb138) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb238) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb338) /** PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb03f) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb13f) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb23f) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb33f) /** PF 3 */ - - /** Gen 4 PF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb041) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb141) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb241) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb341) /** PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb044) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb144) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb244) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb344) /** PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb048) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb148) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb248) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb348) /** PF 3 */ - - /** Gen 5 PF */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb058) /** PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb158) /** PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb258) /** PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xb358) /** PF 3 */ - - { .vendor_id = 0, /* sentinel */ }, -}; - -static void qdma_device_attributes_get(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev; - - qdma_dev = (struct qdma_pci_dev *)dev->data->dev_private; - qdma_dev->hw_access->qdma_get_device_attributes(dev, - &qdma_dev->dev_cap); - - /* Check DPDK configured queues per port */ - if (qdma_dev->dev_cap.num_qs > RTE_MAX_QUEUES_PER_PORT) - qdma_dev->dev_cap.num_qs = RTE_MAX_QUEUES_PER_PORT; - - PMD_DRV_LOG(INFO, "qmax = %d, mm %d, st %d.\n", - qdma_dev->dev_cap.num_qs, qdma_dev->dev_cap.mm_en, - qdma_dev->dev_cap.st_en); -} - -static inline uint8_t pcie_find_cap(const struct rte_pci_device *pci_dev, - uint8_t cap) -{ - uint8_t pcie_cap_pos = 0; - uint8_t pcie_cap_id = 0; - int ttl = MAX_PCIE_CAPABILITY; - int ret; - - ret = rte_pci_read_config(pci_dev, &pcie_cap_pos, sizeof(uint8_t), - PCI_CAPABILITY_LIST); - if (ret < 0) { - PMD_DRV_LOG(ERR, "PCIe config space read failed..\n"); - return 0; - } - - while (ttl-- && pcie_cap_pos >= PCI_STD_HEADER_SIZEOF) { - pcie_cap_pos &= ~3; - - ret = rte_pci_read_config(pci_dev, - &pcie_cap_id, sizeof(uint8_t), - (pcie_cap_pos + PCI_CAP_LIST_ID)); - if (ret < 0) { - PMD_DRV_LOG(ERR, "PCIe config space read failed..\n"); - return 0; - } - - if (pcie_cap_id == 0xff) - break; - - if (pcie_cap_id == cap) - return pcie_cap_pos; - - ret = rte_pci_read_config(pci_dev, - &pcie_cap_pos, sizeof(uint8_t), - (pcie_cap_pos + PCI_CAP_LIST_NEXT)); - if (ret < 0) { - PMD_DRV_LOG(ERR, "PCIe config space read failed..\n"); - return 0; - } - } - - return 0; -} - -static void pcie_perf_enable(const struct rte_pci_device *pci_dev) -{ - uint16_t value; - uint8_t pcie_cap_pos = pcie_find_cap(pci_dev, PCI_CAP_ID_EXP); - - if (!pcie_cap_pos) - return; - - if (pcie_cap_pos > 0) { - if (rte_pci_read_config(pci_dev, &value, sizeof(uint16_t), - pcie_cap_pos + PCI_EXP_DEVCTL) < 0) { - PMD_DRV_LOG(ERR, "PCIe config space read failed..\n"); - return; - } - - value |= (PCI_EXP_DEVCTL_EXT_TAG | PCI_EXP_DEVCTL_RELAX_EN); - - if (rte_pci_write_config(pci_dev, &value, sizeof(uint16_t), - pcie_cap_pos + PCI_EXP_DEVCTL) < 0) { - PMD_DRV_LOG(ERR, "PCIe config space write failed..\n"); - return; - } - } -} - -/* parse a sysfs file containing one integer value */ -static int parse_sysfs_value(const char *filename, uint32_t *val) -{ - FILE *f; - char buf[BUFSIZ]; - char *end = NULL; - - f = fopen(filename, "r"); - if (f == NULL) { - PMD_DRV_LOG(ERR, "%s(): Failed to open sysfs file %s\n", - __func__, filename); - return -1; - } - - if (fgets(buf, sizeof(buf), f) == NULL) { - PMD_DRV_LOG(ERR, "%s(): Failed to read sysfs value %s\n", - __func__, filename); - fclose(f); - return -1; - } - *val = (uint32_t)strtoul(buf, &end, 0); - if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) { - PMD_DRV_LOG(ERR, "%s(): Failed to parse sysfs value %s\n", - __func__, filename); - fclose(f); - return -1; - } - fclose(f); - return 0; -} - -/* Split up a pci address into its constituent parts. */ -static int parse_pci_addr_format(const char *buf, - int bufsize, struct rte_pci_addr *addr) -{ - /* first split on ':' */ - union splitaddr { - struct { - char *domain; - char *bus; - char *devid; - char *function; - }; - /* last element-separator is "." not ":" */ - char *str[PCI_FMT_NVAL]; - } splitaddr; - - char *buf_copy = strndup(buf, bufsize); - if (buf_copy == NULL) { - PMD_DRV_LOG(ERR, "Failed to get pci address duplicate copy\n"); - return -1; - } - - if (rte_strsplit(buf_copy, bufsize, splitaddr.str, PCI_FMT_NVAL, ':') - != PCI_FMT_NVAL - 1) { - PMD_DRV_LOG(ERR, "Failed to split pci address string\n"); - goto error; - } - - /* final split is on '.' between devid and function */ - splitaddr.function = strchr(splitaddr.devid, '.'); - if (splitaddr.function == NULL) { - PMD_DRV_LOG(ERR, "Failed to split pci devid and function\n"); - goto error; - } - *splitaddr.function++ = '\0'; - - /* now convert to int values */ - addr->domain = strtoul(splitaddr.domain, NULL, 16); - addr->bus = strtoul(splitaddr.bus, NULL, 16); - addr->devid = strtoul(splitaddr.devid, NULL, 16); - addr->function = strtoul(splitaddr.function, NULL, 10); - - free(buf_copy); /* free the copy made with strdup */ - return 0; - -error: - free(buf_copy); - return -1; -} - -/* Get max pci bus number from the corresponding pci bridge device */ -static int get_max_pci_bus_num(uint8_t start_bus, uint8_t *end_bus) -{ - char dirname[PATH_MAX]; - char filename[PATH_MAX]; - char cfgname[PATH_MAX]; - struct rte_pci_addr addr; - struct dirent *dp; - uint32_t pci_class_code; - uint8_t sec_bus_num, sub_bus_num; - DIR *dir; - int ret, fd; - - /* Initialize end bus number to zero */ - *end_bus = 0; - - /* Open pci devices directory */ - dir = opendir(rte_pci_get_sysfs_path()); - if (dir == NULL) { - PMD_DRV_LOG(ERR, "%s(): opendir failed\n", - __func__); - return -1; - } - - while ((dp = readdir(dir)) != NULL) { - if (dp->d_name[0] == '.') - continue; - - /* Split pci address to get bus, devid and function numbers */ - if (parse_pci_addr_format(dp->d_name, - sizeof(dp->d_name), &addr) != 0) - continue; - - snprintf(dirname, sizeof(dirname), "%s/%s", - rte_pci_get_sysfs_path(), dp->d_name); - - /* get class code */ - snprintf(filename, sizeof(filename), "%s/class", dirname); - if (parse_sysfs_value(filename, &pci_class_code) < 0) { - PMD_DRV_LOG(ERR, "Failed to get pci class code\n"); - goto error; - } - - /* Get max pci number from pci bridge device */ - if ((((pci_class_code >> PCI_CONFIG_CLASS_CODE_SHIFT) & 0xFF) == - PCI_CONFIG_BRIDGE_DEVICE)) { - snprintf(cfgname, sizeof(cfgname), - "%s/config", dirname); - fd = open(cfgname, O_RDWR); - if (fd < 0) { - PMD_DRV_LOG(ERR, "Failed to open %s\n", - cfgname); - goto error; - } - - /* get secondary bus number */ - ret = pread(fd, &sec_bus_num, sizeof(uint8_t), - PCI_SECONDARY_BUS); - if (ret == -1) { - PMD_DRV_LOG(ERR, "Failed to read secondary bus number\n"); - close(fd); - goto error; - } - - /* get subordinate bus number */ - ret = pread(fd, &sub_bus_num, sizeof(uint8_t), - PCI_SUBORDINATE_BUS); - if (ret == -1) { - PMD_DRV_LOG(ERR, "Failed to read subordinate bus number\n"); - close(fd); - goto error; - } - - /* Get max bus number by checking if given bus number - * falls in between secondary and subordinate bus - * numbers of this pci bridge device. - */ - if ((start_bus >= sec_bus_num) && - (start_bus <= sub_bus_num)) { - *end_bus = sub_bus_num; - close(fd); - closedir(dir); - return 0; - } - - close(fd); - } - } - -error: - closedir(dir); - return -1; -} - -/** - * DPDK callback to register a PCI device. - * - * This function creates an Ethernet device for each port of a given - * PCI device. - * - * @param[in] dev - * Pointer to Ethernet device structure. - * - * @return - * 0 on success, negative errno value on failure. - */ -int qdma_eth_dev_init(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *dma_priv; - uint8_t *baseaddr; - int i, idx, ret, qbase; - struct rte_pci_device *pci_dev; - uint16_t num_vfs; - uint8_t max_pci_bus = 0; - - /* sanity checks */ - if (dev == NULL) - return -EINVAL; - if (dev->data == NULL) - return -EINVAL; - if (dev->data->dev_private == NULL) - return -EINVAL; - - pci_dev = RTE_ETH_DEV_TO_PCI(dev); - if (pci_dev == NULL) - return -EINVAL; - - /* for secondary processes, we don't initialise any further as primary - * has already done this work. - */ - if (rte_eal_process_type() != RTE_PROC_PRIMARY) { - qdma_dev_ops_init(dev); - return 0; - } - - /* allocate space for a single Ethernet MAC address */ - dev->data->mac_addrs = rte_zmalloc("qdma", RTE_ETHER_ADDR_LEN * 1, 0); - if (dev->data->mac_addrs == NULL) - return -ENOMEM; - - /* Copy some dummy Ethernet MAC address for QDMA device - * This will change in real NIC device... - */ - for (i = 0; i < RTE_ETHER_ADDR_LEN; ++i) - dev->data->mac_addrs[0].addr_bytes[i] = 0x15 + i; - - /* Init system & device */ - dma_priv = (struct qdma_pci_dev *)dev->data->dev_private; - dma_priv->is_vf = 0; - dma_priv->is_master = 0; - dma_priv->vf_online_count = 0; - dma_priv->timer_count = DEFAULT_TIMER_CNT_TRIG_MODE_TIMER; - - dma_priv->en_desc_prefetch = 0; //Keep prefetch default to 0 - dma_priv->cmpt_desc_len = DEFAULT_QDMA_CMPT_DESC_LEN; - dma_priv->c2h_bypass_mode = RTE_PMD_QDMA_RX_BYPASS_NONE; - dma_priv->h2c_bypass_mode = 0; - - dma_priv->config_bar_idx = DEFAULT_PF_CONFIG_BAR; - dma_priv->bypass_bar_idx = BAR_ID_INVALID; - dma_priv->user_bar_idx = BAR_ID_INVALID; - - /* Check and handle device devargs*/ - if (qdma_check_kvargs(dev->device->devargs, dma_priv)) { - PMD_DRV_LOG(INFO, "devargs failed\n"); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - /* Store BAR address and length of Config BAR */ - baseaddr = (uint8_t *) - pci_dev->mem_resource[dma_priv->config_bar_idx].addr; - dma_priv->bar_addr[dma_priv->config_bar_idx] = baseaddr; - - /*Assigning QDMA access layer function pointers based on the HW design*/ - dma_priv->hw_access = rte_zmalloc("hwaccess", - sizeof(struct qdma_hw_access), 0); - if (dma_priv->hw_access == NULL) { - rte_free(dev->data->mac_addrs); - return -ENOMEM; - } - idx = qdma_hw_access_init(dev, dma_priv->is_vf, dma_priv->hw_access); - if (idx < 0) { - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - idx = qdma_get_hw_version(dev); - if (idx < 0) { - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - idx = qdma_identify_bars(dev); - if (idx < 0) { - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - /* Store BAR address and length of AXI Master Lite BAR(user bar) */ - if (dma_priv->user_bar_idx >= 0) { - baseaddr = (uint8_t *) - pci_dev->mem_resource[dma_priv->user_bar_idx].addr; - dma_priv->bar_addr[dma_priv->user_bar_idx] = baseaddr; - } - - PMD_DRV_LOG(INFO, "QDMA device driver probe:"); - - qdma_dev_ops_init(dev); - - /* Getting the device attributes from the Hardware */ - qdma_device_attributes_get(dev); - - /* Setting default Mode to RTE_PMD_QDMA_TRIG_MODE_USER_TIMER */ - dma_priv->trigger_mode = RTE_PMD_QDMA_TRIG_MODE_USER_TIMER; - - /* Create master resource node for queue management on the given - * bus number. Node will be created only once per bus number. - */ - qbase = DEFAULT_QUEUE_BASE; - - ret = get_max_pci_bus_num(pci_dev->addr.bus, &max_pci_bus); - if ((ret != QDMA_SUCCESS) && !max_pci_bus) { - PMD_DRV_LOG(ERR, "Failed to get max pci bus number\n"); - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - PMD_DRV_LOG(INFO, "PCI max bus number : 0x%x", max_pci_bus); - - ret = qdma_master_resource_create(pci_dev->addr.bus, max_pci_bus, - qbase, dma_priv->dev_cap.num_qs, - &dma_priv->dma_device_index); - if (ret == -QDMA_ERR_NO_MEM) { - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -ENOMEM; - } - - dma_priv->hw_access->qdma_get_function_number(dev, - &dma_priv->func_id); - PMD_DRV_LOG(INFO, "PF function ID: %d", dma_priv->func_id); - - /* CSR programming is done once per given board or bus number, - * done by the master PF - */ - if (ret == QDMA_SUCCESS) { - RTE_LOG(INFO, PMD, "QDMA PMD VERSION: %s\n", QDMA_PMD_VERSION); - dma_priv->hw_access->qdma_set_default_global_csr(dev); - for (i = 0; i < dma_priv->dev_cap.mm_channel_max; i++) { - if (dma_priv->dev_cap.mm_en) { - /* Enable MM C2H Channel */ - dma_priv->hw_access->qdma_mm_channel_conf(dev, - i, 1, 1); - /* Enable MM H2C Channel */ - dma_priv->hw_access->qdma_mm_channel_conf(dev, - i, 0, 1); - } else { - /* Disable MM C2H Channel */ - dma_priv->hw_access->qdma_mm_channel_conf(dev, - i, 1, 0); - /* Disable MM H2C Channel */ - dma_priv->hw_access->qdma_mm_channel_conf(dev, - i, 0, 0); - } - } - - ret = dma_priv->hw_access->qdma_init_ctxt_memory(dev); - if (ret < 0) { - PMD_DRV_LOG(ERR, - "%s: Failed to initialize ctxt memory, err = %d\n", - __func__, ret); - return -EINVAL; - } - -#ifdef TANDEM_BOOT_SUPPORTED - if (dma_priv->en_st_mode) { - ret = dma_priv->hw_access->qdma_init_st_ctxt(dev); - if (ret < 0) { - PMD_DRV_LOG(ERR, - "%s: Failed to initialize st ctxt memory, err = %d\n", - __func__, ret); - return -EINVAL; - } - } -#endif - dma_priv->hw_access->qdma_hw_error_enable(dev, - dma_priv->hw_access->qdma_max_errors); - if (ret < 0) { - PMD_DRV_LOG(ERR, - "%s: Failed to enable hw errors, err = %d\n", - __func__, ret); - return -EINVAL; - } - - rte_eal_alarm_set(QDMA_ERROR_POLL_FRQ, qdma_check_errors, - (void *)dev); - dma_priv->is_master = 1; - } - - /* - * Create an entry for the device in board list if not already - * created - */ - ret = qdma_dev_entry_create(dma_priv->dma_device_index, - dma_priv->func_id); - if ((ret != QDMA_SUCCESS) && - (ret != -QDMA_ERR_RM_DEV_EXISTS)) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) qdma_dev_entry_create failed: %d\n", - dma_priv->func_id, ret); - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -ENOMEM; - } - - pcie_perf_enable(pci_dev); - if (dma_priv->dev_cap.mailbox_en && pci_dev->max_vfs) - qdma_mbox_init(dev); - - if (!dma_priv->reset_in_progress) { - num_vfs = pci_dev->max_vfs; - if (num_vfs) { - dma_priv->vfinfo = rte_zmalloc("vfinfo", - sizeof(struct qdma_vf_info) * num_vfs, 0); - if (dma_priv->vfinfo == NULL) - rte_panic("Cannot allocate memory for private VF info\n"); - - /* Mark all VFs with invalid function id mapping*/ - for (i = 0; i < num_vfs; i++) - dma_priv->vfinfo[i].func_id = - QDMA_FUNC_ID_INVALID; - } - } - -#ifdef LATENCY_MEASUREMENT - /* Create txq and rxq latency measurement shared memory - * if not already created by the VF - */ - if (!h2c_pidx_to_hw_cidx_lat) { - /* Create a shared memory zone for the txq latency buffer */ - txq_lat_buf_mz = rte_memzone_reserve("TXQ_LAT_BUFFER_ZONE", - LATENCY_MAX_QUEUES * LATENCY_CNT * sizeof(double), - rte_socket_id(), 0); - if (txq_lat_buf_mz == NULL) { - PMD_DRV_LOG(ERR, - "Failed to allocate txq latency buffer memzone\n"); - return -1; - } - - /* Get the virtual address of the txq latency buffer */ - h2c_pidx_to_hw_cidx_lat = - (double(*)[LATENCY_CNT])txq_lat_buf_mz->addr; - } - - if (!c2h_pidx_to_cmpt_pidx_lat) { - /* Create a shared memory zone for the rxq latency buffer */ - rxq_lat_buf_mz = rte_memzone_reserve("RXQ_LAT_BUFFER_ZONE", - LATENCY_MAX_QUEUES * LATENCY_CNT * sizeof(double), - rte_socket_id(), 0); - if (rxq_lat_buf_mz == NULL) { - PMD_DRV_LOG(ERR, - "Failed to allocate rxq latency buffer memzone\n"); - return -1; - } - - /* Get the virtual address of the rxq latency buffer */ - c2h_pidx_to_cmpt_pidx_lat = - (double(*)[LATENCY_CNT])rxq_lat_buf_mz->addr; - } -#endif - - dma_priv->reset_in_progress = 0; - - return 0; -} - -/** - * DPDK callback to deregister PCI device. - * - * @param[in] dev - * Pointer to Ethernet device structure. - * - * @return - * 0 on success, negative errno value on failure. - */ -int qdma_eth_dev_uninit(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - struct qdma_mbox_msg *m = NULL; - int i, rv; - - /* only uninitialize in the primary process */ - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return -EPERM; - - if (qdma_dev->vf_online_count) { - for (i = 0; i < pci_dev->max_vfs; i++) { - if (qdma_dev->vfinfo[i].func_id == QDMA_FUNC_ID_INVALID) - continue; - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - if (!qdma_dev->reset_in_progress) - qdma_mbox_compose_pf_offline(m->raw_data, - qdma_dev->func_id, - qdma_dev->vfinfo[i].func_id); - else - qdma_mbox_compose_vf_reset_message(m->raw_data, - qdma_dev->func_id, - qdma_dev->vfinfo[i].func_id); - rv = qdma_mbox_msg_send(dev, m, 0); - if (rv < 0) - PMD_DRV_LOG(ERR, "Send bye failed from PF:%d to VF:%d\n", - qdma_dev->func_id, - qdma_dev->vfinfo[i].func_id); - } - - PMD_DRV_LOG(INFO, - "%s: Wait till all VFs shutdown for PF-%d(DEVFN)\n", - __func__, qdma_dev->func_id); - - i = 0; - while (i < SHUTDOWN_TIMEOUT) { - if (!qdma_dev->vf_online_count) { - PMD_DRV_LOG(INFO, - "%s: VFs shutdown completed for PF-%d(DEVFN)\n", - __func__, qdma_dev->func_id); - break; - } - rte_delay_ms(1); - i++; - } - - if (i >= SHUTDOWN_TIMEOUT) { - PMD_DRV_LOG(ERR, "%s: Failed VFs shutdown for PF-%d(DEVFN)\n", - __func__, qdma_dev->func_id); - } - } - - if (qdma_dev->dev_configured) - qdma_dev_close(dev); - - if (qdma_dev->dev_cap.mailbox_en && pci_dev->max_vfs) - qdma_mbox_uninit(dev); - - /* cancel pending polls*/ - if (qdma_dev->is_master) - rte_eal_alarm_cancel(qdma_check_errors, (void *)dev); - - /* Remove the device node from the board list */ - qdma_dev_entry_destroy(qdma_dev->dma_device_index, - qdma_dev->func_id); - qdma_master_resource_destroy(qdma_dev->dma_device_index); - - dev->dev_ops = NULL; - dev->rx_pkt_burst = NULL; - dev->tx_pkt_burst = NULL; - dev->data->nb_rx_queues = 0; - dev->data->nb_tx_queues = 0; - - if (!qdma_dev->reset_in_progress && - qdma_dev->vfinfo != NULL) { - rte_free(qdma_dev->vfinfo); - qdma_dev->vfinfo = NULL; - } - - if (dev->data->mac_addrs != NULL) { - rte_free(dev->data->mac_addrs); - dev->data->mac_addrs = NULL; - } - - if (qdma_dev->q_info != NULL) { - rte_free(qdma_dev->q_info); - qdma_dev->q_info = NULL; - } - - if (qdma_dev->hw_access != NULL) { - rte_free(qdma_dev->hw_access); - qdma_dev->hw_access = NULL; - } - -#ifdef LATENCY_MEASUREMENT - rte_memzone_free(txq_lat_buf_mz); - rte_memzone_free(rxq_lat_buf_mz); -#endif - - return 0; -} - -static int eth_qdma_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, - struct rte_pci_device *pci_dev) -{ - return rte_eth_dev_pci_generic_probe(pci_dev, - sizeof(struct qdma_pci_dev), - qdma_eth_dev_init); -} - -/* Detach a ethdev interface */ -static int eth_qdma_pci_remove(struct rte_pci_device *pci_dev) -{ - return rte_eth_dev_pci_generic_remove(pci_dev, qdma_eth_dev_uninit); -} - -static struct rte_pci_driver rte_qdma_pmd = { - .id_table = qdma_pci_id_tbl, - .drv_flags = RTE_PCI_DRV_NEED_MAPPING, - .probe = eth_qdma_pci_probe, - .remove = eth_qdma_pci_remove, -}; - -bool -is_pf_device_supported(struct rte_eth_dev *dev) -{ - if (strcmp(dev->device->driver->name, rte_qdma_pmd.driver.name)) - return false; - - return true; -} - -bool is_qdma_supported(struct rte_eth_dev *dev) -{ - bool is_pf, is_vf; - - is_pf = is_pf_device_supported(dev); - is_vf = is_vf_device_supported(dev); - - if (!is_pf && !is_vf) - return false; - - return true; -} - -RTE_PMD_REGISTER_PCI(net_qdma, rte_qdma_pmd); -RTE_PMD_REGISTER_PCI_TABLE(net_qdma, qdma_pci_id_tbl); diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_log.h b/QDMA/DPDK/drivers/net/qdma/qdma_log.h deleted file mode 100755 index 6851db7..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_log.h +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_LOG_H__ -#define __QDMA_LOG_H__ - -#include <rte_log.h> - -#ifdef RTE_LIBRTE_QDMA_DEBUG_DRIVER -#define PMD_DRV_LOG(level, fmt, args...) \ - RTE_LOG(level, PMD, "%s(): " fmt "\n", __func__, ## args) -#else -#define PMD_DRV_LOG(level, fmt, args...) do { } while (0) -#endif - - -#endif /* ifndef __QDMA_LOG_H__ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_mbox.c b/QDMA/DPDK/drivers/net/qdma/qdma_mbox.c deleted file mode 100755 index e1cd2a5..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_mbox.c +++ /dev/null @@ -1,424 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma.h" -#include "qdma_mbox.h" -#include <rte_malloc.h> -#include <rte_spinlock.h> -#include <rte_alarm.h> - -/* - * Get index from VF info array of PF device for a given VF funcion id. - */ -static int qdma_get_internal_vf_index(struct rte_eth_dev *dev, uint8_t devfn) -{ - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint16_t i; - - for (i = 0; i < pci_dev->max_vfs; i++) { - if (qdma_dev->vfinfo[i].func_id == devfn) - return i; - } - - return QDMA_FUNC_ID_INVALID; -} - -static void qdma_mbox_process_msg_from_vf(void *arg) -{ - struct qdma_mbox_msg *mbox_msg_rsp = qdma_mbox_msg_alloc(); - struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - uint16_t vf_func_id; - uint16_t vf_index; - int i, rv; - - if (mbox_msg_rsp == NULL) - return; - - if (!qdma_dev) - return; - - rv = qdma_mbox_pf_rcv_msg_handler(dev, - qdma_dev->dma_device_index, - qdma_dev->func_id, - qdma_dev->mbox.rx_data, - mbox_msg_rsp->raw_data); - if (rv != QDMA_MBOX_VF_OFFLINE && - rv != QDMA_MBOX_VF_RESET && - rv != QDMA_MBOX_PF_RESET_DONE && - rv != QDMA_MBOX_PF_BYE) - qdma_mbox_msg_send(dev, mbox_msg_rsp, 0); - else - qdma_mbox_msg_free(mbox_msg_rsp); - - if (rv == QDMA_MBOX_VF_ONLINE) { - vf_func_id = qdma_mbox_vf_func_id_get(qdma_dev->mbox.rx_data, - qdma_dev->is_vf); - /* Mapping internal VF function id to a valid VF function id */ - for (i = 0; i < pci_dev->max_vfs; i++) { - if (qdma_dev->vfinfo[i].func_id == - QDMA_FUNC_ID_INVALID) { - qdma_dev->vfinfo[i].func_id = - vf_func_id; - break; - } - } - - if (i == pci_dev->max_vfs) { - PMD_DRV_LOG(INFO, "PF-%d failed to create function id mapping VF func_id%d", - qdma_dev->func_id, vf_func_id); - return; - } - - qdma_dev->vf_online_count++; - } else if (rv == QDMA_MBOX_VF_OFFLINE) { - if (!qdma_dev->reset_in_progress) { - vf_func_id = - qdma_mbox_vf_func_id_get(qdma_dev->mbox.rx_data, - qdma_dev->is_vf); - vf_index = qdma_get_internal_vf_index(dev, vf_func_id); - if (vf_index != QDMA_FUNC_ID_INVALID) - qdma_dev->vfinfo[vf_index].func_id = - QDMA_FUNC_ID_INVALID; - } - qdma_dev->vf_online_count--; - } -} - -static void *qdma_reset_task(void *arg) -{ - struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - if (!qdma_dev) - return NULL; - - rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET, - NULL); - - return NULL; -} - -static void *qdma_remove_task(void *arg) -{ - struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - if (!qdma_dev) - return NULL; - - rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RMV, - NULL); - - return NULL; -} - -static void qdma_mbox_process_msg_from_pf(void *arg) -{ - struct qdma_mbox_msg *mbox_msg_rsp = NULL; - struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - pthread_t thread; - pthread_attr_t tattr; - int rv; - - if (!qdma_dev) - return; - - mbox_msg_rsp = qdma_mbox_msg_alloc(); - if (!mbox_msg_rsp) - return; - - rv = qdma_mbox_vf_rcv_msg_handler(qdma_dev->mbox.rx_data, - mbox_msg_rsp->raw_data); - if (rv) - qdma_mbox_msg_send(dev, mbox_msg_rsp, 0); - else { - qdma_mbox_msg_free(mbox_msg_rsp); - return; - } - - if (rv == QDMA_MBOX_VF_RESET) { - qdma_dev->reset_state = RESET_STATE_RECV_PF_RESET_REQ; - - rv = pthread_attr_init(&tattr); - if (rv) - PMD_DRV_LOG(ERR, - "Failed pthread_attr_init for PF reset\n"); - - rv = pthread_attr_setdetachstate(&tattr, - PTHREAD_CREATE_DETACHED); - if (rv) - PMD_DRV_LOG(ERR, - "Failed pthread_attr_setdetachstate for PF reset\n"); - - if (pthread_create(&thread, NULL, - qdma_reset_task, (void *)dev)) { - PMD_DRV_LOG(ERR, "Could not create qdma reset" - " starter thread\n"); - } - } else if (rv == QDMA_MBOX_PF_RESET_DONE) { - qdma_dev->reset_state = RESET_STATE_RECV_PF_RESET_DONE; - } else if (rv == QDMA_MBOX_PF_BYE) { - rv = pthread_attr_init(&tattr); - if (rv) - PMD_DRV_LOG(ERR, - "Failed pthread_attr_init for PF shutdown\n"); - - rv = pthread_attr_setdetachstate(&tattr, - PTHREAD_CREATE_DETACHED); - if (rv) - PMD_DRV_LOG(ERR, - "Failed pthread_attr_setdetachstate for PF shutdown\n"); - - if (pthread_create(&thread, NULL, - qdma_remove_task, (void *)dev)) { - PMD_DRV_LOG(ERR, - "Could not create qdma remove" - " starter thread\n"); - } - } -} - -static void qdma_mbox_process_rsp_from_pf(void *arg) -{ - struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_list_head *entry = NULL; - struct qdma_list_head *tmp = NULL; - - if (!qdma_dev) - return; - - if ((qdma_dev->is_vf) && (qdma_dev->func_id == 0)) { - qdma_dev->func_id = - qdma_mbox_vf_func_id_get(qdma_dev->mbox.rx_data, - qdma_dev->is_vf); - PMD_DRV_LOG(INFO, "VF function ID: %d", qdma_dev->func_id); - } - - rte_spinlock_lock(&qdma_dev->mbox.list_lock); - qdma_list_for_each_safe(entry, tmp, - &qdma_dev->mbox.rx_pend_list) { - struct qdma_mbox_msg *msg = QDMA_LIST_GET_DATA(entry); - - if (qdma_mbox_is_msg_response(msg->raw_data, - qdma_dev->mbox.rx_data)) { - /* copy response message back to tx buffer */ - memcpy(msg->raw_data, qdma_dev->mbox.rx_data, - MBOX_MSG_REG_MAX * sizeof(uint32_t)); - msg->rsp_rcvd = 1; - qdma_list_del(entry); - break; - } - } - rte_spinlock_unlock(&qdma_dev->mbox.list_lock); -} - -static void qdma_mbox_rcv_task(void *arg) -{ - struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - int rv; - - if (!qdma_dev) - return; - - do { - memset(qdma_dev->mbox.rx_data, 0, - MBOX_MSG_REG_MAX * sizeof(uint32_t)); - rv = qdma_mbox_rcv(dev, qdma_dev->is_vf, - qdma_dev->mbox.rx_data); - if (rv < 0) - break; - if (qdma_dev->is_vf) { - qdma_mbox_process_msg_from_pf(arg); - qdma_mbox_process_rsp_from_pf(arg); - } else - qdma_mbox_process_msg_from_vf(arg); - - } while (1); - - if (!qdma_dev->dev_cap.mailbox_intr) - rte_eal_alarm_set(MBOX_POLL_FRQ, qdma_mbox_rcv_task, arg); -} - -static void qdma_mbox_send_task(void *arg) -{ - struct rte_eth_dev *dev = (struct rte_eth_dev *)arg; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_list_head *entry = NULL; - struct qdma_list_head *tmp = NULL; - int rv; - - rte_spinlock_lock(&qdma_dev->mbox.list_lock); - qdma_list_for_each_safe(entry, tmp, &qdma_dev->mbox.tx_todo_list) { - struct qdma_mbox_msg *msg = QDMA_LIST_GET_DATA(entry); - - rv = qdma_mbox_send(dev, qdma_dev->is_vf, msg->raw_data); - if (rv < 0) { - msg->retry_cnt--; - if (!msg->retry_cnt) { - qdma_list_del(entry); - if (msg->rsp_wait == QDMA_MBOX_RSP_NO_WAIT) - qdma_mbox_msg_free(msg); - } - } else { - qdma_list_del(entry); - if (msg->rsp_wait == QDMA_MBOX_RSP_WAIT) - qdma_list_add_tail(entry, - &qdma_dev->mbox.rx_pend_list); - else - qdma_mbox_msg_free(msg); - } - } - if (!qdma_list_is_empty(&qdma_dev->mbox.tx_todo_list)) - rte_eal_alarm_set(MBOX_POLL_FRQ, qdma_mbox_send_task, arg); - rte_spinlock_unlock(&qdma_dev->mbox.list_lock); -} - -int qdma_mbox_msg_send(struct rte_eth_dev *dev, struct qdma_mbox_msg *msg, - unsigned int timeout_ms) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - if (!msg) - return -EINVAL; - - msg->retry_cnt = timeout_ms ? ((timeout_ms / MBOX_POLL_FRQ) + 1) : - MBOX_SEND_RETRY_COUNT; - QDMA_LIST_SET_DATA(&msg->node, msg); - - rte_spinlock_lock(&qdma_dev->mbox.list_lock); - qdma_list_add_tail(&msg->node, &qdma_dev->mbox.tx_todo_list); - rte_spinlock_unlock(&qdma_dev->mbox.list_lock); - - msg->rsp_wait = (!timeout_ms) ? QDMA_MBOX_RSP_NO_WAIT : - QDMA_MBOX_RSP_WAIT; - rte_eal_alarm_set(MBOX_POLL_FRQ, qdma_mbox_send_task, dev); - - if (!timeout_ms) - return 0; - - /* if code reached here, caller should free the buffer */ - while (msg->retry_cnt && !msg->rsp_rcvd) - rte_delay_ms(1); - - if (!msg->rsp_rcvd) - return -EPIPE; - - return 0; -} - -void *qdma_mbox_msg_alloc(void) -{ - return rte_zmalloc(NULL, sizeof(struct qdma_mbox_msg), 0); -} - -void qdma_mbox_msg_free(void *buffer) -{ - rte_free(buffer); -} - -int qdma_mbox_init(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - uint32_t raw_data[MBOX_MSG_REG_MAX] = {0}; - struct rte_intr_handle *intr_handle = pci_dev_intr_handle; - - if (!qdma_dev->is_vf) { - int i; - - for (i = 0; i < pci_dev->max_vfs; i++) - qdma_mbox_rcv(dev, 0, raw_data); - } else - qdma_mbox_rcv(dev, 1, raw_data); - - qdma_mbox_hw_init(dev, qdma_dev->is_vf); - qdma_list_init_head(&qdma_dev->mbox.tx_todo_list); - qdma_list_init_head(&qdma_dev->mbox.rx_pend_list); - rte_spinlock_init(&qdma_dev->mbox.list_lock); - - if (qdma_dev->dev_cap.mailbox_intr) { - /* Register interrupt call back handler */ - rte_intr_callback_register(intr_handle, - qdma_mbox_rcv_task, dev); - - /* enable uio/vfio intr/eventfd mapping */ - rte_intr_enable(intr_handle); - - /* enable qdma mailbox interrupt */ - qdma_mbox_enable_interrupts((void *)dev, qdma_dev->is_vf); - } else { - rte_eal_alarm_set(MBOX_POLL_FRQ, qdma_mbox_rcv_task, - (void *)dev); - } - - return 0; -} - -void qdma_mbox_uninit(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - struct rte_intr_handle *intr_handle = pci_dev_intr_handle; - - do { - rte_spinlock_lock(&qdma_dev->mbox.list_lock); - if (!qdma_list_is_empty(&qdma_dev->mbox.tx_todo_list)) { - rte_spinlock_unlock(&qdma_dev->mbox.list_lock); - rte_delay_ms(100); - continue; - } - rte_spinlock_unlock(&qdma_dev->mbox.list_lock); - break; - } while (1); - - rte_eal_alarm_cancel(qdma_mbox_send_task, (void *)dev); - if (qdma_dev->dev_cap.mailbox_intr) { - /* Disable the mailbox interrupt */ - qdma_mbox_disable_interrupts((void *)dev, qdma_dev->is_vf); - - /* Disable uio intr before callback unregister */ - rte_intr_disable(intr_handle); - - rte_intr_callback_unregister(intr_handle, - qdma_mbox_rcv_task, dev); - } else { - rte_eal_alarm_cancel(qdma_mbox_rcv_task, (void *)dev); - } -} - diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_mbox.h b/QDMA/DPDK/drivers/net/qdma/qdma_mbox.h deleted file mode 100755 index d861342..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_mbox.h +++ /dev/null @@ -1,75 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef QDMA_DPDK_MBOX_H_ -#define QDMA_DPDK_MBOX_H_ - -#include "qdma_list.h" -#include "qdma_mbox_protocol.h" -#include <rte_ethdev.h> - -#define MBOX_POLL_FRQ 1000 -#define MBOX_OP_RSP_TIMEOUT (10000 * MBOX_POLL_FRQ) /* 10 sec */ -#define MBOX_SEND_RETRY_COUNT (MBOX_OP_RSP_TIMEOUT/MBOX_POLL_FRQ) - -enum qdma_mbox_rsp_state { - QDMA_MBOX_RSP_NO_WAIT, - QDMA_MBOX_RSP_WAIT -}; - -struct qdma_dev_mbox { - struct qdma_list_head tx_todo_list; - struct qdma_list_head rx_pend_list; - rte_spinlock_t list_lock; - uint32_t rx_data[MBOX_MSG_REG_MAX]; -}; - -struct qdma_mbox_msg { - uint8_t rsp_rcvd; - uint32_t retry_cnt; - enum qdma_mbox_rsp_state rsp_wait; - uint32_t raw_data[MBOX_MSG_REG_MAX]; - struct qdma_list_head node; -}; - -int qdma_mbox_init(struct rte_eth_dev *dev); -void qdma_mbox_uninit(struct rte_eth_dev *dev); -void *qdma_mbox_msg_alloc(void); -void qdma_mbox_msg_free(void *buffer); -int qdma_mbox_msg_send(struct rte_eth_dev *dev, struct qdma_mbox_msg *msg, - unsigned int timeout_ms); -int qdma_dev_notify_qadd(struct rte_eth_dev *dev, uint32_t qidx_hw, - enum qdma_dev_q_type q_type); -int qdma_dev_notify_qdel(struct rte_eth_dev *dev, uint32_t qidx_hw, - enum qdma_dev_q_type q_type); - -#endif /* QDMA_DPDK_MBOX_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_platform.c b/QDMA/DPDK/drivers/net/qdma/qdma_platform.c deleted file mode 100755 index 9abe8f6..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_platform.c +++ /dev/null @@ -1,264 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "qdma_access_common.h" -#include "qdma_platform.h" -#include "rte_pmd_qdma.h" -#include "qdma.h" -#include <rte_malloc.h> -#include <rte_spinlock.h> - -static rte_spinlock_t resource_lock = RTE_SPINLOCK_INITIALIZER; -static rte_spinlock_t reg_access_lock = RTE_SPINLOCK_INITIALIZER; - -struct err_code_map error_code_map_list[] = { - {QDMA_SUCCESS, 0}, - {QDMA_ERR_INV_PARAM, EINVAL}, - {QDMA_ERR_NO_MEM, ENOMEM}, - {QDMA_ERR_HWACC_BUSY_TIMEOUT, EBUSY}, - {QDMA_ERR_HWACC_INV_CONFIG_BAR, EINVAL}, - {QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR, EINVAL}, - {QDMA_ERR_HWACC_BAR_NOT_FOUND, EINVAL}, - {QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED, EINVAL}, - {QDMA_ERR_RM_RES_EXISTS, EPERM}, - {QDMA_ERR_RM_RES_NOT_EXISTS, EINVAL}, - {QDMA_ERR_RM_DEV_EXISTS, EPERM}, - {QDMA_ERR_RM_DEV_NOT_EXISTS, EINVAL}, - {QDMA_ERR_RM_NO_QUEUES_LEFT, EPERM}, - {QDMA_ERR_RM_QMAX_CONF_REJECTED, EPERM}, - {QDMA_ERR_MBOX_FMAP_WR_FAILED, EIO}, - {QDMA_ERR_MBOX_NUM_QUEUES, EINVAL}, - {QDMA_ERR_MBOX_INV_QID, EINVAL}, - {QDMA_ERR_MBOX_INV_RINGSZ, EINVAL}, - {QDMA_ERR_MBOX_INV_BUFSZ, EINVAL}, - {QDMA_ERR_MBOX_INV_CNTR_TH, EINVAL}, - {QDMA_ERR_MBOX_INV_TMR_TH, EINVAL}, - {QDMA_ERR_MBOX_INV_MSG, EINVAL}, - {QDMA_ERR_MBOX_SEND_BUSY, EBUSY}, - {QDMA_ERR_MBOX_NO_MSG_IN, EINVAL}, - {QDMA_ERR_MBOX_ALL_ZERO_MSG, EINVAL}, -}; - -/*****************************************************************************/ -/** - * qdma_calloc(): allocate memory and initialize with 0 - * - * @num_blocks: number of blocks of contiguous memory of @size - * @size: size of each chunk of memory - * - * Return: pointer to the memory block created on success and NULL on failure - *****************************************************************************/ -void *qdma_calloc(uint32_t num_blocks, uint32_t size) -{ - return rte_calloc(NULL, num_blocks, size, 0); -} - -/*****************************************************************************/ -/** - * qdma_memfree(): free the memory - * - * @memptr: pointer to the memory block - * - * Return: None - *****************************************************************************/ -void qdma_memfree(void *memptr) -{ - return rte_free(memptr); -} - -/*****************************************************************************/ -/** - * qdma_resource_lock_take() - take lock to access resource management APIs - * - * @return None - *****************************************************************************/ -void qdma_resource_lock_take(void) -{ - rte_spinlock_lock(&resource_lock); -} - -/*****************************************************************************/ -/** - * qdma_resource_lock_give() - release lock after accessing - * resource management APIs - * - * @return None - *****************************************************************************/ -void qdma_resource_lock_give(void) -{ - rte_spinlock_unlock(&resource_lock); -} - -/*****************************************************************************/ -/** - * qdma_reg_write() - Register write API. - * - * @dev_hndl: device handle - * @reg_offst: QDMA Config bar register offset to write - * @val: value to be written - * - * Return: None - *****************************************************************************/ -void qdma_reg_write(void *dev_hndl, uint32_t reg_offst, uint32_t val) -{ - struct qdma_pci_dev *qdma_dev; - uint64_t bar_addr; - - qdma_dev = ((struct rte_eth_dev *)dev_hndl)->data->dev_private; - bar_addr = (uint64_t)qdma_dev->bar_addr[qdma_dev->config_bar_idx]; - *((volatile uint32_t *)(bar_addr + reg_offst)) = val; -} - -/*****************************************************************************/ -/** - * qdma_reg_read() - Register read API. - * - * @dev_hndl: device handle - * @reg_offst: QDMA Config bar register offset to be read - * - * Return: Value read - *****************************************************************************/ -uint32_t qdma_reg_read(void *dev_hndl, uint32_t reg_offst) -{ - struct qdma_pci_dev *qdma_dev; - uint64_t bar_addr; - uint32_t val; - - qdma_dev = ((struct rte_eth_dev *)dev_hndl)->data->dev_private; - bar_addr = (uint64_t)qdma_dev->bar_addr[qdma_dev->config_bar_idx]; - val = *((volatile uint32_t *)(bar_addr + reg_offst)); - - return val; -} - -/*****************************************************************************/ -/** - * qdma_reg_access_lock() - Lock function for Register access - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_reg_access_lock(void *dev_hndl) -{ - (void) dev_hndl; - rte_spinlock_lock(®_access_lock); - return 0; -} - -/*****************************************************************************/ -/** - * qdma_reg_access_release() - Release function for Register access - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_reg_access_release(void *dev_hndl) -{ - (void) dev_hndl; - rte_spinlock_unlock(®_access_lock); - return 0; -} - -/*****************************************************************************/ -/** - * qdma_udelay() - delay function to be used in the common library - * - * @delay_usec: delay in microseconds - * - * Return: None - *****************************************************************************/ -void qdma_udelay(uint32_t delay_usec) -{ - rte_delay_us(delay_usec); -} - -/*****************************************************************************/ -/** - * qdma_get_hw_access() - function to get the qdma_hw_access - * - * @dev_hndl: device handle - * @dev_cap: pointer to hold qdma_hw_access structure - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_get_hw_access(void *dev_hndl, struct qdma_hw_access **hw) -{ - struct qdma_pci_dev *qdma_dev; - qdma_dev = ((struct rte_eth_dev *)dev_hndl)->data->dev_private; - *hw = qdma_dev->hw_access; -} - -/*****************************************************************************/ -/** - * qdma_strncpy(): copy n size string from source to destination buffer - * - * @memptr: pointer to the memory block - * - * Return: None - *****************************************************************************/ -void qdma_strncpy(char *dest, const char *src, size_t n) -{ - strncpy(dest, src, n); -} - -/*****************************************************************************/ -/** - * qdma_get_err_code() - function to get the qdma access mapped error code - * - * @acc_err_code: qdma access error code which is a negative input value - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_err_code(int acc_err_code) -{ - /* Multiply acc_err_code with -1 to convert it to a postive number - * and use it as an array index for error codes. - */ - acc_err_code *= -1; - - return -(error_code_map_list[acc_err_code].err_code); -} - -/*****************************************************************************/ -/** - * qdma_io_wmb() - Write memory barrier for IO device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_io_wmb(void) -{ - rte_io_wmb(); - return 0; -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_platform_env.h b/QDMA/DPDK/drivers/net/qdma/qdma_platform_env.h deleted file mode 100755 index 69d5e59..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_platform_env.h +++ /dev/null @@ -1,61 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef QDMA_PLATFORM_ENV_H_ -#define QDMA_PLATFORM_ENV_H_ - -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <rte_log.h> - -#define QDMA_SNPRINTF_S(arg1, arg2, arg3, ...) \ - snprintf(arg1, arg3, ##__VA_ARGS__) - -#ifdef RTE_LIBRTE_QDMA_DEBUG_DRIVER -#define qdma_log_info(x_, ...) rte_log(RTE_LOG_INFO,\ - RTE_LOGTYPE_USER1, x_, ##__VA_ARGS__) -#define qdma_log_warning(x_, ...) rte_log(RTE_LOG_WARNING,\ - RTE_LOGTYPE_USER1, x_, ##__VA_ARGS__) -#define qdma_log_debug(x_, ...) rte_log(RTE_LOG_DEBUG,\ - RTE_LOGTYPE_USER1, x_, ##__VA_ARGS__) -#define qdma_log_error(x_, ...) rte_log(RTE_LOG_ERR,\ - RTE_LOGTYPE_USER1, x_, ##__VA_ARGS__) -#else -#define qdma_log_info(x_, ...) do { } while (0) -#define qdma_log_warning(x_, ...) do { } while (0) -#define qdma_log_debug(x_, ...) do { } while (0) -#define qdma_log_error(x_, ...) do { } while (0) -#endif - -#endif /* QDMA_PLATFORM_ENV_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_rxtx.c b/QDMA/DPDK/drivers/net/qdma/qdma_rxtx.c deleted file mode 100755 index 186c1bb..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_rxtx.c +++ /dev/null @@ -1,1464 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <rte_mbuf.h> -#include <rte_cycles.h> -#include "qdma.h" -#include "qdma_access_common.h" - -#include <fcntl.h> -#include <unistd.h> -#include "qdma_rxtx.h" -#include "qdma_devops.h" - -#if defined RTE_ARCH_X86_64 -#include <immintrin.h> -#include <emmintrin.h> -#define RTE_QDMA_DESCS_PER_LOOP (2) -#endif - -/** - * Poll the QDMA engine for transfer completion. - * - * @param txq - * Generic pointer to either Rx/Tx queue structure based on the DMA direction. - * @param expected_count - * expected transfer count. - * - * @return - * Number of packets transferred successfully by the engine. - */ -static int dma_wb_monitor(void *xq, uint8_t dir, uint16_t expected_count) -{ - struct wb_status *wb_status; - uint16_t mode, wb_tail; - uint32_t i = 0; - - if (dir == DMA_TO_DEVICE) { - struct qdma_tx_queue *txq = (struct qdma_tx_queue *)xq; - wb_status = txq->wb_status; - - while (i < WB_TIMEOUT) { - if (expected_count == wb_status->cidx) { - PMD_DRV_LOG(DEBUG, "Poll writeback count " - "matches to the expected count :%d", - expected_count); - return 0; - } - PMD_DRV_LOG(DEBUG, "poll wait on wb-count:%d and " - "expected-count:%d\n", - wb_status->cidx, expected_count); - rte_delay_us(2); - i++; - } - PMD_DRV_LOG(DEBUG, "DMA Engine write-back monitor " - "timeout error occurred\n"); - return -1; - } - /* dir == DMA_FROM_DEVICE */ - struct qdma_rx_queue *rxq = (struct qdma_rx_queue *)xq; - wb_status = rxq->wb_status; - mode = rxq->st_mode; - - /* Poll the writeback location until timeout Or, the expected - * count matches to the writeback count - */ - while (i < WB_TIMEOUT) { - if (mode) { - wb_tail = - (rxq->cmpt_cidx_info.wrb_cidx + expected_count) % - (rxq->nb_rx_cmpt_desc - 1); - if (wb_tail == wb_status->pidx) { - PMD_DRV_LOG(DEBUG, "ST: Poll cmpt count matches" - " to the expected count :%d", - expected_count); - return 0; - } - PMD_DRV_LOG(DEBUG, "ST: poll wait on wb-count:%d and" - " expected-count:%d\n", - wb_status->pidx, expected_count); - } else { - if (expected_count == wb_status->cidx) { - PMD_DRV_LOG(DEBUG, "MM: Poll writeback count " - "matches to the expected count" - " :%d", expected_count); - return 0; - } - PMD_DRV_LOG(DEBUG, "MM: poll wait on wb-count:%d " - "and expected-count:%d\n", - wb_status->cidx, expected_count); - } - rte_delay_us(2); - i++; - } - return -1; -} - -static int qdma_extract_st_cmpt_info(void *ul_cmpt_entry, void *cmpt_info) -{ - union qdma_ul_st_cmpt_ring *cmpt_data, *cmpt_desc; - - cmpt_desc = (union qdma_ul_st_cmpt_ring *)(ul_cmpt_entry); - cmpt_data = (union qdma_ul_st_cmpt_ring *)(cmpt_info); - - cmpt_data->data = cmpt_desc->data; - if (unlikely(!cmpt_desc->desc_used)) - cmpt_data->length = 0; - - return 0; -} - -int reclaim_tx_mbuf(struct qdma_tx_queue *txq, - uint16_t cidx, uint16_t free_cnt) -{ - int fl_desc = 0; - uint16_t fl_desc_cnt; - uint16_t count; - int id; - - id = txq->tx_fl_tail; - fl_desc = (int)cidx - id; - - if (unlikely(!fl_desc)) - return 0; - - if (fl_desc < 0) - fl_desc += (txq->nb_tx_desc - 1); - - if (free_cnt && (fl_desc > free_cnt)) - fl_desc = free_cnt; - - if ((id + fl_desc) < (txq->nb_tx_desc - 1)) { - fl_desc_cnt = ((uint16_t)fl_desc & 0xFFFF); - rte_pktmbuf_free_bulk(&txq->sw_ring[id], fl_desc_cnt); - for (count = 0; count < fl_desc_cnt; count++) - txq->sw_ring[id++] = NULL; - - txq->tx_fl_tail = id; - - return fl_desc; - } - - txq->qstats.ring_wrap_cnt++; - - /* Handle Tx queue ring wrap case */ - fl_desc -= (txq->nb_tx_desc - 1 - id); - rte_pktmbuf_free_bulk(&txq->sw_ring[id], (txq->nb_tx_desc - 1 - id)); - for (; id < (txq->nb_tx_desc - 1); id++) - txq->sw_ring[id] = NULL; - - id -= (txq->nb_tx_desc - 1); - fl_desc_cnt = ((uint16_t)fl_desc & 0xFFFF); - rte_pktmbuf_free_bulk(&txq->sw_ring[id], fl_desc_cnt); - for (count = 0; count < fl_desc_cnt; count++) - txq->sw_ring[id++] = NULL; - - txq->tx_fl_tail = id; - - return fl_desc; -} - -#ifdef TEST_64B_DESC_BYPASS -uint16_t qdma_xmit_64B_desc_bypass(struct qdma_tx_queue *txq, - struct rte_mbuf **tx_pkts, uint16_t nb_pkts) -{ - uint16_t count, id; - uint8_t *tx_ring_st_bypass = NULL; - int ofd = -1, ret = 0; - char fln[50]; - struct qdma_pci_dev *qdma_dev = txq->dev->data->dev_private; - - id = txq->q_pidx_info.pidx; - - for (count = 0; count < nb_pkts; count++) { - tx_ring_st_bypass = (uint8_t *)txq->tx_ring; - memset(&tx_ring_st_bypass[id * (txq->bypass_desc_sz)], - ((id % 255) + 1), txq->bypass_desc_sz); - - snprintf(fln, sizeof(fln), "q_%u_%s", txq->queue_id, - "h2c_desc_data.txt"); - ofd = open(fln, O_RDWR | O_CREAT | O_APPEND | O_SYNC, - 0666); - if (ofd < 0) { - PMD_DRV_LOG(INFO, " txq[%d] unable to create " - "outfile to dump descriptor" - " data", txq->queue_id); - return 0; - } - ret = write(ofd, &(tx_ring_st_bypass[id * - (txq->bypass_desc_sz)]), - txq->bypass_desc_sz); - if (ret < txq->bypass_desc_sz) - PMD_DRV_LOG(DEBUG, "Txq[%d] descriptor data " - "len: %d, written to inputfile" - " :%d bytes", txq->queue_id, - txq->bypass_desc_sz, ret); - close(ofd); - - rte_pktmbuf_free(tx_pkts[count]); - - id++; - if (unlikely(id >= (txq->nb_tx_desc - 1))) - id -= (txq->nb_tx_desc - 1); - } - - /* Make sure writes to the H2C descriptors are synchronized - * before updating PIDX - */ - rte_wmb(); - - txq->q_pidx_info.pidx = id; - qdma_dev->hw_access->qdma_queue_pidx_update(txq->dev, qdma_dev->is_vf, - txq->queue_id, 0, &txq->q_pidx_info); - - PMD_DRV_LOG(DEBUG, " xmit completed with count:%d\n", count); - - return count; -} -#endif - -uint16_t qdma_get_rx_queue_id(void *queue_hndl) -{ - struct qdma_rx_queue *rxq = (struct qdma_rx_queue *)queue_hndl; - - return rxq->queue_id; -} - -void qdma_get_device_info(void *queue_hndl, - enum qdma_device_type *device_type, - enum qdma_ip_type *ip_type) -{ - struct qdma_rx_queue *rxq = (struct qdma_rx_queue *)queue_hndl; - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; - - *device_type = (enum qdma_device_type)qdma_dev->device_type; - *ip_type = (enum qdma_ip_type)qdma_dev->ip_type; -} - -uint64_t get_mm_c2h_ep_addr(void *queue_hndl) -{ - struct qdma_rx_queue *rxq = (struct qdma_rx_queue *)queue_hndl; - - return rxq->ep_addr; -} - -uint32_t get_mm_buff_size(void *queue_hndl) -{ - struct qdma_rx_queue *rxq = (struct qdma_rx_queue *)queue_hndl; - - return rxq->rx_buff_size; -} - -struct qdma_ul_st_h2c_desc *get_st_h2c_desc(void *queue_hndl) -{ - volatile uint16_t id; - struct qdma_ul_st_h2c_desc *tx_ring_st; - struct qdma_ul_st_h2c_desc *desc; - struct qdma_tx_queue *txq = (struct qdma_tx_queue *)queue_hndl; - - id = txq->q_pidx_info.pidx; - tx_ring_st = (struct qdma_ul_st_h2c_desc *)txq->tx_ring; - desc = (struct qdma_ul_st_h2c_desc *)&tx_ring_st[id]; - - id++; - if (unlikely(id >= (txq->nb_tx_desc - 1))) - id -= (txq->nb_tx_desc - 1); - - txq->q_pidx_info.pidx = id; - - return desc; -} - -struct qdma_ul_mm_desc *get_mm_h2c_desc(void *queue_hndl) -{ - struct qdma_ul_mm_desc *desc; - struct qdma_tx_queue *txq = (struct qdma_tx_queue *)queue_hndl; - struct qdma_ul_mm_desc *tx_ring = - (struct qdma_ul_mm_desc *)txq->tx_ring; - uint32_t id; - - id = txq->q_pidx_info.pidx; - desc = (struct qdma_ul_mm_desc *)&tx_ring[id]; - - id = (id + 1) % (txq->nb_tx_desc - 1); - txq->q_pidx_info.pidx = id; - - return desc; -} - -uint64_t get_mm_h2c_ep_addr(void *queue_hndl) -{ - struct qdma_tx_queue *txq = (struct qdma_tx_queue *)queue_hndl; - - return txq->ep_addr; -} - -#ifdef QDMA_LATENCY_OPTIMIZED -static void adjust_c2h_cntr_avgs(struct qdma_rx_queue *rxq) -{ - int i; - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; - - if (rxq->sorted_c2h_cntr_idx < 0) - return; - - rxq->pend_pkt_moving_avg = - qdma_dev->g_c2h_cnt_th[rxq->cmpt_cidx_info.counter_idx]; - - if (rxq->sorted_c2h_cntr_idx == (QDMA_GLOBAL_CSR_ARRAY_SZ - 1)) - i = qdma_dev->sorted_idx_c2h_cnt_th[rxq->sorted_c2h_cntr_idx]; - else - i = qdma_dev->sorted_idx_c2h_cnt_th[ - rxq->sorted_c2h_cntr_idx + 1]; - - rxq->pend_pkt_avg_thr_hi = qdma_dev->g_c2h_cnt_th[i]; - - if (rxq->sorted_c2h_cntr_idx > 0) - i = qdma_dev->sorted_idx_c2h_cnt_th[ - rxq->sorted_c2h_cntr_idx - 1]; - else - i = qdma_dev->sorted_idx_c2h_cnt_th[rxq->sorted_c2h_cntr_idx]; - - rxq->pend_pkt_avg_thr_lo = qdma_dev->g_c2h_cnt_th[i]; - - PMD_DRV_LOG(DEBUG, "q%u: c2h_cntr_idx = %u %u %u", - rxq->queue_id, - rxq->cmpt_cidx_info.counter_idx, - rxq->pend_pkt_avg_thr_lo, - rxq->pend_pkt_avg_thr_hi); -} - -static void incr_c2h_cntr_th(struct qdma_rx_queue *rxq) -{ - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; - unsigned char i, c2h_cntr_idx; - unsigned char c2h_cntr_val_new; - unsigned char c2h_cntr_val_curr; - - if (rxq->sorted_c2h_cntr_idx == - (QDMA_NUM_C2H_COUNTERS - 1)) - return; - - rxq->c2h_cntr_monitor_cnt = 0; - i = rxq->sorted_c2h_cntr_idx; - c2h_cntr_idx = qdma_dev->sorted_idx_c2h_cnt_th[i]; - c2h_cntr_val_curr = qdma_dev->g_c2h_cnt_th[c2h_cntr_idx]; - i++; - c2h_cntr_idx = qdma_dev->sorted_idx_c2h_cnt_th[i]; - c2h_cntr_val_new = qdma_dev->g_c2h_cnt_th[c2h_cntr_idx]; - - /* Choose the closest counter value */ - if ((c2h_cntr_val_new >= rxq->pend_pkt_moving_avg) && - (c2h_cntr_val_new - rxq->pend_pkt_moving_avg) >= - (rxq->pend_pkt_moving_avg - c2h_cntr_val_curr)) - return; - - /* Do not allow c2h counter value go beyond half of C2H ring sz*/ - if (c2h_cntr_val_new < (qdma_dev->g_ring_sz[rxq->ringszidx] >> 1)) { - rxq->cmpt_cidx_info.counter_idx = c2h_cntr_idx; - rxq->sorted_c2h_cntr_idx = i; - adjust_c2h_cntr_avgs(rxq); - } -} - -static void decr_c2h_cntr_th(struct qdma_rx_queue *rxq) -{ - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; - unsigned char i, c2h_cntr_idx; - unsigned char c2h_cntr_val_new; - unsigned char c2h_cntr_val_curr; - - if (!rxq->sorted_c2h_cntr_idx) - return; - rxq->c2h_cntr_monitor_cnt = 0; - i = rxq->sorted_c2h_cntr_idx; - c2h_cntr_idx = qdma_dev->sorted_idx_c2h_cnt_th[i]; - c2h_cntr_val_curr = qdma_dev->g_c2h_cnt_th[c2h_cntr_idx]; - i--; - c2h_cntr_idx = qdma_dev->sorted_idx_c2h_cnt_th[i]; - - c2h_cntr_val_new = qdma_dev->g_c2h_cnt_th[c2h_cntr_idx]; - - /* Choose the closest counter value */ - if ((c2h_cntr_val_new <= rxq->pend_pkt_moving_avg) && - (rxq->pend_pkt_moving_avg - c2h_cntr_val_new) >= - (c2h_cntr_val_curr - rxq->pend_pkt_moving_avg)) - return; - - rxq->cmpt_cidx_info.counter_idx = c2h_cntr_idx; - - rxq->sorted_c2h_cntr_idx = i; - adjust_c2h_cntr_avgs(rxq); -} - -#define MAX_C2H_CNTR_STAGNANT_CNT 16 -static void adapt_update_counter(struct qdma_rx_queue *rxq, - uint16_t nb_pkts_avail) -{ - /* Add available pkt count and average */ - rxq->pend_pkt_moving_avg += nb_pkts_avail; - rxq->pend_pkt_moving_avg >>= 1; - - /* if avg > hi_th, increase the counter - * if avg < lo_th, decrease the counter - */ - if (rxq->pend_pkt_avg_thr_hi <= rxq->pend_pkt_moving_avg) - incr_c2h_cntr_th(rxq); - else if (rxq->pend_pkt_avg_thr_lo >= - rxq->pend_pkt_moving_avg) - decr_c2h_cntr_th(rxq); - else { - rxq->c2h_cntr_monitor_cnt++; - if (rxq->c2h_cntr_monitor_cnt == MAX_C2H_CNTR_STAGNANT_CNT) { - /* go down on counter value to see if we actually are - * increasing latency by setting - * higher counter threshold - */ - decr_c2h_cntr_th(rxq); - rxq->c2h_cntr_monitor_cnt = 0; - } else - return; - } -} -#endif //QDMA_LATENCY_OPTIMIZED - -/* Process completion ring */ -static int process_cmpt_ring(struct qdma_rx_queue *rxq, - uint16_t num_cmpt_entries) -{ - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; - union qdma_ul_st_cmpt_ring *user_cmpt_entry; - uint32_t count = 0; - int ret = 0; - uint16_t rx_cmpt_tail = rxq->cmpt_cidx_info.wrb_cidx; - - if (likely(!rxq->dump_immediate_data)) { - if ((rx_cmpt_tail + num_cmpt_entries) < - (rxq->nb_rx_cmpt_desc - 1)) { - for (count = 0; count < num_cmpt_entries; count++) { - user_cmpt_entry = - (union qdma_ul_st_cmpt_ring *) - ((uint64_t)rxq->cmpt_ring + - ((uint64_t)rx_cmpt_tail * rxq->cmpt_desc_len)); - - ret = qdma_extract_st_cmpt_info( - user_cmpt_entry, - &rxq->cmpt_data[count]); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Error detected on CMPT ring " - "at index %d, queue_id = %d\n", - rx_cmpt_tail, rxq->queue_id); - rxq->err = 1; - return -1; - } - rx_cmpt_tail++; - } - } else { - while (count < num_cmpt_entries) { - user_cmpt_entry = - (union qdma_ul_st_cmpt_ring *) - ((uint64_t)rxq->cmpt_ring + - ((uint64_t)rx_cmpt_tail * rxq->cmpt_desc_len)); - - ret = qdma_extract_st_cmpt_info( - user_cmpt_entry, - &rxq->cmpt_data[count]); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Error detected on CMPT ring " - "at index %d, queue_id = %d\n", - rx_cmpt_tail, rxq->queue_id); - rxq->err = 1; - return -1; - } - - rx_cmpt_tail++; - if (unlikely(rx_cmpt_tail >= - (rxq->nb_rx_cmpt_desc - 1))) - rx_cmpt_tail -= - (rxq->nb_rx_cmpt_desc - 1); - count++; - } - } - } else { - while (count < num_cmpt_entries) { - user_cmpt_entry = - (union qdma_ul_st_cmpt_ring *) - ((uint64_t)rxq->cmpt_ring + - ((uint64_t)rx_cmpt_tail * rxq->cmpt_desc_len)); - - ret = qdma_ul_extract_st_cmpt_info( - user_cmpt_entry, - &rxq->cmpt_data[count]); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Error detected on CMPT ring " - "at CMPT index %d, queue_id = %d\n", - rx_cmpt_tail, rxq->queue_id); - rxq->err = 1; - return -1; - } - - ret = qdma_ul_process_immediate_data_st((void *)rxq, - user_cmpt_entry, rxq->cmpt_desc_len); - if (ret < 0) { - PMD_DRV_LOG(ERR, "Error processing immediate data " - "at CMPT index = %d, queue_id = %d\n", - rx_cmpt_tail, rxq->queue_id); - return -1; - } - - rx_cmpt_tail++; - if (unlikely(rx_cmpt_tail >= - (rxq->nb_rx_cmpt_desc - 1))) - rx_cmpt_tail -= (rxq->nb_rx_cmpt_desc - 1); - count++; - } - } - - // Update the CPMT CIDX - rxq->cmpt_cidx_info.wrb_cidx = rx_cmpt_tail; - qdma_dev->hw_access->qdma_queue_cmpt_cidx_update(rxq->dev, - qdma_dev->is_vf, - rxq->queue_id, &rxq->cmpt_cidx_info); - - return 0; -} - -uint32_t rx_queue_count(void *rx_queue) -{ - struct qdma_rx_queue *rxq = rx_queue; - struct wb_status *wb_status; - uint16_t pkt_length; - uint16_t nb_pkts_avail = 0; - uint16_t rx_cmpt_tail = 0; - uint16_t cmpt_pidx; - uint32_t nb_desc_used = 0, count = 0; - union qdma_ul_st_cmpt_ring *user_cmpt_entry; - union qdma_ul_st_cmpt_ring cmpt_data; - - wb_status = rxq->wb_status; - rx_cmpt_tail = rxq->cmpt_cidx_info.wrb_cidx; - cmpt_pidx = wb_status->pidx; - - if (rx_cmpt_tail < cmpt_pidx) - nb_pkts_avail = cmpt_pidx - rx_cmpt_tail; - else if (rx_cmpt_tail > cmpt_pidx) - nb_pkts_avail = rxq->nb_rx_cmpt_desc - 1 - rx_cmpt_tail + - cmpt_pidx; - - if (nb_pkts_avail == 0) - return 0; - - while (count < nb_pkts_avail) { - user_cmpt_entry = - (union qdma_ul_st_cmpt_ring *)((uint64_t)rxq->cmpt_ring + - ((uint64_t)rx_cmpt_tail * rxq->cmpt_desc_len)); - - if (qdma_ul_extract_st_cmpt_info(user_cmpt_entry, - &cmpt_data)) { - break; - } - - pkt_length = qdma_ul_get_cmpt_pkt_len(&cmpt_data); - if (unlikely(!pkt_length)) { - count++; - continue; - } - - nb_desc_used += ((pkt_length/rxq->rx_buff_size) + 1); - rx_cmpt_tail++; - if (unlikely(rx_cmpt_tail >= (rxq->nb_rx_cmpt_desc - 1))) - rx_cmpt_tail -= (rxq->nb_rx_cmpt_desc - 1); - count++; - } - PMD_DRV_LOG(DEBUG, "%s: nb_desc_used = %d", - __func__, nb_desc_used); - return nb_desc_used; -} - -/** - * DPDK callback to check the status of a Rx descriptor in the queue. - * - * @param rx_queue - * Pointer to Rx queue specific data structure. - * @param offset - * The offset of the descriptor starting from tail (0 is the next - * packet to be received by the driver). - * - * @return - * - (RTE_ETH_RX_DESC_AVAIL): Descriptor is available for the hardware to - * receive a packet. - * - (RTE_ETH_RX_DESC_DONE): Descriptor is done, it is filled by hw, but - * not yet processed by the driver (i.e. in the receive queue). - * - (RTE_ETH_RX_DESC_UNAVAIL): Descriptor is unavailable, either hold by - * the driver and not yet returned to hw, or reserved by the hw. - * - (-EINVAL) bad descriptor offset. - */ -int -qdma_dev_rx_descriptor_status(void *rx_queue, uint16_t offset) -{ - struct qdma_rx_queue *rxq = rx_queue; - uint32_t desc_used_count; - uint16_t rx_tail, c2h_pidx, pending_desc; - - if (unlikely(offset >= (rxq->nb_rx_desc - 1))) - return -EINVAL; - - /* One descriptor is reserved so that pidx is not same as tail */ - if (offset == (rxq->nb_rx_desc - 2)) - return RTE_ETH_RX_DESC_UNAVAIL; - - desc_used_count = rx_queue_count(rxq); - if (offset < desc_used_count) - return RTE_ETH_RX_DESC_DONE; - - /* If Tail is not same as PIDX, descriptors are held by the driver */ - rx_tail = rxq->rx_tail; - c2h_pidx = rxq->q_pidx_info.pidx; - - pending_desc = rx_tail - c2h_pidx - 1; - if (rx_tail < (c2h_pidx + 1)) - pending_desc = rxq->nb_rx_desc - 2 + rx_tail - - c2h_pidx; - - if (offset < (desc_used_count + pending_desc)) - return RTE_ETH_RX_DESC_UNAVAIL; - - return RTE_ETH_RX_DESC_AVAIL; -} - -/* Update mbuf for a segmented packet */ -struct rte_mbuf *prepare_segmented_packet(struct qdma_rx_queue *rxq, - uint16_t pkt_length, uint16_t *tail) -{ - struct rte_mbuf *mb; - struct rte_mbuf *first_seg = NULL; - struct rte_mbuf *last_seg = NULL; - uint16_t id = *tail; - uint16_t length; - uint16_t rx_buff_size = rxq->rx_buff_size; - - do { - mb = rxq->sw_ring[id]; - rxq->sw_ring[id++] = NULL; - length = pkt_length; - - if (unlikely(id >= (rxq->nb_rx_desc - 1))) - id -= (rxq->nb_rx_desc - 1); - if (pkt_length > rx_buff_size) { - rte_pktmbuf_data_len(mb) = rx_buff_size; - pkt_length -= rx_buff_size; - } else { - rte_pktmbuf_data_len(mb) = pkt_length; - pkt_length = 0; - } - rte_mbuf_refcnt_set(mb, 1); - - if (first_seg == NULL) { - first_seg = mb; - first_seg->nb_segs = 1; - first_seg->pkt_len = length; - first_seg->packet_type = 0; - first_seg->ol_flags = 0; - first_seg->port = rxq->port_id; - first_seg->vlan_tci = 0; - first_seg->hash.rss = 0; - } else { - first_seg->nb_segs++; - if (last_seg != NULL) - last_seg->next = mb; - } - - last_seg = mb; - mb->next = NULL; - } while (pkt_length); - - *tail = id; - return first_seg; -} - -/* Prepare mbuf for one packet */ -static inline -struct rte_mbuf *prepare_single_packet(struct qdma_rx_queue *rxq, - uint16_t cmpt_idx) -{ - struct rte_mbuf *mb = NULL; - uint16_t id = rxq->rx_tail; - uint16_t pkt_length; - - pkt_length = qdma_ul_get_cmpt_pkt_len(&rxq->cmpt_data[cmpt_idx]); - - if (pkt_length) { - rxq->stats.pkts++; - rxq->stats.bytes += pkt_length; - - if (likely(pkt_length <= rxq->rx_buff_size)) { - mb = rxq->sw_ring[id]; - rxq->sw_ring[id++] = NULL; - - if (unlikely(id >= (rxq->nb_rx_desc - 1))) - id -= (rxq->nb_rx_desc - 1); - - rte_mbuf_refcnt_set(mb, 1); - mb->nb_segs = 1; - mb->port = rxq->port_id; - mb->ol_flags = 0; - mb->packet_type = 0; - mb->pkt_len = pkt_length; - mb->data_len = pkt_length; - } else { - mb = prepare_segmented_packet(rxq, pkt_length, &id); - } - - rxq->rx_tail = id; - } - return mb; -} - -/* Prepare mbufs with packet information */ -static uint16_t prepare_packets(struct qdma_rx_queue *rxq, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts) -{ - uint16_t count_pkts = 0; - - struct rte_mbuf *mb; - uint16_t pkt_length; - uint16_t count = 0; - while (count < nb_pkts) { - pkt_length = qdma_ul_get_cmpt_pkt_len( - &rxq->cmpt_data[count]); - if (pkt_length) { - rxq->stats.pkts++; - rxq->stats.bytes += pkt_length; - mb = prepare_segmented_packet(rxq, - pkt_length, &rxq->rx_tail); - rx_pkts[count_pkts++] = mb; - } - count++; - } - - return count_pkts; -} - -/* Populate C2H ring with new buffers */ -static int rearm_c2h_ring(struct qdma_rx_queue *rxq, uint16_t num_desc) -{ - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; - struct rte_mbuf *mb; - struct qdma_ul_st_c2h_desc *rx_ring_st = - (struct qdma_ul_st_c2h_desc *)rxq->rx_ring; - uint16_t mbuf_index = 0; - uint16_t id; - int rearm_descs; - - id = rxq->q_pidx_info.pidx; - - /* Split the C2H ring updation in two parts. - * First handle till end of ring and then - * handle from beginning of ring, if ring wraps - */ - if ((id + num_desc) < (rxq->nb_rx_desc - 1)) - rearm_descs = num_desc; - else { - rearm_descs = (rxq->nb_rx_desc - 1) - id; - rxq->qstats.ring_wrap_cnt++; - } - - /* allocate new buffer */ - if (rte_mempool_get_bulk(rxq->mb_pool, (void *)&rxq->sw_ring[id], - rearm_descs) != 0){ - PMD_DRV_LOG(ERR, "%s(): %d: No MBUFS, queue id = %d," - "mbuf_avail_count = %d," - " mbuf_in_use_count = %d, num_desc_req = %d\n", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool), rearm_descs); - return -1; - } - - for (mbuf_index = 0; mbuf_index < rearm_descs; - mbuf_index++, id++) { - mb = rxq->sw_ring[id]; - mb->data_off = RTE_PKTMBUF_HEADROOM; - - /* rearm descriptor */ - rx_ring_st[id].dst_addr = - (uint64_t)mb->buf_iova + - RTE_PKTMBUF_HEADROOM; - } - - if (unlikely(id >= (rxq->nb_rx_desc - 1))) - id -= (rxq->nb_rx_desc - 1); - - /* Handle from beginning of ring, if ring wrapped */ - rearm_descs = num_desc - rearm_descs; - if (unlikely(rearm_descs)) { - /* allocate new buffer */ - if (rte_mempool_get_bulk(rxq->mb_pool, - (void *)&rxq->sw_ring[id], rearm_descs) != 0) { - PMD_DRV_LOG(ERR, "%s(): %d: No MBUFS, queue id = %d," - "mbuf_avail_count = %d," - " mbuf_in_use_count = %d, num_desc_req = %d\n", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool), rearm_descs); - - rxq->q_pidx_info.pidx = id; - qdma_dev->hw_access->qdma_queue_pidx_update(rxq->dev, - qdma_dev->is_vf, - rxq->queue_id, 1, &rxq->q_pidx_info); - - return -1; - } - - for (mbuf_index = 0; - mbuf_index < ((uint16_t)rearm_descs & 0xFFFF); - mbuf_index++, id++) { - mb = rxq->sw_ring[id]; - mb->data_off = RTE_PKTMBUF_HEADROOM; - - /* rearm descriptor */ - rx_ring_st[id].dst_addr = - (uint64_t)mb->buf_iova + - RTE_PKTMBUF_HEADROOM; - } - } - - PMD_DRV_LOG(DEBUG, "%s(): %d: PIDX Update: queue id = %d, " - "num_desc = %d", - __func__, __LINE__, rxq->queue_id, - num_desc); - - /* Make sure writes to the C2H descriptors are - * synchronized before updating PIDX - */ - rte_wmb(); - - rxq->q_pidx_info.pidx = id; - qdma_dev->hw_access->qdma_queue_pidx_update(rxq->dev, - qdma_dev->is_vf, - rxq->queue_id, 1, &rxq->q_pidx_info); - - return 0; -} - -/* Receive API for Streaming mode */ -uint16_t qdma_recv_pkts_st(struct qdma_rx_queue *rxq, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts) -{ - uint16_t count_pkts; - struct wb_status *wb_status; - uint16_t nb_pkts_avail = 0; - uint16_t rx_cmpt_tail = 0; - uint16_t cmpt_pidx, c2h_pidx; - uint16_t pending_desc; -#ifdef TEST_64B_DESC_BYPASS - int bypass_desc_sz_idx = qmda_get_desc_sz_idx(rxq->bypass_desc_sz); -#endif - - if (unlikely(rxq->err)) - return 0; - - PMD_DRV_LOG(DEBUG, "recv start on rx queue-id :%d, on " - "tail index:%d number of pkts %d", - rxq->queue_id, rxq->rx_tail, nb_pkts); - wb_status = rxq->wb_status; - rx_cmpt_tail = rxq->cmpt_cidx_info.wrb_cidx; - -#ifdef TEST_64B_DESC_BYPASS - if (unlikely(rxq->en_bypass && - bypass_desc_sz_idx == SW_DESC_CNTXT_64B_BYPASS_DMA)) { - PMD_DRV_LOG(DEBUG, "For RX ST-mode, example" - " design doesn't support 64byte descriptor\n"); - return 0; - } -#endif - cmpt_pidx = wb_status->pidx; - -#ifdef LATENCY_MEASUREMENT - if (cmpt_pidx != rxq->qstats.wrb_pidx) { - /* stop the timer */ - rxq->qstats.pkt_lat.curr = rte_get_timer_cycles(); - c2h_pidx_to_cmpt_pidx_lat[rxq->queue_id][rxq->qstats.lat_cnt] = - rxq->qstats.pkt_lat.curr - rxq->qstats.pkt_lat.prev; - rxq->qstats.lat_cnt = ((rxq->qstats.lat_cnt + 1) % LATENCY_CNT); - } -#endif - - if (rx_cmpt_tail < cmpt_pidx) - nb_pkts_avail = cmpt_pidx - rx_cmpt_tail; - else if (rx_cmpt_tail > cmpt_pidx) - nb_pkts_avail = rxq->nb_rx_cmpt_desc - 1 - rx_cmpt_tail + - cmpt_pidx; - - if (nb_pkts_avail == 0) { - PMD_DRV_LOG(DEBUG, "%s(): %d: nb_pkts_avail = 0\n", - __func__, __LINE__); - return 0; - } - - nb_pkts = RTE_MIN(nb_pkts, RTE_MIN(nb_pkts_avail, QDMA_MAX_BURST_SIZE)); - -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(DEBUG, "%s(): %d: queue id = %d, mbuf_avail_count = %d, " - "mbuf_in_use_count = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); -#endif //DUMP_MEMPOOL_USAGE_STATS - /* Make sure reads to CMPT ring are synchronized before - * accessing the ring - */ - rte_rmb(); -#ifdef QDMA_LATENCY_OPTIMIZED - adapt_update_counter(rxq, nb_pkts_avail); -#endif //QDMA_LATENCY_OPTIMIZED - - int ret = process_cmpt_ring(rxq, nb_pkts); - if (unlikely(ret)) - return 0; - - if (rxq->status != RTE_ETH_QUEUE_STATE_STARTED) { - PMD_DRV_LOG(DEBUG, "%s(): %d: rxq->status = %d\n", - __func__, __LINE__, rxq->status); - return 0; - } - - count_pkts = prepare_packets(rxq, rx_pkts, nb_pkts); - - c2h_pidx = rxq->q_pidx_info.pidx; - pending_desc = rxq->rx_tail - c2h_pidx - 1; - if (rxq->rx_tail < (c2h_pidx + 1)) - pending_desc = rxq->nb_rx_desc - 2 + rxq->rx_tail - - c2h_pidx; - - rxq->qstats.pidx = rxq->q_pidx_info.pidx; - rxq->qstats.wrb_pidx = rxq->wb_status->pidx; - rxq->qstats.wrb_cidx = rxq->wb_status->cidx; - rxq->qstats.rxq_cmpt_tail = rx_cmpt_tail; - rxq->qstats.pending_desc = pending_desc; - rxq->qstats.mbuf_avail_cnt = rte_mempool_avail_count(rxq->mb_pool); - rxq->qstats.mbuf_in_use_cnt = rte_mempool_in_use_count(rxq->mb_pool); - - /* Batch the PIDX updates, this minimizes overhead on - * descriptor engine - */ - if (pending_desc >= MIN_RX_PIDX_UPDATE_THRESHOLD) - rearm_c2h_ring(rxq, pending_desc); - -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(DEBUG, "%s(): %d: queue id = %d, mbuf_avail_count = %d," - " mbuf_in_use_count = %d, count_pkts = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool), count_pkts); -#endif //DUMP_MEMPOOL_USAGE_STATS - - PMD_DRV_LOG(DEBUG, " Recv complete with hw cidx :%d", - rxq->wb_status->cidx); - PMD_DRV_LOG(DEBUG, " Recv complete with hw pidx :%d\n", - rxq->wb_status->pidx); - - return count_pkts; -} - -/* Receive API for Memory mapped mode */ -uint16_t qdma_recv_pkts_mm(struct qdma_rx_queue *rxq, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts) -{ - struct rte_mbuf *mb; - uint32_t count, id; - struct qdma_ul_mm_desc *desc; - uint32_t len; - int ret; - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; -#ifdef TEST_64B_DESC_BYPASS - int bypass_desc_sz_idx = qmda_get_desc_sz_idx(rxq->bypass_desc_sz); -#endif - - if (rxq->status != RTE_ETH_QUEUE_STATE_STARTED) - return 0; - - id = rxq->q_pidx_info.pidx; /* Descriptor index */ - - PMD_DRV_LOG(DEBUG, "recv start on rx queue-id :%d, on tail index:%d\n", - rxq->queue_id, id); - -#ifdef TEST_64B_DESC_BYPASS - if (unlikely(rxq->en_bypass && - bypass_desc_sz_idx == SW_DESC_CNTXT_64B_BYPASS_DMA)) { - PMD_DRV_LOG(DEBUG, "For MM mode, example design doesn't " - "support 64byte descriptor\n"); - return 0; - } -#endif - /* Make 1 less available, otherwise if we allow all descriptors - * to be filled,when nb_pkts = nb_tx_desc - 1, pidx will be same - * as old pidx and HW will treat this as no new descriptors were added. - * Hence, DMA won't happen with new descriptors. - */ - if (nb_pkts > rxq->nb_rx_desc - 2) - nb_pkts = rxq->nb_rx_desc - 2; - - for (count = 0; count < nb_pkts; count++) { - /* allocate new buffer */ - if (rte_mempool_get(rxq->mb_pool, (void *)&mb) != 0) { - PMD_DRV_LOG(ERR, "%s(): %d: No MBUFS, queue id = %d," - "mbuf_avail_count = %d," - " mbuf_in_use_count = %d\n", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); - return 0; - } - - desc = (struct qdma_ul_mm_desc *)rxq->rx_ring; - desc += id; - qdma_ul_update_mm_c2h_desc(rxq, mb, desc); - - len = (int)rxq->rx_buff_size; - rte_pktmbuf_pkt_len(mb) = len; - - rte_mbuf_refcnt_set(mb, 1); - mb->packet_type = 0; - mb->ol_flags = 0; - mb->next = 0; - mb->nb_segs = 1; - mb->port = rxq->port_id; - mb->vlan_tci = 0; - mb->hash.rss = 0; - - rx_pkts[count] = mb; - - rxq->ep_addr = (rxq->ep_addr + len) % DMA_BRAM_SIZE; - id = (id + 1) % (rxq->nb_rx_desc - 1); - } - - /* Make sure writes to the C2H descriptors are synchronized - * before updating PIDX - */ - rte_wmb(); - - /* update pidx pointer for MM-mode*/ - if (count > 0) { - rxq->q_pidx_info.pidx = id; - qdma_dev->hw_access->qdma_queue_pidx_update(rxq->dev, - qdma_dev->is_vf, - rxq->queue_id, 1, &rxq->q_pidx_info); - } - - ret = dma_wb_monitor(rxq, DMA_FROM_DEVICE, id); - if (ret) {//Error - PMD_DRV_LOG(ERR, "DMA Engine write-back monitor " - "timeout error occurred, wb-count:%d " - "and expected-count:%d\n", - rxq->wb_status->cidx, id); - - return 0; - } - return count; -} -/** - * DPDK callback for receiving packets in burst. - * - * @param rx_queue - * Generic pointer to Rx queue structure. - * @param[out] rx_pkts - * Array to store received packets. - * @param nb_pkts - * Maximum number of packets in array. - * - * @return - * Number of packets successfully received (<= nb_pkts). - */ -uint16_t qdma_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - uint16_t nb_pkts) -{ - struct qdma_rx_queue *rxq = rx_queue; - uint32_t count; - - if (rxq->st_mode) - count = qdma_recv_pkts_st(rxq, rx_pkts, nb_pkts); - else - count = qdma_recv_pkts_mm(rxq, rx_pkts, nb_pkts); - - return count; -} - -/** - * DPDK callback to request the driver to free mbufs - * currently cached by the driver. - * - * @param tx_queue - * Pointer to Tx queue specific data structure. - * @param free_cnt - * Maximum number of packets to free. Use 0 to indicate all possible packets - * should be freed. Note that a packet may be using multiple mbufs. - * - * @return - * Failure: < 0 - * Success: >= 0 - * 0-n: Number of packets freed. More packets may still remain in ring that - * are in use. - */ -int -qdma_dev_tx_done_cleanup(void *tx_queue, uint32_t free_cnt) -{ - struct qdma_tx_queue *txq = tx_queue; - - if ((uint16_t)free_cnt >= (txq->nb_tx_desc - 1)) - return -EINVAL; - - /* Free transmitted mbufs back to pool */ - return reclaim_tx_mbuf(txq, txq->wb_status->cidx, free_cnt); -} - -/** - * DPDK callback to check the status of a Tx descriptor in the queue. - * - * @param tx_queue - * Pointer to Tx queue specific data structure. - * @param offset - * The offset of the descriptor starting from tail (0 is the place where - * the next packet will be send). - * - * @return - * - (RTE_ETH_TX_DESC_FULL) Descriptor is being processed by the hw, i.e. - * in the transmit queue. - * - (RTE_ETH_TX_DESC_DONE) Hardware is done with this descriptor, it can - * be reused by the driver. - * - (RTE_ETH_TX_DESC_UNAVAIL): Descriptor is unavailable, reserved by the - * driver or the hardware. - * - (-EINVAL) bad descriptor offset. - */ -int -qdma_dev_tx_descriptor_status(void *tx_queue, uint16_t offset) -{ - struct qdma_tx_queue *txq = tx_queue; - uint16_t id; - int avail, in_use; - uint16_t cidx = 0; - - if (unlikely(offset >= (txq->nb_tx_desc - 1))) - return -EINVAL; - - /* One descriptor is reserved so that pidx is not same as old pidx */ - if (offset == (txq->nb_tx_desc - 2)) - return RTE_ETH_TX_DESC_UNAVAIL; - - id = txq->q_pidx_info.pidx; - cidx = txq->wb_status->cidx; - - in_use = (int)id - cidx; - if (in_use < 0) - in_use += (txq->nb_tx_desc - 1); - avail = txq->nb_tx_desc - 2 - in_use; - - if (offset < avail) - return RTE_ETH_TX_DESC_DONE; - - return RTE_ETH_TX_DESC_FULL; -} - -/* Transmit API for Streaming mode */ -uint16_t qdma_xmit_pkts_st(struct qdma_tx_queue *txq, - struct rte_mbuf **tx_pkts, uint16_t nb_pkts) -{ - struct rte_mbuf *mb = NULL; - uint64_t pkt_len = 0; - int avail, in_use, ret, nsegs; - uint16_t cidx = 0; - uint16_t count = 0, id; - struct qdma_pci_dev *qdma_dev = txq->dev->data->dev_private; - -#ifdef TEST_64B_DESC_BYPASS - int bypass_desc_sz_idx = qmda_get_desc_sz_idx(txq->bypass_desc_sz); - - if (unlikely(txq->en_bypass && - bypass_desc_sz_idx == SW_DESC_CNTXT_64B_BYPASS_DMA)) { - return qdma_xmit_64B_desc_bypass(txq, tx_pkts, nb_pkts); - } -#endif - - id = txq->q_pidx_info.pidx; - - /* Make sure reads to Tx ring are synchronized before - * accessing the status descriptor. - */ - rte_rmb(); - - cidx = txq->wb_status->cidx; - -#ifdef LATENCY_MEASUREMENT - if (cidx != txq->qstats.wrb_cidx) { - /* stop the timer */ - txq->qstats.pkt_lat.curr = rte_get_timer_cycles(); - h2c_pidx_to_hw_cidx_lat[txq->queue_id][txq->qstats.lat_cnt] = - txq->qstats.pkt_lat.curr - txq->qstats.pkt_lat.prev; - txq->qstats.lat_cnt = ((txq->qstats.lat_cnt + 1) % LATENCY_CNT); - } -#endif - - PMD_DRV_LOG(DEBUG, "Xmit start on tx queue-id:%d, tail index:%d\n", - txq->queue_id, id); - - /* Free transmitted mbufs back to pool */ - reclaim_tx_mbuf(txq, cidx, 0); - - in_use = (int)id - cidx; - if (in_use < 0) - in_use += (txq->nb_tx_desc - 1); - - /* Make 1 less available, otherwise if we allow all descriptors - * to be filled, when nb_pkts = nb_tx_desc - 1, pidx will be same - * as old pidx and HW will treat this as no new descriptors were added. - * Hence, DMA won't happen with new descriptors. - */ - avail = txq->nb_tx_desc - 2 - in_use; - - if (unlikely(!avail)) { - txq->qstats.txq_full_cnt++; - PMD_DRV_LOG(DEBUG, "Tx queue full, in_use = %d", in_use); - return 0; - } - - for (count = 0; count < nb_pkts; count++) { - mb = tx_pkts[count]; - nsegs = mb->nb_segs; - if (nsegs > avail) { - /* Number of segments in current mbuf are greater - * than number of descriptors available, - * hence update PIDX and return - */ - break; - } - avail -= nsegs; - id = txq->q_pidx_info.pidx; - txq->sw_ring[id] = mb; - pkt_len += rte_pktmbuf_pkt_len(mb); - - ret = qdma_ul_update_st_h2c_desc(txq, txq->offloads, mb); - if (unlikely(ret < 0)) - break; - } - - txq->stats.pkts += count; - txq->stats.bytes += pkt_len; - - txq->qstats.pidx = id; - txq->qstats.wrb_cidx = cidx; - txq->qstats.txq_tail = txq->tx_fl_tail; - txq->qstats.in_use_desc = in_use; - txq->qstats.nb_pkts = nb_pkts; - -#if (MIN_TX_PIDX_UPDATE_THRESHOLD > 1) - rte_spinlock_lock(&txq->pidx_update_lock); -#endif - txq->tx_desc_pend += count; - - /* Send PIDX update only if pending desc is more than threshold - * Saves frequent Hardware transactions - */ - if (txq->tx_desc_pend >= MIN_TX_PIDX_UPDATE_THRESHOLD) { - qdma_dev->hw_access->qdma_queue_pidx_update(txq->dev, - qdma_dev->is_vf, - txq->queue_id, 0, &txq->q_pidx_info); - - txq->tx_desc_pend = 0; -#ifdef LATENCY_MEASUREMENT - /* start the timer */ - txq->qstats.pkt_lat.prev = rte_get_timer_cycles(); -#endif - } -#if (MIN_TX_PIDX_UPDATE_THRESHOLD > 1) - rte_spinlock_unlock(&txq->pidx_update_lock); -#endif - PMD_DRV_LOG(DEBUG, " xmit completed with count:%d\n", count); - - return count; -} - -/* Transmit API for Memory mapped mode */ -uint16_t qdma_xmit_pkts_mm(struct qdma_tx_queue *txq, - struct rte_mbuf **tx_pkts, uint16_t nb_pkts) -{ - struct rte_mbuf *mb; - uint32_t count, id; - uint64_t len = 0; - int avail, in_use; - int ret; - struct qdma_pci_dev *qdma_dev = txq->dev->data->dev_private; - uint16_t cidx = 0; - -#ifdef TEST_64B_DESC_BYPASS - int bypass_desc_sz_idx = qmda_get_desc_sz_idx(txq->bypass_desc_sz); -#endif - - id = txq->q_pidx_info.pidx; - PMD_DRV_LOG(DEBUG, "Xmit start on tx queue-id:%d, tail index:%d\n", - txq->queue_id, id); - -#ifdef TEST_64B_DESC_BYPASS - if (unlikely(txq->en_bypass && - bypass_desc_sz_idx == SW_DESC_CNTXT_64B_BYPASS_DMA)) { - PMD_DRV_LOG(DEBUG, "For MM mode, example design doesn't " - "support 64B bypass testing\n"); - return 0; - } -#endif - cidx = txq->wb_status->cidx; - /* Free transmitted mbufs back to pool */ - reclaim_tx_mbuf(txq, cidx, 0); - in_use = (int)id - cidx; - if (in_use < 0) - in_use += (txq->nb_tx_desc - 1); - - /* Make 1 less available, otherwise if we allow all descriptors to be - * filled, when nb_pkts = nb_tx_desc - 1, pidx will be same as old pidx - * and HW will treat this as no new descriptors were added. - * Hence, DMA won't happen with new descriptors. - */ - avail = txq->nb_tx_desc - 2 - in_use; - if (!avail) { - PMD_DRV_LOG(ERR, "Tx queue full, in_use = %d", in_use); - return 0; - } - - if (nb_pkts > avail) - nb_pkts = avail; - - // Set the xmit descriptors and control bits - for (count = 0; count < nb_pkts; count++) { - - mb = tx_pkts[count]; - txq->sw_ring[id] = mb; - /*Update the descriptor control feilds*/ - qdma_ul_update_mm_h2c_desc(txq, mb); - - len = rte_pktmbuf_data_len(mb); - PMD_DRV_LOG(DEBUG, "xmit number of bytes:%ld, count:%d ", - len, count); - -#ifndef TANDEM_BOOT_SUPPORTED - txq->ep_addr = (txq->ep_addr + len) % DMA_BRAM_SIZE; -#endif - id = txq->q_pidx_info.pidx; - } - - /* Make sure writes to the H2C descriptors are synchronized before - * updating PIDX - */ - rte_wmb(); - - /* update pidx pointer */ - if (count > 0) { - PMD_DRV_LOG(INFO, "tx PIDX=%d", txq->q_pidx_info.pidx); - qdma_dev->hw_access->qdma_queue_pidx_update(txq->dev, - qdma_dev->is_vf, - txq->queue_id, 0, &txq->q_pidx_info); - } - - ret = dma_wb_monitor(txq, DMA_TO_DEVICE, id); - if (ret) { - PMD_DRV_LOG(ERR, "DMA Engine write-back monitor " - "timeout error occurred, wb-count:%d " - "and expected-count:%d\n", - txq->wb_status->cidx, id); - return 0; - } - - PMD_DRV_LOG(DEBUG, " xmit completed with count:%d", count); - return count; -} -/** - * DPDK callback for transmitting packets in burst. - * - * @param tx_queue - * Generic pointer to TX queue structure. - * @param[in] tx_pkts - * Packets to transmit. - * @param nb_pkts - * Number of packets in array. - * - * @return - * Number of packets successfully transmitted (<= nb_pkts). - */ -uint16_t qdma_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, - uint16_t nb_pkts) -{ - struct qdma_tx_queue *txq = tx_queue; - uint16_t count; - - if (txq->status != RTE_ETH_QUEUE_STATE_STARTED) - return 0; - - if (txq->st_mode) - count = qdma_xmit_pkts_st(txq, tx_pkts, nb_pkts); - else - count = qdma_xmit_pkts_mm(txq, tx_pkts, nb_pkts); - - return count; -} - -void __rte_cold -qdma_set_tx_function(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - if (rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128) { - PMD_DRV_LOG(DEBUG, "Using Vector Tx (port %d).", - dev->data->port_id); - qdma_dev->tx_vec_allowed = true; - dev->tx_pkt_burst = qdma_xmit_pkts_vec; - } else { - PMD_DRV_LOG(DEBUG, "Normal Rx will be used on port %d.", - dev->data->port_id); - dev->tx_pkt_burst = qdma_xmit_pkts; - } -} - -void __rte_cold -qdma_set_rx_function(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - if (rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128) { - PMD_DRV_LOG(DEBUG, "Using Vector Rx (port %d).", - dev->data->port_id); - qdma_dev->rx_vec_allowed = true; - dev->rx_pkt_burst = qdma_recv_pkts_vec; - } else { - PMD_DRV_LOG(DEBUG, "Normal Rx will be used on port %d.", - dev->data->port_id); - dev->rx_pkt_burst = qdma_recv_pkts; - } -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_rxtx.h b/QDMA/DPDK/drivers/net/qdma/qdma_rxtx.h deleted file mode 100755 index 58ac9e5..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_rxtx.h +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef QDMA_DPDK_RXTX_H_ -#define QDMA_DPDK_RXTX_H_ - -#include "qdma_access_export.h" - -/*Supporting functions for user logic pluggability*/ -uint16_t qdma_get_rx_queue_id(void *queue_hndl); -void qdma_get_device_info(void *queue_hndl, - enum qdma_device_type *device_type, - enum qdma_ip_type *ip_type); -struct qdma_ul_st_h2c_desc *get_st_h2c_desc(void *queue_hndl); -struct qdma_ul_mm_desc *get_mm_h2c_desc(void *queue_hndl); -uint64_t get_mm_c2h_ep_addr(void *queue_hndl); -uint64_t get_mm_h2c_ep_addr(void *queue_hndl); -uint32_t get_mm_buff_size(void *queue_hndl); - -uint32_t rx_queue_count(void *rx_queue); - -#endif /* QDMA_DPDK_RXTX_H_ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_rxtx_vec_sse.c b/QDMA/DPDK/drivers/net/qdma/qdma_rxtx_vec_sse.c deleted file mode 100755 index 34809dd..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_rxtx_vec_sse.c +++ /dev/null @@ -1,851 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <rte_mbuf.h> -#include <rte_cycles.h> -#include "qdma.h" -#include "qdma_access_common.h" - -#include <fcntl.h> -#include <unistd.h> -#include "qdma_rxtx.h" -#include "qdma_devops.h" - -#if defined RTE_ARCH_X86_64 -#include <immintrin.h> -#include <emmintrin.h> -#define RTE_QDMA_DESCS_PER_LOOP (2) -#endif - -/* Vector implementation to get packet length from two completion entries */ -static void qdma_ul_get_cmpt_pkt_len_vec(void *ul_cmpt_entry, __m128i *data) -{ - union qdma_ul_st_cmpt_ring *cmpt_entry1, *cmpt_entry2; - __m128i pkt_len_shift = _mm_set_epi64x(0, 4); - - cmpt_entry1 = (union qdma_ul_st_cmpt_ring *)(ul_cmpt_entry); - cmpt_entry2 = cmpt_entry1 + 1; - - /* Read desc statuses backwards to avoid race condition */ - /* Load a pkt desc */ - data[1] = _mm_set_epi64x(0, cmpt_entry2->data); - /* Find packet length, currently driver needs - * only packet length from completion info - */ - data[1] = _mm_srl_epi32(data[1], pkt_len_shift); - - /* Load a pkt desc */ - data[0] = _mm_set_epi64x(0, cmpt_entry1->data); - /* Find packet length, currently driver needs - * only packet length from completion info - */ - data[0] = _mm_srl_epi32(data[0], pkt_len_shift); -} - -/* Vector implementation to update H2C descriptor */ -static int qdma_ul_update_st_h2c_desc_vec(void *qhndl, uint64_t q_offloads, - struct rte_mbuf *mb) -{ - (void)q_offloads; - int nsegs = mb->nb_segs; - uint16_t flags = S_H2C_DESC_F_SOP | S_H2C_DESC_F_EOP; - uint16_t id; - struct qdma_ul_st_h2c_desc *tx_ring_st; - struct qdma_tx_queue *txq = (struct qdma_tx_queue *)qhndl; - - tx_ring_st = (struct qdma_ul_st_h2c_desc *)txq->tx_ring; - id = txq->q_pidx_info.pidx; - - if (nsegs == 1) { - __m128i descriptor; - uint16_t datalen = mb->data_len; - - descriptor = _mm_set_epi64x(mb->buf_iova + mb->data_off, - (uint64_t)datalen << 16 | - (uint64_t)datalen << 32 | - (uint64_t)flags << 48); - _mm_store_si128((__m128i *)&tx_ring_st[id], descriptor); - - id++; - if (unlikely(id >= (txq->nb_tx_desc - 1))) - id -= (txq->nb_tx_desc - 1); - } else { - int pkt_segs = nsegs; - while (nsegs && mb) { - __m128i descriptor; - uint16_t datalen = mb->data_len; - - flags = 0; - if (nsegs == pkt_segs) - flags |= S_H2C_DESC_F_SOP; - if (nsegs == 1) - flags |= S_H2C_DESC_F_EOP; - - descriptor = _mm_set_epi64x(mb->buf_iova + mb->data_off, - (uint64_t)datalen << 16 | - (uint64_t)datalen << 32 | - (uint64_t)flags << 48); - _mm_store_si128((__m128i *)&tx_ring_st[id], descriptor); - - nsegs--; - mb = mb->next; - id++; - if (unlikely(id >= (txq->nb_tx_desc - 1))) - id -= (txq->nb_tx_desc - 1); - } - } - - txq->q_pidx_info.pidx = id; - - return 0; -} - -/* Process completion ring */ -static int process_cmpt_ring_vec(struct qdma_rx_queue *rxq, - uint16_t num_cmpt_entries) -{ - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; - union qdma_ul_st_cmpt_ring *user_cmpt_entry; - uint32_t count = 0; - int ret = 0; - uint16_t rx_cmpt_tail = rxq->cmpt_cidx_info.wrb_cidx; - - if (likely(!rxq->dump_immediate_data)) { - if ((rx_cmpt_tail + num_cmpt_entries) < - (rxq->nb_rx_cmpt_desc - 1)) { - for (count = 0; count < num_cmpt_entries; count++) { - user_cmpt_entry = - (union qdma_ul_st_cmpt_ring *) - ((uint64_t)rxq->cmpt_ring + - ((uint64_t)rx_cmpt_tail * rxq->cmpt_desc_len)); - - ret = qdma_ul_extract_st_cmpt_info( - user_cmpt_entry, - &rxq->cmpt_data[count]); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Error detected on CMPT ring " - "at index %d, queue_id = %d\n", - rx_cmpt_tail, rxq->queue_id); - rxq->err = 1; - return -1; - } - rx_cmpt_tail++; - } - } else { - while (count < num_cmpt_entries) { - user_cmpt_entry = - (union qdma_ul_st_cmpt_ring *) - ((uint64_t)rxq->cmpt_ring + - ((uint64_t)rx_cmpt_tail * rxq->cmpt_desc_len)); - - ret = qdma_ul_extract_st_cmpt_info( - user_cmpt_entry, - &rxq->cmpt_data[count]); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Error detected on CMPT ring " - "at index %d, queue_id = %d\n", - rx_cmpt_tail, rxq->queue_id); - rxq->err = 1; - return -1; - } - - rx_cmpt_tail++; - if (unlikely(rx_cmpt_tail >= - (rxq->nb_rx_cmpt_desc - 1))) - rx_cmpt_tail -= - (rxq->nb_rx_cmpt_desc - 1); - count++; - } - } - } else { - while (count < num_cmpt_entries) { - user_cmpt_entry = - (union qdma_ul_st_cmpt_ring *) - ((uint64_t)rxq->cmpt_ring + - ((uint64_t)rx_cmpt_tail * rxq->cmpt_desc_len)); - - ret = qdma_ul_extract_st_cmpt_info( - user_cmpt_entry, - &rxq->cmpt_data[count]); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Error detected on CMPT ring " - "at CMPT index %d, queue_id = %d\n", - rx_cmpt_tail, rxq->queue_id); - rxq->err = 1; - return -1; - } - - ret = qdma_ul_process_immediate_data_st((void *)rxq, - user_cmpt_entry, rxq->cmpt_desc_len); - if (ret < 0) { - PMD_DRV_LOG(ERR, "Error processing immediate data " - "at CMPT index = %d, queue_id = %d\n", - rx_cmpt_tail, rxq->queue_id); - return -1; - } - - rx_cmpt_tail++; - if (unlikely(rx_cmpt_tail >= - (rxq->nb_rx_cmpt_desc - 1))) - rx_cmpt_tail -= (rxq->nb_rx_cmpt_desc - 1); - count++; - } - } - - // Update the CPMT CIDX - rxq->cmpt_cidx_info.wrb_cidx = rx_cmpt_tail; - qdma_dev->hw_access->qdma_queue_cmpt_cidx_update(rxq->dev, - qdma_dev->is_vf, - rxq->queue_id, &rxq->cmpt_cidx_info); - - return 0; -} - -/* Prepare mbuf for one packet */ -static inline -struct rte_mbuf *prepare_single_packet(struct qdma_rx_queue *rxq, - uint16_t cmpt_idx) -{ - struct rte_mbuf *mb = NULL; - uint16_t id = rxq->rx_tail; - uint16_t pkt_length; - - pkt_length = qdma_ul_get_cmpt_pkt_len(&rxq->cmpt_data[cmpt_idx]); - - if (pkt_length) { - rxq->stats.pkts++; - rxq->stats.bytes += pkt_length; - - if (likely(pkt_length <= rxq->rx_buff_size)) { - mb = rxq->sw_ring[id]; - rxq->sw_ring[id++] = NULL; - - if (unlikely(id >= (rxq->nb_rx_desc - 1))) - id -= (rxq->nb_rx_desc - 1); - - rte_mbuf_refcnt_set(mb, 1); - mb->nb_segs = 1; - mb->port = rxq->port_id; - mb->ol_flags = 0; - mb->packet_type = 0; - mb->pkt_len = pkt_length; - mb->data_len = pkt_length; - } else { - mb = prepare_segmented_packet(rxq, pkt_length, &id); - } - - rxq->rx_tail = id; - } - return mb; -} - -/* Vector implementation to prepare mbufs for packets. - * Update this API if HW provides more information to be populated in mbuf. - */ -static uint16_t prepare_packets_vec(struct qdma_rx_queue *rxq, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts) -{ - struct rte_mbuf *mb; - uint16_t count = 0, count_pkts = 0; - uint16_t n_pkts = nb_pkts & -2; - uint16_t id = rxq->rx_tail; - struct rte_mbuf **sw_ring = rxq->sw_ring; - uint16_t rx_buff_size = rxq->rx_buff_size; - /* mask to shuffle from desc. to mbuf */ - __m128i shuf_msk = _mm_set_epi8( - 0xFF, 0xFF, 0xFF, 0xFF, /* skip 32bits rss */ - 0xFF, 0xFF, /* skip low 16 bits vlan_macip */ - 1, 0, /* octet 0~1, 16 bits data_len */ - 0xFF, 0xFF, /* skip high 16 bits pkt_len, zero out */ - 1, 0, /* octet 0~1, low 16 bits pkt_len */ - 0xFF, 0xFF, /* skip 32 bit pkt_type */ - 0xFF, 0xFF - ); - __m128i mbuf_init, pktlen, zero_data; - - mbuf_init = _mm_set_epi64x(0, rxq->mbuf_initializer); - pktlen = _mm_setzero_si128(); - zero_data = _mm_setzero_si128(); - - /* compile-time check */ - RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) != - offsetof(struct rte_mbuf, rx_descriptor_fields1) + 4); - RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_len) != - offsetof(struct rte_mbuf, rx_descriptor_fields1) + 8); - RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, rearm_data) != - RTE_ALIGN(offsetof(struct rte_mbuf, rearm_data), 16)); - - for (count = 0; count < n_pkts; - count += RTE_QDMA_DESCS_PER_LOOP) { - __m128i pkt_len[RTE_QDMA_DESCS_PER_LOOP]; - __m128i pkt_mb1, pkt_mb2; - __m128i mbp1; - uint16_t pktlen1, pktlen2; - - qdma_ul_get_cmpt_pkt_len_vec( - &rxq->cmpt_data[count], pkt_len); - - pktlen1 = _mm_extract_epi16(pkt_len[0], 0); - pktlen2 = _mm_extract_epi16(pkt_len[1], 0); - - /* Check if packets are segmented across descriptors */ - if ((pktlen1 && (pktlen1 <= rx_buff_size)) && - (pktlen2 && (pktlen2 <= rx_buff_size)) && - ((id + RTE_QDMA_DESCS_PER_LOOP) < - (rxq->nb_rx_desc - 1))) { - /* Load 2 (64 bit) mbuf pointers */ - mbp1 = _mm_loadu_si128((__m128i *)&sw_ring[id]); - - /* Copy 2 64 bit mbuf point into rx_pkts */ - _mm_storeu_si128((__m128i *)&rx_pkts[count_pkts], mbp1); - _mm_storeu_si128((__m128i *)&sw_ring[id], zero_data); - - /* Pkt 1,2 convert format from desc to pktmbuf */ - /* We only have packet length to copy */ - pkt_mb2 = _mm_shuffle_epi8(pkt_len[1], shuf_msk); - pkt_mb1 = _mm_shuffle_epi8(pkt_len[0], shuf_msk); - - /* Write the rearm data and the olflags in one write */ - _mm_store_si128( - (__m128i *)&rx_pkts[count_pkts]->rearm_data, mbuf_init); - _mm_store_si128( - (__m128i *)&rx_pkts[count_pkts + 1]->rearm_data, - mbuf_init); - - /* Write packet length */ - _mm_storeu_si128( - (void *)&rx_pkts[count_pkts]->rx_descriptor_fields1, - pkt_mb1); - _mm_storeu_si128( - (void *)&rx_pkts[count_pkts + 1]->rx_descriptor_fields1, - pkt_mb2); - - /* Accumulate packet length counter */ - pktlen = _mm_add_epi64(pktlen, - _mm_set_epi16(0, 0, 0, 0, - 0, 0, 0, pktlen1)); - pktlen = _mm_add_epi64(pktlen, - _mm_set_epi16(0, 0, 0, 0, - 0, 0, 0, pktlen2)); - - count_pkts += RTE_QDMA_DESCS_PER_LOOP; - id += RTE_QDMA_DESCS_PER_LOOP; - } else { - /* Handle packets segmented - * across multiple descriptors - * or ring wrap - */ - if (pktlen1) { - mb = prepare_segmented_packet(rxq, - pktlen1, &id); - rx_pkts[count_pkts++] = mb; - pktlen = _mm_add_epi64(pktlen, - _mm_set_epi16(0, 0, 0, 0, - 0, 0, 0, pktlen1)); - } - - if (pktlen2) { - mb = prepare_segmented_packet(rxq, - pktlen2, &id); - rx_pkts[count_pkts++] = mb; - pktlen = _mm_add_epi64(pktlen, - _mm_set_epi16(0, 0, 0, 0, - 0, 0, 0, pktlen2)); - } - } - } - - rxq->stats.pkts += count_pkts; - rxq->stats.bytes += _mm_extract_epi64(pktlen, 0); - rxq->rx_tail = id; - - /* Handle single packet, if any pending */ - if (nb_pkts & 1) { - mb = prepare_single_packet(rxq, count); - if (mb) - rx_pkts[count_pkts++] = mb; - } - - return count_pkts; -} - -/* Populate C2H ring with new buffers */ -static int rearm_c2h_ring_vec(struct qdma_rx_queue *rxq, uint16_t num_desc) -{ - struct qdma_pci_dev *qdma_dev = rxq->dev->data->dev_private; - struct rte_mbuf *mb; - struct qdma_ul_st_c2h_desc *rx_ring_st = - (struct qdma_ul_st_c2h_desc *)rxq->rx_ring; - uint16_t mbuf_index = 0; - uint16_t id; - int rearm_descs; - - id = rxq->q_pidx_info.pidx; - - /* Split the C2H ring updation in two parts. - * First handle till end of ring and then - * handle from beginning of ring, if ring wraps - */ - if ((id + num_desc) < (rxq->nb_rx_desc - 1)) - rearm_descs = num_desc; - else { - rearm_descs = (rxq->nb_rx_desc - 1) - id; - rxq->qstats.ring_wrap_cnt++; - } - - /* allocate new buffer */ - if (rte_mempool_get_bulk(rxq->mb_pool, (void *)&rxq->sw_ring[id], - rearm_descs) != 0){ - PMD_DRV_LOG(ERR, "%s(): %d: No MBUFS, queue id = %d," - "mbuf_avail_count = %d," - " mbuf_in_use_count = %d, num_desc_req = %d\n", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool), rearm_descs); - return -1; - } - - int rearm_cnt = rearm_descs & -2; - __m128i head_room = _mm_set_epi64x(RTE_PKTMBUF_HEADROOM, - RTE_PKTMBUF_HEADROOM); - - for (mbuf_index = 0; mbuf_index < ((uint16_t)rearm_cnt & 0xFFFF); - mbuf_index += RTE_QDMA_DESCS_PER_LOOP, - id += RTE_QDMA_DESCS_PER_LOOP) { - __m128i vaddr0, vaddr1; - __m128i dma_addr; - - /* load buf_addr(lo 64bit) and buf_iova(hi 64bit) */ - RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, buf_iova) != - offsetof(struct rte_mbuf, buf_addr) + 8); - - /* Load two mbufs data addresses */ - vaddr0 = _mm_loadu_si128( - (__m128i *)&(rxq->sw_ring[id]->buf_addr)); - vaddr1 = _mm_loadu_si128( - (__m128i *)&(rxq->sw_ring[id+1]->buf_addr)); - - /* Extract physical addresses of two mbufs */ - dma_addr = _mm_unpackhi_epi64(vaddr0, vaddr1); - - /* Add headroom to dma_addr */ - dma_addr = _mm_add_epi64(dma_addr, head_room); - - /* Write C2H desc with physical dma_addr */ - _mm_storeu_si128((__m128i *)&rx_ring_st[id], dma_addr); - } - - if (rearm_descs & 1) { - mb = rxq->sw_ring[id]; - - /* rearm descriptor */ - rx_ring_st[id].dst_addr = - (uint64_t)mb->buf_iova + - RTE_PKTMBUF_HEADROOM; - id++; - } - - if (unlikely(id >= (rxq->nb_rx_desc - 1))) - id -= (rxq->nb_rx_desc - 1); - - /* Handle from beginning of ring, if ring wrapped */ - rearm_descs = num_desc - rearm_descs; - if (unlikely(rearm_descs)) { - /* allocate new buffer */ - if (rte_mempool_get_bulk(rxq->mb_pool, - (void *)&rxq->sw_ring[id], rearm_descs) != 0) { - PMD_DRV_LOG(ERR, "%s(): %d: No MBUFS, queue id = %d," - "mbuf_avail_count = %d," - " mbuf_in_use_count = %d, num_desc_req = %d\n", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool), rearm_descs); - - rxq->q_pidx_info.pidx = id; - qdma_dev->hw_access->qdma_queue_pidx_update(rxq->dev, - qdma_dev->is_vf, - rxq->queue_id, 1, &rxq->q_pidx_info); -#ifdef LATENCY_MEASUREMENT - /* start the timer */ - rxq->qstats.pkt_lat.prev = rte_get_timer_cycles(); -#endif - return -1; - } - - for (mbuf_index = 0; - mbuf_index < ((uint16_t)rearm_descs & 0xFFFF); - mbuf_index++, id++) { - mb = rxq->sw_ring[id]; - mb->data_off = RTE_PKTMBUF_HEADROOM; - - /* rearm descriptor */ - rx_ring_st[id].dst_addr = - (uint64_t)mb->buf_iova + - RTE_PKTMBUF_HEADROOM; - } - } - - PMD_DRV_LOG(DEBUG, "%s(): %d: PIDX Update: queue id = %d, " - "num_desc = %d", - __func__, __LINE__, rxq->queue_id, - num_desc); - - /* Make sure writes to the C2H descriptors are - * synchronized before updating PIDX - */ - rte_wmb(); - - rxq->q_pidx_info.pidx = id; - qdma_dev->hw_access->qdma_queue_pidx_update(rxq->dev, - qdma_dev->is_vf, - rxq->queue_id, 1, &rxq->q_pidx_info); - -#ifdef LATENCY_MEASUREMENT - /* start the timer */ - rxq->qstats.pkt_lat.prev = rte_get_timer_cycles(); -#endif - return 0; -} - -/* Receive API for Streaming mode */ -uint16_t qdma_recv_pkts_st_vec(struct qdma_rx_queue *rxq, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts) -{ - uint16_t count_pkts; - struct wb_status *wb_status; - uint16_t nb_pkts_avail = 0; - uint16_t rx_cmpt_tail = 0; - uint16_t cmpt_pidx, c2h_pidx; - uint16_t pending_desc; -#ifdef TEST_64B_DESC_BYPASS - int bypass_desc_sz_idx = qmda_get_desc_sz_idx(rxq->bypass_desc_sz); -#endif - - if (unlikely(rxq->err)) - return 0; - - PMD_DRV_LOG(DEBUG, "recv start on rx queue-id :%d, on " - "tail index:%d number of pkts %d", - rxq->queue_id, rxq->rx_tail, nb_pkts); - wb_status = rxq->wb_status; - rx_cmpt_tail = rxq->cmpt_cidx_info.wrb_cidx; - -#ifdef TEST_64B_DESC_BYPASS - if (unlikely(rxq->en_bypass && - bypass_desc_sz_idx == SW_DESC_CNTXT_64B_BYPASS_DMA)) { - PMD_DRV_LOG(DEBUG, "For RX ST-mode, example" - " design doesn't support 64byte descriptor\n"); - return 0; - } -#endif - cmpt_pidx = wb_status->pidx; - -#ifdef LATENCY_MEASUREMENT - if (cmpt_pidx != rxq->qstats.wrb_pidx) { - /* stop the timer */ - rxq->qstats.pkt_lat.curr = rte_get_timer_cycles(); - c2h_pidx_to_cmpt_pidx_lat[rxq->queue_id][rxq->qstats.lat_cnt] = - rxq->qstats.pkt_lat.curr - rxq->qstats.pkt_lat.prev; - rxq->qstats.lat_cnt = ((rxq->qstats.lat_cnt + 1) % LATENCY_CNT); - } -#endif - - if (rx_cmpt_tail < cmpt_pidx) - nb_pkts_avail = cmpt_pidx - rx_cmpt_tail; - else if (rx_cmpt_tail > cmpt_pidx) - nb_pkts_avail = rxq->nb_rx_cmpt_desc - 1 - rx_cmpt_tail + - cmpt_pidx; - - if (nb_pkts_avail == 0) { - PMD_DRV_LOG(DEBUG, "%s(): %d: nb_pkts_avail = 0\n", - __func__, __LINE__); - return 0; - } - - nb_pkts = RTE_MIN(nb_pkts, RTE_MIN(nb_pkts_avail, QDMA_MAX_BURST_SIZE)); - -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(DEBUG, "%s(): %d: queue id = %d, mbuf_avail_count = %d, " - "mbuf_in_use_count = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); -#endif //DUMP_MEMPOOL_USAGE_STATS - /* Make sure reads to CMPT ring are synchronized before - * accessing the ring - */ - rte_rmb(); -#ifdef QDMA_LATENCY_OPTIMIZED - adapt_update_counter(rxq, nb_pkts_avail); -#endif //QDMA_LATENCY_OPTIMIZED - - int ret = process_cmpt_ring_vec(rxq, nb_pkts); - if (unlikely(ret)) - return 0; - - if (rxq->status != RTE_ETH_QUEUE_STATE_STARTED) { - PMD_DRV_LOG(DEBUG, "%s(): %d: rxq->status = %d\n", - __func__, __LINE__, rxq->status); - return 0; - } - - count_pkts = prepare_packets_vec(rxq, rx_pkts, nb_pkts); - - c2h_pidx = rxq->q_pidx_info.pidx; - pending_desc = rxq->rx_tail - c2h_pidx - 1; - if (rxq->rx_tail < (c2h_pidx + 1)) - pending_desc = rxq->nb_rx_desc - 2 + rxq->rx_tail - - c2h_pidx; - - rxq->qstats.pidx = rxq->q_pidx_info.pidx; - rxq->qstats.wrb_pidx = rxq->wb_status->pidx; - rxq->qstats.wrb_cidx = rxq->wb_status->cidx; - rxq->qstats.rxq_cmpt_tail = rx_cmpt_tail; - rxq->qstats.pending_desc = pending_desc; - rxq->qstats.mbuf_avail_cnt = rte_mempool_avail_count(rxq->mb_pool); - rxq->qstats.mbuf_in_use_cnt = rte_mempool_in_use_count(rxq->mb_pool); - - /* Batch the PIDX updates, this minimizes overhead on - * descriptor engine - */ - if (pending_desc >= MIN_RX_PIDX_UPDATE_THRESHOLD) - rearm_c2h_ring_vec(rxq, pending_desc); - -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(DEBUG, "%s(): %d: queue id = %d, mbuf_avail_count = %d," - " mbuf_in_use_count = %d, count_pkts = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool), count_pkts); -#endif //DUMP_MEMPOOL_USAGE_STATS - - PMD_DRV_LOG(DEBUG, " Recv complete with hw cidx :%d", - rxq->wb_status->cidx); - PMD_DRV_LOG(DEBUG, " Recv complete with hw pidx :%d\n", - rxq->wb_status->pidx); - - return count_pkts; -} - -/** - * DPDK callback for receiving packets in burst. - * - * @param rx_queue - * Generic pointer to Rx queue structure. - * @param[out] rx_pkts - * Array to store received packets. - * @param nb_pkts - * Maximum number of packets in array. - * - * @return - * Number of packets successfully received (<= nb_pkts). - */ -uint16_t qdma_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, - uint16_t nb_pkts) -{ - struct qdma_rx_queue *rxq = rx_queue; - uint32_t count; - - if (rxq->st_mode) - count = qdma_recv_pkts_st_vec(rxq, rx_pkts, nb_pkts); - else - count = qdma_recv_pkts_mm(rxq, rx_pkts, nb_pkts); - - return count; -} - -/* Transmit API for Streaming mode */ -uint16_t qdma_xmit_pkts_st_vec(struct qdma_tx_queue *txq, - struct rte_mbuf **tx_pkts, uint16_t nb_pkts) -{ - struct rte_mbuf *mb; - uint64_t pkt_len = 0; - int avail, in_use, ret, nsegs; - uint16_t cidx = 0; - uint16_t count = 0, id; - struct qdma_pci_dev *qdma_dev = txq->dev->data->dev_private; - -#ifdef TEST_64B_DESC_BYPASS - int bypass_desc_sz_idx = qmda_get_desc_sz_idx(txq->bypass_desc_sz); - - if (unlikely(txq->en_bypass && - bypass_desc_sz_idx == SW_DESC_CNTXT_64B_BYPASS_DMA)) { - return qdma_xmit_64B_desc_bypass(txq, tx_pkts, nb_pkts); - } -#endif - - id = txq->q_pidx_info.pidx; - - /* Make sure reads to Tx ring are synchronized before - * accessing the status descriptor. - */ - rte_rmb(); - - cidx = txq->wb_status->cidx; - -#ifdef LATENCY_MEASUREMENT - uint32_t cidx_cnt = 0; - if (cidx != txq->qstats.wrb_cidx) { - if ((cidx - txq->qstats.wrb_cidx) > 0) { - cidx_cnt = cidx - txq->qstats.wrb_cidx; - - if (cidx_cnt <= 8) - txq->qstats.wrb_cidx_cnt_lt_8++; - else if (cidx_cnt > 8 && cidx_cnt <= 32) - txq->qstats.wrb_cidx_cnt_8_to_32++; - else if (cidx_cnt > 32 && cidx_cnt <= 64) - txq->qstats.wrb_cidx_cnt_32_to_64++; - else - txq->qstats.wrb_cidx_cnt_gt_64++; - } - - /* stop the timer */ - txq->qstats.pkt_lat.curr = rte_get_timer_cycles(); - h2c_pidx_to_hw_cidx_lat[txq->queue_id][txq->qstats.lat_cnt] = - txq->qstats.pkt_lat.curr - txq->qstats.pkt_lat.prev; - txq->qstats.lat_cnt = ((txq->qstats.lat_cnt + 1) % LATENCY_CNT); - } else { - txq->qstats.wrb_cidx_cnt_no_change++; - } -#endif - - PMD_DRV_LOG(DEBUG, "Xmit start on tx queue-id:%d, tail index:%d\n", - txq->queue_id, id); - - /* Free transmitted mbufs back to pool */ - reclaim_tx_mbuf(txq, cidx, 0); - - in_use = (int)id - cidx; - if (in_use < 0) - in_use += (txq->nb_tx_desc - 1); - - /* Make 1 less available, otherwise if we allow all descriptors - * to be filled, when nb_pkts = nb_tx_desc - 1, pidx will be same - * as old pidx and HW will treat this as no new descriptors were added. - * Hence, DMA won't happen with new descriptors. - */ - avail = txq->nb_tx_desc - 2 - in_use; - - if (unlikely(!avail)) { - txq->qstats.txq_full_cnt++; - PMD_DRV_LOG(DEBUG, "Tx queue full, in_use = %d", in_use); - return 0; - } - - for (count = 0; count < nb_pkts; count++) { - mb = tx_pkts[count]; - nsegs = mb->nb_segs; - if (nsegs > avail) { - /* Number of segments in current mbuf are greater - * than number of descriptors available, - * hence update PIDX and return - */ - break; - } - avail -= nsegs; - id = txq->q_pidx_info.pidx; - txq->sw_ring[id] = mb; - pkt_len += rte_pktmbuf_pkt_len(mb); - - ret = qdma_ul_update_st_h2c_desc_vec(txq, txq->offloads, mb); - - if (unlikely(ret < 0)) - break; - } - - txq->stats.pkts += count; - txq->stats.bytes += pkt_len; - - txq->qstats.pidx = id; - txq->qstats.wrb_cidx = cidx; - txq->qstats.txq_tail = txq->tx_fl_tail; - txq->qstats.in_use_desc = in_use; - txq->qstats.nb_pkts = nb_pkts; - -#if (MIN_TX_PIDX_UPDATE_THRESHOLD > 1) - rte_spinlock_lock(&txq->pidx_update_lock); -#endif - txq->tx_desc_pend += count; - - /* Send PIDX update only if pending desc is more than threshold - * Saves frequent Hardware transactions - */ - if (txq->tx_desc_pend >= MIN_TX_PIDX_UPDATE_THRESHOLD) { - qdma_dev->hw_access->qdma_queue_pidx_update(txq->dev, - qdma_dev->is_vf, - txq->queue_id, 0, &txq->q_pidx_info); - - txq->tx_desc_pend = 0; - -#ifdef LATENCY_MEASUREMENT - /* start the timer */ - txq->qstats.pkt_lat.prev = rte_get_timer_cycles(); -#endif - } -#if (MIN_TX_PIDX_UPDATE_THRESHOLD > 1) - rte_spinlock_unlock(&txq->pidx_update_lock); -#endif - PMD_DRV_LOG(DEBUG, " xmit completed with count:%d\n", count); - - return count; -} - -/** - * DPDK callback for transmitting packets in burst. - * - * @param tx_queue - * Generic pointer to TX queue structure. - * @param[in] tx_pkts - * Packets to transmit. - * @param nb_pkts - * Number of packets in array. - * - * @return - * Number of packets successfully transmitted (<= nb_pkts). - */ -uint16_t qdma_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts, - uint16_t nb_pkts) -{ - struct qdma_tx_queue *txq = tx_queue; - uint16_t count; - - if (txq->status != RTE_ETH_QUEUE_STATE_STARTED) - return 0; - - if (txq->st_mode) - count = qdma_xmit_pkts_st_vec(txq, tx_pkts, nb_pkts); - else - count = qdma_xmit_pkts_mm(txq, tx_pkts, nb_pkts); - - return count; -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_user.c b/QDMA/DPDK/drivers/net/qdma/qdma_user.c deleted file mode 100755 index a487de6..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_user.c +++ /dev/null @@ -1,295 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <rte_mbuf.h> -#include <rte_cycles.h> -#include <rte_ethdev.h> -#include "qdma_user.h" -#include "qdma_access_common.h" -#include "qdma_log.h" - -#include <fcntl.h> -#include <unistd.h> - -/** - * Extract the fields of given completion entry in the completion ring. - * - * @param ul_cmpt_entry - * Pointer to completion entry to be extracted. - * @param cmpt_info - * Pointer to variable to which completion entry details to be extracted. - * - * @return - * 0 on success and -1 on failure. - */ -int qdma_ul_extract_st_cmpt_info(void *ul_cmpt_entry, void *cmpt_info) -{ - union qdma_ul_st_cmpt_ring *cmpt_data, *cmpt_desc; - - cmpt_desc = (union qdma_ul_st_cmpt_ring *)(ul_cmpt_entry); - cmpt_data = (union qdma_ul_st_cmpt_ring *)(cmpt_info); - - if (unlikely(cmpt_desc->err || cmpt_desc->data_frmt)) - return -1; - - cmpt_data->data = cmpt_desc->data; - if (unlikely(!cmpt_desc->desc_used)) - cmpt_data->length = 0; - - return 0; -} - -/** - * Extract the packet length from the given completion entry. - * - * @param ul_cmpt_entry - * Pointer to completion entry to be extracted. - * - * @return - * Packet length - */ -uint16_t qdma_ul_get_cmpt_pkt_len(void *ul_cmpt_entry) -{ - return ((union qdma_ul_st_cmpt_ring *)ul_cmpt_entry)->length; -} - -/** - * Processes the immediate data for the given completion ring entry - * and stores in a file. - * - * @param qhndl - * Pointer to RX queue handle. - * @param cmpt_desc_len - * Completion descriptor length. - * @param cmpt_entry - * Pointer to completion entry to be processed. - * - * @return - * None. - */ -int qdma_ul_process_immediate_data_st(void *qhndl, void *cmpt_entry, - uint16_t cmpt_desc_len) -{ - int ofd; - char fln[50]; -#ifndef TEST_64B_DESC_BYPASS - uint16_t i = 0; - enum qdma_device_type dev_type; - enum qdma_ip_type ip_type; -#else - int ret = 0; -#endif - uint16_t queue_id = 0; - - queue_id = qdma_get_rx_queue_id(qhndl); - snprintf(fln, sizeof(fln), "q_%d_%s", queue_id, - "immmediate_data.txt"); - ofd = open(fln, O_RDWR | O_CREAT | O_APPEND | - O_SYNC, 0666); - if (ofd < 0) { - PMD_DRV_LOG(INFO, "recv on qhndl[%d] CMPT, " - "unable to create outfile " - " to dump immediate data", - queue_id); - return ofd; - } -#ifdef TEST_64B_DESC_BYPASS - ret = write(ofd, cmpt_entry, cmpt_desc_len); - if (ret < cmpt_desc_len) - PMD_DRV_LOG(DEBUG, "recv on rxq[%d] CMPT, " - "immediate data len: %d, " - "written to outfile :%d bytes", - queue_id, cmpt_desc_len, - ret); -#else - qdma_get_device_info(qhndl, &dev_type, &ip_type); - - if (ip_type == QDMA_VERSAL_HARD_IP && - dev_type == QDMA_DEVICE_VERSAL_CPM4) { - //Ignoring first 20 bits of length feild - dprintf(ofd, "%02x", - (*((uint8_t *)cmpt_entry + 2) & 0xF0)); - for (i = 3; i < (cmpt_desc_len) ; i++) - dprintf(ofd, "%02x", - *((uint8_t *)cmpt_entry + i)); - } else { - dprintf(ofd, "%02x", - (*((uint8_t *)cmpt_entry) & 0xF0)); - for (i = 1; i < (cmpt_desc_len) ; i++) - dprintf(ofd, "%02x", - *((uint8_t *)cmpt_entry + i)); - } -#endif - - close(ofd); - return 0; -} - -/** - * Updates the ST H2C descriptor. - * - * @param qhndl - * Pointer to TX queue handle. - * @param q_offloads - * Offloads supported for the queue. - * @param mb - * Pointer to memory buffer. - * - * @return - * None. - */ -int qdma_ul_update_st_h2c_desc(void *qhndl, uint64_t q_offloads, - struct rte_mbuf *mb) -{ - (void)q_offloads; - struct qdma_ul_st_h2c_desc *desc_info; - int nsegs = mb->nb_segs; - int pkt_segs = nsegs; - - if (nsegs == 1) { - desc_info = get_st_h2c_desc(qhndl); - desc_info->len = rte_pktmbuf_data_len(mb); - desc_info->pld_len = desc_info->len; - desc_info->src_addr = mb->buf_iova + mb->data_off; - desc_info->flags = (S_H2C_DESC_F_SOP | S_H2C_DESC_F_EOP); - desc_info->cdh_flags = 0; - return 0; - } - - while (nsegs && mb) { - desc_info = get_st_h2c_desc(qhndl); - - desc_info->len = rte_pktmbuf_data_len(mb); - desc_info->pld_len = desc_info->len; - desc_info->src_addr = mb->buf_iova + mb->data_off; - desc_info->flags = 0; - - desc_info->flags |= (nsegs == pkt_segs) ? S_H2C_DESC_F_SOP : 0; - desc_info->flags |= (nsegs == 1) ? S_H2C_DESC_F_EOP : 0; - - desc_info->cdh_flags = 0; - - nsegs--; - mb = mb->next; - } - - return 0; -} - -/** - * updates the MM c2h descriptor. - * - * @param qhndl - * Pointer to RX queue handle. - * @param mb - * Pointer to memory buffer. - * @param desc - * Pointer to descriptor entry. - * - * @return - * None. - */ -int qdma_ul_update_mm_c2h_desc(void *qhndl, struct rte_mbuf *mb, void *desc) -{ - struct qdma_ul_mm_desc *desc_info = (struct qdma_ul_mm_desc *)desc; - - desc_info->src_addr = get_mm_c2h_ep_addr(qhndl); - /* make it so the data pointer starts there too... */ - mb->data_off = RTE_PKTMBUF_HEADROOM; - /* low 32-bits of phys addr must be 4KB aligned... */ - desc_info->dst_addr = (uint64_t)mb->buf_iova + RTE_PKTMBUF_HEADROOM; - desc_info->dv = 1; - desc_info->eop = 1; - desc_info->sop = 1; - desc_info->len = (int)get_mm_buff_size(qhndl); - - return 0; -} - -/** - * updates the MM h2c descriptor. - * - * @param qhndl - * Pointer to TX queue handle. - * @param mb - * Pointer to memory buffer. - * - * @return - * None. - */ -int qdma_ul_update_mm_h2c_desc(void *qhndl, struct rte_mbuf *mb) -{ - struct qdma_ul_mm_desc *desc_info; - - desc_info = (struct qdma_ul_mm_desc *)get_mm_h2c_desc(qhndl); - desc_info->src_addr = mb->buf_iova + mb->data_off; - desc_info->dst_addr = get_mm_h2c_ep_addr(qhndl); - desc_info->dv = 1; - desc_info->eop = 1; - desc_info->sop = 1; - desc_info->len = rte_pktmbuf_data_len(mb); - - return 0; -} - -/** - * Processes the completion data from the given completion entry. - * - * @param cmpt_entry - * Pointer to completion entry to be processed. - * @param cmpt_desc_len - * Completion descriptor length. - * @param cmpt_buff - * Pointer to the data buffer to which the data will be extracted. - * - * @return - * None. - */ -int qdma_ul_process_immediate_data(void *cmpt_entry, uint16_t cmpt_desc_len, - char *cmpt_buff) -{ - uint16_t i = 0; - char *cmpt_buff_ptr; - struct qdma_ul_cmpt_ring *cmpt_desc = - (struct qdma_ul_cmpt_ring *)(cmpt_entry); - - if (unlikely(cmpt_desc->err || cmpt_desc->data_frmt)) - return -1; - - cmpt_buff_ptr = (char *)cmpt_buff; - *(cmpt_buff_ptr) = (*((uint8_t *)cmpt_desc) & 0xF0); - for (i = 1; i < (cmpt_desc_len); i++) - *(cmpt_buff_ptr + i) = (*((uint8_t *)cmpt_desc + i)); - - return 0; -} diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_user.h b/QDMA/DPDK/drivers/net/qdma/qdma_user.h deleted file mode 100755 index 9c3de6f..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_user.h +++ /dev/null @@ -1,253 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2018-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_USER_H__ -#define __QDMA_USER_H__ -/** - * @file - * @brief This file contains example design/user logic controlled - * data structures and functions - * The driver is specific to an example design, if the example design - * changes user controlled parameters, this file needs to be modified - * appropriately. - * Structures for Completion entry, Descriptor bypass can be added here. - */ - -#include "qdma_rxtx.h" - /** - * C2H Completion entry structure - * This structure is specific for the example design. - * Processing of this ring happens in qdma_rxtx.c. - */ -union qdma_ul_st_cmpt_ring { - volatile uint64_t data; - struct { - /* For 2018.2 IP, this field determines the - * Standard or User format of completion entry - */ - volatile uint32_t data_frmt:1; - - /* This field inverts every time PIDX wraps - * the completion ring - */ - volatile uint32_t color:1; - - /* Indicates that C2H engine encountered - * a descriptor error - */ - volatile uint32_t err:1; - - /* Indicates that the completion packet - * consumes descriptor in C2H ring - */ - volatile uint32_t desc_used:1; - - /* Indicates length of the data packet */ - volatile uint32_t length:16; - - /* Reserved field */ - volatile uint32_t user_rsv:4; - - /* User logic defined data of - * length based on CMPT entry - * length - */ - volatile uint8_t user_def[]; - }; -}; - - - /** - * Completion entry structure - * This structure is specific for the example design. - * Currently this structure is used for the processing - * of the MM completion ring in rte_pmd_qdma.c. - */ -struct __attribute__ ((packed)) qdma_ul_cmpt_ring -{ - volatile uint32_t data_frmt:1; /* For 2018.2 IP, this field - * determines the Standard or User - * format of completion entry - */ - volatile uint32_t color:1; /* This field inverts every time - * PIDX wraps the completion ring - */ - volatile uint32_t err:1; /* Indicates that C2H engine - * encountered a descriptor - * error - */ - volatile uint32_t rsv:1; /* Reserved */ - volatile uint8_t user_def[]; /* User logic defined data of - * length based on CMPT entry - * length - */ -}; - -/** ST C2H Descriptor **/ -struct __attribute__ ((packed)) qdma_ul_st_c2h_desc -{ - uint64_t dst_addr; -}; - -#define S_H2C_DESC_F_SOP 1 -#define S_H2C_DESC_F_EOP 2 - -/* pld_len and flags members are part of custom descriptor format needed - * by example design for ST loopback and desc bypass - */ - -/** ST H2C Descriptor **/ -struct __attribute__ ((packed)) qdma_ul_st_h2c_desc -{ - volatile uint16_t cdh_flags; - volatile uint16_t pld_len; - volatile uint16_t len; - volatile uint16_t flags; - volatile uint64_t src_addr; -}; - -/** MM Descriptor **/ -struct __attribute__ ((packed)) qdma_ul_mm_desc -{ - volatile uint64_t src_addr; - volatile uint64_t len:28; - volatile uint64_t dv:1; - volatile uint64_t sop:1; - volatile uint64_t eop:1; - volatile uint64_t rsvd:33; - volatile uint64_t dst_addr; - volatile uint64_t rsvd2; -}; - -/** - * Extract the fields of given completion entry in the completion ring. - * - * @param ul_cmpt_entry - * Pointer to completion entry to be extracted. - * @param cmpt_info - * Pointer to structure to which completion entry details needs to be filled. - * - * @return - * 0 on success and -ve on error. - */ -int qdma_ul_extract_st_cmpt_info(void *ul_cmpt_entry, void *cmpt_info); - -/** - * Extract the packet length from the given completion entry. - * - * @param ul_cmpt_entry - * Pointer to completion entry to be extracted. - * - * @return - * Packet length - */ -uint16_t qdma_ul_get_cmpt_pkt_len(void *ul_cmpt_entry); - -/** - * Processes the immediate data for the given completion ring entry - * and stores the immediate data in a file. - * - * @param qhndl - * Pointer to RX queue handle. - * @param cmpt_entry - * Pointer to completion entry to be processed. - * @param cmpt_desc_len - * Completion descriptor length. - * - * @return - * None. - */ -int qdma_ul_process_immediate_data_st(void *qhndl, void *cmpt_entry, - uint16_t cmpt_desc_len); - -/** - * Updates the ST H2C descriptor - * - * @param qhndl - * Pointer to TX queue handle. - * @param q_offloads - * Offloads supported for the queue. - * @param mb - * Pointer to memory buffer. - * - * @return - * None. - */ -int qdma_ul_update_st_h2c_desc(void *qhndl, uint64_t q_offloads, - struct rte_mbuf *mb); - -/** - * Updates the MM c2h descriptor. - * - * @param qhndl - * Pointer to RX queue handle. - * @param mb - * Pointer to memory buffer. - * @param desc - * Pointer to descriptor entry. - * - * @return - * None. - */ -int qdma_ul_update_mm_c2h_desc(void *qhndl, struct rte_mbuf *mb, void *desc); - -/** - * updates the MM h2c descriptor. - * - * @param qhndl - * Pointer to TX queue handle. - * @param mb - * Pointer to memory buffer. - * - * @return - * None. - */ -int qdma_ul_update_mm_h2c_desc(void *qhndl, struct rte_mbuf *mb); - -/** - * Processes the completion data from the given completion entry. - * - * @param cmpt_entry - * Pointer to completion entry to be processed. - * @param cmpt_desc_len - * Completion descriptor length. - * @param cmpt_buff - * Pointer to the data buffer to which the data will be extracted. - * - * @return - * None. - */ -int qdma_ul_process_immediate_data(void *cmpt_entry, uint16_t cmpt_desc_len, - char *cmpt_buff); - -#endif /* ifndef __QDMA_USER_H__ */ diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_vf_ethdev.c b/QDMA/DPDK/drivers/net/qdma/qdma_vf_ethdev.c deleted file mode 100755 index 219af04..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_vf_ethdev.c +++ /dev/null @@ -1,1265 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdint.h> -#include <stdbool.h> -#include <sys/mman.h> -#include <sys/fcntl.h> -#include <rte_memzone.h> -#include <rte_string_fns.h> -#include <rte_malloc.h> -#include <rte_dev.h> -#include <rte_pci.h> -#include <rte_ether.h> -#include <rte_ethdev.h> -#include <rte_cycles.h> -#include <rte_alarm.h> -#include <unistd.h> -#include <string.h> -#include <linux/pci.h> -#include "qdma.h" -#include "version.h" -#include "qdma_access_common.h" -#include "qdma_mbox_protocol.h" -#include "qdma_mbox.h" -#include "qdma_devops.h" - -static int eth_qdma_vf_dev_init(struct rte_eth_dev *dev); -static int eth_qdma_vf_dev_uninit(struct rte_eth_dev *dev); - -/* - * The set of PCI devices this driver supports - */ -static struct rte_pci_id qdma_vf_pci_id_tbl[] = { -#define RTE_PCI_DEV_ID_DECL(vend, dev) {RTE_PCI_DEVICE(vend, dev)}, -#ifndef PCI_VENDOR_ID_XILINX -#define PCI_VENDOR_ID_XILINX 0x10ee -#endif - - /** Gen 1 VF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa011) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa111) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa211) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa311) /* VF on PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa014) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa114) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa214) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa314) /* VF on PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa018) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa118) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa218) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa318) /* VF on PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa01f) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa11f) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa21f) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa31f) /* VF on PF 3 */ - - /** Gen 2 VF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa021) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa121) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa221) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa321) /* VF on PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa024) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa124) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa224) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa324) /* VF on PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa028) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa128) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa228) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa328) /* VF on PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa02f) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa12f) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa22f) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa32f) /* VF on PF 3 */ - - /** Gen 3 VF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa031) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa131) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa231) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa331) /* VF on PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa034) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa134) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa234) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa334) /* VF on PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa038) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa138) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa238) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa338) /* VF on PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa03f) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa13f) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa23f) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa33f) /* VF on PF 3 */ - - /** Gen 4 VF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa041) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa141) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa241) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa341) /* VF on PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa044) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa144) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa244) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa344) /* VF on PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa048) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa148) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa248) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xa348) /* VF on PF 3 */ - - /** Versal */ - /** Gen 1 VF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc011) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc111) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc211) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc311) /* VF on PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc014) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc114) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc214) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc314) /* VF on PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc018) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc118) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc218) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc318) /* VF on PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc01f) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc11f) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc21f) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc31f) /* VF on PF 3 */ - - /** Gen 2 VF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc021) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc121) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc221) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc321) /* VF on PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc024) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc124) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc224) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc324) /* VF on PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc028) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc128) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc228) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc328) /* VF on PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc02f) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc12f) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc22f) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc32f) /* VF on PF 3 */ - - /** Gen 3 VF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc031) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc131) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc231) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc331) /* VF on PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc034) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc134) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc234) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc334) /* VF on PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc038) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc138) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc238) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc338) /* VF on PF 3 */ - /** PCIe lane width x16 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc03f) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc13f) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc23f) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc33f) /* VF on PF 3 */ - - /** Gen 4 VF */ - /** PCIe lane width x1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc041) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc141) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc241) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc341) /* VF on PF 3 */ - /** PCIe lane width x4 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc044) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc144) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc244) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc344) /* VF on PF 3 */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc048) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc148) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc248) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc348) /* VF on PF 3 */ - - /** Gen 5 VF */ - /** PCIe lane width x8 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc058) /* VF on PF 0 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc158) /* VF on PF 1 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc258) /* VF on PF 2 */ - RTE_PCI_DEV_ID_DECL(PCI_VENDOR_ID_XILINX, 0xc358) /* VF on PF 3 */ - - { .vendor_id = 0, /* sentinel */ }, -}; - -static int qdma_ethdev_online(struct rte_eth_dev *dev) -{ - int rv = 0; - int qbase = -1; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - - if (!m) - return -ENOMEM; - - qmda_mbox_compose_vf_online(qdma_dev->func_id, 0, &qbase, m->raw_data); - - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) - PMD_DRV_LOG(ERR, "%x, send hello failed %d.\n", - qdma_dev->func_id, rv); - - rv = qdma_mbox_vf_dev_info_get(m->raw_data, - &qdma_dev->dev_cap, - &qdma_dev->dma_device_index); - - if (rv < 0) - PMD_DRV_LOG(ERR, "%x, failed to get dev info %d.\n", - qdma_dev->func_id, rv); - else { - qdma_mbox_msg_free(m); - } - return rv; -} - -static int qdma_ethdev_offline(struct rte_eth_dev *dev) -{ - int rv; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_offline(qdma_dev->func_id, m->raw_data); - - rv = qdma_mbox_msg_send(dev, m, 0); - if (rv < 0) - PMD_DRV_LOG(ERR, "%x, send bye failed %d.\n", - qdma_dev->func_id, rv); - - return rv; -} - -static int qdma_vf_set_qrange(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m; - int rv = 0; - - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_fmap_prog(qdma_dev->func_id, - (uint16_t)qdma_dev->qsets_en, - (int)qdma_dev->queue_base, - m->raw_data); - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - if (rv != -ENODEV) - PMD_DRV_LOG(ERR, "%x set q range (fmap) failed %d.\n", - qdma_dev->func_id, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw_data); - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_set_qmax(struct rte_eth_dev *dev, int *qmax, int *qbase) -{ - struct qdma_mbox_msg *m; - int rv = 0; - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_qreq(qdma_dev->func_id, (uint16_t)*qmax & 0xFFFF, - *qbase, m->raw_data); - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - PMD_DRV_LOG(ERR, "%x set q max failed %d.\n", - qdma_dev->func_id, rv); - goto err_out; - } - - rv = qdma_mbox_vf_qinfo_get(m->raw_data, qbase, (uint16_t *)qmax); -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_rxq_context_setup(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint32_t qid_hw; - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - struct mbox_descq_conf descq_conf; - int rv, bypass_desc_sz_idx; - struct qdma_rx_queue *rxq; - uint8_t cmpt_desc_fmt; - enum mbox_cmpt_ctxt_type cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - - if (!m) - return -ENOMEM; - memset(&descq_conf, 0, sizeof(struct mbox_descq_conf)); - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - qid_hw = qdma_dev->queue_base + rxq->queue_id; - - switch (rxq->cmpt_desc_len) { - case RTE_PMD_QDMA_CMPT_DESC_LEN_8B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_8B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_16B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_16B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_32B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_32B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_64B: - if (!qdma_dev->dev_cap.cmpt_desc_64b) { - PMD_DRV_LOG(ERR, "PF-%d(DEVFN) 64B is not supported in this " - "mode:\n", qdma_dev->func_id); - return -1; - } - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_64B; - break; - default: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_8B; - break; - } - descq_conf.ring_bs_addr = rxq->rx_mz->iova; - descq_conf.en_bypass = rxq->en_bypass; - descq_conf.irq_arm = 0; - descq_conf.at = 0; - descq_conf.wbk_en = 1; - descq_conf.irq_en = 0; - - bypass_desc_sz_idx = qmda_get_desc_sz_idx(rxq->bypass_desc_sz); - - if (!rxq->st_mode) {/* mm c2h */ - descq_conf.desc_sz = SW_DESC_CNTXT_MEMORY_MAP_DMA; - descq_conf.wbi_intvl_en = 1; - descq_conf.wbi_chk = 1; - } else {/* st c2h*/ - descq_conf.desc_sz = SW_DESC_CNTXT_C2H_STREAM_DMA; - descq_conf.forced_en = 1; - descq_conf.cmpt_ring_bs_addr = rxq->rx_cmpt_mz->iova; - descq_conf.cmpt_desc_sz = cmpt_desc_fmt; - descq_conf.triggermode = rxq->triggermode; - - descq_conf.cmpt_color = CMPT_DEFAULT_COLOR_BIT; - descq_conf.cmpt_full_upd = 0; - descq_conf.cnt_thres = - qdma_dev->g_c2h_cnt_th[rxq->threshidx]; - descq_conf.timer_thres = - qdma_dev->g_c2h_timer_cnt[rxq->timeridx]; - descq_conf.cmpt_ringsz = - qdma_dev->g_ring_sz[rxq->cmpt_ringszidx] - 1; - descq_conf.bufsz = qdma_dev->g_c2h_buf_sz[rxq->buffszidx]; - descq_conf.cmpt_int_en = 0; - descq_conf.cmpl_stat_en = rxq->st_mode; - descq_conf.pfch_en = rxq->en_prefetch; - descq_conf.en_bypass_prefetch = rxq->en_bypass_prefetch; - if (qdma_dev->dev_cap.cmpt_ovf_chk_dis) - descq_conf.dis_overflow_check = rxq->dis_overflow_check; - - cmpt_ctxt_type = QDMA_MBOX_CMPT_WITH_ST; - } - - if (rxq->en_bypass && - (rxq->bypass_desc_sz != 0)) - descq_conf.desc_sz = bypass_desc_sz_idx; - - descq_conf.func_id = rxq->func_id; - descq_conf.ringsz = qdma_dev->g_ring_sz[rxq->ringszidx] - 1; - - qdma_mbox_compose_vf_qctxt_write(rxq->func_id, qid_hw, rxq->st_mode, 1, - cmpt_ctxt_type, - &descq_conf, m->raw_data); - - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - PMD_DRV_LOG(ERR, "%x, qid_hw 0x%x, mbox failed %d.\n", - qdma_dev->func_id, qid_hw, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw_data); - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_txq_context_setup(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - struct mbox_descq_conf descq_conf; - int rv, bypass_desc_sz_idx; - struct qdma_tx_queue *txq; - uint32_t qid_hw; - - if (!m) - return -ENOMEM; - memset(&descq_conf, 0, sizeof(struct mbox_descq_conf)); - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - qid_hw = qdma_dev->queue_base + txq->queue_id; - descq_conf.ring_bs_addr = txq->tx_mz->iova; - descq_conf.en_bypass = txq->en_bypass; - descq_conf.wbi_intvl_en = 1; - descq_conf.wbi_chk = 1; - descq_conf.wbk_en = 1; - - bypass_desc_sz_idx = qmda_get_desc_sz_idx(txq->bypass_desc_sz); - - if (!txq->st_mode) /* mm h2c */ - descq_conf.desc_sz = SW_DESC_CNTXT_MEMORY_MAP_DMA; - else /* st h2c */ - descq_conf.desc_sz = SW_DESC_CNTXT_H2C_STREAM_DMA; - descq_conf.func_id = txq->func_id; - descq_conf.ringsz = qdma_dev->g_ring_sz[txq->ringszidx] - 1; - - if (txq->en_bypass && - (txq->bypass_desc_sz != 0)) - descq_conf.desc_sz = bypass_desc_sz_idx; - - qdma_mbox_compose_vf_qctxt_write(txq->func_id, qid_hw, txq->st_mode, 0, - QDMA_MBOX_CMPT_CTXT_NONE, - &descq_conf, m->raw_data); - - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - PMD_DRV_LOG(ERR, "%x, qid_hw 0x%x, mbox failed %d.\n", - qdma_dev->func_id, qid_hw, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw_data); - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_queue_context_invalidate(struct rte_eth_dev *dev, uint32_t qid, - bool st, bool c2h) -{ - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint32_t qid_hw; - int rv; - enum mbox_cmpt_ctxt_type cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - - if (!m) - return -ENOMEM; - - if (st && c2h) - cmpt_ctxt_type = QDMA_MBOX_CMPT_WITH_ST; - qid_hw = qdma_dev->queue_base + qid; - qdma_mbox_compose_vf_qctxt_invalidate(qdma_dev->func_id, qid_hw, - st, c2h, cmpt_ctxt_type, - m->raw_data); - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - if (rv != -ENODEV) - PMD_DRV_LOG(INFO, "%x, qid_hw 0x%x mbox failed %d.\n", - qdma_dev->func_id, qid_hw, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw_data); - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_vf_dev_start(struct rte_eth_dev *dev) -{ - struct qdma_tx_queue *txq; - struct qdma_rx_queue *rxq; - uint32_t qid; - int err; - - PMD_DRV_LOG(INFO, "qdma_dev_start: Starting\n"); - /* prepare descriptor rings for operation */ - for (qid = 0; qid < dev->data->nb_tx_queues; qid++) { - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - - /*Deferred Queues should not start with dev_start*/ - if (!txq->tx_deferred_start) { - err = qdma_vf_dev_tx_queue_start(dev, qid); - if (err != 0) - return err; - } - } - - for (qid = 0; qid < dev->data->nb_rx_queues; qid++) { - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - - /*Deferred Queues should not start with dev_start*/ - if (!rxq->rx_deferred_start) { - err = qdma_vf_dev_rx_queue_start(dev, qid); - if (err != 0) - return err; - } - } - return 0; -} - -static int qdma_vf_dev_link_update(struct rte_eth_dev *dev, - __rte_unused int wait_to_complete) -{ - dev->data->dev_link.link_status = ETH_LINK_UP; - dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX; - - /* TODO: Configure link speed by reading hardware capabilities */ - dev->data->dev_link.link_speed = ETH_SPEED_NUM_200G; - - PMD_DRV_LOG(INFO, "Link update done\n"); - - return 0; -} - -static int qdma_vf_dev_infos_get(__rte_unused struct rte_eth_dev *dev, - struct rte_eth_dev_info *dev_info) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - dev_info->max_rx_queues = qdma_dev->dev_cap.num_qs; - dev_info->max_tx_queues = qdma_dev->dev_cap.num_qs; - - dev_info->min_rx_bufsize = QDMA_MIN_RXBUFF_SIZE; - dev_info->max_rx_pktlen = DMA_BRAM_SIZE; - dev_info->max_mac_addrs = 1; - - return 0; -} - -static int qdma_vf_dev_stop(struct rte_eth_dev *dev) -{ -#ifdef RTE_LIBRTE_QDMA_DEBUG_DRIVER - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; -#endif - uint32_t qid; - - /* reset driver's internal queue structures to default values */ - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) Stop H2C & C2H queues", - qdma_dev->func_id); - for (qid = 0; qid < dev->data->nb_tx_queues; qid++) - qdma_vf_dev_tx_queue_stop(dev, qid); - for (qid = 0; qid < dev->data->nb_rx_queues; qid++) - qdma_vf_dev_rx_queue_stop(dev, qid); - - return 0; -} - -int qdma_vf_dev_close(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_tx_queue *txq; - struct qdma_rx_queue *rxq; - struct qdma_cmpt_queue *cmptq; - uint32_t qid; - - PMD_DRV_LOG(INFO, "Closing all queues\n"); - - if (dev->data->dev_started) - qdma_vf_dev_stop(dev); - - /* iterate over rx queues */ - for (qid = 0; qid < dev->data->nb_rx_queues; ++qid) { - rxq = dev->data->rx_queues[qid]; - if (rxq != NULL) { - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) Remove C2H queue: %d", - qdma_dev->func_id, qid); - - qdma_dev_notify_qdel(rxq->dev, rxq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_C2H); - - if (rxq->st_mode) - qdma_dev_notify_qdel(rxq->dev, rxq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_CMPT); - - if (rxq->sw_ring) - rte_free(rxq->sw_ring); - - if (rxq->st_mode) { /** if ST-mode **/ - if (rxq->rx_cmpt_mz) - rte_memzone_free(rxq->rx_cmpt_mz); - } - - if (rxq->rx_mz) - rte_memzone_free(rxq->rx_mz); - rte_free(rxq); - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) C2H queue %d removed", - qdma_dev->func_id, qid); - } - } - - /* iterate over tx queues */ - for (qid = 0; qid < dev->data->nb_tx_queues; ++qid) { - txq = dev->data->tx_queues[qid]; - if (txq != NULL) { - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) Remove H2C queue: %d", - qdma_dev->func_id, qid); - - qdma_dev_notify_qdel(txq->dev, txq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_H2C); - if (txq->sw_ring) - rte_free(txq->sw_ring); - if (txq->tx_mz) - rte_memzone_free(txq->tx_mz); - rte_free(txq); - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) H2C queue %d removed", - qdma_dev->func_id, qid); - } - } - if (qdma_dev->dev_cap.mm_cmpt_en) { - /* iterate over cmpt queues */ - for (qid = 0; qid < qdma_dev->qsets_en; ++qid) { - cmptq = qdma_dev->cmpt_queues[qid]; - if (cmptq != NULL) { - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) Remove CMPT queue: %d", - qdma_dev->func_id, qid); - qdma_dev_notify_qdel(cmptq->dev, - cmptq->queue_id + - qdma_dev->queue_base, - QDMA_DEV_Q_TYPE_CMPT); - if (cmptq->cmpt_mz) - rte_memzone_free(cmptq->cmpt_mz); - rte_free(cmptq); - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) CMPT queue %d removed", - qdma_dev->func_id, qid); - } - } - - if (qdma_dev->cmpt_queues != NULL) { - rte_free(qdma_dev->cmpt_queues); - qdma_dev->cmpt_queues = NULL; - } - } - - qdma_dev->qsets_en = 0; - qdma_set_qmax(dev, (int *)&qdma_dev->qsets_en, - (int *)&qdma_dev->queue_base); - qdma_dev->init_q_range = 0; - rte_free(qdma_dev->q_info); - qdma_dev->q_info = NULL; - qdma_dev->dev_configured = 0; - - return 0; -} - -static int qdma_vf_dev_reset(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint32_t i = 0; - int ret; - - PMD_DRV_LOG(INFO, "%s: Reset VF-%d(DEVFN)", - __func__, qdma_dev->func_id); - - ret = eth_qdma_vf_dev_uninit(dev); - if (ret) - return ret; - - if (qdma_dev->reset_state == RESET_STATE_IDLE) { - ret = eth_qdma_vf_dev_init(dev); - } else { - - /* VFs do not stop mbox and start waiting for a - * "PF_RESET_DONE" mailbox message from PF - * for a maximum of 60 secs - */ - PMD_DRV_LOG(INFO, - "%s: Waiting for reset done message from PF", - __func__); - while (i < RESET_TIMEOUT) { - if (qdma_dev->reset_state == - RESET_STATE_RECV_PF_RESET_DONE) { - qdma_mbox_uninit(dev); - - ret = eth_qdma_vf_dev_init(dev); - return ret; - } - - rte_delay_ms(1); - i++; - } - } - - if (i >= RESET_TIMEOUT) { - PMD_DRV_LOG(ERR, "%s: Reset failed for VF-%d(DEVFN)\n", - __func__, qdma_dev->func_id); - return -ETIMEDOUT; - } - - return ret; -} - -static int qdma_vf_dev_configure(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - int32_t ret = 0, queue_base = -1; - uint32_t qid = 0; - - /** FMAP configuration **/ - qdma_dev->qsets_en = RTE_MAX(dev->data->nb_rx_queues, - dev->data->nb_tx_queues); - - if (qdma_dev->qsets_en > qdma_dev->dev_cap.num_qs) { - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) Error: Number of Queues to be " - "configured are greater than the queues " - "supported by the hardware\n", - qdma_dev->func_id); - qdma_dev->qsets_en = 0; - return -1; - } - - /* Request queue base from the resource manager */ - ret = qdma_set_qmax(dev, (int *)&qdma_dev->qsets_en, - (int *)&queue_base); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, "VF-%d(DEVFN) queue allocation failed: %d\n", - qdma_dev->func_id, ret); - return -1; - } - qdma_dev->queue_base = queue_base; - - qdma_dev->q_info = rte_zmalloc("qinfo", sizeof(struct queue_info) * - qdma_dev->qsets_en, 0); - if (qdma_dev->q_info == NULL) { - PMD_DRV_LOG(INFO, "VF-%d fail to allocate queue info memory\n", - qdma_dev->func_id); - return (-ENOMEM); - } - - /* Reserve memory for cmptq ring pointers - * Max completion queues can be maximum of rx and tx queues. - */ - qdma_dev->cmpt_queues = rte_zmalloc("cmpt_queues", - sizeof(qdma_dev->cmpt_queues[0]) * - qdma_dev->qsets_en, - RTE_CACHE_LINE_SIZE); - if (qdma_dev->cmpt_queues == NULL) { - PMD_DRV_LOG(ERR, "VF-%d(DEVFN) cmpt ring pointers memory " - "allocation failed:\n", qdma_dev->func_id); - rte_free(qdma_dev->q_info); - qdma_dev->q_info = NULL; - return -(ENOMEM); - } - - /* Initialize queue_modes to all 1's ( i.e. Streaming) */ - for (qid = 0 ; qid < qdma_dev->qsets_en; qid++) - qdma_dev->q_info[qid].queue_mode = RTE_PMD_QDMA_STREAMING_MODE; - - for (qid = 0 ; qid < dev->data->nb_rx_queues; qid++) { - qdma_dev->q_info[qid].cmpt_desc_sz = qdma_dev->cmpt_desc_len; - qdma_dev->q_info[qid].rx_bypass_mode = - qdma_dev->c2h_bypass_mode; - qdma_dev->q_info[qid].trigger_mode = qdma_dev->trigger_mode; - qdma_dev->q_info[qid].timer_count = - qdma_dev->timer_count; - } - - for (qid = 0 ; qid < dev->data->nb_tx_queues; qid++) - qdma_dev->q_info[qid].tx_bypass_mode = - qdma_dev->h2c_bypass_mode; - - ret = qdma_vf_set_qrange(dev); - if (ret < 0) { - PMD_DRV_LOG(ERR, "FMAP programming failed\n"); - rte_free(qdma_dev->q_info); - qdma_dev->q_info = NULL; - rte_free(qdma_dev->cmpt_queues); - qdma_dev->cmpt_queues = NULL; - return ret; - } - - qdma_dev->dev_configured = 1; - - return ret; -} - -int qdma_vf_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_tx_queue *txq; - - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - qdma_reset_tx_queue(txq); - - if (qdma_txq_context_setup(dev, qid) < 0) - return -1; - - txq->q_pidx_info.pidx = 0; - qdma_dev->hw_access->qdma_queue_pidx_update(dev, qdma_dev->is_vf, - qid, 0, &txq->q_pidx_info); - - dev->data->tx_queue_state[qid] = RTE_ETH_QUEUE_STATE_STARTED; - txq->status = RTE_ETH_QUEUE_STATE_STARTED; - - return 0; -} - -int qdma_vf_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_rx_queue *rxq; - int err; - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - qdma_reset_rx_queue(rxq); - - err = qdma_init_rx_queue(rxq); - if (err != 0) - return err; - if (qdma_rxq_context_setup(dev, qid) < 0) { - PMD_DRV_LOG(ERR, "context_setup for qid - %u failed", qid); - - return -1; - } - - if (rxq->st_mode) { - rxq->cmpt_cidx_info.counter_idx = rxq->threshidx; - rxq->cmpt_cidx_info.timer_idx = rxq->timeridx; - rxq->cmpt_cidx_info.trig_mode = rxq->triggermode; - rxq->cmpt_cidx_info.wrb_en = 1; - qdma_dev->hw_access->qdma_queue_cmpt_cidx_update(dev, 1, - qid, &rxq->cmpt_cidx_info); - - rxq->q_pidx_info.pidx = (rxq->nb_rx_desc - 2); - qdma_dev->hw_access->qdma_queue_pidx_update(dev, 1, - qid, 1, &rxq->q_pidx_info); - } - - dev->data->rx_queue_state[qid] = RTE_ETH_QUEUE_STATE_STARTED; - rxq->status = RTE_ETH_QUEUE_STATE_STARTED; - return 0; -} - -int qdma_vf_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_rx_queue *rxq; - int i = 0, cnt = 0; - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - - rxq->status = RTE_ETH_QUEUE_STATE_STOPPED; - - /* Wait for queue to recv all packets. */ - if (rxq->st_mode) { /** ST-mode **/ - while (rxq->wb_status->pidx != rxq->cmpt_cidx_info.wrb_cidx) { - usleep(10); - if (cnt++ > 10000) - break; - } - } else { /* MM mode */ - while (rxq->wb_status->cidx != rxq->q_pidx_info.pidx) { - usleep(10); - if (cnt++ > 10000) - break; - } - } - - qdma_queue_context_invalidate(dev, qid, rxq->st_mode, 1); - - if (rxq->st_mode) { /** ST-mode **/ -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(INFO, "%s(): %d: queue id = %d, mbuf_avail_count = " - "%d, mbuf_in_use_count = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); -#endif //DUMP_MEMPOOL_USAGE_STATS - - for (i = 0; i < rxq->nb_rx_desc - 1; i++) { - rte_pktmbuf_free(rxq->sw_ring[i]); - rxq->sw_ring[i] = NULL; - } -#ifdef DUMP_MEMPOOL_USAGE_STATS - PMD_DRV_LOG(INFO, "%s(): %d: queue id = %d, mbuf_avail_count = " - "%d, mbuf_in_use_count = %d", - __func__, __LINE__, rxq->queue_id, - rte_mempool_avail_count(rxq->mb_pool), - rte_mempool_in_use_count(rxq->mb_pool)); -#endif //DUMP_MEMPOOL_USAGE_STATS - } - - qdma_reset_rx_queue(rxq); - dev->data->rx_queue_state[qid] = RTE_ETH_QUEUE_STATE_STOPPED; - return 0; -} - - -int qdma_vf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_tx_queue *txq; - int i = 0, cnt = 0; - - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - - txq->status = RTE_ETH_QUEUE_STATE_STOPPED; - /* Wait for TXQ to send out all packets. */ - while (txq->wb_status->cidx != txq->q_pidx_info.pidx) { - usleep(10); - if (cnt++ > 10000) - break; - } - - qdma_queue_context_invalidate(dev, qid, txq->st_mode, 0); - - /* Free mbufs if any pending in the ring */ - for (i = 0; i < txq->nb_tx_desc; i++) { - rte_pktmbuf_free(txq->sw_ring[i]); - txq->sw_ring[i] = NULL; - } - qdma_reset_tx_queue(txq); - dev->data->tx_queue_state[qid] = RTE_ETH_QUEUE_STATE_STOPPED; - return 0; -} - -static struct eth_dev_ops qdma_vf_eth_dev_ops = { - .dev_configure = qdma_vf_dev_configure, - .dev_infos_get = qdma_vf_dev_infos_get, - .dev_start = qdma_vf_dev_start, - .dev_stop = qdma_vf_dev_stop, - .dev_close = qdma_vf_dev_close, - .dev_reset = qdma_vf_dev_reset, - .link_update = qdma_vf_dev_link_update, - .rx_queue_setup = qdma_dev_rx_queue_setup, - .tx_queue_setup = qdma_dev_tx_queue_setup, - .rx_queue_release = qdma_dev_rx_queue_release, - .tx_queue_release = qdma_dev_tx_queue_release, - .rx_queue_start = qdma_vf_dev_rx_queue_start, - .rx_queue_stop = qdma_vf_dev_rx_queue_stop, - .tx_queue_start = qdma_vf_dev_tx_queue_start, - .tx_queue_stop = qdma_vf_dev_tx_queue_stop, - .stats_get = qdma_dev_stats_get, -}; - -/** - * DPDK callback to register a PCI device. - * - * This function creates an Ethernet device for each port of a given - * PCI device. - * - * @param[in] dev - * Pointer to Ethernet device structure. - * - * @return - * 0 on success, negative errno value on failure. - */ -static int eth_qdma_vf_dev_init(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *dma_priv; - uint8_t *baseaddr; - int i, idx; - static bool once = true; - struct rte_pci_device *pci_dev; - - /* sanity checks */ - if (dev == NULL) - return -EINVAL; - if (dev->data == NULL) - return -EINVAL; - if (dev->data->dev_private == NULL) - return -EINVAL; - - pci_dev = RTE_ETH_DEV_TO_PCI(dev); - if (pci_dev == NULL) - return -EINVAL; - - /* for secondary processes, we don't initialise any further as primary - * has already done this work. - */ - if (rte_eal_process_type() != RTE_PROC_PRIMARY) { - dev->dev_ops = &qdma_vf_eth_dev_ops; - return 0; - } - - if (once) { - RTE_LOG(INFO, PMD, "QDMA PMD VERSION: %s\n", QDMA_PMD_VERSION); - once = false; - } - - /* allocate space for a single Ethernet MAC address */ - dev->data->mac_addrs = rte_zmalloc("qdma_vf", - RTE_ETHER_ADDR_LEN * 1, 0); - if (dev->data->mac_addrs == NULL) - return -ENOMEM; - - /* Copy some dummy Ethernet MAC address for XDMA device - * This will change in real NIC device... - */ - for (i = 0; i < RTE_ETHER_ADDR_LEN; ++i) - dev->data->mac_addrs[0].addr_bytes[i] = 0x15 + i; - - /* Init system & device */ - dma_priv = (struct qdma_pci_dev *)dev->data->dev_private; - dma_priv->func_id = 0; - dma_priv->is_vf = 1; - dma_priv->timer_count = DEFAULT_TIMER_CNT_TRIG_MODE_TIMER; - - dma_priv->en_desc_prefetch = 0; - dma_priv->cmpt_desc_len = DEFAULT_QDMA_CMPT_DESC_LEN; - dma_priv->c2h_bypass_mode = RTE_PMD_QDMA_RX_BYPASS_NONE; - dma_priv->h2c_bypass_mode = 0; - - dev->dev_ops = &qdma_vf_eth_dev_ops; - dev->rx_pkt_burst = &qdma_recv_pkts; - dev->tx_pkt_burst = &qdma_xmit_pkts; - - dma_priv->config_bar_idx = DEFAULT_VF_CONFIG_BAR; - dma_priv->bypass_bar_idx = BAR_ID_INVALID; - dma_priv->user_bar_idx = BAR_ID_INVALID; - - if (qdma_check_kvargs(dev->device->devargs, dma_priv)) { - PMD_DRV_LOG(INFO, "devargs failed\n"); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - /* Store BAR address and length of Config BAR */ - baseaddr = (uint8_t *) - pci_dev->mem_resource[dma_priv->config_bar_idx].addr; - dma_priv->bar_addr[dma_priv->config_bar_idx] = baseaddr; - - /*Assigning QDMA access layer function pointers based on the HW design*/ - dma_priv->hw_access = rte_zmalloc("vf_hwaccess", - sizeof(struct qdma_hw_access), 0); - if (dma_priv->hw_access == NULL) { - rte_free(dev->data->mac_addrs); - return -ENOMEM; - } - idx = qdma_hw_access_init(dev, dma_priv->is_vf, dma_priv->hw_access); - if (idx < 0) { - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - idx = qdma_get_hw_version(dev); - if (idx < 0) { - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - idx = qdma_identify_bars(dev); - if (idx < 0) { - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - /* Store BAR address and length of AXI Master Lite BAR(user bar)*/ - if (dma_priv->user_bar_idx >= 0) { - baseaddr = (uint8_t *) - pci_dev->mem_resource[dma_priv->user_bar_idx].addr; - dma_priv->bar_addr[dma_priv->user_bar_idx] = baseaddr; - } - - if (dma_priv->ip_type == QDMA_VERSAL_HARD_IP && - dma_priv->device_type == - QDMA_DEVICE_VERSAL_CPM4) - dma_priv->dev_cap.mailbox_intr = 0; - else - dma_priv->dev_cap.mailbox_intr = 1; - - qdma_mbox_init(dev); - idx = qdma_ethdev_online(dev); - if (idx < 0) { - rte_free(dma_priv->hw_access); - rte_free(dev->data->mac_addrs); - return -EINVAL; - } - - /* Setting default Mode to RTE_PMD_QDMA_TRIG_MODE_USER_TIMER */ - dma_priv->trigger_mode = RTE_PMD_QDMA_TRIG_MODE_USER_TIMER; - - dma_priv->reset_state = RESET_STATE_IDLE; - -#ifdef LATENCY_MEASUREMENT - /* Create txq and rxq latency measurement shared memory - * if not already created by the PF - */ - if (!h2c_pidx_to_hw_cidx_lat) { - /* Create a shared memory zone for the txq latency buffer */ - txq_lat_buf_mz = rte_memzone_reserve("TXQ_LAT_BUFFER_ZONE", - LATENCY_MAX_QUEUES * LATENCY_CNT * sizeof(double), - rte_socket_id(), 0); - if (txq_lat_buf_mz == NULL) { - PMD_DRV_LOG(ERR, - "Failed to allocate txq latency buffer memzone\n"); - return -1; - } - - /* Get the virtual address of the txq latency buffer */ - h2c_pidx_to_hw_cidx_lat = - (double(*)[LATENCY_CNT])txq_lat_buf_mz->addr; - } - - if (!c2h_pidx_to_cmpt_pidx_lat) { - /* Create a shared memory zone for the rxq latency buffer */ - rxq_lat_buf_mz = rte_memzone_reserve("RXQ_LAT_BUFFER_ZONE", - LATENCY_MAX_QUEUES * LATENCY_CNT * sizeof(double), - rte_socket_id(), 0); - if (rxq_lat_buf_mz == NULL) { - PMD_DRV_LOG(ERR, - "Failed to allocate rxq latency buffer memzone\n"); - return -1; - } - - /* Get the virtual address of the rxq latency buffer */ - c2h_pidx_to_cmpt_pidx_lat = - (double(*)[LATENCY_CNT])rxq_lat_buf_mz->addr; - } -#endif - - PMD_DRV_LOG(INFO, "VF-%d(DEVFN) QDMA device driver probe:", - dma_priv->func_id); - - return 0; -} - -/** - * DPDK callback to deregister PCI device. - * - * @param[in] dev - * Pointer to Ethernet device structure. - * - * @return - * 0 on success, negative errno value on failure. - */ -static int eth_qdma_vf_dev_uninit(struct rte_eth_dev *dev) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - - /* only uninitialize in the primary process */ - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return -EPERM; - - if (qdma_dev->dev_configured) - qdma_vf_dev_close(dev); - - qdma_ethdev_offline(dev); - - if (qdma_dev->reset_state != RESET_STATE_RECV_PF_RESET_REQ) - qdma_mbox_uninit(dev); - - dev->dev_ops = NULL; - dev->rx_pkt_burst = NULL; - dev->tx_pkt_burst = NULL; - dev->data->nb_rx_queues = 0; - dev->data->nb_tx_queues = 0; - - if (dev->data->mac_addrs != NULL) { - rte_free(dev->data->mac_addrs); - dev->data->mac_addrs = NULL; - } - - if (qdma_dev->q_info != NULL) { - rte_free(qdma_dev->q_info); - qdma_dev->q_info = NULL; - } - - return 0; -} - -static int eth_qdma_vf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, - struct rte_pci_device *pci_dev) -{ - return rte_eth_dev_pci_generic_probe(pci_dev, - sizeof(struct qdma_pci_dev), - eth_qdma_vf_dev_init); -} - -/* Detach a ethdev interface */ -static int eth_qdma_vf_pci_remove(struct rte_pci_device *pci_dev) -{ - return rte_eth_dev_pci_generic_remove(pci_dev, eth_qdma_vf_dev_uninit); -} - -static struct rte_pci_driver rte_qdma_vf_pmd = { - .id_table = qdma_vf_pci_id_tbl, - .drv_flags = RTE_PCI_DRV_NEED_MAPPING, - .probe = eth_qdma_vf_pci_probe, - .remove = eth_qdma_vf_pci_remove, -}; - -bool -is_vf_device_supported(struct rte_eth_dev *dev) -{ - if (strcmp(dev->device->driver->name, rte_qdma_vf_pmd.driver.name)) - return false; - - return true; -} - -RTE_PMD_REGISTER_PCI(net_qdma_vf, rte_qdma_vf_pmd); -RTE_PMD_REGISTER_PCI_TABLE(net_qdma_vf, qdma_vf_pci_id_tbl); diff --git a/QDMA/DPDK/drivers/net/qdma/qdma_xdebug.c b/QDMA/DPDK/drivers/net/qdma/qdma_xdebug.c deleted file mode 100755 index 4cade04..0000000 --- a/QDMA/DPDK/drivers/net/qdma/qdma_xdebug.c +++ /dev/null @@ -1,1468 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdint.h> -#include <sys/mman.h> -#include <sys/fcntl.h> -#include <rte_memzone.h> -#include <rte_string_fns.h> -#include <rte_malloc.h> -#include <rte_dev.h> -#include <rte_pci.h> -#include <rte_ether.h> -#include <rte_ethdev.h> -#include <rte_cycles.h> -#include <unistd.h> -#include <string.h> -#include <rte_hexdump.h> - -#include "qdma.h" -#include "rte_pmd_qdma.h" -#include "qdma_access_common.h" -#include "qdma_reg_dump.h" -#include "qdma_mbox_protocol.h" -#include "qdma_mbox.h" - -#define xdebug_info(args...) rte_log(RTE_LOG_INFO, RTE_LOGTYPE_USER1,\ - ## args) -#define xdebug_error(args...) rte_log(RTE_LOG_ERR, RTE_LOGTYPE_USER1,\ - ## args) - -struct xdebug_desc_param { - uint16_t queue; - int start; - int end; - enum rte_pmd_qdma_xdebug_desc_type type; -}; - -const char *qdma_desc_eng_mode_info[QDMA_DESC_ENG_MODE_MAX] = { - "Internal and Bypass mode", - "Bypass only mode", - "Internal only mode" -}; - -static void print_header(const char *str) -{ - xdebug_info("\n\n%s\n\n", str); -} - -static int qdma_h2c_struct_dump(uint8_t port_id, uint16_t queue) -{ - struct rte_eth_dev *dev; - struct qdma_tx_queue *tx_q; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - tx_q = (struct qdma_tx_queue *)dev->data->tx_queues[queue]; - - if (queue >= dev->data->nb_tx_queues) { - xdebug_info("TX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - if (tx_q) { - print_header("***********TX Queue struct************"); - xdebug_info("\t\t wb_pidx :%x\n", - tx_q->wb_status->pidx); - xdebug_info("\t\t wb_cidx :%x\n", - tx_q->wb_status->cidx); - xdebug_info("\t\t h2c_pidx :%x\n", - tx_q->q_pidx_info.pidx); - xdebug_info("\t\t tx_fl_tail :%x\n", - tx_q->tx_fl_tail); - xdebug_info("\t\t tx_desc_pend :%x\n", - tx_q->tx_desc_pend); - xdebug_info("\t\t nb_tx_desc :%x\n", - tx_q->nb_tx_desc); - xdebug_info("\t\t st_mode :%x\n", - tx_q->st_mode); - xdebug_info("\t\t tx_deferred_start :%x\n", - tx_q->tx_deferred_start); - xdebug_info("\t\t en_bypass :%x\n", - tx_q->en_bypass); - xdebug_info("\t\t bypass_desc_sz :%x\n", - tx_q->bypass_desc_sz); - xdebug_info("\t\t func_id :%x\n", - tx_q->func_id); - xdebug_info("\t\t port_id :%x\n", - tx_q->port_id); - xdebug_info("\t\t ringszidx :%x\n", - tx_q->ringszidx); - xdebug_info("\t\t ep_addr :0x%" PRIx64 "\n", - tx_q->ep_addr); - } - - return 0; -} - -static int qdma_c2h_struct_dump(uint8_t port_id, uint16_t queue) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_rx_queue *rx_q; - enum qdma_ip_type ip_type; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - ip_type = (enum qdma_ip_type)qdma_dev->ip_type; - rx_q = (struct qdma_rx_queue *)dev->data->rx_queues[queue]; - - if (queue >= dev->data->nb_rx_queues) { - xdebug_info("RX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - if (rx_q) { - print_header(" ***********RX Queue struct********** "); - xdebug_info("\t\t wb_pidx :%x\n", - rx_q->wb_status->pidx); - xdebug_info("\t\t wb_cidx :%x\n", - rx_q->wb_status->cidx); - xdebug_info("\t\t rx_tail (ST) :%x\n", - rx_q->rx_tail); - xdebug_info("\t\t c2h_pidx :%x\n", - rx_q->q_pidx_info.pidx); - xdebug_info("\t\t rx_cmpt_cidx :%x\n", - rx_q->cmpt_cidx_info.wrb_cidx); - xdebug_info("\t\t cmpt_desc_len :%x\n", - rx_q->cmpt_desc_len); - xdebug_info("\t\t rx_buff_size :%x\n", - rx_q->rx_buff_size); - xdebug_info("\t\t nb_rx_desc :%x\n", - rx_q->nb_rx_desc); - xdebug_info("\t\t nb_rx_cmpt_desc :%x\n", - rx_q->nb_rx_cmpt_desc); - xdebug_info("\t\t ep_addr :0x%" PRIx64 "\n", - rx_q->ep_addr); - xdebug_info("\t\t st_mode :%x\n", - rx_q->st_mode); - xdebug_info("\t\t rx_deferred_start :%x\n", - rx_q->rx_deferred_start); - xdebug_info("\t\t en_prefetch :%x\n", - rx_q->en_prefetch); - xdebug_info("\t\t en_bypass :%x\n", - rx_q->en_bypass); - xdebug_info("\t\t dump_immediate_data :%x\n", - rx_q->dump_immediate_data); - xdebug_info("\t\t en_bypass_prefetch :%x\n", - rx_q->en_bypass_prefetch); - - if (!(ip_type == QDMA_VERSAL_HARD_IP)) - xdebug_info("\t\t dis_overflow_check :%x\n", - rx_q->dis_overflow_check); - - xdebug_info("\t\t bypass_desc_sz :%x\n", - rx_q->bypass_desc_sz); - xdebug_info("\t\t ringszidx :%x\n", - rx_q->ringszidx); - xdebug_info("\t\t cmpt_ringszidx :%x\n", - rx_q->cmpt_ringszidx); - xdebug_info("\t\t buffszidx :%x\n", - rx_q->buffszidx); - xdebug_info("\t\t threshidx :%x\n", - rx_q->threshidx); - xdebug_info("\t\t timeridx :%x\n", - rx_q->timeridx); - xdebug_info("\t\t triggermode :%x\n", - rx_q->triggermode); - } - - return 0; -} - -static int qdma_config_read_reg_list(struct rte_eth_dev *dev, - uint16_t group_num, - uint16_t *num_regs, struct qdma_reg_data *reg_list) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - int rv; - - if (!m) - return -ENOMEM; - - qdma_mbox_compose_reg_read(qdma_dev->func_id, group_num, m->raw_data); - - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - if (rv != -ENODEV) - xdebug_error("reg read mbox failed with error = %d\n", - rv); - goto err_out; - } - - rv = qdma_mbox_vf_reg_list_get(m->raw_data, num_regs, reg_list); - if (rv < 0) { - xdebug_error("qdma_mbox_vf_reg_list_get failed with error = %d\n", - rv); - goto err_out; - } - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_config_reg_dump(uint8_t port_id) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - enum qdma_ip_type ip_type; - enum qdma_device_type device_type; - char *buf = NULL; - int buflen; - int ret; - struct qdma_reg_data *reg_list; - uint16_t num_regs = 0, group_num = 0; - int len = 0, rcv_len = 0, reg_len = 0; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - ip_type = (enum qdma_ip_type)qdma_dev->ip_type; - device_type = (enum qdma_device_type)qdma_dev->device_type; - - if (qdma_dev->is_vf) { - reg_len = (QDMA_MAX_REGISTER_DUMP * - sizeof(struct qdma_reg_data)); - reg_list = (struct qdma_reg_data *)rte_zmalloc("QDMA_DUMP_REG_VF", - reg_len, RTE_CACHE_LINE_SIZE); - if (!reg_list) { - xdebug_error("Unable to allocate memory for VF dump for reglist " - "size %d\n", reg_len); - return -ENOMEM; - } - - ret = qdma_acc_reg_dump_buf_len(dev, ip_type, - device_type, &buflen); - if (ret < 0) { - xdebug_error("Failed to get register dump buffer length\n"); - return ret; - } - /*allocate memory for register dump*/ - buf = (char *)rte_zmalloc("QDMA_DUMP_BUF_VF", buflen, - RTE_CACHE_LINE_SIZE); - if (!buf) { - xdebug_error("Unable to allocate memory for reg dump " - "size %d\n", buflen); - rte_free(reg_list); - return -ENOMEM; - } - xdebug_info("FPGA Config Registers for port_id: %d\n--------\n", - port_id); - xdebug_info(" Offset Name " - " Value(Hex) Value(Dec)\n"); - - for (group_num = 0; group_num < QDMA_REG_READ_GROUP_3; - group_num++) { - /** Reset the reg_list with 0's */ - memset(reg_list, 0, (QDMA_MAX_REGISTER_DUMP * - sizeof(struct qdma_reg_data))); - ret = qdma_config_read_reg_list(dev, - group_num, &num_regs, reg_list); - if (ret < 0) { - xdebug_error("Failed to read config registers " - "size %d, err = %d\n", buflen, ret); - rte_free(reg_list); - rte_free(buf); - return ret; - } - - rcv_len = qdma_acc_dump_config_reg_list(dev, - ip_type, device_type, num_regs, - reg_list, buf + len, buflen - len); - if (len < 0) { - xdebug_error("Failed to dump config regs " - "size %d, err = %d\n", buflen, ret); - rte_free(reg_list); - rte_free(buf); - return ret; - } - len += rcv_len; - } - if (ret < 0) { - xdebug_error("Insufficient space to dump Config Bar register values\n"); - rte_free(reg_list); - rte_free(buf); - return qdma_get_error_code(ret); - } - xdebug_info("%s\n", buf); - rte_free(reg_list); - rte_free(buf); - } else { - ret = qdma_acc_reg_dump_buf_len(dev, - ip_type, device_type, &buflen); - if (ret < 0) { - xdebug_error("Failed to get register dump buffer length\n"); - return ret; - } - - /*allocate memory for register dump*/ - buf = (char *)rte_zmalloc("QDMA_REG_DUMP", buflen, - RTE_CACHE_LINE_SIZE); - if (!buf) { - xdebug_error("Unable to allocate memory for reg dump " - "size %d\n", buflen); - return -ENOMEM; - } - xdebug_info("FPGA Config Registers for port_id: %d\n--------\n", - port_id); - xdebug_info(" Offset Name " - " Value(Hex) Value(Dec)\n"); - - ret = qdma_acc_dump_config_regs(dev, qdma_dev->is_vf, - ip_type, device_type, buf, buflen); - if (ret < 0) { - xdebug_error("Insufficient space to dump Config Bar register values\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - xdebug_info("%s\n", buf); - rte_free(buf); - } - - return 0; -} - -static int qdma_device_dump(uint8_t port_id) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - - xdebug_info("\n*** QDMA Device struct for port_id: %d ***\n\n", - port_id); - - xdebug_info("\t\t config BAR index :%x\n", - qdma_dev->config_bar_idx); - xdebug_info("\t\t AXI Master Lite BAR index :%x\n", - qdma_dev->user_bar_idx); - xdebug_info("\t\t AXI Bridge Master BAR index :%x\n", - qdma_dev->bypass_bar_idx); - xdebug_info("\t\t qsets enable :%x\n", - qdma_dev->qsets_en); - xdebug_info("\t\t queue base :%x\n", - qdma_dev->queue_base); - xdebug_info("\t\t pf :%x\n", - qdma_dev->func_id); - xdebug_info("\t\t cmpt desc length :%x\n", - qdma_dev->cmpt_desc_len); - xdebug_info("\t\t c2h bypass mode :%x\n", - qdma_dev->c2h_bypass_mode); - xdebug_info("\t\t h2c bypass mode :%x\n", - qdma_dev->h2c_bypass_mode); - xdebug_info("\t\t trigger mode :%x\n", - qdma_dev->trigger_mode); - xdebug_info("\t\t timer count :%x\n", - qdma_dev->timer_count); - xdebug_info("\t\t is vf :%x\n", - qdma_dev->is_vf); - xdebug_info("\t\t is master :%x\n", - qdma_dev->is_master); - xdebug_info("\t\t enable desc prefetch :%x\n", - qdma_dev->en_desc_prefetch); - xdebug_info("\t\t ip type :%x\n", - qdma_dev->ip_type); - xdebug_info("\t\t vivado release :%x\n", - qdma_dev->vivado_rel); - xdebug_info("\t\t rtl version :%x\n", - qdma_dev->rtl_version); - xdebug_info("\t\t is queue conigured :%x\n", - qdma_dev->init_q_range); - - xdebug_info("\n\t ***** Device Capabilities *****\n"); - xdebug_info("\t\t number of PFs :%x\n", - qdma_dev->dev_cap.num_pfs); - xdebug_info("\t\t number of Queues :%x\n", - qdma_dev->dev_cap.num_qs); - xdebug_info("\t\t FLR present :%x\n", - qdma_dev->dev_cap.flr_present); - xdebug_info("\t\t ST mode enable :%x\n", - qdma_dev->dev_cap.st_en); - xdebug_info("\t\t MM mode enable :%x\n", - qdma_dev->dev_cap.mm_en); - xdebug_info("\t\t MM with compt enable :%x\n", - qdma_dev->dev_cap.mm_cmpt_en); - xdebug_info("\t\t Mailbox enable :%x\n", - qdma_dev->dev_cap.mailbox_en); - xdebug_info("\t\t Num of MM channels :%x\n", - qdma_dev->dev_cap.mm_channel_max); - xdebug_info("\t\t Descriptor engine mode :%s\n", - qdma_desc_eng_mode_info[qdma_dev->dev_cap.desc_eng_mode]); - xdebug_info("\t\t Debug mode enable :%x\n", - qdma_dev->dev_cap.debug_mode); - - return 0; -} - -static int qdma_tx_qstats_dump(struct qdma_tx_queue *txq) -{ - if (txq == NULL) { - xdebug_info("Caught NULL pointer for queue_id: %d\n", - txq->queue_id); - return -1; - } - - xdebug_info("\n***** QDMA Tx Qstats on port_id: %d for qid: %d *****\n", - txq->port_id, txq->queue_id); - xdebug_info("\t\t txq_pidx :%u\n", - txq->qstats.pidx); - xdebug_info("\t\t txq_wrb_cidx :%u\n", - txq->qstats.wrb_cidx); - xdebug_info("\t\t txq_tail :%u\n", - txq->qstats.txq_tail); - xdebug_info("\t\t in_use_desc :%u\n", - txq->qstats.in_use_desc); - xdebug_info("\t\t nb_pkts :%u\n", - txq->qstats.nb_pkts); - xdebug_info("\t\t ring_wrap_cnt :%u\n", - txq->qstats.ring_wrap_cnt); - xdebug_info("\t\t txq_full_cnt :%u\n", - txq->qstats.txq_full_cnt); - -#ifdef LATENCY_MEASUREMENT - xdebug_info("\n\t***** wrb cidx counts *****\n"); - xdebug_info("\t\t wrb_cidx_cnt_no_change :%u\n", - txq->qstats.wrb_cidx_cnt_no_change); - xdebug_info("\t\t wrb_cidx_cnt_lt_8 :%u\n", - txq->qstats.wrb_cidx_cnt_lt_8); - xdebug_info("\t\t wrb_cidx_cnt_8_to_32 :%u\n", - txq->qstats.wrb_cidx_cnt_8_to_32); - xdebug_info("\t\t wrb_cidx_cnt_32_to_64 :%u\n", - txq->qstats.wrb_cidx_cnt_32_to_64); - xdebug_info("\t\t wrb_cidx_cnt_gt_64 :%u\n", - txq->qstats.wrb_cidx_cnt_gt_64); -#endif - - return 0; -} - -static int qdma_tx_qstats_latency_dump(struct rte_eth_dev *dev, uint16_t queue) -{ - struct qdma_tx_queue *txq; - int ret; -#ifdef LATENCY_MEASUREMENT - double pkt_lat_val_ms = 0; - double txq_avg_lat_ms = 0; - const struct rte_memzone *memzone; - double (*lat_data)[LATENCY_CNT] = NULL; - uint64_t hz; - int i; -#endif - - if (dev == NULL) { - xdebug_error("Caught NULL pointer for dev\n"); - return -EINVAL; - } - - if (queue >= dev->data->nb_tx_queues) { - xdebug_info("TX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - txq = (struct qdma_tx_queue *)dev->data->tx_queues[queue]; - if (txq == NULL) { - xdebug_info("Caught NULL pointer for queue_id: %d\n", queue); - return -1; - } - - if (txq->status != RTE_ETH_QUEUE_STATE_STARTED) { - xdebug_info("Queue_id %d is not yet started\n", txq->queue_id); - return -1; - } - - ret = qdma_tx_qstats_dump(txq); - if (ret < 0) { - xdebug_info("Failed to dump Tx qstats for queue_id: %d\n", - queue); - return -1; - } - -#ifdef LATENCY_MEASUREMENT - /* Find the memzone created by the primary application */ - memzone = rte_memzone_lookup("TXQ_LAT_BUFFER_ZONE"); - if (memzone == NULL) { - /* Handle memzone lookup failure */ - return -1; - } - - /* Get the virtual address of the shared rxq latency buffer memory */ - lat_data = memzone->addr; - - xdebug_info("\n\t**** TxQ SW PIDX to HW CIDX Latency for qid: %d ****\n", - queue); - hz = rte_get_timer_hz(); - for (i = 0; i < LATENCY_CNT; i++) { - pkt_lat_val_ms = - ((double)lat_data[queue][i]*1000000/hz); - txq_avg_lat_ms += pkt_lat_val_ms; - xdebug_info("\t\t h2c_sw_pidx_to_hw_cidx_latency[%d][%d] : %f ms\n", - queue, i, pkt_lat_val_ms); - } - - xdebug_info( - "\n\t Avg h2c_sw_pidx_to_hw_cidx_latency for qid:%d is %f ms\n", - queue, (txq_avg_lat_ms/LATENCY_CNT)); -#endif - - return 0; -} - -static int qdma_rx_qstats_dump(struct qdma_rx_queue *rxq) -{ - if (rxq == NULL) { - xdebug_info("Caught NULL pointer for queue_id: %d\n", - rxq->queue_id); - return -1; - } - - xdebug_info("\n***** QDMA Rx Qstats on port_id: %d for qid: %d *****\n", - rxq->port_id, rxq->queue_id); - - xdebug_info("\t\t rxq_pidx :%u\n", - rxq->qstats.pidx); - xdebug_info("\t\t rxq_wrb_pidx :%u\n", - rxq->qstats.wrb_pidx); - xdebug_info("\t\t rxq_wrb_cidx :%u\n", - rxq->qstats.wrb_cidx); - xdebug_info("\t\t rxq_cmpt_tail :%u\n", - rxq->qstats.rxq_cmpt_tail); - xdebug_info("\t\t pending_desc :%u\n", - rxq->qstats.pending_desc); - xdebug_info("\t\t ring_wrap_cnt :%u\n", - rxq->qstats.ring_wrap_cnt); - xdebug_info("\t\t mbuf_avail_cnt :%u\n", - rxq->qstats.mbuf_avail_cnt); - xdebug_info("\t\t mbuf_in_use_cnt :%u\n", - rxq->qstats.mbuf_in_use_cnt); - - return 0; -} - -static int qdma_rx_qstats_latency_dump(struct rte_eth_dev *dev, uint16_t queue) -{ - struct qdma_rx_queue *rxq; - int ret; -#ifdef LATENCY_MEASUREMENT - double pkt_lat_val_ms = 0; - double rxq_avg_lat_ms = 0; - const struct rte_memzone *memzone; - double (*lat_data)[LATENCY_CNT] = NULL; - uint64_t hz; - int i; -#endif - - if (dev == NULL) { - xdebug_error("Caught NULL pointer for dev\n"); - return -EINVAL; - } - - if (queue >= dev->data->nb_rx_queues) { - xdebug_info("RX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[queue]; - if (rxq == NULL) { - xdebug_info("Caught NULL pointer for queue_id: %d\n", queue); - return -1; - } - - if (rxq->status != RTE_ETH_QUEUE_STATE_STARTED) { - xdebug_info("Queue_id %d is not yet started\n", rxq->queue_id); - return -1; - } - - ret = qdma_rx_qstats_dump(rxq); - if (ret < 0) { - xdebug_info("Failed to dump Rx qstats for queue_id: %d\n", - queue); - return -1; - } - -#ifdef LATENCY_MEASUREMENT - /* Find the memzone created by the primary application */ - memzone = rte_memzone_lookup("RXQ_LAT_BUFFER_ZONE"); - if (memzone == NULL) { - /* Handle memzone lookup failure */ - return -1; - } - - /* Get the virtual address of the shared txq latency buffer memory */ - lat_data = memzone->addr; - - xdebug_info("\n\t*** RxQ SW PIDX to CMPT PIDX Latency for qid: %d ***\n", - queue); - hz = rte_get_timer_hz(); - for (i = 0; i < LATENCY_CNT; i++) { - pkt_lat_val_ms = - ((double)lat_data[queue][i]*1000000/hz); - rxq_avg_lat_ms += pkt_lat_val_ms; - xdebug_info("\t\t c2h_sw_pidx_to_cmpt_pidx_latency[%d][%d] : %f ms\n", - queue, i, pkt_lat_val_ms); - } - - xdebug_info( - "\n\t Avg c2h_sw_pidx_to_cmpt_pidx_latency for qid:%d is %f ms\n", - queue, (rxq_avg_lat_ms/LATENCY_CNT)); -#endif - - return 0; -} - -static int qdma_descq_context_read_vf(struct rte_eth_dev *dev, - unsigned int qid_hw, bool st_mode, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *context) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - enum mbox_cmpt_ctxt_type cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - int rv; - - if (!m) - return -ENOMEM; - - if (!st_mode) { - if (q_type == QDMA_DEV_Q_TYPE_CMPT) - cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_ONLY; - else - cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - } else { - if (q_type == QDMA_DEV_Q_TYPE_C2H) - cmpt_ctxt_type = QDMA_MBOX_CMPT_WITH_ST; - } - - qdma_mbox_compose_vf_qctxt_read(qdma_dev->func_id, - qid_hw, st_mode, q_type, cmpt_ctxt_type, m->raw_data); - - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - xdebug_error("%x, qid_hw 0x%x, mbox failed for vf q context %d.\n", - qdma_dev->func_id, qid_hw, rv); - goto free_msg; - } - - rv = qdma_mbox_vf_context_get(m->raw_data, context); - if (rv < 0) { - xdebug_error("%x, failed to get vf queue context info %d.\n", - qdma_dev->func_id, rv); - goto free_msg; - } - -free_msg: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_c2h_context_dump(uint8_t port_id, uint16_t queue) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_descq_context queue_context; - enum qdma_dev_q_type q_type; - enum qdma_ip_type ip_type; - enum qdma_device_type device_type; - uint16_t qid; - uint8_t st_mode; - char *buf = NULL; - uint32_t buflen = 0; - int ret = 0; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - qid = qdma_dev->queue_base + queue; - ip_type = (enum qdma_ip_type)qdma_dev->ip_type; - device_type = (enum qdma_device_type)qdma_dev->device_type; - st_mode = qdma_dev->q_info[qid].queue_mode; - q_type = QDMA_DEV_Q_TYPE_C2H; - - if (queue >= dev->data->nb_rx_queues) { - xdebug_info("RX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - xdebug_info( - "\n ***** C2H Queue Contexts on port_id: %d for q_id: %d *****\n", - port_id, qid); - - ret = qdma_acc_context_buf_len(dev, ip_type, device_type, st_mode, - q_type, &buflen); - if (ret < 0) { - xdebug_error("Failed to get context buffer length,\n"); - return ret; - } - - /*allocate memory for csr dump*/ - buf = (char *)rte_zmalloc("QDMA_C2H_CONTEXT_DUMP", - buflen, RTE_CACHE_LINE_SIZE); - if (!buf) { - xdebug_error("Unable to allocate memory for c2h context dump " - "size %d\n", buflen); - return -ENOMEM; - } - - if (qdma_dev->is_vf) { - ret = qdma_descq_context_read_vf(dev, qid, - st_mode, q_type, &queue_context); - if (ret < 0) { - xdebug_error("Failed to read c2h queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - - ret = qdma_acc_dump_queue_context(dev, ip_type, device_type, - st_mode, q_type, &queue_context, buf, buflen); - if (ret < 0) { - xdebug_error("Failed to dump c2h queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - } else { - ret = qdma_acc_read_dump_queue_context(dev, - ip_type, device_type, qdma_dev->func_id, qid, - st_mode, q_type, buf, buflen); - if (ret < 0) { - xdebug_error("Failed to read and dump c2h queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - } - - xdebug_info("%s\n", buf); - rte_free(buf); - - return 0; -} - -static int qdma_h2c_context_dump(uint8_t port_id, uint16_t queue) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_descq_context queue_context; - enum qdma_dev_q_type q_type; - enum qdma_ip_type ip_type; - enum qdma_device_type device_type; - uint32_t buflen = 0; - uint16_t qid; - uint8_t st_mode; - char *buf = NULL; - int ret = 0; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - qid = qdma_dev->queue_base + queue; - ip_type = (enum qdma_ip_type)qdma_dev->ip_type; - device_type = (enum qdma_device_type)qdma_dev->device_type; - st_mode = qdma_dev->q_info[qid].queue_mode; - q_type = QDMA_DEV_Q_TYPE_H2C; - - if (queue >= dev->data->nb_tx_queues) { - xdebug_info("TX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - xdebug_info( - "\n ***** H2C Queue Contexts on port_id: %d for q_id: %d *****\n", - port_id, qid); - - ret = qdma_acc_context_buf_len(dev, ip_type, device_type, st_mode, - q_type, &buflen); - if (ret < 0) { - xdebug_error("Failed to get context buffer length,\n"); - return ret; - } - - /*allocate memory for csr dump*/ - buf = (char *)rte_zmalloc("QDMA_H2C_CONTEXT_DUMP", - buflen, RTE_CACHE_LINE_SIZE); - if (!buf) { - xdebug_error("Unable to allocate memory for h2c context dump " - "size %d\n", buflen); - return -ENOMEM; - } - - if (qdma_dev->is_vf) { - ret = qdma_descq_context_read_vf(dev, qid, - st_mode, q_type, &queue_context); - if (ret < 0) { - xdebug_error("Failed to read h2c queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - - ret = qdma_acc_dump_queue_context(dev, ip_type, - device_type, st_mode, q_type, - &queue_context, buf, buflen); - if (ret < 0) { - xdebug_error("Failed to dump h2c queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - } else { - ret = qdma_acc_read_dump_queue_context(dev, - ip_type, device_type, qdma_dev->func_id, qid, - st_mode, q_type, buf, buflen); - if (ret < 0) { - xdebug_error("Failed to read and dump h2c queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - } - - xdebug_info("%s\n", buf); - rte_free(buf); - - return 0; -} - -static int qdma_cmpt_context_dump(uint8_t port_id, uint16_t queue) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_descq_context queue_context; - enum qdma_dev_q_type q_type; - enum qdma_ip_type ip_type; - enum qdma_device_type device_type; - uint32_t buflen; - uint16_t qid; - uint8_t st_mode; - char *buf = NULL; - int ret = 0; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - qid = qdma_dev->queue_base + queue; - ip_type = (enum qdma_ip_type)qdma_dev->ip_type; - device_type = (enum qdma_device_type)qdma_dev->device_type; - st_mode = qdma_dev->q_info[qid].queue_mode; - q_type = QDMA_DEV_Q_TYPE_CMPT; - - if (queue >= dev->data->nb_rx_queues) { - xdebug_info("RX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - xdebug_info( - "\n ***** CMPT Queue Contexts on port_id: %d for q_id: %d *****\n", - port_id, qid); - - ret = qdma_acc_context_buf_len(dev, ip_type, device_type, - st_mode, q_type, &buflen); - if (ret < 0) { - xdebug_error("Failed to get context buffer length\n"); - return ret; - } - - /*allocate memory for csr dump*/ - buf = (char *)rte_zmalloc("QDMA_CMPT_CONTEXT_DUMP", - buflen, RTE_CACHE_LINE_SIZE); - if (!buf) { - xdebug_error("Unable to allocate memory for cmpt context dump " - "size %d\n", buflen); - return -ENOMEM; - } - - if (qdma_dev->is_vf) { - ret = qdma_descq_context_read_vf(dev, qid, - st_mode, q_type, &queue_context); - if (ret < 0) { - xdebug_error("Failed to read cmpt queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - - ret = qdma_acc_dump_queue_context(dev, ip_type, - device_type, st_mode, q_type, - &queue_context, buf, buflen); - if (ret < 0) { - xdebug_error("Failed to dump cmpt queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - } else { - ret = qdma_acc_read_dump_queue_context(dev, - ip_type, device_type, qdma_dev->func_id, qid, st_mode, - q_type, buf, buflen); - if (ret < 0) { - xdebug_error("Failed to read and dump cmpt queue context\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - } - - xdebug_info("%s\n", buf); - rte_free(buf); - - return 0; -} - -static int qdma_queue_desc_dump(uint8_t port_id, - struct xdebug_desc_param *param) -{ - struct rte_eth_dev *dev; - struct qdma_rx_queue *rxq; - struct qdma_tx_queue *txq; - uint8_t *rx_ring_bypass = NULL; - uint8_t *tx_ring_bypass = NULL; - char str[50]; - int x; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - - switch (param->type) { - case RTE_PMD_QDMA_XDEBUG_DESC_C2H: - - if (param->queue >= dev->data->nb_rx_queues) { - xdebug_info("queue_id=%d not configured", - param->queue); - return -1; - } - - rxq = (struct qdma_rx_queue *) - dev->data->rx_queues[param->queue]; - - if (rxq == NULL) { - xdebug_info("Caught NULL pointer for queue_id: %d\n", - param->queue); - return -1; - } - - if (rxq->status != RTE_ETH_QUEUE_STATE_STARTED) { - xdebug_info("Queue_id %d is not yet started\n", - param->queue); - return -1; - } - - if (param->start < 0 || param->start > rxq->nb_rx_desc) - param->start = 0; - if (param->end <= param->start || - param->end > rxq->nb_rx_desc) - param->end = rxq->nb_rx_desc; - - if ((rxq->en_bypass) && (rxq->bypass_desc_sz != 0)) { - rx_ring_bypass = (uint8_t *)rxq->rx_ring; - - xdebug_info("\n===== C2H bypass descriptors=====\n"); - for (x = param->start; x < param->end; x++) { - uint8_t *rx_bypass = - &rx_ring_bypass[x]; - snprintf(str, sizeof(str), - "\nDescriptor ID %d\t", x); - rte_hexdump(stdout, str, - (const void *)rx_bypass, - rxq->bypass_desc_sz); - } - } else { - if (rxq->st_mode) { - struct qdma_ul_st_c2h_desc *rx_ring_st = - (struct qdma_ul_st_c2h_desc *)rxq->rx_ring; - - xdebug_info("\n===== C2H ring descriptors=====\n"); - for (x = param->start; x < param->end; x++) { - struct qdma_ul_st_c2h_desc *rx_st = - &rx_ring_st[x]; - snprintf(str, sizeof(str), - "\nDescriptor ID %d\t", x); - rte_hexdump(stdout, str, - (const void *)rx_st, - sizeof(struct qdma_ul_st_c2h_desc)); - } - } else { - struct qdma_ul_mm_desc *rx_ring_mm = - (struct qdma_ul_mm_desc *)rxq->rx_ring; - xdebug_info("\n====== C2H ring descriptors======\n"); - for (x = param->start; x < param->end; x++) { - snprintf(str, sizeof(str), - "\nDescriptor ID %d\t", x); - rte_hexdump(stdout, str, - (const void *)&rx_ring_mm[x], - sizeof(struct qdma_ul_mm_desc)); - } - } - } - break; - case RTE_PMD_QDMA_XDEBUG_DESC_CMPT: - - if (param->queue >= dev->data->nb_rx_queues) { - xdebug_info("queue_id=%d not configured", - param->queue); - return -1; - } - - rxq = (struct qdma_rx_queue *) - dev->data->rx_queues[param->queue]; - - if (rxq) { - if (rxq->status != RTE_ETH_QUEUE_STATE_STARTED) { - xdebug_info("Queue_id %d is not yet started\n", - param->queue); - return -1; - } - - if (param->start < 0 || - param->start > rxq->nb_rx_cmpt_desc) - param->start = 0; - if (param->end <= param->start || - param->end > rxq->nb_rx_cmpt_desc) - param->end = rxq->nb_rx_cmpt_desc; - - if (!rxq->st_mode) { - xdebug_info("Queue_id %d is not initialized " - "in Stream mode\n", param->queue); - return -1; - } - - xdebug_info("\n===== CMPT ring descriptors=====\n"); - for (x = param->start; x < param->end; x++) { - uint32_t *cmpt_ring = (uint32_t *) - ((uint64_t)(rxq->cmpt_ring) + - ((uint64_t)x * rxq->cmpt_desc_len)); - snprintf(str, sizeof(str), - "\nDescriptor ID %d\t", x); - rte_hexdump(stdout, str, - (const void *)cmpt_ring, - rxq->cmpt_desc_len); - } - } - break; - case RTE_PMD_QDMA_XDEBUG_DESC_H2C: - - if (param->queue >= dev->data->nb_tx_queues) { - xdebug_info("queue_id=%d not configured", - param->queue); - return -1; - } - - txq = (struct qdma_tx_queue *) - dev->data->tx_queues[param->queue]; - - if (txq == NULL) { - xdebug_info("Caught NULL pointer for queue_id: %d\n", - param->queue); - return -1; - } - - if (txq->status != RTE_ETH_QUEUE_STATE_STARTED) { - xdebug_info("Queue_id %d is not yet started\n", - param->queue); - return -1; - } - - if (param->start < 0 || param->start > txq->nb_tx_desc) - param->start = 0; - if (param->end <= param->start || - param->end > txq->nb_tx_desc) - param->end = txq->nb_tx_desc; - - if ((txq->en_bypass) && (txq->bypass_desc_sz != 0)) { - tx_ring_bypass = (uint8_t *)txq->tx_ring; - - xdebug_info("\n====== H2C bypass descriptors=====\n"); - for (x = param->start; x < param->end; x++) { - uint8_t *tx_bypass = - &tx_ring_bypass[x]; - snprintf(str, sizeof(str), - "\nDescriptor ID %d\t", x); - rte_hexdump(stdout, str, - (const void *)tx_bypass, - txq->bypass_desc_sz); - } - } else { - if (txq->st_mode) { - struct qdma_ul_st_h2c_desc *qdma_h2c_ring = - (struct qdma_ul_st_h2c_desc *)txq->tx_ring; - xdebug_info("\n====== H2C ring descriptors=====\n"); - for (x = param->start; x < param->end; x++) { - snprintf(str, sizeof(str), - "\nDescriptor ID %d\t", x); - rte_hexdump(stdout, str, - (const void *)&qdma_h2c_ring[x], - sizeof(struct qdma_ul_st_h2c_desc)); - } - } else { - struct qdma_ul_mm_desc *tx_ring_mm = - (struct qdma_ul_mm_desc *)txq->tx_ring; - xdebug_info("\n===== H2C ring descriptors=====\n"); - for (x = param->start; x < param->end; x++) { - snprintf(str, sizeof(str), - "\nDescriptor ID %d\t", x); - rte_hexdump(stdout, str, - (const void *)&tx_ring_mm[x], - sizeof(struct qdma_ul_mm_desc)); - } - } - } - break; - default: - xdebug_info("Invalid ring selected\n"); - break; - } - return 0; -} - -int rte_pmd_qdma_dbg_regdump(uint8_t port_id) -{ - int err; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - err = qdma_config_reg_dump(port_id); - if (err) { - xdebug_error("Error dumping Global registers\n"); - return err; - } - return 0; -} - -int rte_pmd_qdma_dbg_reg_info_dump(uint8_t port_id, - uint32_t num_regs, uint32_t reg_addr) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - enum qdma_ip_type ip_type; - enum qdma_device_type device_type; - char *buf = NULL; - int buflen = QDMA_MAX_BUFLEN; - int ret; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - ip_type = (enum qdma_ip_type)qdma_dev->ip_type; - device_type = (enum qdma_device_type)qdma_dev->device_type; - - /*allocate memory for register dump*/ - buf = (char *)rte_zmalloc("QDMA_DUMP_BUF_REG_INFO", buflen, - RTE_CACHE_LINE_SIZE); - if (!buf) { - xdebug_error("Unable to allocate memory for reg info dump " - "size %d\n", buflen); - return -ENOMEM; - } - - ret = qdma_acc_dump_reg_info(dev, ip_type, device_type, - reg_addr, num_regs, buf, buflen); - if (ret < 0) { - xdebug_error("Failed to dump reg field values\n"); - rte_free(buf); - return qdma_get_error_code(ret); - } - xdebug_info("%s\n", buf); - rte_free(buf); - - return 0; -} - -int rte_pmd_qdma_dbg_qdevice(uint8_t port_id) -{ - int err; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - err = qdma_device_dump(port_id); - if (err) { - xdebug_error("Error dumping QDMA device\n"); - return err; - } - return 0; -} - -int rte_pmd_qdma_qstats(uint8_t port_id, uint16_t queue) -{ - struct rte_eth_dev *dev; - int ret; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - if (dev == NULL) { - xdebug_error("Caught NULL pointer for dev\n"); - return -EINVAL; - } - - ret = qdma_tx_qstats_latency_dump(dev, queue); - if (ret) { - xdebug_error("Error dumping QDMA Tx queue stats\n"); - return ret; - } - - ret = qdma_rx_qstats_latency_dump(dev, queue); - if (ret) { - xdebug_error("Error dumping QDMA Rx queue stats\n"); - return ret; - } - - return 0; -} - -int qdma_tx_qstats_clear(struct rte_eth_dev *dev, uint16_t queue) -{ - struct qdma_tx_queue *txq; - int ret; -#ifdef LATENCY_MEASUREMENT - int i; -#endif - - if (queue >= dev->data->nb_tx_queues) { - xdebug_info("TX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - txq = (struct qdma_tx_queue *)dev->data->tx_queues[queue]; - if (txq == NULL) { - xdebug_info("Caught NULL pointer for queue_id: %d\n", queue); - return -EINVAL; - } - - memset(&txq->qstats, 0, sizeof(struct qdma_txq_stats)); - -#ifdef LATENCY_MEASUREMENT - for (i = 0; i < LATENCY_CNT; i++) - h2c_pidx_to_hw_cidx_lat[queue][i] = 0; -#endif - - xdebug_info("\nCleared Tx queue stats for qid: %d\n", - queue); - - ret = qdma_tx_qstats_dump(txq); - if (ret < 0) { - xdebug_info("Failed to dump Tx qstats for queue_id: %d\n", - queue); - return -1; - } - - return 0; -} - -int qdma_rx_qstats_clear(struct rte_eth_dev *dev, uint16_t queue) -{ - struct qdma_rx_queue *rxq; - int ret; -#ifdef LATENCY_MEASUREMENT - int i; -#endif - - if (queue >= dev->data->nb_rx_queues) { - xdebug_info("RX queue_id=%d not configured\n", queue); - return -EINVAL; - } - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[queue]; - if (rxq == NULL) { - xdebug_info("Caught NULL pointer for queue_id: %d\n", queue); - return -EINVAL; - } - - memset(&rxq->qstats, 0, sizeof(struct qdma_rxq_stats)); - -#ifdef LATENCY_MEASUREMENT - for (i = 0; i < LATENCY_CNT; i++) - c2h_pidx_to_cmpt_pidx_lat[queue][i] = 0; -#endif - - xdebug_info("\nCleared Rx queue stats for qid: %d\n", - queue); - - ret = qdma_rx_qstats_dump(rxq); - if (ret < 0) { - xdebug_info("Failed to dump Rx qstats for queue_id: %d\n", - queue); - return -1; - } - - return 0; -} - -int rte_pmd_qdma_qstats_clear(uint8_t port_id, uint16_t queue) -{ - struct rte_eth_dev *dev; - int ret; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - - ret = qdma_tx_qstats_clear(dev, queue); - if (ret) { - xdebug_error("Failed to clear QDMA Tx queue stats\n"); - return ret; - } - - ret = qdma_rx_qstats_clear(dev, queue); - if (ret) { - xdebug_error("Failed to clear QDMA Rx queue stats\n"); - return ret; - } - - return 0; -} - -int rte_pmd_qdma_dbg_qinfo(uint8_t port_id, uint16_t queue) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - uint16_t qid; - uint8_t st_mode; - int err; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - qid = qdma_dev->queue_base + queue; - st_mode = qdma_dev->q_info[qid].queue_mode; - - err = qdma_h2c_context_dump(port_id, queue); - if (err) { - xdebug_error("Error dumping %d: %d\n", - queue, err); - return err; - } - - err = qdma_c2h_context_dump(port_id, queue); - if (err) { - xdebug_error("Error dumping %d: %d\n", - queue, err); - return err; - } - - if (!st_mode && qdma_dev->dev_cap.mm_cmpt_en) { - err = qdma_cmpt_context_dump(port_id, queue); - if (err) { - xdebug_error("Error dumping %d: %d\n", - queue, err); - return err; - } - } - - err = qdma_h2c_struct_dump(port_id, queue); - if (err) { - xdebug_error("Error dumping %d: %d\n", - queue, err); - return err; - } - - err = qdma_c2h_struct_dump(port_id, queue); - if (err) { - xdebug_error("Error dumping %d: %d\n", - queue, err); - return err; - } - - return 0; -} - -int rte_pmd_qdma_dbg_qdesc(uint8_t port_id, uint16_t queue, int start, - int end, enum rte_pmd_qdma_xdebug_desc_type type) -{ - struct xdebug_desc_param param; - int err; - - if (port_id >= rte_eth_dev_count_avail()) { - xdebug_error("Wrong port id %d\n", port_id); - return -EINVAL; - } - - param.queue = queue; - param.start = start; - param.end = end; - param.type = type; - - err = qdma_queue_desc_dump(port_id, ¶m); - if (err) { - xdebug_error("Error dumping %d: %d\n", - queue, err); - return err; - } - return 0; -} diff --git a/QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.c b/QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.c deleted file mode 100755 index d2b93ba..0000000 --- a/QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.c +++ /dev/null @@ -1,1821 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#include <stdint.h> -#include <sys/mman.h> -#include <sys/fcntl.h> -#include <rte_memzone.h> -#include <rte_string_fns.h> -#include <rte_malloc.h> -#include <rte_dev.h> -#include <rte_pci.h> -#include <rte_ether.h> -#include <rte_ethdev.h> -#include <rte_alarm.h> -#include <rte_cycles.h> -#include <unistd.h> -#include <string.h> - -#include "qdma.h" -#include "qdma_access_common.h" -#include "rte_pmd_qdma.h" -#include "qdma_devops.h" - - -static int validate_qdma_dev_info(int port_id, uint16_t qid) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - - if (port_id < 0 || port_id >= rte_eth_dev_count_avail()) { - PMD_DRV_LOG(ERR, "Wrong port id %d\n", port_id); - return -ENOTSUP; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (!is_qdma_supported(dev)) { - PMD_DRV_LOG(ERR, "Device is not supported\n"); - return -ENOTSUP; - } - - if (qid >= qdma_dev->qsets_en) { - PMD_DRV_LOG(ERR, "Invalid Queue id passed, queue ID = %d\n", - qid); - return -EINVAL; - } - - if (!qdma_dev->dev_configured) { - PMD_DRV_LOG(ERR, - "Device for port id %d is not configured yet\n", - port_id); - return -EINVAL; - } - - return 0; -} - -static int8_t qdma_get_trigger_mode(enum rte_pmd_qdma_tigger_mode_t mode) -{ - int8_t ret; - switch (mode) { - case RTE_PMD_QDMA_TRIG_MODE_DISABLE: - ret = QDMA_CMPT_UPDATE_TRIG_MODE_DIS; - break; - case RTE_PMD_QDMA_TRIG_MODE_EVERY: - ret = QDMA_CMPT_UPDATE_TRIG_MODE_EVERY; - break; - case RTE_PMD_QDMA_TRIG_MODE_USER_COUNT: - ret = QDMA_CMPT_UPDATE_TRIG_MODE_USR_CNT; - break; - case RTE_PMD_QDMA_TRIG_MODE_USER: - ret = QDMA_CMPT_UPDATE_TRIG_MODE_USR; - break; - case RTE_PMD_QDMA_TRIG_MODE_USER_TIMER: - ret = QDMA_CMPT_UPDATE_TRIG_MODE_USR_TMR; - break; - case RTE_PMD_QDMA_TRIG_MODE_USER_TIMER_COUNT: - ret = QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR; - break; - default: - ret = QDMA_CMPT_UPDATE_TRIG_MODE_USR_TMR; - break; - } - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_get_bar_details - * Description: Returns the BAR indices of the QDMA BARs - * - * @param port_id : Port ID - * @param config_bar_idx : Config BAR index - * @param user_bar_idx : AXI Master Lite BAR(user bar) index - * @param bypass_bar_idx : AXI Bridge Master BAR(bypass bar) index - * - * @return '0' on success and '< 0' on failure. - * - * @note None. - ******************************************************************************/ -int rte_pmd_qdma_get_bar_details(int port_id, int32_t *config_bar_idx, - int32_t *user_bar_idx, int32_t *bypass_bar_idx) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *dma_priv; - - if (port_id < 0 || port_id >= rte_eth_dev_count_avail()) { - PMD_DRV_LOG(ERR, "Wrong port id %d\n", port_id); - return -ENOTSUP; - } - dev = &rte_eth_devices[port_id]; - dma_priv = dev->data->dev_private; - if (!is_qdma_supported(dev)) { - PMD_DRV_LOG(ERR, "Device is not supported\n"); - return -ENOTSUP; - } - - if (config_bar_idx != NULL) - *(config_bar_idx) = dma_priv->config_bar_idx; - - if (user_bar_idx != NULL) - *(user_bar_idx) = dma_priv->user_bar_idx; - - if (bypass_bar_idx != NULL) - *(bypass_bar_idx) = dma_priv->bypass_bar_idx; - - return 0; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_get_queue_base - * Description: Returns queue base for given port - * - * @param port_id : Port ID. - * @param queue_base : queue base. - * - * @return '0' on success and '< 0' on failure. - * - * @note Application can call this API only after successful - * call to rte_eh_dev_configure() API. - ******************************************************************************/ -int rte_pmd_qdma_get_queue_base(int port_id, uint32_t *queue_base) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *dma_priv; - - if (port_id < 0 || port_id >= rte_eth_dev_count_avail()) { - PMD_DRV_LOG(ERR, "Wrong port id %d\n", port_id); - return -ENOTSUP; - } - dev = &rte_eth_devices[port_id]; - dma_priv = dev->data->dev_private; - if (!is_qdma_supported(dev)) { - PMD_DRV_LOG(ERR, "Device is not supported\n"); - return -ENOTSUP; - } - - if (queue_base == NULL) { - PMD_DRV_LOG(ERR, "Caught NULL pointer for queue base\n"); - return -EINVAL; - } - - *(queue_base) = dma_priv->queue_base; - - return 0; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_get_pci_func_type - * Description: Retrieves pci function type i.e. PF or VF - * - * @param port_id : Port ID. - * @param func_type : Indicates pci function type. - * - * @return '0' on success and '< 0' on failure. - * - * @note Returns the PCIe function type i.e. PF or VF of the given port. - ******************************************************************************/ -int rte_pmd_qdma_get_pci_func_type(int port_id, - enum rte_pmd_qdma_pci_func_type *func_type) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *dma_priv; - - if (port_id < 0 || port_id >= rte_eth_dev_count_avail()) { - PMD_DRV_LOG(ERR, "Wrong port id %d\n", port_id); - return -ENOTSUP; - } - dev = &rte_eth_devices[port_id]; - dma_priv = dev->data->dev_private; - if (!is_qdma_supported(dev)) { - PMD_DRV_LOG(ERR, "Device is not supported\n"); - return -ENOTSUP; - } - - if (func_type == NULL) { - PMD_DRV_LOG(ERR, "Caught NULL pointer for function type\n"); - return -EINVAL; - } - - *((enum rte_pmd_qdma_pci_func_type *)func_type) = (dma_priv->is_vf) ? - RTE_PMD_QDMA_PCI_FUNC_VF : RTE_PMD_QDMA_PCI_FUNC_PF; - - return 0; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_get_immediate_data_state - * Description: Returns immediate data state - * i.e. whether enabled or disabled, for the specified - * queue - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param state : Pointer to the state specifying whether - * immediate data is enabled or not - * - * @return '0' on success and '< 0' on failure. - * - * @note Application can call this function after - * rte_eth_tx_queue_setup() or - * rte_eth_rx_queue_setup() is called. - * API is applicable for streaming queues only. - ******************************************************************************/ -int rte_pmd_qdma_get_immediate_data_state(int port_id, uint32_t qid, - int *state) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_rx_queue *rxq; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qid >= dev->data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid Q-id passed qid %d max en_qid %d\n", - qid, dev->data->nb_rx_queues); - return -EINVAL; - } - - if (state == NULL) { - PMD_DRV_LOG(ERR, "Invalid state for qid %d\n", qid); - return -EINVAL; - } - - if (qdma_dev->q_info[qid].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) { - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - if (rxq != NULL) { - *((int *)state) = rxq->dump_immediate_data; - } else { - PMD_DRV_LOG(ERR, "Qid %d is not setup\n", qid); - return -EINVAL; - } - - } else { - PMD_DRV_LOG(ERR, "Qid %d is not setup in Streaming mode\n", - qid); - return -EINVAL; - } - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_set_queue_mode - * Description: Sets queue mode for the specified queue - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param mode : Queue mode to be set - * - * @return '0' on success and '<0' on failure. - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() but before - * rte_eth_tx_queue_setup/rte_eth_rx_queue_setup() API. - * By default, all queues are setup in streaming mode. - ******************************************************************************/ -int rte_pmd_qdma_set_queue_mode(int port_id, uint32_t qid, - enum rte_pmd_qdma_queue_mode_t mode) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (mode >= RTE_PMD_QDMA_QUEUE_MODE_MAX) { - PMD_DRV_LOG(ERR, "Invalid Queue mode passed,Mode = %d\n", mode); - return -EINVAL; - } - - qdma_dev->q_info[qid].queue_mode = mode; - - return ret; -} - -/******************************************************************************/ -/** - *Function Name: rte_pmd_qdma_set_immediate_data_state - *Description: Sets immediate data state - * i.e. enable or disable, for the specified queue. - * If enabled, the user defined data in the completion - * ring are dumped in to a queue specific file - * "q_<qid>_immmediate_data.txt" in the local directory. - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param value : Immediate data state to be set - * Set '0' to disable and '1' to enable - * - * @return '0' on success and '< 0' on failure. - * - * @note Application can call this API after successful - * call to rte_eth_dev_configure() API. Application can - * also call this API after successful call to - * rte_eth_rx_queue_setup() only if rx queue is not in - * start state. This API is applicable for - * streaming queues only. - ******************************************************************************/ -int rte_pmd_qdma_set_immediate_data_state(int port_id, uint32_t qid, - uint8_t state) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_rx_queue *rxq; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qid >= dev->data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid RX Queue id passed for %s," - "Queue ID = %d\n", __func__, qid); - return -EINVAL; - } - - if (state > 1) { - PMD_DRV_LOG(ERR, "Invalid value specified for immediate data " - "state %s, Queue ID = %d\n", __func__, qid); - return -EINVAL; - } - - if (qdma_dev->q_info[qid].queue_mode != - RTE_PMD_QDMA_STREAMING_MODE) { - PMD_DRV_LOG(ERR, "Qid %d is not setup in ST mode\n", qid); - return -EINVAL; - } - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - if (rxq == NULL) { - /* Update the configuration in q_info structure - * if rx queue is not setup. - */ - qdma_dev->q_info[qid].immediate_data_state = state; - } else if (dev->data->rx_queue_state[qid] == - RTE_ETH_QUEUE_STATE_STOPPED) { - /* Update the config in both q_info and rxq structures, - * only if rx queue is setup but not yet started. - */ - qdma_dev->q_info[qid].immediate_data_state = state; - rxq->dump_immediate_data = state; - } else { - PMD_DRV_LOG(ERR, - "Cannot configure when Qid %d is in start state\n", - qid); - return -EINVAL; - } - - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_set_cmpt_overflow_check - * Description: Enables or disables the overflow check - * (whether PIDX is overflowing the CIDX) performed by - * QDMA on the completion descriptor ring of specified - * queue. - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param enable : '1' to enable and '0' to disable the overflow check - * - * @return '0' on success and '< 0' on failure. - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() API. Application can also call this - * API after successful call to rte_eth_rx_queue_setup()/ - * rte_pmd_qdma_dev_cmptq_setup() API only if - * rx/cmpt queue is not in start state. - ******************************************************************************/ -int rte_pmd_qdma_set_cmpt_overflow_check(int port_id, uint32_t qid, - uint8_t enable) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_cmpt_queue *cmptq; - struct qdma_rx_queue *rxq; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (enable > 1) - return -EINVAL; - - if (!qdma_dev->dev_cap.cmpt_ovf_chk_dis) { - PMD_DRV_LOG(ERR, "%s: Completion overflow check disable is " - "not supported in the current design\n", __func__); - return -EINVAL; - } - if (qdma_dev->q_info[qid].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) { - if (qid >= dev->data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid Queue id passed for %s," - "Queue ID(ST-mode) = %d\n", __func__, - qid); - return -EINVAL; - } - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - if (rxq == NULL) { - /* Update the configuration in q_info structure - * if rx queue is not setup. - */ - qdma_dev->q_info[qid].dis_cmpt_ovf_chk = - (enable == 1) ? 0 : 1; - } else if (dev->data->rx_queue_state[qid] == - RTE_ETH_QUEUE_STATE_STOPPED) { - /* Update the config in both q_info and rxq structures, - * only if rx queue is setup but not yet started. - */ - qdma_dev->q_info[qid].dis_cmpt_ovf_chk = - (enable == 1) ? 0 : 1; - rxq->dis_overflow_check = - qdma_dev->q_info[qid].dis_cmpt_ovf_chk; - } else { - PMD_DRV_LOG(ERR, - "Cannot configure when Qid %d is in start state\n", - qid); - return -EINVAL; - } - } else { - cmptq = (struct qdma_cmpt_queue *)qdma_dev->cmpt_queues[qid]; - if (cmptq == NULL) { - /* Update the configuration in q_info structure - * if cmpt queue is not setup. - */ - qdma_dev->q_info[qid].dis_cmpt_ovf_chk = - (enable == 1) ? 0 : 1; - } else if (cmptq->status == - RTE_ETH_QUEUE_STATE_STOPPED) { - /* Update the configuration in both q_info and cmptq - * structures if cmpt queue is already setup. - */ - qdma_dev->q_info[qid].dis_cmpt_ovf_chk = - (enable == 1) ? 0 : 1; - cmptq->dis_overflow_check = - qdma_dev->q_info[qid].dis_cmpt_ovf_chk; - } else { - PMD_DRV_LOG(ERR, - "Cannot configure when Qid %d is in start state\n", - qid); - return -EINVAL; - } - } - - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_set_cmpt_descriptor_size - * Description: Configures the completion ring descriptor size - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param size : Descriptor size to be configured - * - * @return '0' on success and '<0' on failure. - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() but before rte_eth_rx_queue_setup() API - * when queue is in streaming mode, and before - * rte_pmd_qdma_dev_cmptq_setup when queue is in memory mapped - * mode. - * By default, the completion desciptor size is set to 8 bytes. - ******************************************************************************/ -int rte_pmd_qdma_set_cmpt_descriptor_size(int port_id, uint32_t qid, - enum rte_pmd_qdma_cmpt_desc_len size) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qdma_dev->q_info[qid].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) { - if (qid >= dev->data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid Queue id passed for %s," - "Queue ID(ST-mode) = %d\n", __func__, - qid); - return -EINVAL; - } - } - - if (size != RTE_PMD_QDMA_CMPT_DESC_LEN_8B && - size != RTE_PMD_QDMA_CMPT_DESC_LEN_16B && - size != RTE_PMD_QDMA_CMPT_DESC_LEN_32B && - (size != RTE_PMD_QDMA_CMPT_DESC_LEN_64B || - !qdma_dev->dev_cap.cmpt_desc_64b)) { - - PMD_DRV_LOG(ERR, "Invalid Size passed for %s, Size = %d\n", - __func__, size); - return -EINVAL; - } - - qdma_dev->q_info[qid].cmpt_desc_sz = size; - - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_set_cmpt_trigger_mode - * Description: Configures the trigger mode for completion ring CIDX - * updates - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param mode : Trigger mode to be configured - * - * @return '0' on success and '<0' on failure. - * - * @note Application can call this API after successful - * call to rte_eth_dev_configure() API. Application can - * also call this API after successful call to - * rte_eth_rx_queue_setup()/rte_pmd_qdma_dev_cmptq_setup() - * API only if rx/cmpt queue is not in start state. - * By default, trigger mode is set to Counter + Timer. - ******************************************************************************/ -int rte_pmd_qdma_set_cmpt_trigger_mode(int port_id, uint32_t qid, - enum rte_pmd_qdma_tigger_mode_t mode) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_cmpt_queue *cmptq; - struct qdma_rx_queue *rxq; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (mode >= RTE_PMD_QDMA_TRIG_MODE_MAX) { - PMD_DRV_LOG(ERR, "Invalid Trigger mode passed\n"); - return -EINVAL; - } - - if ((mode == RTE_PMD_QDMA_TRIG_MODE_USER_TIMER_COUNT) && - !qdma_dev->dev_cap.cmpt_trig_count_timer) { - PMD_DRV_LOG(ERR, "%s: Trigger mode %d is " - "not supported in the current design\n", - __func__, mode); - return -EINVAL; - } - - if (qdma_dev->q_info[qid].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) { - if (qid >= dev->data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid Queue id passed for %s," - "Queue ID(ST-mode) = %d\n", __func__, - qid); - return -EINVAL; - } - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - if (rxq == NULL) { - /* Update the configuration in q_info structure - * if rx queue is not setup. - */ - qdma_dev->q_info[qid].trigger_mode = - qdma_get_trigger_mode(mode); - } else if (dev->data->rx_queue_state[qid] == - RTE_ETH_QUEUE_STATE_STOPPED) { - /* Update the config in both q_info and rxq structures, - * only if rx queue is setup but not yet started. - */ - qdma_dev->q_info[qid].trigger_mode = - qdma_get_trigger_mode(mode); - rxq->triggermode = qdma_dev->q_info[qid].trigger_mode; - } else { - PMD_DRV_LOG(ERR, - "Cannot configure when Qid %d is in start state\n", - qid); - return -EINVAL; - } - } else if (qdma_dev->dev_cap.mm_cmpt_en) { - cmptq = (struct qdma_cmpt_queue *)qdma_dev->cmpt_queues[qid]; - if (cmptq == NULL) { - /* Update the configuration in q_info structure - * if cmpt queue is not setup. - */ - qdma_dev->q_info[qid].trigger_mode = - qdma_get_trigger_mode(mode); - } else if (cmptq->status == - RTE_ETH_QUEUE_STATE_STOPPED) { - /* Update the configuration in both q_info and cmptq - * structures if cmpt queue is already setup. - */ - qdma_dev->q_info[qid].trigger_mode = - qdma_get_trigger_mode(mode); - cmptq->triggermode = - qdma_dev->q_info[qid].trigger_mode; - } else { - PMD_DRV_LOG(ERR, - "Cannot configure when Qid %d is in start state\n", - qid); - return -EINVAL; - } - } else { - PMD_DRV_LOG(ERR, "Unable to set trigger mode for %s," - "Queue ID = %d, Queue Mode = %d\n", - __func__, - qid, qdma_dev->q_info[qid].queue_mode); - } - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_set_cmpt_timer - * Description: Configures the timer interval in microseconds to trigger - * the completion ring CIDX updates - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param value : Timer interval for completion trigger to be configured - * - * @return '0' on success and "<0" on failure. - * - * @note Application can call this API after successful - * call to rte_eth_dev_configure() API. Application can - * also call this API after successful call to - * rte_eth_rx_queue_setup()/rte_pmd_qdma_dev_cmptq_setup() API - * only if rx/cmpt queue is not in start state. - ******************************************************************************/ -int rte_pmd_qdma_set_cmpt_timer(int port_id, uint32_t qid, uint32_t value) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_cmpt_queue *cmptq; - struct qdma_rx_queue *rxq; - int8_t timer_index; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - timer_index = index_of_array(qdma_dev->g_c2h_timer_cnt, - QDMA_NUM_C2H_TIMERS, - value); - - if (timer_index < 0) { - PMD_DRV_LOG(ERR, "Expected timer %d not found\n", value); - return -ENOTSUP; - } - - if (qdma_dev->q_info[qid].queue_mode == - RTE_PMD_QDMA_STREAMING_MODE) { - if (qid >= dev->data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid Queue id passed for %s," - "Queue ID(ST-mode) = %d\n", __func__, - qid); - return -EINVAL; - } - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - if (rxq == NULL) { - /* Update the configuration in q_info structure - * if rx queue is not setup. - */ - qdma_dev->q_info[qid].timer_count = value; - } else if (dev->data->rx_queue_state[qid] == - RTE_ETH_QUEUE_STATE_STOPPED) { - /* Update the config in both q_info and rxq structures, - * only if rx queue is setup but not yet started. - */ - qdma_dev->q_info[qid].timer_count = value; - rxq->timeridx = timer_index; - } else { - PMD_DRV_LOG(ERR, - "Cannot configure when Qid %d is in start state\n", - qid); - return -EINVAL; - } - } else if (qdma_dev->dev_cap.mm_cmpt_en) { - cmptq = (struct qdma_cmpt_queue *)qdma_dev->cmpt_queues[qid]; - if (cmptq == NULL) { - /* Update the configuration in q_info structure - * if cmpt queue is not setup. - */ - qdma_dev->q_info[qid].timer_count = value; - } else if (cmptq->status == - RTE_ETH_QUEUE_STATE_STOPPED) { - /* Update the configuration in both q_info and cmptq - * structures if cmpt queue is already setup. - */ - qdma_dev->q_info[qid].timer_count = value; - cmptq->timeridx = timer_index; - } else { - PMD_DRV_LOG(ERR, - "Cannot configure when Qid %d is in start state\n", - qid); - return -EINVAL; - } - } else { - PMD_DRV_LOG(ERR, "Unable to set trigger mode for %s," - "Queue ID = %d, Queue Mode = %d\n", - __func__, - qid, qdma_dev->q_info[qid].queue_mode); - } - return ret; -} - -/******************************************************************************/ -/** - *Function Name: rte_pmd_qdma_set_c2h_descriptor_prefetch - *Description: Enables or disables prefetch of the descriptors by - * prefetch engine - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param enable:'1' to enable and '0' to disable the descriptor prefetch - * - * @return '0' on success and '<0' on failure. - * - * @note Application can call this API after successful - * call to rte_eth_dev_configure() API. Application can - * also call this API after successful call to - * rte_eth_rx_queue_setup() API, only if rx queue - * is not in start state. - ******************************************************************************/ -int rte_pmd_qdma_set_c2h_descriptor_prefetch(int port_id, uint32_t qid, - uint8_t enable) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_rx_queue *rxq; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qid >= dev->data->nb_rx_queues) { - PMD_DRV_LOG(ERR, "Invalid Queue id passed for %s, " - "Queue ID = %d\n", __func__, qid); - return -EINVAL; - } - - if (qdma_dev->q_info[qid].queue_mode == - RTE_PMD_QDMA_MEMORY_MAPPED_MODE) { - PMD_DRV_LOG(ERR, "%s() not supported for qid %d in MM mode", - __func__, qid); - return -ENOTSUP; - } - - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - - if (rxq == NULL) { - /* Update the configuration in q_info structure - * if rx queue is not setup. - */ - qdma_dev->q_info[qid].en_prefetch = (enable > 0) ? 1 : 0; - } else if (dev->data->rx_queue_state[qid] == - RTE_ETH_QUEUE_STATE_STOPPED) { - /* Update the config in both q_info and rxq structures, - * only if rx queue is setup but not yet started. - */ - qdma_dev->q_info[qid].en_prefetch = (enable > 0) ? 1 : 0; - rxq->en_prefetch = qdma_dev->q_info[qid].en_prefetch; - } else { - PMD_DRV_LOG(ERR, - "Cannot configure when Qid %d is in start state\n", - qid); - return -EINVAL; - } - - return ret; -} - -/*****************************************************************************/ -/** - * Function Name: rte_pmd_qdma_set_mm_endpoint_addr - * Description: Sets the PCIe endpoint memory offset at which to - * perform DMA operation for the specified queue operating - * in memory mapped mode. - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param dir : direction i.e. TX or RX. - * @param addr : Destination address for TX , Source address for RX - * - * @return '0' on success and '<0' on failure. - * - * @note This API can be called before TX/RX burst API's - * (rte_eth_tx_burst() and rte_eth_rx_burst()) are called. - *****************************************************************************/ -int rte_pmd_qdma_set_mm_endpoint_addr(int port_id, uint32_t qid, - enum rte_pmd_qdma_dir_type dir, uint64_t addr) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_rx_queue *rxq; - struct qdma_tx_queue *txq; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qdma_dev->q_info[qid].queue_mode != - RTE_PMD_QDMA_MEMORY_MAPPED_MODE) { - PMD_DRV_LOG(ERR, "Invalid Queue mode for %s, Queue ID = %d," - "mode = %d\n", __func__, qid, - qdma_dev->q_info[qid].queue_mode); - return -EINVAL; - } - - if (dir == RTE_PMD_QDMA_TX) { - txq = (struct qdma_tx_queue *)dev->data->tx_queues[qid]; - if (txq != NULL) - txq->ep_addr = addr; - else { - PMD_DRV_LOG(ERR, "Qid %d is not setup\n", qid); - return -EINVAL; - } - } else if (dir == RTE_PMD_QDMA_RX) { - rxq = (struct qdma_rx_queue *)dev->data->rx_queues[qid]; - if (rxq != NULL) - rxq->ep_addr = addr; - else { - PMD_DRV_LOG(ERR, "Qid %d is not setup\n", qid); - return -EINVAL; - } - } else { - PMD_DRV_LOG(ERR, "Invalid direction specified," - "Direction is %d\n", dir); - return -EINVAL; - } - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_configure_tx_bypass - * Description: Sets the TX bypass mode and bypass descriptor size - * for the specified queue - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param bypass_mode : Bypass mode to be set - * @param size : Bypass descriptor size to be set - * - * @return '0' on success and '<0' on failure. - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() but before tx_setup() API. - * By default, all queues are configured in internal mode - * i.e. bypass disabled. - * If size is specified zero, then the bypass descriptor size is - * set to the one used in internal mode. - ******************************************************************************/ -int rte_pmd_qdma_configure_tx_bypass(int port_id, uint32_t qid, - enum rte_pmd_qdma_tx_bypass_mode bypass_mode, - enum rte_pmd_qdma_bypass_desc_len size) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qid < dev->data->nb_tx_queues) { - if (bypass_mode >= RTE_PMD_QDMA_TX_BYPASS_MAX) { - PMD_DRV_LOG(ERR, "Invalid Tx Bypass mode : %d\n", - bypass_mode); - return -EINVAL; - } - if (qdma_dev->dev_cap.sw_desc_64b) { - /*64byte descriptor size supported - *in >2018.3 Example Design Only - */ - if ((size != 0) && (size != 64)) { - PMD_DRV_LOG(ERR, "%s: Descriptor size %d not supported." - "64B and internal " - "mode descriptor sizes (size = 0) " - "are only supported by the driver in > 2018.3 " - "example design\n", __func__, size); - return -EINVAL; - } - } else { - /*In 2018.2 design, internal mode descriptor - *sizes are only supported.Hence not allowing - *to configure bypass descriptor size. - *Size 0 indicates internal mode descriptor size. - */ - if (size != 0) { - PMD_DRV_LOG(ERR, "%s: Descriptor size %d not supported.Only " - "Internal mode descriptor sizes (size = 0)" - "are supported in the current design.\n", - __func__, size); - return -EINVAL; - } - } - qdma_dev->q_info[qid].tx_bypass_mode = bypass_mode; - - qdma_dev->q_info[qid].tx_bypass_desc_sz = size; - } else { - PMD_DRV_LOG(ERR, "Invalid queue ID specified, Queue ID = %d\n", - qid); - return -EINVAL; - } - - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_configure_rx_bypass - * Description: Sets the RX bypass mode and bypass descriptor size for - * the specified queue - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param bypass_mode : Bypass mode to be set - * @param size : Bypass descriptor size to be set - * - * @return '0' on success and '<0' on failure. - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() but before rte_eth_rx_queue_setup() API. - * By default, all queues are configured in internal mode - * i.e. bypass disabled. - * If size is specified zero, then the bypass descriptor size is - * set to the one used in internal mode. - ******************************************************************************/ -int rte_pmd_qdma_configure_rx_bypass(int port_id, uint32_t qid, - enum rte_pmd_qdma_rx_bypass_mode bypass_mode, - enum rte_pmd_qdma_bypass_desc_len size) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qid < dev->data->nb_rx_queues) { - if (bypass_mode >= RTE_PMD_QDMA_RX_BYPASS_MAX) { - PMD_DRV_LOG(ERR, "Invalid Rx Bypass mode : %d\n", - bypass_mode); - return -EINVAL; - } - - if (qdma_dev->dev_cap.sw_desc_64b) { - /*64byte descriptor size supported - *in >2018.3 Example Design Only - */ - if ((size != 0) && (size != 64)) { - PMD_DRV_LOG(ERR, "%s: Descriptor size %d not supported." - "64B and internal " - "mode descriptor sizes (size = 0) " - "are only supported by the driver in > 2018.3 " - "example design\n", __func__, size); - return -EINVAL; - } - } else { - /*In 2018.2 design, internal mode descriptor - *sizes are only supported.Hence not allowing - *to configure bypass descriptor size. - *Size 0 indicates internal mode descriptor size. - */ - if (size != 0) { - PMD_DRV_LOG(ERR, "%s: Descriptor size %d not supported.Only " - "Internal mode descriptor sizes (size = 0)" - "are supported in the current design.\n", - __func__, size); - return -EINVAL; - } - } - - qdma_dev->q_info[qid].rx_bypass_mode = bypass_mode; - - qdma_dev->q_info[qid].rx_bypass_desc_sz = size; - } else { - PMD_DRV_LOG(ERR, "Invalid queue ID specified, Queue ID = %d\n", - qid); - return -EINVAL; - } - - return ret; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_get_device_capabilities - * Description: Retrive the device capabilities - * - * @param port_id : Port ID. - * @param dev_attr:Pointer to the device capabilities structure - * - * @return '0' on success and '< 0' on failure. - * - * @note None. - ******************************************************************************/ -int rte_pmd_qdma_get_device_capabilities(int port_id, - struct rte_pmd_qdma_dev_attributes *dev_attr) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - - if (port_id < 0 || port_id >= rte_eth_dev_count_avail()) { - PMD_DRV_LOG(ERR, "Wrong port id %d\n", port_id); - return -ENOTSUP; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (!is_qdma_supported(dev)) { - PMD_DRV_LOG(ERR, "Device is not supported\n"); - return -ENOTSUP; - } - - if (dev_attr == NULL) { - PMD_DRV_LOG(ERR, "Caught NULL pointer for dev_attr\n"); - return -EINVAL; - } - - dev_attr->num_pfs = qdma_dev->dev_cap.num_pfs; - dev_attr->num_qs = qdma_dev->dev_cap.num_qs; - dev_attr->flr_present = qdma_dev->dev_cap.flr_present; - dev_attr->st_en = qdma_dev->dev_cap.st_en; - dev_attr->mm_en = qdma_dev->dev_cap.mm_en; - dev_attr->mm_cmpt_en = qdma_dev->dev_cap.mm_cmpt_en; - dev_attr->mailbox_en = qdma_dev->dev_cap.mailbox_en; - dev_attr->mm_channel_max = qdma_dev->dev_cap.mm_channel_max; - dev_attr->debug_mode = qdma_dev->dev_cap.debug_mode; - dev_attr->desc_eng_mode = qdma_dev->dev_cap.desc_eng_mode; - dev_attr->cmpt_ovf_chk_dis = qdma_dev->dev_cap.cmpt_ovf_chk_dis; - dev_attr->sw_desc_64b = qdma_dev->dev_cap.sw_desc_64b; - dev_attr->cmpt_desc_64b = qdma_dev->dev_cap.cmpt_desc_64b; - dev_attr->cmpt_trig_count_timer = - qdma_dev->dev_cap.cmpt_trig_count_timer; - - switch (qdma_dev->device_type) { - case QDMA_DEVICE_SOFT: - dev_attr->device_type = RTE_PMD_QDMA_DEVICE_SOFT; - break; - case QDMA_DEVICE_VERSAL_CPM4: - dev_attr->device_type = RTE_PMD_QDMA_DEVICE_VERSAL_CPM4; - break; - case QDMA_DEVICE_VERSAL_CPM5: - dev_attr->device_type = RTE_PMD_QDMA_DEVICE_VERSAL_CPM5; - break; - default: - PMD_DRV_LOG(ERR, "%s: Invalid device type " - "Id = %d\n", __func__, qdma_dev->device_type); - return -EINVAL; - } - - switch (qdma_dev->ip_type) { - case QDMA_VERSAL_HARD_IP: - dev_attr->ip_type = - RTE_PMD_QDMA_VERSAL_HARD_IP; - break; - case QDMA_VERSAL_SOFT_IP: - dev_attr->ip_type = - RTE_PMD_QDMA_VERSAL_SOFT_IP; - break; - case QDMA_SOFT_IP: - dev_attr->ip_type = - RTE_PMD_QDMA_SOFT_IP; - break; - case EQDMA_SOFT_IP: - dev_attr->ip_type = - RTE_PMD_EQDMA_SOFT_IP; - break; - default: - dev_attr->ip_type = RTE_PMD_QDMA_NONE_IP; - PMD_DRV_LOG(ERR, "%s: Invalid IP type " - "ip_type = %d\n", __func__, - qdma_dev->ip_type); - return -EINVAL; - } - - return 0; -} - -/******************************************************************************/ -/** - * Function Name: rte_pmd_qdma_dev_cmptq_setup - * Description: Allocate and set up a completion queue for - * memory mapped mode. - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param nb_cmpt_desc: Completion queue ring size. - * @param socket_id : The socket_id argument is the socket identifier - * in case of NUMA. Its value can be SOCKET_ID_ANY - * if there is no NUMA constraint for the DMA memory - * allocated for the transmit descriptors of the ring. - * - * @return '0' on success and '< 0' on failure. - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() and rte_pmd_qdma_set_queue_mode() - * for queues in memory mapped mode. - ******************************************************************************/ - -int rte_pmd_qdma_dev_cmptq_setup(int port_id, uint32_t cmpt_queue_id, - uint16_t nb_cmpt_desc, - unsigned int socket_id) -{ - struct rte_eth_dev *dev; - uint32_t sz; - struct qdma_pci_dev *qdma_dev; - struct qdma_cmpt_queue *cmptq = NULL; - int err; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, cmpt_queue_id); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (nb_cmpt_desc == 0) { - PMD_DRV_LOG(ERR, "Invalid descriptor ring size %d\n", - nb_cmpt_desc); - return -EINVAL; - } - - if (!qdma_dev->dev_cap.mm_cmpt_en) { - PMD_DRV_LOG(ERR, "Completion Queue support for MM-mode " - "not enabled"); - return -EINVAL; - } - - if (!qdma_dev->is_vf) { - err = qdma_dev_increment_active_queue( - qdma_dev->dma_device_index, - qdma_dev->func_id, - QDMA_DEV_Q_TYPE_CMPT); - if (err != QDMA_SUCCESS) - return -EINVAL; - } else { - err = qdma_dev_notify_qadd(dev, cmpt_queue_id + - qdma_dev->queue_base, QDMA_DEV_Q_TYPE_CMPT); - - if (err < 0) { - PMD_DRV_LOG(ERR, "%s: Queue addition failed for CMPT Queue ID " - "%d\n", __func__, cmpt_queue_id); - return -EINVAL; - } - } - - if (!qdma_dev->init_q_range) { - if (qdma_dev->is_vf) { - err = qdma_vf_csr_read(dev); - if (err < 0) - goto cmptq_setup_err; - } else { - err = qdma_pf_csr_read(dev); - if (err < 0) - goto cmptq_setup_err; - } - qdma_dev->init_q_range = 1; - } - - /* Allocate cmpt queue data structure */ - cmptq = rte_zmalloc("QDMA_CmptQ", sizeof(struct qdma_cmpt_queue), - RTE_CACHE_LINE_SIZE); - - if (!cmptq) { - PMD_DRV_LOG(ERR, "Unable to allocate structure cmptq of " - "size %d\n", - (int)(sizeof(struct qdma_cmpt_queue))); - err = -ENOMEM; - goto cmptq_setup_err; - } - - cmptq->queue_id = cmpt_queue_id; - cmptq->port_id = dev->data->port_id; - cmptq->func_id = qdma_dev->func_id; - cmptq->dev = dev; - cmptq->st_mode = qdma_dev->q_info[cmpt_queue_id].queue_mode; - cmptq->triggermode = qdma_dev->q_info[cmpt_queue_id].trigger_mode; - cmptq->nb_cmpt_desc = nb_cmpt_desc + 1; - cmptq->cmpt_desc_len = qdma_dev->q_info[cmpt_queue_id].cmpt_desc_sz; - if ((cmptq->cmpt_desc_len == RTE_PMD_QDMA_CMPT_DESC_LEN_64B) && - !qdma_dev->dev_cap.cmpt_desc_64b) { - PMD_DRV_LOG(ERR, "%s: PF-%d(DEVFN) CMPT of 64B is not supported in the " - "current design\n", __func__, qdma_dev->func_id); - return -ENOTSUP; - } - /* Find completion ring size index */ - cmptq->ringszidx = index_of_array(qdma_dev->g_ring_sz, - QDMA_NUM_RING_SIZES, - cmptq->nb_cmpt_desc); - if (cmptq->ringszidx < 0) { - PMD_DRV_LOG(ERR, "Expected completion ring size %d not found\n", - cmptq->nb_cmpt_desc); - err = -EINVAL; - goto cmptq_setup_err; - } - - /* Find Threshold index */ - cmptq->threshidx = index_of_array(qdma_dev->g_c2h_cnt_th, - QDMA_NUM_C2H_COUNTERS, - DEFAULT_MM_CMPT_CNT_THRESHOLD); - if (cmptq->threshidx < 0) { - PMD_DRV_LOG(ERR, "Expected Threshold %d not found," - " using the value %d at index 0\n", - DEFAULT_MM_CMPT_CNT_THRESHOLD, - qdma_dev->g_c2h_cnt_th[0]); - cmptq->threshidx = 0; - } - - /* Find Timer index */ - cmptq->timeridx = index_of_array(qdma_dev->g_c2h_timer_cnt, - QDMA_NUM_C2H_TIMERS, - qdma_dev->q_info[cmpt_queue_id].timer_count); - if (cmptq->timeridx < 0) { - PMD_DRV_LOG(ERR, "Expected timer %d not found, " - "using the value %d at index 1\n", - qdma_dev->q_info[cmpt_queue_id].timer_count, - qdma_dev->g_c2h_timer_cnt[1]); - cmptq->timeridx = 1; - } - - cmptq->dis_overflow_check = - qdma_dev->q_info[cmpt_queue_id].dis_cmpt_ovf_chk; - - /* Allocate memory for completion(CMPT) descriptor ring */ - sz = (cmptq->nb_cmpt_desc) * cmptq->cmpt_desc_len; - cmptq->cmpt_mz = qdma_zone_reserve(dev, "RxHwCmptRn", - cmpt_queue_id, sz, socket_id); - if (!cmptq->cmpt_mz) { - PMD_DRV_LOG(ERR, "Unable to allocate cmptq->cmpt_mz " - "of size %d\n", sz); - err = -ENOMEM; - goto cmptq_setup_err; - } - cmptq->cmpt_ring = (struct qdma_ul_cmpt_ring *)cmptq->cmpt_mz->addr; - - /* Write-back status structure */ - cmptq->wb_status = (struct wb_status *)((uint64_t)cmptq->cmpt_ring + - (((uint64_t)cmptq->nb_cmpt_desc - 1) * - cmptq->cmpt_desc_len)); - memset(cmptq->cmpt_ring, 0, sz); - qdma_dev->cmpt_queues[cmpt_queue_id] = cmptq; - return ret; - -cmptq_setup_err: - if (!qdma_dev->is_vf) - qdma_dev_decrement_active_queue(qdma_dev->dma_device_index, - qdma_dev->func_id, QDMA_DEV_Q_TYPE_CMPT); - else - qdma_dev_notify_qdel(dev, cmpt_queue_id + - qdma_dev->queue_base, QDMA_DEV_Q_TYPE_CMPT); - - if (cmptq) { - if (cmptq->cmpt_mz) - rte_memzone_free(cmptq->cmpt_mz); - rte_free(cmptq); - } - return err; -} - -static int qdma_vf_cmptq_context_write(struct rte_eth_dev *dev, uint16_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - uint32_t qid_hw; - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - struct mbox_descq_conf descq_conf; - int rv; - struct qdma_cmpt_queue *cmptq; - uint8_t cmpt_desc_fmt; - - if (!m) - return -ENOMEM; - memset(&descq_conf, 0, sizeof(struct mbox_descq_conf)); - cmptq = (struct qdma_cmpt_queue *)qdma_dev->cmpt_queues[qid]; - qid_hw = qdma_dev->queue_base + cmptq->queue_id; - - switch (cmptq->cmpt_desc_len) { - case RTE_PMD_QDMA_CMPT_DESC_LEN_8B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_8B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_16B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_16B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_32B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_32B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_64B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_64B; - break; - default: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_8B; - break; - } - - descq_conf.irq_arm = 0; - descq_conf.at = 0; - descq_conf.wbk_en = 1; - descq_conf.irq_en = 0; - descq_conf.desc_sz = SW_DESC_CNTXT_MEMORY_MAP_DMA; - descq_conf.forced_en = 1; - descq_conf.cmpt_ring_bs_addr = cmptq->cmpt_mz->iova; - descq_conf.cmpt_desc_sz = cmpt_desc_fmt; - descq_conf.triggermode = cmptq->triggermode; - - descq_conf.cmpt_color = CMPT_DEFAULT_COLOR_BIT; - descq_conf.cmpt_full_upd = 0; - descq_conf.cnt_thres = qdma_dev->g_c2h_cnt_th[cmptq->threshidx]; - descq_conf.timer_thres = qdma_dev->g_c2h_timer_cnt[cmptq->timeridx]; - descq_conf.cmpt_ringsz = qdma_dev->g_ring_sz[cmptq->ringszidx] - 1; - descq_conf.cmpt_int_en = 0; - descq_conf.cmpl_stat_en = 1; /* Enable stats for MM-CMPT */ - - if (qdma_dev->dev_cap.cmpt_ovf_chk_dis) - descq_conf.dis_overflow_check = cmptq->dis_overflow_check; - - descq_conf.func_id = cmptq->func_id; - - qdma_mbox_compose_vf_qctxt_write(cmptq->func_id, qid_hw, - cmptq->st_mode, 1, - QDMA_MBOX_CMPT_CTXT_ONLY, - &descq_conf, m->raw_data); - - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - PMD_DRV_LOG(ERR, "%x, qid_hw 0x%x, mbox failed %d.\n", - qdma_dev->func_id, qid_hw, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw_data); - - cmptq->cmpt_cidx_info.counter_idx = cmptq->threshidx; - cmptq->cmpt_cidx_info.timer_idx = cmptq->timeridx; - cmptq->cmpt_cidx_info.trig_mode = cmptq->triggermode; - cmptq->cmpt_cidx_info.wrb_en = 1; - cmptq->cmpt_cidx_info.wrb_cidx = 0; - qdma_dev->hw_access->qdma_queue_cmpt_cidx_update(dev, qdma_dev->is_vf, - qid, &cmptq->cmpt_cidx_info); - cmptq->status = RTE_ETH_QUEUE_STATE_STARTED; -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_pf_cmptq_context_write(struct rte_eth_dev *dev, uint32_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_cmpt_queue *cmptq; - uint32_t queue_base = qdma_dev->queue_base; - uint8_t cmpt_desc_fmt; - int err = 0; - struct qdma_descq_cmpt_ctxt q_cmpt_ctxt; - - cmptq = (struct qdma_cmpt_queue *)qdma_dev->cmpt_queues[qid]; - memset(&q_cmpt_ctxt, 0, sizeof(struct qdma_descq_cmpt_ctxt)); - /* Clear Completion Context */ - qdma_dev->hw_access->qdma_cmpt_ctx_conf(dev, qid, - &q_cmpt_ctxt, QDMA_HW_ACCESS_CLEAR); - - switch (cmptq->cmpt_desc_len) { - case RTE_PMD_QDMA_CMPT_DESC_LEN_8B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_8B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_16B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_16B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_32B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_32B; - break; - case RTE_PMD_QDMA_CMPT_DESC_LEN_64B: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_64B; - break; - default: - cmpt_desc_fmt = CMPT_CNTXT_DESC_SIZE_8B; - break; - } - - q_cmpt_ctxt.en_stat_desc = 1; - q_cmpt_ctxt.trig_mode = cmptq->triggermode; - q_cmpt_ctxt.fnc_id = cmptq->func_id; - q_cmpt_ctxt.counter_idx = cmptq->threshidx; - q_cmpt_ctxt.timer_idx = cmptq->timeridx; - q_cmpt_ctxt.color = CMPT_DEFAULT_COLOR_BIT; - q_cmpt_ctxt.ringsz_idx = cmptq->ringszidx; - q_cmpt_ctxt.bs_addr = (uint64_t)cmptq->cmpt_mz->iova; - q_cmpt_ctxt.desc_sz = cmpt_desc_fmt; - q_cmpt_ctxt.valid = 1; - - if (qdma_dev->dev_cap.cmpt_ovf_chk_dis) - q_cmpt_ctxt.ovf_chk_dis = cmptq->dis_overflow_check; - - /* Set Completion Context */ - err = qdma_dev->hw_access->qdma_cmpt_ctx_conf(dev, (qid + queue_base), - &q_cmpt_ctxt, QDMA_HW_ACCESS_WRITE); - if (err < 0) - return qdma_dev->hw_access->qdma_get_error_code(err); - - cmptq->cmpt_cidx_info.counter_idx = cmptq->threshidx; - cmptq->cmpt_cidx_info.timer_idx = cmptq->timeridx; - cmptq->cmpt_cidx_info.trig_mode = cmptq->triggermode; - cmptq->cmpt_cidx_info.wrb_en = 1; - cmptq->cmpt_cidx_info.wrb_cidx = 0; - qdma_dev->hw_access->qdma_queue_cmpt_cidx_update(dev, qdma_dev->is_vf, - qid, &cmptq->cmpt_cidx_info); - cmptq->status = RTE_ETH_QUEUE_STATE_STARTED; - - return 0; -} - -/******************************************************************************/ -/* - * Function Name: rte_pmd_qdma_dev_cmptq_start - * Description: Start the MM completion queue. - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * - * @return '0' on success and '< 0' on failure. - * - * @note Application can call this API after successful call to - * rte_pmd_qdma_dev_cmptq_setup() API when queue is in - * memory mapped mode. - ******************************************************************************/ -int rte_pmd_qdma_dev_cmptq_start(int port_id, uint32_t qid) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qdma_dev->q_info[qid].queue_mode != - RTE_PMD_QDMA_MEMORY_MAPPED_MODE) { - PMD_DRV_LOG(ERR, "Qid %d is not configured in MM-mode\n", qid); - return -EINVAL; - } - - if (qid >= qdma_dev->qsets_en) { - PMD_DRV_LOG(ERR, "Invalid Queue id passed for %s," - "Queue ID(MM-mode) = %d\n", __func__, - qid); - return -EINVAL; - } - - if (qdma_dev->is_vf) - return qdma_vf_cmptq_context_write(dev, qid); - else - return qdma_pf_cmptq_context_write(dev, qid); -} - -static int qdma_pf_cmptq_context_invalidate(struct rte_eth_dev *dev, - uint32_t qid) -{ - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_cmpt_queue *cmptq; - uint32_t sz, i = 0; - struct qdma_descq_cmpt_ctxt q_cmpt_ctxt; - - cmptq = (struct qdma_cmpt_queue *)qdma_dev->cmpt_queues[qid]; - qdma_dev->hw_access->qdma_cmpt_ctx_conf(dev, - (qid + qdma_dev->queue_base), - &q_cmpt_ctxt, QDMA_HW_ACCESS_INVALIDATE); - - /* Zero the cmpt-ring entries*/ - sz = cmptq->cmpt_desc_len; - for (i = 0; i < (sz * cmptq->nb_cmpt_desc); i++) - ((volatile char *)cmptq->cmpt_ring)[i] = 0; - - cmptq->status = RTE_ETH_QUEUE_STATE_STOPPED; - - return 0; -} - -static int qdma_vf_cmptq_context_invalidate(struct rte_eth_dev *dev, - uint32_t qid) -{ - struct qdma_mbox_msg *m = qdma_mbox_msg_alloc(); - struct qdma_pci_dev *qdma_dev = dev->data->dev_private; - struct qdma_cmpt_queue *cmptq; - uint32_t qid_hw; - int rv; - - if (!m) - return -ENOMEM; - - qid_hw = qdma_dev->queue_base + qid; - qdma_mbox_compose_vf_qctxt_invalidate(qdma_dev->func_id, qid_hw, - 0, 0, QDMA_MBOX_CMPT_CTXT_ONLY, - m->raw_data); - rv = qdma_mbox_msg_send(dev, m, MBOX_OP_RSP_TIMEOUT); - if (rv < 0) { - if (rv != -ENODEV) - PMD_DRV_LOG(INFO, "%x, qid_hw 0x%x mbox failed %d.\n", - qdma_dev->func_id, qid_hw, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw_data); - - cmptq = (struct qdma_cmpt_queue *)qdma_dev->cmpt_queues[qid]; - cmptq->status = RTE_ETH_QUEUE_STATE_STOPPED; - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -/******************************************************************************/ -/* - * Function Name: rte_pmd_qdma_dev_cmptq_stop - * Description: Stop the MM completion queue. - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * - * @return '0' on success and '< 0' on failure. - * - * @note Application can call this API after successful call to - * rte_pmd_qdma_dev_cmptq_start() API when queue is in - * memory mapped mode. - ******************************************************************************/ -int rte_pmd_qdma_dev_cmptq_stop(int port_id, uint32_t qid) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qdma_dev->q_info[qid].queue_mode != - RTE_PMD_QDMA_MEMORY_MAPPED_MODE) { - PMD_DRV_LOG(ERR, "Qid %d is not configured in MM-mode\n", qid); - return -EINVAL; - } - - if (qdma_dev->is_vf) - return qdma_vf_cmptq_context_invalidate(dev, qid); - else - return qdma_pf_cmptq_context_invalidate(dev, qid); -} - -/*****************************************************************************/ -/** - * Function Name: rte_pmd_qdma_mm_cmpt_process - * Description: Process the MM Completion queue entries. - * - * @param port_id : Port ID. - * @param qid : Queue ID. - * @param cmpt_buff : User buffer pointer to store the completion data. - * @param nb_entries: Number of compeltion entries to process. - * - * @return 'number of entries processed' on success and '< 0' on failure. - * - * @note Application can call this API after successful call to - * rte_pmd_qdma_dev_cmptq_start() API. - ******************************************************************************/ - -uint16_t rte_pmd_qdma_mm_cmpt_process(int port_id, uint32_t qid, - void *cmpt_buff, uint16_t nb_entries) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - struct qdma_cmpt_queue *cmptq; - uint32_t count = 0; - struct qdma_ul_cmpt_ring *cmpt_entry; - struct wb_status *wb_status; - uint16_t nb_entries_avail = 0; - uint16_t cmpt_tail = 0; - uint16_t cmpt_pidx; - int ret = 0; - - ret = validate_qdma_dev_info(port_id, qid); - if (ret != QDMA_SUCCESS) { - PMD_DRV_LOG(ERR, - "QDMA device validation failed for port id %d\n", - port_id); - return ret; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - if (qdma_dev->q_info[qid].queue_mode != - RTE_PMD_QDMA_MEMORY_MAPPED_MODE) { - PMD_DRV_LOG(ERR, "Qid %d is not configured in MM-mode\n", qid); - return -EINVAL; - } - - cmptq = (struct qdma_cmpt_queue *)qdma_dev->cmpt_queues[qid]; - - if (cmpt_buff == NULL) { - PMD_DRV_LOG(ERR, "Invalid user buffer pointer from user"); - return 0; - } - - wb_status = cmptq->wb_status; - cmpt_tail = cmptq->cmpt_cidx_info.wrb_cidx; - cmpt_pidx = wb_status->pidx; - - if (cmpt_tail < cmpt_pidx) - nb_entries_avail = cmpt_pidx - cmpt_tail; - else if (cmpt_tail > cmpt_pidx) - nb_entries_avail = cmptq->nb_cmpt_desc - 1 - cmpt_tail + - cmpt_pidx; - - if (nb_entries_avail == 0) { - PMD_DRV_LOG(DEBUG, "%s(): %d: nb_entries_avail = 0\n", - __func__, __LINE__); - return 0; - } - - if (nb_entries > nb_entries_avail) - nb_entries = nb_entries_avail; - - while (count < nb_entries) { - cmpt_entry = - (struct qdma_ul_cmpt_ring *)((uint64_t)cmptq->cmpt_ring + - ((uint64_t)cmpt_tail * cmptq->cmpt_desc_len)); - - ret = qdma_ul_process_immediate_data(cmpt_entry, - cmptq->cmpt_desc_len, cmpt_buff); - if (ret < 0) { - PMD_DRV_LOG(ERR, "Error detected on CMPT ring at " - "index %d, queue_id = %d\n", - cmpt_tail, - cmptq->queue_id); - return 0; - } - cmpt_tail++; - if (unlikely(cmpt_tail >= (cmptq->nb_cmpt_desc - 1))) - cmpt_tail -= (cmptq->nb_cmpt_desc - 1); - count++; - } - - // Update the CPMT CIDX - cmptq->cmpt_cidx_info.wrb_cidx = cmpt_tail; - qdma_dev->hw_access->qdma_queue_cmpt_cidx_update(cmptq->dev, - qdma_dev->is_vf, - cmptq->queue_id, - &cmptq->cmpt_cidx_info); - return count; -} - -/*****************************************************************************/ -/** - * Function Name: rte_pmd_qdma_dev_close - * Description: DPDK PMD function to close the device. - * - * @param port_id Port ID - * - * @return '0' on success and '< 0' on failure - * - ******************************************************************************/ -int rte_pmd_qdma_dev_close(uint16_t port_id) -{ - struct rte_eth_dev *dev; - struct qdma_pci_dev *qdma_dev; - - if (port_id >= rte_eth_dev_count_avail()) { - PMD_DRV_LOG(ERR, "%s:%d Wrong port id %d\n", __func__, __LINE__, - port_id); - return -ENOTSUP; - } - dev = &rte_eth_devices[port_id]; - qdma_dev = dev->data->dev_private; - - dev->data->dev_started = 0; - - if (qdma_dev->is_vf) - qdma_vf_dev_close(dev); - else - qdma_dev_close(dev); - - dev->data->nb_rx_queues = 0; - rte_free(dev->data->rx_queues); - dev->data->rx_queues = NULL; - dev->data->nb_tx_queues = 0; - rte_free(dev->data->tx_queues); - dev->data->tx_queues = NULL; - - return 0; -} - diff --git a/QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.h b/QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.h deleted file mode 100755 index 8a6e95c..0000000 --- a/QDMA/DPDK/drivers/net/qdma/rte_pmd_qdma.h +++ /dev/null @@ -1,888 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __RTE_PMD_QDMA_EXPORT_H__ -#define __RTE_PMD_QDMA_EXPORT_H__ - -#include <rte_dev.h> -#include <rte_ethdev.h> -#include <rte_spinlock.h> -#include <rte_log.h> -#include <rte_byteorder.h> -#include <rte_memzone.h> -#include <linux/pci.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup rte_pmd_qdma_enums Enumerations - */ -/** @defgroup rte_pmd_qdma_struct Data Structures - */ -/** @defgroup rte_pmd_qdma_func Functions - */ - -/** - * Bypass modes in C2H direction - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_rx_bypass_mode { - /** C2H bypass mode disabled */ - RTE_PMD_QDMA_RX_BYPASS_NONE = 0, - /** C2H cache bypass mode */ - RTE_PMD_QDMA_RX_BYPASS_CACHE = 1, - /** C2H simple bypass mode */ - RTE_PMD_QDMA_RX_BYPASS_SIMPLE = 2, - /** C2H bypass mode invalid */ - RTE_PMD_QDMA_RX_BYPASS_MAX -}; - -/** - * Bypass modes in H2C direction - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_tx_bypass_mode { - /** H2C bypass mode disabled */ - RTE_PMD_QDMA_TX_BYPASS_NONE = 0, - /** H2C bypass mode enabled */ - RTE_PMD_QDMA_TX_BYPASS_ENABLE = 1, - /** H2C bypass mode invalid */ - RTE_PMD_QDMA_TX_BYPASS_MAX -}; - -/** - * Enum to specify the direction i.e. TX or RX - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_dir_type { - /** H2C direction */ - RTE_PMD_QDMA_TX = 0, - /** C2H direction */ - RTE_PMD_QDMA_RX, - /** Invalid Direction */ - RTE_PMD_QDMA_DIR_TYPE_MAX -}; - -/** - * Enum to specify the PCIe function type i.e. PF or VF - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_pci_func_type { - /** Physical Function */ - RTE_PMD_QDMA_PCI_FUNC_PF, - /** Virtual Function */ - RTE_PMD_QDMA_PCI_FUNC_VF, - /** Invalid PCI Function */ - RTE_PMD_QDMA_PCI_FUNC_TYPE_MAX, -}; - -/** - * Enum to specify the queue mode - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_queue_mode_t { - /** Memory mapped queue mode */ - RTE_PMD_QDMA_MEMORY_MAPPED_MODE, - /** Streaming queue mode */ - RTE_PMD_QDMA_STREAMING_MODE, - /** Invalid queue mode */ - RTE_PMD_QDMA_QUEUE_MODE_MAX, -}; - -/** - * Enum to specify the completion trigger mode - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_tigger_mode_t { - /** Trigger mode disabled */ - RTE_PMD_QDMA_TRIG_MODE_DISABLE, - /** Trigger mode every */ - RTE_PMD_QDMA_TRIG_MODE_EVERY, - /** Trigger mode user count */ - RTE_PMD_QDMA_TRIG_MODE_USER_COUNT, - /** Trigger mode user */ - RTE_PMD_QDMA_TRIG_MODE_USER, - /** Trigger mode timer */ - RTE_PMD_QDMA_TRIG_MODE_USER_TIMER, - /** Trigger mode timer + count */ - RTE_PMD_QDMA_TRIG_MODE_USER_TIMER_COUNT, - /** Trigger mode invalid */ - RTE_PMD_QDMA_TRIG_MODE_MAX, -}; - -/** - * Enum to specify the completion descriptor length - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_cmpt_desc_len { - /** 8B Completion descriptor */ - RTE_PMD_QDMA_CMPT_DESC_LEN_8B = 8, - /** 16B Completion descriptor */ - RTE_PMD_QDMA_CMPT_DESC_LEN_16B = 16, - /** 32B Completion descriptor */ - RTE_PMD_QDMA_CMPT_DESC_LEN_32B = 32, - /** 64B Completion descriptor */ - RTE_PMD_QDMA_CMPT_DESC_LEN_64B = 64, - /** Invalid Completion descriptor */ - RTE_PMD_QDMA_CMPT_DESC_LEN_MAX, -}; - -/** - * Enum to specify the bypass descriptor length - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_bypass_desc_len { - /** 8B Bypass descriptor */ - RTE_PMD_QDMA_BYPASS_DESC_LEN_8B = 8, - /** 16B Bypass descriptor */ - RTE_PMD_QDMA_BYPASS_DESC_LEN_16B = 16, - /** 32B Bypass descriptor */ - RTE_PMD_QDMA_BYPASS_DESC_LEN_32B = 32, - /** 64B Bypass descriptor */ - RTE_PMD_QDMA_BYPASS_DESC_LEN_64B = 64, - /** Invalid Bypass descriptor */ - RTE_PMD_QDMA_BYPASS_DESC_LEN_MAX, -}; - -/** - * Enum to specify the debug request type - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_xdebug_type { - /** Debug Global registers */ - RTE_PMD_QDMA_XDEBUG_QDMA_GLOBAL_CSR, - /** Debug Device specific structure */ - RTE_PMD_QDMA_XDEBUG_QDMA_DEVICE_STRUCT, - /** Debug Queue information */ - RTE_PMD_QDMA_XDEBUG_QUEUE_INFO, - /** Debug descriptor */ - RTE_PMD_QDMA_XDEBUG_QUEUE_DESC_DUMP, - /** Invalid debug type */ - RTE_PMD_QDMA_XDEBUG_MAX, -}; - -/** - * Enum to specify the queue ring for debug - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_xdebug_desc_type { - /** Debug C2H ring descriptor */ - RTE_PMD_QDMA_XDEBUG_DESC_C2H, - /** Debug H2C ring descriptor */ - RTE_PMD_QDMA_XDEBUG_DESC_H2C, - /** Debug CMPT ring descriptor */ - RTE_PMD_QDMA_XDEBUG_DESC_CMPT, - /** Invalid debug type */ - RTE_PMD_QDMA_XDEBUG_DESC_MAX, -}; - -/** - * Enum to specify the QDMA device type - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_device_type { - /** QDMA Soft device e.g. UltraScale+ IP's */ - RTE_PMD_QDMA_DEVICE_SOFT, - /** QDMA Versal CPM4 device */ - RTE_PMD_QDMA_DEVICE_VERSAL_CPM4, - /** QDMA Versal CPM5 device */ - RTE_PMD_QDMA_DEVICE_VERSAL_CPM5, - /** Invalid QDMA device */ - RTE_PMD_QDMA_DEVICE_NONE -}; - -/** - * Enum to specify the QDMA IP type - * @ingroup rte_pmd_qdma_enums - */ -enum rte_pmd_qdma_ip_type { - /** Versal Hard IP */ - RTE_PMD_QDMA_VERSAL_HARD_IP, - /** Versal Soft IP */ - RTE_PMD_QDMA_VERSAL_SOFT_IP, - /** QDMA Soft IP */ - RTE_PMD_QDMA_SOFT_IP, - /** EQDMA Soft IP */ - RTE_PMD_EQDMA_SOFT_IP, - /** Invalid IP type */ - RTE_PMD_QDMA_NONE_IP -}; - - - - -/** - * Structure to hold the QDMA device attributes - * - * @ingroup rte_pmd_qdma_struct - */ -struct rte_pmd_qdma_dev_attributes { - /** Number of PFs*/ - uint8_t num_pfs; - /** Number of Queues */ - uint16_t num_qs; - /** Indicates whether FLR supported or not */ - uint8_t flr_present:1; - /** Indicates whether ST mode supported or not */ - uint8_t st_en:1; - /** Indicates whether MM mode supported or not */ - uint8_t mm_en:1; - /** Indicates whether MM with Completions supported or not */ - uint8_t mm_cmpt_en:1; - /** Indicates whether Mailbox supported or not */ - uint8_t mailbox_en:1; - /** Debug mode is enabled/disabled for IP */ - uint8_t debug_mode:1; - /** Descriptor Engine mode: - * Internal only/Bypass only/Internal & Bypass - */ - uint8_t desc_eng_mode:2; - /** Number of MM channels */ - uint8_t mm_channel_max; - - /** To indicate support of - * overflow check disable in CMPT ring - */ - uint8_t cmpt_ovf_chk_dis:1; - /** To indicate support of 64 bytes - * C2H/H2C descriptor format - */ - uint8_t sw_desc_64b:1; - /** To indicate support of 64 bytes - * CMPT descriptor format - */ - uint8_t cmpt_desc_64b:1; - /** To indicate support of - * counter + timer trigger mode - */ - uint8_t cmpt_trig_count_timer:1; - /** Device Type */ - enum rte_pmd_qdma_device_type device_type; - /** Versal IP Type */ - enum rte_pmd_qdma_ip_type ip_type; -}; - - -/******************************************************************************/ -/** - * Dumps the QDMA configuration registers for the given port - * - * @param port_id Port ID - * - * @return '0' on success and "< 0" on failure - * - * @note None - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_dbg_regdump(uint8_t port_id); - -/******************************************************************************/ -/** - * Dumps the QDMA register field information for a given register offset - * - * @param port_id Port ID - * @param reg_addr Register Address - * - * @return '0' on success and "< 0" on failure - * - * @note None - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_dbg_reg_info_dump(uint8_t port_id, - uint32_t num_regs, uint32_t reg_addr); - -/******************************************************************************/ -/** - * Dumps the device specific SW structure for the given port - * - * @param port_id Port ID - * - * @return '0' on success and "< 0" on failure - * - * @note None - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_dbg_qdevice(uint8_t port_id); - -/******************************************************************************/ -/** - * Dumps the qdma Tx and Rx queue stats for the given queue ID - * - * @param port_id Port ID - * @param queue Queue ID relative to the Port - * - * @return '0' on success and "< 0" on failure - * - * @note None - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_qstats(uint8_t port_id, uint16_t queue); - -/******************************************************************************/ -/** - * Clear the qdma Tx and Rx queue stats for the given queue ID - * - * @param port_id Port ID - * @param queue Queue ID relative to the Port - * - * @return '0' on success and "< 0" on failure - * - * @note None - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_qstats_clear(uint8_t port_id, uint16_t queue); - -/******************************************************************************/ -/** - * Dumps the queue contexts and queue specific SW - * structures for the given queue ID - * - * @param port_id Port ID - * @param queue Queue ID relative to the Port - * - * @return '0' on success and "< 0" on failure - * - * @note None - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_dbg_qinfo(uint8_t port_id, uint16_t queue); - -/******************************************************************************/ -/** - * Dumps the Queue descriptors - * - * @param port_id Port ID - * @param queue Queue ID relative to the Port - * @param start Start index of the descriptor to dump - * @param end End index of the descriptor to dump - * @param type Descriptor type - * - * @return '0' on success and "< 0" on failure - * - * @note None - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_dbg_qdesc(uint8_t port_id, uint16_t queue, int start, - int end, enum rte_pmd_qdma_xdebug_desc_type type); - -/******************************************************************************/ -/** - * Returns the BAR indices of the QDMA BARs - * - * @param port_id Port ID - * @param config_bar_idx Config BAR index - * @param user_bar_idx AXI Master Lite BAR(user bar) index - * @param bypass_bar_idx AXI Bridge Master BAR(bypass bar) index - * - * @return '0' on success and '< 0' on failure - * - * @note None - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_get_bar_details(int port_id, int32_t *config_bar_idx, - int32_t *user_bar_idx, int32_t *bypass_bar_idx); - -/******************************************************************************/ -/** - * Returns queue base for given port - * - * @param port_id Port ID - * @param queue_base Queue base - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API only after successful - * call to rte_eh_dev_configure() API - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_get_queue_base(int port_id, uint32_t *queue_base); - -/******************************************************************************/ -/** - * Retrieves PCIe function type i.e. PF or VF - * - * @param port_id Port ID - * @param func_type Indicates PCIe function type - * - * @return '0' on success and '< 0' on failure - * - * @note Returns the PCIe function type i.e. PF or VF of the given port - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_get_pci_func_type(int port_id, - enum rte_pmd_qdma_pci_func_type *func_type); - -/******************************************************************************/ -/** - * Returns immediate data state i.e. whether enabled or disabled, - * for the specified queue - * - * @param port_id Port ID - * @param qid Queue ID - * @param state Pointer to the state specifying whether - * immediate data is enabled or not - * @return '0' on success and '< 0' on failure - * - * @note Application can call this function after - * rte_eth_rx_queue_setup() is called. - * API is applicable for streaming queues only. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_get_immediate_data_state(int port_id, uint32_t qid, - int *state); - -/******************************************************************************/ -/** - * Sets queue interface mode for the specified queue - * - * @param port_id Port ID - * @param qid Queue ID - * @param mode Queue interface mode to be set - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() but before - * rte_eth_tx_queue_setup()/rte_eth_rx_queue_setup() API. - * By default, all queues are setup in streaming mode. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_set_queue_mode(int port_id, uint32_t qid, - enum rte_pmd_qdma_queue_mode_t mode); - -/******************************************************************************/ -/** - * Sets immediate data state i.e. enable or disable, for the specified queue. - * If enabled, the user defined data in the completion - * ring are dumped in to a queue specific file - * "q_<qid>_immmediate_data.txt" in the local directory. - * - *@param port_id Port ID - *@param qid Queue ID - *@param state Immediate data state to be set. - * Set '0' to disable and '1' to enable. - * - *@return '0' on success and '< 0' on failure - * - *@note Application can call this API after successful - * call to rte_eth_rx_queue_setup() API. - * This API is applicable for streaming queues only. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_set_immediate_data_state(int port_id, uint32_t qid, - uint8_t state); - -/******************************************************************************/ -/** - * Enables or disables the overflow check (whether PIDX is overflowing - * the CIDX) performed by QDMA on the completion descriptor ring of specified - * queue. - * - * @param port_id Port ID - * @param qid Queue ID - * @param enable '1' to enable and '0' to disable the overflow check - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_eth_rx_queue_setup() API, but before calling - * rte_eth_rx_queue_start() or rte_eth_dev_start() API. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_set_cmpt_overflow_check(int port_id, uint32_t qid, - uint8_t enable); - -/******************************************************************************/ -/** - * Configures the completion ring descriptor size - * - * @param port_id Port ID - * @param qid Queue ID - * @param size Descriptor size to be configured - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() but before rte_eth_rx_queue_setup() API - * when queue is in streaming mode, and before - * rte_pmd_qdma_dev_cmptq_setup when queue is in - * memory mapped mode. - * By default, the completion desciptor size is set to 8 bytes. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_set_cmpt_descriptor_size(int port_id, uint32_t qid, - enum rte_pmd_qdma_cmpt_desc_len size); - -/******************************************************************************/ -/** - * Configures the trigger mode for completion ring CIDX updates - * - * @param port_id Port ID - * @param qid Queue ID - * @param mode Trigger mode to be configured - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API before calling - * rte_eth_rx_queue_start() or rte_eth_dev_start() API. - * By default, trigger mode is set to - * RTE_PMD_QDMA_TRIG_MODE_USER_TIMER_COUNT. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_set_cmpt_trigger_mode(int port_id, uint32_t qid, - enum rte_pmd_qdma_tigger_mode_t mode); - -/******************************************************************************/ -/** - * Configures the timer interval in microseconds to trigger - * the completion ring CIDX updates - * - * @param port_id Port ID - * @param qid Queue ID - * @param value Timer interval for completion trigger to be configured - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API before calling - * rte_eth_rx_queue_start() or rte_eth_dev_start() API. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_set_cmpt_timer(int port_id, uint32_t qid, uint32_t value); - -/******************************************************************************/ -/** - * Enables or disables prefetch of the descriptors by prefetch engine - * - *@param port_id Port ID - *@param qid Queue ID - *@param enable '1' to enable and '0' to disable the descriptor prefetch - * - *@return '0' on success and '< 0' on failure - * - *@note Application can call this API after successful call to - * rte_eth_rx_queue_setup() API, but before calling - * rte_eth_rx_queue_start() or rte_eth_dev_start() API. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_set_c2h_descriptor_prefetch(int port_id, uint32_t qid, - uint8_t enable); - -/*****************************************************************************/ -/** - * Sets the PCIe endpoint memory offset at which to - * perform DMA operation for the specified queue operating - * in memory mapped mode. - * - * @param port_id Port ID - * @param qid Queue ID - * @param dir Direction i.e. Tx or Rx - * @param addr Destination address for Tx, Source address for Rx - * - * @return '0' on success and '< 0' on failure - * - * @note This API can be called before Tx/Rx burst API's - * (rte_eth_tx_burst() and rte_eth_rx_burst()) are called. - * @ingroup rte_pmd_qdma_func - *****************************************************************************/ -int rte_pmd_qdma_set_mm_endpoint_addr(int port_id, uint32_t qid, - enum rte_pmd_qdma_dir_type dir, uint64_t addr); - -/******************************************************************************/ -/** - * Sets the Tx bypass mode and bypass descriptor size for the specified queue - * - * @param port_id Port ID - * @param qid Queue ID - * @param bypass_mode Bypass mode to be set - * @param size Bypass descriptor size to be set - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() but before tx_setup() API. - * By default, all queues are configured in internal mode - * i.e. bypass disabled. - * If size is specified zero, then the bypass descriptor size is - * set to the one used in internal mode. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_configure_tx_bypass(int port_id, uint32_t qid, - enum rte_pmd_qdma_tx_bypass_mode bypass_mode, - enum rte_pmd_qdma_bypass_desc_len size); - -/******************************************************************************/ -/** - * Sets the Rx bypass mode and bypass descriptor size for the specified queue - * - * @param port_id Port ID - * @param qid Queue ID - * @param bypass_mode Bypass mode to be set - * @param size Bypass descriptor size to be set - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() but before rte_eth_rx_queue_setup() API. - * By default, all queues are configured in internal mode - * i.e. bypass disabled. - * If size is specified zero, then the bypass descriptor size is - * set to the one used in internal mode. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_configure_rx_bypass(int port_id, uint32_t qid, - enum rte_pmd_qdma_rx_bypass_mode bypass_mode, - enum rte_pmd_qdma_bypass_desc_len size); - -/******************************************************************************/ -/** - * Retrive the device capabilities - * - * @param port_id Port ID - * @param dev_attr Pointer to the device capabilities structure - * - * @return '0' on success and '< 0' on failure - * - * @note None. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_get_device_capabilities(int port_id, - struct rte_pmd_qdma_dev_attributes *dev_attr); - -/******************************************************************************/ -/** - * Allocate and set up a completion queue for memory mapped mode - * - * @param port_id Port ID - * @param qid Queue ID - * @param nb_cmpt_desc Completion queue ring size - * @param socket_id The socket_id argument is the socket identifier - * in case of NUMA. Its value can be SOCKET_ID_ANY - * if there is no NUMA constraint for the DMA memory - * allocated for the transmit descriptors of the ring. - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_eth_dev_configure() and rte_pmd_qdma_set_queue_mode() - * for queues in memory mapped mode. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_dev_cmptq_setup(int port_id, uint32_t cmpt_queue_id, - uint16_t nb_cmpt_desc, - unsigned int socket_id); - -/******************************************************************************/ -/** - * Start the MM completion queue - * - * @param port_id Port ID - * @param qid Queue ID - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_pmd_qdma_dev_cmptq_setup() API when queue is in - * memory mapped mode. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_dev_cmptq_start(int port_id, uint32_t qid); - -/******************************************************************************/ -/** - * Stop the MM completion queue - * - * @param port_id Port ID - * @param qid Queue ID - * - * @return '0' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_pmd_qdma_dev_cmptq_start() API when queue is in - * memory mapped mode. - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -int rte_pmd_qdma_dev_cmptq_stop(int port_id, uint32_t qid); - -/*****************************************************************************/ -/** - * Process the MM Completion queue entries - * - * @param port_id Port ID - * @param qid Queue ID - * @param cmpt_buff User buffer pointer to store the completion data - * @param nb_entries Number of compeltion entries to process - * - * @return 'number of entries processed' on success and '< 0' on failure - * - * @note Application can call this API after successful call to - * rte_pmd_qdma_dev_cmptq_start() API - * @ingroup rte_pmd_qdma_func - ******************************************************************************/ -uint16_t rte_pmd_qdma_mm_cmpt_process(int port_id, uint32_t qid, - void *cmpt_buff, uint16_t nb_entries); - -/*****************************************************************************/ -/** - * DPDK PMD function to close the device. - * - * @param port_id Port ID - * - * @return '0' on success and '< 0' on failure - * - ******************************************************************************/ -int rte_pmd_qdma_dev_close(uint16_t port_id); - -/*****************************************************************************/ -/** - * DPDK PMD function to fill fast-path operations. - * - * @param port_id Port ID - * - * @return on success return 0 - * - ******************************************************************************/ -int rte_pmd_qdma_dev_fp_ops_config(int port_id); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to read pci registers. - * - * @param port_id Port ID - * @param bar Bar - * @param offset Offset - * - * @return pci_read_reg value - * - ******************************************************************************/ -unsigned int rte_pmd_qdma_compat_pci_read_reg(int port_id, - unsigned int bar, unsigned int offset); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to write pci registers. - * - * @param port_id Port ID - * @param bar Bar - * @param offset Offset - * @param reg_val Value which needs to write - * - ******************************************************************************/ -void rte_pmd_qdma_compat_pci_write_reg(int port_id, uint32_t bar, - uint32_t offset, uint32_t reg_val); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to get bdf - * - * @param m_id Port ID - * @param bus Bus - * @param dev Device - * @param fn Function - * - ******************************************************************************/ -void rte_pmd_qdma_get_bdf(uint32_t m_id, uint32_t *bus, - uint32_t *dev, uint32_t *fn); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to reserve memzone - * - ******************************************************************************/ -void rte_pmd_qdma_compat_memzone_reserve_aligned(void); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to device remove - * - * @param port_id Port ID - * @return device id to remove - * - ******************************************************************************/ -int rte_pmd_qdma_dev_remove(int port_id); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to get device id - * - * @param port_id Port ID - * @return device id to get - * - ******************************************************************************/ -uint16_t rte_pmd_qdma_get_dev_id(int port_id); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to device started - * - * @param port_id Port ID - * @param status Enable/Disable - * - ******************************************************************************/ -void rte_pmd_qdma_dev_started(int port_id, bool status); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function for eth dev to pci - * - * @param port_id Port ID - * @return rte_pci_device* pci_device - * - ******************************************************************************/ - -struct rte_pci_device *rte_pmd_qdma_eth_dev_to_pci(int port_id); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to get rte device - * - * @param port_id Port ID - * @return rte_device* rte_device - * - ******************************************************************************/ -struct rte_device *rte_pmd_qdma_get_device(int port_id); - -/*****************************************************************************/ -/** - * DPDK PMD compatibility function to validate rte device - * - * @param port_id Port ID - * @return bool true/false - * - ******************************************************************************/ -bool rte_pmd_qdma_validate_dev(int port_id); - -#ifdef __cplusplus -} -#endif -#endif /* ifndef __RTE_PMD_QDMA_EXPORT_H__ */ diff --git a/QDMA/DPDK/drivers/net/qdma/version.h b/QDMA/DPDK/drivers/net/qdma/version.h deleted file mode 100755 index 8e44e3a..0000000 --- a/QDMA/DPDK/drivers/net/qdma/version.h +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __QDMA_VERSION_H__ -#define __QDMA_VERSION_H__ - -#define qdma_stringify1(x...) #x -#define qdma_stringify(x...) qdma_stringify1(x) - -#define QDMA_PMD_MAJOR 2023 -#define QDMA_PMD_MINOR 2 -#define QDMA_PMD_PATCHLEVEL 1 - -#define QDMA_PMD_VERSION \ - qdma_stringify(QDMA_PMD_MAJOR) "." \ - qdma_stringify(QDMA_PMD_MINOR) "." \ - qdma_stringify(QDMA_PMD_PATCHLEVEL) - -#define QDMA_PMD_VERSION_NUMBER \ - ((QDMA_PMD_MAJOR) * 1000 + (QDMA_PMD_MINOR) * 100 + QDMA_PMD_PATCHLEVEL) - -#endif /* ifndef __QDMA_VERSION_H__ */ diff --git a/QDMA/DPDK/drivers/net/qdma/version.map b/QDMA/DPDK/drivers/net/qdma/version.map deleted file mode 100755 index 2944145..0000000 --- a/QDMA/DPDK/drivers/net/qdma/version.map +++ /dev/null @@ -1,166 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -DPDK_21 { - global: - - rte_pmd_qdma_set_immediate_data_state; - rte_pmd_qdma_get_bar_details; - rte_pmd_qdma_get_queue_base; - rte_pmd_qdma_set_queue_mode; - rte_pmd_qdma_get_device_capabilities; - qdma_pci_read_reg; - qdma_pci_write_reg; - rte_pmd_qdma_set_mm_endpoint_addr; - rte_pmd_qdma_dbg_qdesc; - rte_pmd_qdma_dbg_regdump; - rte_pmd_qdma_dbg_reg_info_dump; - rte_pmd_qdma_dbg_qinfo; - - rte_pmd_qdma_get_pci_func_type; - rte_pmd_qdma_configure_tx_bypass; - rte_pmd_qdma_configure_rx_bypass; - rte_pmd_qdma_set_cmpt_descriptor_size; - rte_pmd_qdma_set_c2h_descriptor_prefetch; - rte_pmd_qdma_set_cmpt_overflow_check; - rte_pmd_qdma_set_cmpt_trigger_mode; - rte_pmd_qdma_set_cmpt_timer; - rte_pmd_qdma_get_immediate_data_state; - rte_pmd_qdma_dev_cmptq_setup; - rte_pmd_qdma_dev_cmptq_start; - rte_pmd_qdma_mm_cmpt_process; - rte_pmd_qdma_dev_cmptq_stop; - rte_pmd_qdma_dbg_qdevice; - rte_pmd_qdma_qstats; - rte_pmd_qdma_qstats_clear; - rte_pmd_qdma_dev_close; - rte_pmd_qdma_dev_fp_ops_config; - - local: *; -}; - -DPDK_22 { - global: - - rte_pmd_qdma_set_immediate_data_state; - rte_pmd_qdma_get_bar_details; - rte_pmd_qdma_get_queue_base; - rte_pmd_qdma_set_queue_mode; - rte_pmd_qdma_get_device_capabilities; - qdma_pci_read_reg; - qdma_pci_write_reg; - rte_pmd_qdma_set_mm_endpoint_addr; - rte_pmd_qdma_dbg_qdesc; - rte_pmd_qdma_dbg_regdump; - rte_pmd_qdma_dbg_reg_info_dump; - rte_pmd_qdma_dbg_qinfo; - - rte_pmd_qdma_get_pci_func_type; - rte_pmd_qdma_configure_tx_bypass; - rte_pmd_qdma_configure_rx_bypass; - rte_pmd_qdma_set_cmpt_descriptor_size; - rte_pmd_qdma_set_c2h_descriptor_prefetch; - rte_pmd_qdma_set_cmpt_overflow_check; - rte_pmd_qdma_set_cmpt_trigger_mode; - rte_pmd_qdma_set_cmpt_timer; - rte_pmd_qdma_get_immediate_data_state; - rte_pmd_qdma_dev_cmptq_setup; - rte_pmd_qdma_dev_cmptq_start; - rte_pmd_qdma_mm_cmpt_process; - rte_pmd_qdma_dev_cmptq_stop; - rte_pmd_qdma_dbg_qdevice; - rte_pmd_qdma_qstats; - rte_pmd_qdma_qstats_clear; - rte_pmd_qdma_dev_close; - rte_pmd_qdma_dev_fp_ops_config; - rte_pmd_qdma_compat_pci_write_reg; - rte_pmd_qdma_compat_pci_read_reg; - rte_pmd_qdma_compat_memzone_reserve_aligned; - rte_pmd_qdma_get_bdf; - rte_pmd_qdma_dev_remove; - rte_pmd_qdma_get_dev_id; - rte_pmd_qdma_dev_started; - rte_pmd_qdma_eth_dev_to_pci; - rte_pmd_qdma_get_device; - rte_pmd_qdma_validate_dev; - - local: *; -}; - -DPDK_23 { - global: - - rte_pmd_qdma_set_immediate_data_state; - rte_pmd_qdma_get_bar_details; - rte_pmd_qdma_get_queue_base; - rte_pmd_qdma_set_queue_mode; - rte_pmd_qdma_get_device_capabilities; - qdma_pci_read_reg; - qdma_pci_write_reg; - rte_pmd_qdma_set_mm_endpoint_addr; - rte_pmd_qdma_dbg_qdesc; - rte_pmd_qdma_dbg_regdump; - rte_pmd_qdma_dbg_reg_info_dump; - rte_pmd_qdma_dbg_qinfo; - - rte_pmd_qdma_get_pci_func_type; - rte_pmd_qdma_configure_tx_bypass; - rte_pmd_qdma_configure_rx_bypass; - rte_pmd_qdma_set_cmpt_descriptor_size; - rte_pmd_qdma_set_c2h_descriptor_prefetch; - rte_pmd_qdma_set_cmpt_overflow_check; - rte_pmd_qdma_set_cmpt_trigger_mode; - rte_pmd_qdma_set_cmpt_timer; - rte_pmd_qdma_get_immediate_data_state; - rte_pmd_qdma_dev_cmptq_setup; - rte_pmd_qdma_dev_cmptq_start; - rte_pmd_qdma_mm_cmpt_process; - rte_pmd_qdma_dev_cmptq_stop; - rte_pmd_qdma_dbg_qdevice; - rte_pmd_qdma_qstats; - rte_pmd_qdma_qstats_clear; - rte_pmd_qdma_dev_close; - rte_pmd_qdma_dev_fp_ops_config; - rte_pmd_qdma_compat_pci_write_reg; - rte_pmd_qdma_compat_pci_read_reg; - rte_pmd_qdma_compat_memzone_reserve_aligned; - rte_pmd_qdma_get_bdf; - rte_pmd_qdma_dev_remove; - rte_pmd_qdma_get_dev_id; - rte_pmd_qdma_dev_started; - rte_pmd_qdma_eth_dev_to_pci; - rte_pmd_qdma_get_device; - rte_pmd_qdma_validate_dev; - - local: *; -}; diff --git a/QDMA/DPDK/examples/qdma_testapp/Makefile b/QDMA/DPDK/examples/qdma_testapp/Makefile deleted file mode 100755 index 177c5cf..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/Makefile +++ /dev/null @@ -1,97 +0,0 @@ -# BSD LICENSE -# -# Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. -# Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -ifeq ($(RTE_SDK),) -$(error "Please define RTE_SDK environment variable") -endif - -# Default target, can be overriden by command line or environment -RTE_TARGET ?= build - -#Default BRAM size is set to 512K -#if modified the BRAM_SIZE, the same need to be set to the driver Makefile -BRAM_SIZE ?= 524288 - -# binary name -APP = qdma_testapp - -# all source are stored in SRCS-y -SRCS-y := testapp.c pcierw.c commands.c - -ifeq ($(CONFIG_RTE_LIBRTE_QDMA_GCOV),y) - CFLAGS += -g -ftest-coverage -fprofile-arcs - LDFLAGS += -lgcov -endif - -# Build using pkg-config variables if possible -ifneq ($(shell pkg-config --exists libdpdk && echo 0),0) -$(error "no installation of DPDK found") -endif - -all: shared -.PHONY: shared static -shared: build/$(APP)-shared - ln -sf $(APP)-shared build/$(APP) -static: build/$(APP)-static - ln -sf $(APP)-static build/$(APP) - -PKGCONF ?= pkg-config - -CFLAGS += -DBRAM_SIZE=$(BRAM_SIZE) -CFLAGS += -DDPDK=1 - -# Add flag to allow experimental API as qdma_testapp uses rte_ethdev_set_ptype API -CFLAGS += -DALLOW_EXPERIMENTAL_API - -PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null) -CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk) -LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk) -LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk) -LDFLAGS += $(shell $(PKGCONF) --libs libdpdk) - -LDFLAGS += -lrte_net_qdma - -# for shared library builds, we need to explicitly link these PMDs -LDFLAGS_SHARED += -lrte_net_qdma - -build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build - $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED) - -build/$(APP)-static: $(SRCS-y) Makefile $(PC_FILE) | build - $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_STATIC) - -build: - @mkdir -p $@ - -.PHONY: clean -clean: - rm -f build/$(APP) build/$(APP)-static build/$(APP)-shared - test -d build && rmdir -p build || true diff --git a/QDMA/DPDK/examples/qdma_testapp/commands.c b/QDMA/DPDK/examples/qdma_testapp/commands.c deleted file mode 100755 index 20e8af7..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/commands.c +++ /dev/null @@ -1,1526 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*- - * BSD LICENSE - * - * Copyright (c) 2010-2014 Intel Corporation. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (c) 2009, Olivier MATZ <zer0@droids-corp.org> - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the University of California, Berkeley nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdio.h> -#include <stdint.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <stdarg.h> -#include <errno.h> -#include <netinet/in.h> -#include <termios.h> -#ifndef __linux__ -#include <net/socket.h> -#endif - -#include <cmdline_rdline.h> -#include <cmdline_parse.h> -#include <cmdline_parse_ipaddr.h> -#include <cmdline_parse_num.h> -#include <cmdline_parse_string.h> -#include <cmdline.h> - -#include <rte_string_fns.h> -#include <rte_ethdev.h> -#include <fcntl.h> - -#include "parse_obj_list.h" -#include "pcierw.h" -#include "commands.h" -#include "qdma_regs.h" -#include "testapp.h" -#include "../../drivers/net/qdma/rte_pmd_qdma.h" - -#define ALIGN_TO_WORD_BYTES (4) -#define NUMERICAL_BASE_HEXADECIMAL (16) - -/* Command help */ -struct cmd_help_result { - cmdline_fixed_string_t help; -}; - -static void cmd_help_parsed(__attribute__((unused)) void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - cmdline_printf(cl, - "Demo example of command line interface in RTE\n\n" - "This is a readline-like interface that can be " - "used to\n debug your RTE application.\n\n" - "Supported Commands:\n" - "\tport_init <port-id> " - "<num-queues> <st-queues> " - "<ring-depth> <pkt-buff-size> " - " :port-initailization\n" - "\tport_close <port-id> " - ":port-close\n" - "\tport_reset <port-id> " - "<num-queues> <st-queues> " - "<ring-depth> <pkt-buff-size> " - " :port-reset\n" - "\tport_remove <port-id> " - ":port-remove\n" - "\treg_read <port-id> <bar-num> <address> " - ":Reads Specified Register\n" - "\treg_write <port-id> <bar-num> <address> " - "<value> " - ":Writes Specified Register\n" - "\tdma_to_device <port-id> <num-queues> " - "<input-filename> " - "<dst_addr> <size> <iterations> " - ":To Transmit\n" - "\tdma_from_device <port-id> <num-queues> " - "<output-filename> " - "<src_addr> <size> <iterations> " - ":To Receive\n" - "\treg_dump <port-id> " - ":To dump all the valid registers\n" - "\treg_info_read <port-id> <reg-addr> <num-regs> " - ":Reads the field info for the specified number of registers\n" - "\tqueue_dump <port-id> <queue-id> " - ":To dump the queue-context of a queue-number\n" - "\tqstats <port-id> <queue-id> " - ":To dump the queue-stats of a queue-number\n" - "\tqstats_clr <port-id> <queue-id> " - ":To clear the queue-stats of a queue-number\n" - "\tdesc_dump <port-id> <queue-id> " - ":To dump the descriptor-fields of a " - "queue-number\n" - "\tload_cmds <file-name> " - ":To execute the list of commands from file\n" - "\thelp\n" - "\tCtrl-d " - ": To quit from this command-line type Ctrl+d\n" - "\n"); -} - -cmdline_parse_token_string_t cmd_help_help = - TOKEN_STRING_INITIALIZER(struct cmd_help_result, help, "help"); - -cmdline_parse_inst_t cmd_help = { - .f = cmd_help_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "show help", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_help_help, - NULL, - }, -}; - -struct cmd_obj_port_init_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t num_queues; - cmdline_fixed_string_t st_queues; - cmdline_fixed_string_t nb_descs; - cmdline_fixed_string_t buff_size; -}; - -static void cmd_obj_port_init_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_port_init_result *res = parsed_result; - - cmdline_printf(cl, "Port-init Port:%s, num-queues:%s, st-queues: %s\n", - res->port_id, res->num_queues, res->st_queues); - - int port_id = atoi(res->port_id); - if (pinfo[port_id].num_queues) { - cmdline_printf(cl, "Error: port-id:%d already initialized\n" - "To re-initialize please close the port\n", - port_id); - return; - } - - int num_queues = atoi(res->num_queues); - int st_queues = atoi(res->st_queues); - int nb_descs = atoi(res->nb_descs); - int buff_size = atoi(res->buff_size); - - if ((num_queues < 1) || (num_queues > MAX_NUM_QUEUES)) { - cmdline_printf(cl, "Error: please enter valid number of queues," - "entered: %d max allowed: %d\n", - num_queues, MAX_NUM_QUEUES); - return; - } - - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: please enter valid port number: " - "%d\n", port_id); - return; - } - - int result = port_init(port_id, num_queues, - st_queues, nb_descs, buff_size); - - if (result < 0) - cmdline_printf(cl, "Error: Port initialization on " - "port-id:%d failed\n", port_id); - else - cmdline_printf(cl, "Port initialization done " - "successfully on port-id:%d\n", - port_id); -} - -cmdline_parse_token_string_t cmd_obj_action_port_init = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_init_result, action, - "port_init"); -cmdline_parse_token_string_t cmd_obj_port_init_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_init_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_port_init_num_queues = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_init_result, num_queues, - NULL); -cmdline_parse_token_string_t cmd_obj_port_init_st_queues = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_init_result, st_queues, - NULL); -cmdline_parse_token_string_t cmd_obj_port_init_nb_descs = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_init_result, nb_descs, - NULL); -cmdline_parse_token_string_t cmd_obj_port_init_buff_size = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_init_result, buff_size, - NULL); - -cmdline_parse_inst_t cmd_obj_port_init = { - .f = cmd_obj_port_init_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "port_init port-id num-queues st-queues " - "queue-ring-size buffer-size", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_port_init, - (void *)&cmd_obj_port_init_port_id, - (void *)&cmd_obj_port_init_num_queues, - (void *)&cmd_obj_port_init_st_queues, - (void *)&cmd_obj_port_init_nb_descs, - (void *)&cmd_obj_port_init_buff_size, - NULL, - }, -}; - -/* Command port-close */ -struct cmd_obj_port_close_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; -}; - -static void cmd_obj_port_close_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_port_close_result *res = parsed_result; - - cmdline_printf(cl, "Port-close on Port-id:%s\n", res->port_id); - - int port_id = atoi(res->port_id); - if (pinfo[port_id].num_queues == 0) { - cmdline_printf(cl, "Error: port-id:%d already closed\n", - port_id); - return; - } - - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: please enter valid port " - "number: %d\n", port_id); - return; - } - - port_close(port_id); - pinfo[port_id].num_queues = 0; - cmdline_printf(cl, "Port-id:%d closed successfully\n", port_id); -} - -cmdline_parse_token_string_t cmd_obj_action_port_close = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_close_result, action, - "port_close"); -cmdline_parse_token_string_t cmd_obj_port_close_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_close_result, port_id, - NULL); - -cmdline_parse_inst_t cmd_obj_port_close = { - .f = cmd_obj_port_close_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "port_close port-id ", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_port_close, - (void *)&cmd_obj_port_close_port_id, - NULL, - }, - -}; - -/* Command port-reset */ -struct cmd_obj_port_reset_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t num_queues; - cmdline_fixed_string_t st_queues; - cmdline_fixed_string_t nb_descs; - cmdline_fixed_string_t buff_size; -}; - -static void cmd_obj_port_reset_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_port_reset_result *res = parsed_result; - - cmdline_printf(cl, "Port-reset Port:%s, num-queues:%s, st-queues: %s\n", - res->port_id, res->num_queues, res->st_queues); - - int port_id = atoi(res->port_id); - int num_queues = atoi(res->num_queues); - int st_queues = atoi(res->st_queues); - int nb_descs = atoi(res->nb_descs); - int buff_size = atoi(res->buff_size); - - if ((num_queues < 1) || (num_queues > MAX_NUM_QUEUES)) { - cmdline_printf(cl, "Error: please enter valid number of queues," - "entered: %d max allowed: %d\n", - num_queues, MAX_NUM_QUEUES); - return; - } - - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: please enter valid port number: " - "%d\n", port_id); - return; - } - - int result = port_reset(port_id, num_queues, - st_queues, nb_descs, buff_size); - - if (result < 0) - cmdline_printf(cl, "Error: Port reset on " - "port-id:%d failed\n", port_id); -} - -cmdline_parse_token_string_t cmd_obj_action_port_reset = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_reset_result, action, - "port_reset"); -cmdline_parse_token_string_t cmd_obj_port_reset_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_reset_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_port_reset_num_queues = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_reset_result, num_queues, - NULL); -cmdline_parse_token_string_t cmd_obj_port_reset_st_queues = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_reset_result, st_queues, - NULL); -cmdline_parse_token_string_t cmd_obj_port_reset_nb_descs = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_reset_result, nb_descs, - NULL); -cmdline_parse_token_string_t cmd_obj_port_reset_buff_size = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_reset_result, buff_size, - NULL); - -cmdline_parse_inst_t cmd_obj_port_reset = { - .f = cmd_obj_port_reset_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "port_reset port-id num-queues st-queues " - "queue-ring-size buffer-size", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_port_reset, - (void *)&cmd_obj_port_reset_port_id, - (void *)&cmd_obj_port_reset_num_queues, - (void *)&cmd_obj_port_reset_st_queues, - (void *)&cmd_obj_port_reset_nb_descs, - (void *)&cmd_obj_port_reset_buff_size, - NULL, - }, -}; - -/* Command port-remove */ -struct cmd_obj_port_remove_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; -}; - -static void cmd_obj_port_remove_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_port_remove_result *res = parsed_result; - - cmdline_printf(cl, "Port-remove on Port-id:%s\n", res->port_id); - - int port_id = atoi(res->port_id); - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: please enter valid port " - "number: %d\n", port_id); - return; - } - - int result = port_remove(port_id); - pinfo[port_id].num_queues = 0; - - if (result < 0) - cmdline_printf(cl, "Error: Port remove on " - "port-id:%d failed\n", port_id); -} - -cmdline_parse_token_string_t cmd_obj_action_port_remove = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_remove_result, action, - "port_remove"); -cmdline_parse_token_string_t cmd_obj_port_remove_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_port_remove_result, port_id, - NULL); - -cmdline_parse_inst_t cmd_obj_port_remove = { - .f = cmd_obj_port_remove_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "port_remove port-id ", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_port_remove, - (void *)&cmd_obj_port_remove_port_id, - NULL, - }, -}; - -/* Command Read addr */ -struct cmd_obj_reg_read_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t bar_id; - cmdline_fixed_string_t addr; -}; - -static void cmd_obj_reg_read_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_reg_read_result *res = parsed_result; - - cmdline_printf(cl, "Read Port:%s, BAR-index:%s, Address:%s\n\n", - res->port_id, res->bar_id, res->addr); - - int addr = strtol(res->addr, NULL, NUMERICAL_BASE_HEXADECIMAL); - - if (addr % ALIGN_TO_WORD_BYTES) { - cmdline_printf(cl, "ERROR: Read address must aligned to " - "a 4-byte boundary.\n\n"); - } else { - int port_id = atoi(res->port_id); - int bar_id = atoi(res->bar_id); - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", - port_id); - return; - } - int result = PciRead(bar_id, addr, port_id); - - cmdline_printf(cl, "Read (%d:0x%08x) = 0x%08x\n", - port_id, addr, result); - } -} - -cmdline_parse_token_string_t cmd_obj_action_reg_read = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_read_result, action, - "reg_read"); -cmdline_parse_token_string_t cmd_obj_reg_read_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_read_result, port_id, NULL); -cmdline_parse_token_string_t cmd_obj_reg_read_bar_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_read_result, bar_id, NULL); -cmdline_parse_token_string_t cmd_obj_reg_read_addr = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_read_result, addr, NULL); - -cmdline_parse_inst_t cmd_obj_reg_read = { - .f = cmd_obj_reg_read_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "reg_read port-id bar-id address", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_reg_read, - (void *)&cmd_obj_reg_read_port_id, - (void *)&cmd_obj_reg_read_bar_id, - (void *)&cmd_obj_reg_read_addr, - NULL, - }, - -}; - -/* Command Write addr */ -struct cmd_obj_reg_write_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t bar_id; - cmdline_fixed_string_t address; - cmdline_fixed_string_t value; -}; - -static void cmd_obj_reg_write_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_reg_write_result *res = parsed_result; - - cmdline_printf(cl, "Write Port:%s, Address:%s, Value:%s\n", - res->port_id, res->address, res->value); - - int bar_id = atoi(res->bar_id); - int port_id = atoi(res->port_id); - int addr = strtol(res->address, NULL, NUMERICAL_BASE_HEXADECIMAL); - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", port_id); - return; - } - if (addr % ALIGN_TO_WORD_BYTES) { - cmdline_printf(cl, "ERROR: Write address must aligned to a " - "4-byte boundary.\n\n"); - } else{ - int value = strtol(res->value, NULL, NUMERICAL_BASE_HEXADECIMAL); - PciWrite(bar_id, addr, value, port_id); - int result = PciRead(bar_id, addr, port_id); - cmdline_printf(cl, "Read (%d:0x%08x) = 0x%08x\n", port_id, addr, - result); - } -} - -cmdline_parse_token_string_t cmd_obj_action_reg_write = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_write_result, action, - "reg_write"); -cmdline_parse_token_string_t cmd_obj_reg_write_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_write_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_reg_write_bar_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_write_result, bar_id, NULL); -cmdline_parse_token_string_t cmd_obj_reg_write_address = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_write_result, address, - NULL); -cmdline_parse_token_string_t cmd_obj_reg_write_value = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_write_result, value, NULL); - -cmdline_parse_inst_t cmd_obj_reg_write = { - .f = cmd_obj_reg_write_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "reg_write port-id bar-id address value", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_reg_write, - (void *)&cmd_obj_reg_write_port_id, - (void *)&cmd_obj_reg_write_bar_id, - (void *)&cmd_obj_reg_write_address, - (void *)&cmd_obj_reg_write_value, - NULL, - }, - -}; - -/* Command do-xmit */ -struct cmd_obj_dma_to_device_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t queues; - cmdline_fixed_string_t filename; - cmdline_fixed_string_t dst_addr; - cmdline_fixed_string_t size; - cmdline_fixed_string_t loops; -}; - -static void cmd_obj_dma_to_device_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_dma_to_device_result *res = parsed_result; - int i, ifd, tot_num_desc, offset, size, r_size = 0, total_size = 0; - int ld_size = 0, loop = 0, ret, j, zbyte = 0, user_bar_idx; - off_t ret_val; - int port_id = 0, num_queues = 0, input_size = 0, num_loops = 0; - uint64_t dst_addr = 0; - uint32_t regval = 0; - unsigned int q_data_size = 0; - char *p = NULL; - - cmdline_printf(cl, "xmit on Port:%s, filename:%s, num-queues:%s\n\n", - res->port_id, res->filename, res->queues); - - ifd = open(res->filename, O_RDWR); - if (ifd < 0) { - cmdline_printf(cl, "Error: Invalid filename: %s\n", - res->filename); - return; - } - - { - port_id = atoi(res->port_id); - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", - port_id); - close(ifd); - return; - } - num_queues = atoi(res->queues); - if ((unsigned int)num_queues > pinfo[port_id].num_queues) { - cmdline_printf(cl, "Error: num-queues:%d are more than " - "the configured queues:%d,\n " - "Please enter valid number of queues\n", - num_queues, pinfo[port_id].num_queues); - close(ifd); - return; - } - if (num_queues == 0) { - cmdline_printf(cl, "Error: Please enter valid number " - "of queues\n"); - close(ifd); - return; - } - user_bar_idx = pinfo[port_id].user_bar_idx; - -#if !defined(TANDEM_BOOT_SUPPORTED) - regval = PciRead(user_bar_idx, C2H_CONTROL_REG, port_id); -#endif - - input_size = atoi(res->size); - num_loops = atoi(res->loops); - dst_addr = strtoull(res->dst_addr, &p, 0); - -#if !defined(PERF_BENCHMARK) && !defined(TANDEM_BOOT_SUPPORTED) - if (dst_addr + input_size > BRAM_SIZE) { - cmdline_printf(cl, "Error: (dst_addr %ld + input size " - "%d) shall be less than " - "BRAM_SIZE %d.\n", dst_addr, - input_size, BRAM_SIZE); - close(ifd); - return; - } -#endif - /* For zero-byte transfers, HW expects a - * buffer of length 4kb and with desc->len as 0. - */ - if (input_size == 0) { - if ((unsigned int)num_queues <= - pinfo[port_id].st_queues) { - zbyte = 1; - } else { - cmdline_printf(cl, "Error: Zero-length support " - "is for queues with ST-mode " - "only\n"); - close(ifd); - return; - } - } - - if (input_size % num_queues) { - size = input_size / num_queues; - r_size = input_size % num_queues; - } else - size = input_size / num_queues; - - do { - total_size = input_size; - dst_addr = strtoull(res->dst_addr, &p, 0); - q_data_size = 0; - /* transmit data on the number of Queues configured - * from the input file - */ - for (i = 0, j = 0; i < num_queues; i++, j++) { - dst_addr += q_data_size; - -#ifndef TANDEM_BOOT_SUPPORTED - dst_addr %= BRAM_SIZE; -#endif - - if ((unsigned int)i >= - pinfo[port_id].st_queues) { - ret = - rte_pmd_qdma_set_mm_endpoint_addr( - port_id, - i, - RTE_PMD_QDMA_TX, - dst_addr); - if (ret < 0) { - close(ifd); - return; - } - } - - if (total_size == 0) - q_data_size = pinfo[port_id].buff_size; - else if (total_size == (r_size + size)) { - q_data_size = total_size; - total_size = 0; - } else { - q_data_size = size; - total_size -= size; - } - - if (q_data_size >= pinfo[port_id].buff_size) { - if (q_data_size % - pinfo[port_id].buff_size) { - tot_num_desc = (q_data_size / - pinfo[port_id].buff_size) + 1; - ld_size = q_data_size % - pinfo[port_id].buff_size; - } else - tot_num_desc = (q_data_size / - pinfo[port_id].buff_size); - } else { - tot_num_desc = 1; - ld_size = q_data_size % - pinfo[port_id].buff_size; - } - - if (port_id) - offset = (input_size/num_queues) * j; - else - offset = (input_size/num_queues) * i; - - if ((unsigned int)i < (pinfo[port_id].st_queues) - && !(regval & ST_LOOPBACK_EN)) - ret_val = lseek(ifd, 0, SEEK_SET); - else - ret_val = lseek(ifd, offset, SEEK_SET); - - if (ret_val == (off_t)-1) { - cmdline_printf(cl, "DMA-to-Device: " - "lseek func failed\n"); - close(ifd); - return; - } - - cmdline_printf(cl, "DMA-to-Device: with " - "input-size:%d, ld_size:%d," - "tot_num_desc:%d\n", - input_size, ld_size, - tot_num_desc); - ret = do_xmit(port_id, ifd, i, ld_size, - tot_num_desc, zbyte); - if (ret < 0) { - close(ifd); - return; - } - } - ++loop; - } while (loop < num_loops); - close(ifd); - } - cmdline_printf(cl, "\n######## DMA transfer to device is completed " - "successfully #######\n"); -} - -cmdline_parse_token_string_t cmd_obj_action_dma_to_device = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_to_device_result, action, - "dma_to_device"); -cmdline_parse_token_string_t cmd_obj_dma_to_device_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_to_device_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_dma_to_device_queues = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_to_device_result, queues, - NULL); -cmdline_parse_token_string_t cmd_obj_dma_to_device_filename = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_to_device_result, filename, - NULL); -cmdline_parse_token_string_t cmd_obj_dma_to_device_dst_addr = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_to_device_result, dst_addr, - NULL); -cmdline_parse_token_string_t cmd_obj_dma_to_device_size = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_to_device_result, size, - NULL); -cmdline_parse_token_string_t cmd_obj_dma_to_device_loops = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_to_device_result, loops, - NULL); - -cmdline_parse_inst_t cmd_obj_dma_to_device = { - .f = cmd_obj_dma_to_device_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "dma_to_device port-id num-queues filename dst_addr " - "size loops", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_dma_to_device, - (void *)&cmd_obj_dma_to_device_port_id, - (void *)&cmd_obj_dma_to_device_queues, - (void *)&cmd_obj_dma_to_device_filename, - (void *)&cmd_obj_dma_to_device_dst_addr, - (void *)&cmd_obj_dma_to_device_size, - (void *)&cmd_obj_dma_to_device_loops, - NULL, - }, - -}; - -/* Command do-recv */ -struct cmd_obj_dma_from_device_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t queues; - cmdline_fixed_string_t filename; - cmdline_fixed_string_t src_addr; - cmdline_fixed_string_t size; - cmdline_fixed_string_t loops; -}; - -static void cmd_obj_dma_from_device_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_dma_from_device_result *res = parsed_result; - int i, ofd, offset, size, total_size, r_size = 0; - int mm_tdesc, mm_ld_size = 0; - int loop = 0, ret, j; - off_t ret_val; - int port_id = 0, num_queues = 0, input_size = 0, num_loops = 0; - uint64_t src_addr = 0; - unsigned int q_data_size = 0; - - cmdline_printf(cl, "recv on Port:%s, filename:%s\n", - res->port_id, res->filename); - - ofd = open(res->filename, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0666); - if (ofd < 0) { - cmdline_printf(cl, "Error: Invalid filename: %s\n", - res->filename); - return; - } - - { - port_id = atoi(res->port_id); - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", - port_id); - close(ofd); - return; - } - num_queues = atoi(res->queues); - if ((unsigned int)num_queues > pinfo[port_id].num_queues) { - cmdline_printf(cl, "Error: num-queues:%d are more than " - "the configured queues:%d,\n" - "Please enter valid number of queues\n", - num_queues, pinfo[port_id].num_queues); - close(ofd); - return; - } - if (num_queues == 0) { - cmdline_printf(cl, "Error: Please enter valid number " - "of queues\n"); - close(ofd); - return; - } - input_size = atoi(res->size); - num_loops = atoi(res->loops); - src_addr = atoi(res->src_addr); -#ifndef PERF_BENCHMARK - if (src_addr + input_size > BRAM_SIZE) { - cmdline_printf(cl, "Error: (src_addr %ld + input " - "size %d) shall be less than " - "BRAM_SIZE %d.\n", src_addr, - input_size, BRAM_SIZE); - close(ofd); - return; - } -#endif - /* Restrict C2H zerobyte support to ST-mode queues*/ - if (input_size == 0) { - if ((unsigned int)num_queues > - pinfo[port_id].st_queues) { - cmdline_printf(cl, "Error: Zero-length support " - "is for queues with ST-mode only\n"); - close(ofd); - return; - } - } - - if (input_size % num_queues) { - size = input_size / num_queues; - r_size = input_size % num_queues; - } else - size = input_size / num_queues; - - do { - total_size = input_size; - src_addr = atoi(res->src_addr); - q_data_size = 0; - /* Transmit data on the number of Queues configured - * from the input file - */ - for (i = 0, j = 0; i < num_queues; i++, j++) { - src_addr += q_data_size; - src_addr %= BRAM_SIZE; - - if ((unsigned int)i >= - pinfo[port_id].st_queues) { - ret = - rte_pmd_qdma_set_mm_endpoint_addr( - port_id, - i, - RTE_PMD_QDMA_RX, - src_addr); - if (ret < 0) { - close(ofd); - return; - } - } - - if (total_size == (r_size + size)) { - q_data_size = total_size; - total_size = 0; - } else { - q_data_size = size; - total_size -= size; - } - - if (q_data_size >= pinfo[port_id].buff_size) { - if (q_data_size % - pinfo[port_id].buff_size) { - mm_tdesc = (q_data_size / - pinfo[port_id].buff_size) + 1; - - mm_ld_size = q_data_size % - pinfo[port_id].buff_size; - } else - mm_tdesc = (q_data_size / - pinfo[port_id].buff_size); - } else { - mm_tdesc = 1; - mm_ld_size = q_data_size % - pinfo[port_id].buff_size; - } - - if (port_id) - offset = (input_size/num_queues) * j; - else - offset = (input_size/num_queues) * i; - - ret_val = lseek(ofd, offset, SEEK_SET); - if (ret_val == (off_t)-1) { - cmdline_printf(cl, "DMA-to-Device: " - "lseek func failed\n"); - close(ofd); - return; - } - - cmdline_printf(cl, "DMA-from-Device: with " - "input-size:%d, ld_size:%d, " - "tot_num_desc:%d\n", - input_size, mm_ld_size, - mm_tdesc); - - if ((unsigned int)i < - (pinfo[port_id].st_queues)) - ret = do_recv_st(port_id, ofd, i, - q_data_size); - else - ret = do_recv_mm(port_id, ofd, i, - mm_ld_size, - mm_tdesc); - if (ret < 0) { - close(ofd); - return; - } - - ret_val = lseek(ofd, offset, SEEK_END); - if (ret_val == (off_t)-1) { - cmdline_printf(cl, "DMA-to-Device: " - "lseek func failed\n"); - close(ofd); - return; - } - } - ++loop; - } while (loop < num_loops); - close(ofd); - } - cmdline_printf(cl, "\n####### DMA transfer from device is completed " - "successfully #######\n"); -} - -cmdline_parse_token_string_t cmd_obj_action_dma_from_device = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_from_device_result, action, - "dma_from_device"); -cmdline_parse_token_string_t cmd_obj_dma_from_device_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_from_device_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_dma_from_device_queues = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_from_device_result, queues, - NULL); -cmdline_parse_token_string_t cmd_obj_dma_from_device_filename = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_from_device_result, - filename, NULL); -cmdline_parse_token_string_t cmd_obj_dma_from_device_src_addr = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_from_device_result, - src_addr, NULL); -cmdline_parse_token_string_t cmd_obj_dma_from_device_size = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_from_device_result, size, - NULL); -cmdline_parse_token_string_t cmd_obj_dma_from_device_loops = - TOKEN_STRING_INITIALIZER(struct cmd_obj_dma_from_device_result, loops, - NULL); - -cmdline_parse_inst_t cmd_obj_dma_from_device = { - .f = cmd_obj_dma_from_device_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "dma_from_device port_id num-queues filename " - "src_addr size loops", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_dma_from_device, - (void *)&cmd_obj_dma_from_device_port_id, - (void *)&cmd_obj_dma_from_device_queues, - (void *)&cmd_obj_dma_from_device_filename, - (void *)&cmd_obj_dma_from_device_src_addr, - (void *)&cmd_obj_dma_from_device_size, - (void *)&cmd_obj_dma_from_device_loops, - NULL, - }, - -}; - -struct cmd_obj_reg_dump_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; -}; - -static void cmd_obj_reg_dump_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_reg_dump_result *res = parsed_result; - - - int bar_id; - int port_id = atoi(res->port_id); - - bar_id = pinfo[port_id].config_bar_idx; - if (bar_id < 0) { - cmdline_printf(cl, "Error: fetching QDMA config BAR-id " - "on port-id:%d not supported\n Please enter " - "valid port-id\n", port_id); - return; - } - cmdline_printf(cl, "Register dump on cofig BAR-id:%d with Port-id:%s\n", - bar_id, res->port_id); - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", - port_id); - return; - } - rte_pmd_qdma_dbg_regdump(port_id); -} - -cmdline_parse_token_string_t cmd_obj_action_reg_dump = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_dump_result, action, - "reg_dump"); -cmdline_parse_token_string_t cmd_obj_reg_dump_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_dump_result, port_id, NULL); - -cmdline_parse_inst_t cmd_obj_reg_dump = { - .f = cmd_obj_reg_dump_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "reg_dump port-id", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_reg_dump, - (void *)&cmd_obj_reg_dump_port_id, - NULL, - }, - -}; - - -/* Command Read Info addr */ -struct cmd_obj_reg_info_read_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t reg_addr; - cmdline_fixed_string_t num_regs; -}; - -static void cmd_obj_reg_info_read_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_reg_info_read_result *res = parsed_result; - - cmdline_printf(cl, "Read Reg info Port:%s, Address:%s, Num Regs: %s\n\n", - res->port_id, res->reg_addr, res->num_regs); - - int reg_addr = strtol(res->reg_addr, NULL, NUMERICAL_BASE_HEXADECIMAL); - - if (reg_addr % ALIGN_TO_WORD_BYTES) { - cmdline_printf(cl, "ERROR: Read address must aligned to " - "a 4-byte boundary.\n\n"); - } else { - int port_id = atoi(res->port_id); - int num_regs = atoi(res->num_regs); - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", - port_id); - return; - } - rte_pmd_qdma_dbg_reg_info_dump(port_id, num_regs,reg_addr); - } -} - -cmdline_parse_token_string_t cmd_obj_action_reg_info_read = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_info_read_result, action, - "reg_info_read"); -cmdline_parse_token_string_t cmd_obj_reg_info_read_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_info_read_result, port_id, NULL); -cmdline_parse_token_string_t cmd_obj_reg_info_read_reg_addr = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_info_read_result, reg_addr, NULL); -cmdline_parse_token_string_t cmd_obj_reg_info_read_num_regs = - TOKEN_STRING_INITIALIZER(struct cmd_obj_reg_info_read_result, num_regs, NULL); - -cmdline_parse_inst_t cmd_obj_reg_info_read = { - .f = cmd_obj_reg_info_read_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "reg_info_read port-id reg-addr", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_reg_info_read, - (void *)&cmd_obj_reg_info_read_port_id, - (void *)&cmd_obj_reg_info_read_reg_addr, - (void *)&cmd_obj_reg_info_read_num_regs, - NULL, - }, - -}; - - -/*Command queue-context dump*/ - -struct cmd_obj_queue_dump_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t queue_id; -}; - -static void cmd_obj_queue_dump_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_queue_dump_result *res = parsed_result; - - cmdline_printf(cl, "queue-dump on Port:%s, queue-id:%s\n\n", - res->port_id, res->queue_id); - - { - int port_id = atoi(res->port_id); - int qid = atoi(res->queue_id); - int bar_id = 0x0; - - bar_id = pinfo[port_id].config_bar_idx; - if (bar_id < 0) { - cmdline_printf(cl, "Error: fetching QDMA config BAR-id " - "on port-id:%d not supported\n Please " - "enter valid port-id\n", port_id); - return; - } - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", - port_id); - return; - } - if ((unsigned int)qid >= pinfo[port_id].num_queues) { - cmdline_printf(cl, "Error: queue-id:%d is greater than " - "the number of confgiured queues in " - "the port\n Please enter valid " - "queue-id\n", qid); - return; - } - rte_pmd_qdma_dbg_qinfo(port_id, qid); - } -} - -cmdline_parse_token_string_t cmd_obj_action_queue_dump = - TOKEN_STRING_INITIALIZER(struct cmd_obj_queue_dump_result, action, - "queue_dump"); -cmdline_parse_token_string_t cmd_obj_queue_dump_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_queue_dump_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_queue_dump_queue_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_queue_dump_result, queue_id, - NULL); - -cmdline_parse_inst_t cmd_obj_queue_dump = { - .f = cmd_obj_queue_dump_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "queue_dump port-id queue_id", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_queue_dump, - (void *)&cmd_obj_queue_dump_port_id, - (void *)&cmd_obj_queue_dump_queue_id, - NULL, - }, - -}; - -/*Command queue-stats dump*/ - -struct cmd_obj_qstats_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t queue_id; -}; - -static void cmd_obj_qstats_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_qstats_result *res = parsed_result; - - cmdline_printf(cl, "queue-dump on Port:%s, queue-id:%s\n\n", - res->port_id, res->queue_id); - - { - int port_id = atoi(res->port_id); - int qid = atoi(res->queue_id); - int bar_id = 0x0; - - bar_id = pinfo[port_id].config_bar_idx; - if (bar_id < 0) { - cmdline_printf(cl, "Error: fetching QDMA config BAR-id " - "on port-id:%d not supported\n Please " - "enter valid port-id\n", port_id); - return; - } - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", - port_id); - return; - } - if ((unsigned int)qid >= pinfo[port_id].num_queues) { - cmdline_printf(cl, "Error: queue-id:%d is greater than " - "the number of confgiured queues in " - "the port\n Please enter valid " - "queue-id\n", qid); - return; - } - rte_pmd_qdma_qstats(port_id, qid); - } -} - -cmdline_parse_token_string_t cmd_obj_action_qstats = - TOKEN_STRING_INITIALIZER(struct cmd_obj_qstats_result, action, - "qstats"); -cmdline_parse_token_string_t cmd_obj_qstats_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_qstats_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_qstats_queue_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_qstats_result, queue_id, - NULL); - -cmdline_parse_inst_t cmd_obj_qstats = { - .f = cmd_obj_qstats_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "qstats port-id queue_id", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_qstats, - (void *)&cmd_obj_qstats_port_id, - (void *)&cmd_obj_qstats_queue_id, - NULL, - }, - -}; - -/*Command queue-stats-cleaar dump*/ - -struct cmd_obj_qstats_clr_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t queue_id; -}; - -static void cmd_obj_qstats_clr_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_qstats_clr_result *res = parsed_result; - - cmdline_printf(cl, "queue-dump on Port:%s, queue-id:%s\n\n", - res->port_id, res->queue_id); - - { - int port_id = atoi(res->port_id); - int qid = atoi(res->queue_id); - int bar_id = 0x0; - - bar_id = pinfo[port_id].config_bar_idx; - if (bar_id < 0) { - cmdline_printf(cl, "Error: fetching QDMA config BAR-id " - "on port-id:%d not supported\n Please " - "enter valid port-id\n", port_id); - return; - } - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n " - "Please enter valid port-id\n", - port_id); - return; - } - if ((unsigned int)qid >= pinfo[port_id].num_queues) { - cmdline_printf(cl, "Error: queue-id:%d is greater than " - "the number of confgiured queues in " - "the port\n Please enter valid " - "queue-id\n", qid); - return; - } - rte_pmd_qdma_qstats_clear(port_id, qid); - } -} - -cmdline_parse_token_string_t cmd_obj_action_qstats_clr = - TOKEN_STRING_INITIALIZER(struct cmd_obj_qstats_clr_result, action, - "qstats_clr"); -cmdline_parse_token_string_t cmd_obj_qstats_clr_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_qstats_clr_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_qstats_clr_queue_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_qstats_clr_result, queue_id, - NULL); - -cmdline_parse_inst_t cmd_obj_qstats_clr = { - .f = cmd_obj_qstats_clr_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "qstats_clr port-id queue_id", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_qstats_clr, - (void *)&cmd_obj_qstats_clr_port_id, - (void *)&cmd_obj_qstats_clr_queue_id, - NULL, - }, - -}; - -/* Command descriptor dump */ - -struct cmd_obj_desc_dump_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t port_id; - cmdline_fixed_string_t queue_id; -}; - -static void cmd_obj_desc_dump_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_desc_dump_result *res = parsed_result; - int start; - int end; - - cmdline_printf(cl, "Descriptor-dump on Port:%s, queue-id:%s\n\n", - res->port_id, res->queue_id); - { - int port_id = atoi(res->port_id); - int qid = atoi(res->queue_id); - if (port_id >= num_ports) { - cmdline_printf(cl, "Error: port-id:%d not supported\n" - "Please enter valid port-id\n", - port_id); - return; - } - if ((unsigned int)qid >= pinfo[port_id].num_queues) { - cmdline_printf(cl, "Error: queue-id:%d is greater than " - "the number of confgiured queues in " - "the port\n Please enter valid " - "queue-id\n", qid); - return; - } - - start = 0; - end = pinfo[port_id].nb_descs - 1; - rte_pmd_qdma_dbg_qdesc(port_id, qid, start, - end, RTE_PMD_QDMA_XDEBUG_DESC_C2H); - - rte_pmd_qdma_dbg_qdesc(port_id, qid, start, - end, RTE_PMD_QDMA_XDEBUG_DESC_H2C); - - if ((unsigned int)qid < pinfo[port_id].st_queues) { - rte_pmd_qdma_dbg_qdesc(port_id, qid, start, - end, RTE_PMD_QDMA_XDEBUG_DESC_CMPT); - } - } -} - -cmdline_parse_token_string_t cmd_obj_action_desc_dump = - TOKEN_STRING_INITIALIZER(struct cmd_obj_desc_dump_result, action, - "desc_dump"); -cmdline_parse_token_string_t cmd_obj_desc_dump_port_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_desc_dump_result, port_id, - NULL); -cmdline_parse_token_string_t cmd_obj_desc_dump_queue_id = - TOKEN_STRING_INITIALIZER(struct cmd_obj_desc_dump_result, queue_id, - NULL); - -cmdline_parse_inst_t cmd_obj_desc_dump = { - .f = cmd_obj_desc_dump_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "desc_dump port-id queue_id", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_desc_dump, - (void *)&cmd_obj_desc_dump_port_id, - (void *)&cmd_obj_desc_dump_queue_id, - NULL, - }, - -}; - -/*Command load commands from file */ - -struct cmd_obj_load_cmds_result { - cmdline_fixed_string_t action; - cmdline_fixed_string_t filename; -}; - -static void cmd_obj_load_cmds_parsed(void *parsed_result, - struct cmdline *cl, - __attribute__((unused)) void *data) -{ - struct cmd_obj_load_cmds_result *res = parsed_result; - FILE *fp; - char buff[256]; - - cmdline_printf(cl, "load-cmds from file:%s\n\n", res->filename); - fp = fopen((const char *)res->filename, "r"); - if (fp == NULL) { - cmdline_printf(cl, "Error: Invalid filename: %s\n", - res->filename); - return; - } - - - struct rdline *rdl = cmdline_get_rdline(cl); - rdline_reset(rdl); - { - cmdline_in(cl, "\r", 1); - while (fgets(buff, sizeof(buff), fp)) - cmdline_in(cl, buff, strlen(buff)); - - cmdline_in(cl, "\r", 1); - } - fclose(fp); -} - -cmdline_parse_token_string_t cmd_obj_action_load_cmds = - TOKEN_STRING_INITIALIZER(struct cmd_obj_load_cmds_result, action, - "load_cmds"); -cmdline_parse_token_string_t cmd_obj_load_cmds_filename = - TOKEN_STRING_INITIALIZER(struct cmd_obj_load_cmds_result, filename, - NULL); - -cmdline_parse_inst_t cmd_obj_load_cmds = { - .f = cmd_obj_load_cmds_parsed, /* function to call */ - .data = NULL, /* 2nd arg of func */ - .help_str = "load_cmds file-name", - .tokens = { /* token list, NULL terminated */ - (void *)&cmd_obj_action_load_cmds, - (void *)&cmd_obj_load_cmds_filename, - NULL, - }, - -}; - -/* CONTEXT (list of instruction) */ - -cmdline_parse_ctx_t main_ctx[] = { - (cmdline_parse_inst_t *)&cmd_obj_port_init, - (cmdline_parse_inst_t *)&cmd_obj_port_close, - (cmdline_parse_inst_t *)&cmd_obj_port_reset, - (cmdline_parse_inst_t *)&cmd_obj_port_remove, - (cmdline_parse_inst_t *)&cmd_obj_reg_read, - (cmdline_parse_inst_t *)&cmd_obj_reg_write, - (cmdline_parse_inst_t *)&cmd_obj_dma_to_device, - (cmdline_parse_inst_t *)&cmd_obj_dma_from_device, - (cmdline_parse_inst_t *)&cmd_obj_reg_dump, - (cmdline_parse_inst_t *)&cmd_obj_reg_info_read, - (cmdline_parse_inst_t *)&cmd_obj_queue_dump, - (cmdline_parse_inst_t *)&cmd_obj_qstats, - (cmdline_parse_inst_t *)&cmd_obj_qstats_clr, - (cmdline_parse_inst_t *)&cmd_obj_desc_dump, - (cmdline_parse_inst_t *)&cmd_obj_load_cmds, - (cmdline_parse_inst_t *)&cmd_help, - NULL, -}; diff --git a/QDMA/DPDK/examples/qdma_testapp/commands.h b/QDMA/DPDK/examples/qdma_testapp/commands.h deleted file mode 100755 index e598e4b..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/commands.h +++ /dev/null @@ -1,38 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2010-2023 Intel Corporation. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _COMMANDS_H_ -#define _COMMANDS_H_ - -extern cmdline_parse_ctx_t main_ctx[]; -#endif /* _COMMANDS_H_ */ diff --git a/QDMA/DPDK/examples/qdma_testapp/parse_obj_list.c b/QDMA/DPDK/examples/qdma_testapp/parse_obj_list.c deleted file mode 100755 index f0f38ed..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/parse_obj_list.c +++ /dev/null @@ -1,197 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*- - * BSD LICENSE - * - * Copyright (c) 2010-2014 Intel Corporation. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (c) 2009, Olivier MATZ <zer0@droids-corp.org> - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the University of California, Berkeley nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdio.h> -#include <inttypes.h> -#include <stdarg.h> -#include <errno.h> -#include <ctype.h> -#include <string.h> -#include <netinet/in.h> - -#include <cmdline_parse.h> -#include <cmdline_parse_ipaddr.h> - -#include <rte_string_fns.h> - -#include "parse_obj_list.h" - -/* This file is an example of extension of libcmdline. It provides an - * example of objects stored in a list - */ - -struct cmdline_token_ops token_obj_list_ops = { - .parse = parse_obj_list, - .complete_get_nb = complete_get_nb_obj_list, - .complete_get_elt = complete_get_elt_obj_list, - .get_help = get_help_obj_list, -}; - -int -parse_obj_list(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res, - unsigned int buf_len) -{ - struct token_obj_list *tk2 = (struct token_obj_list *)tk; - struct token_obj_list_data *tkd = &tk2->obj_list_data; - struct object *obj = NULL; - unsigned int token_len = 0; - - if (*srcbuf == 0) - return -1; - - while (!cmdline_isendoftoken(srcbuf[token_len])) - token_len++; - - SLIST_FOREACH(obj, tkd->list, next) { - if (token_len != strnlen(obj->name, OBJ_NAME_LEN_MAX)) - continue; - if (strncmp(srcbuf, obj->name, token_len)) - continue; - break; - } - if (!obj) /* not found */ - return -1; - - /* store the address of object in structure */ - if (res) - *(struct object **)res = obj; - - return token_len; -} - -int complete_get_nb_obj_list(cmdline_parse_token_hdr_t *tk) -{ - struct token_obj_list *tk2 = (struct token_obj_list *)tk; - struct token_obj_list_data *tkd = &tk2->obj_list_data; - struct object *obj = NULL; - int ret = 0; - - SLIST_FOREACH(obj, tkd->list, next) { - ret++; - } - return ret; -} - -int complete_get_elt_obj_list(cmdline_parse_token_hdr_t *tk, - int idx, char *dstbuf, unsigned int size) -{ - struct token_obj_list *tk2 = (struct token_obj_list *)tk; - struct token_obj_list_data *tkd = &tk2->obj_list_data; - struct object *obj = NULL; - int i = 0; - unsigned int len; - - SLIST_FOREACH(obj, tkd->list, next) { - if (i++ == idx) - break; - } - if (!obj) - return -1; - - len = strnlen(obj->name, OBJ_NAME_LEN_MAX); - if ((len + 1) > size) - return -1; - - if (dstbuf) - snprintf(dstbuf, size, "%s", obj->name); - - return 0; -} - - -int get_help_obj_list(__attribute__((unused)) cmdline_parse_token_hdr_t *tk, - char *dstbuf, unsigned int size) -{ - snprintf(dstbuf, size, "Obj-List"); - return 0; -} diff --git a/QDMA/DPDK/examples/qdma_testapp/parse_obj_list.h b/QDMA/DPDK/examples/qdma_testapp/parse_obj_list.h deleted file mode 100755 index e35e9de..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/parse_obj_list.h +++ /dev/null @@ -1,147 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*- - * BSD LICENSE - * - * Copyright (c) 2010-2014 Intel Corporation. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (c) 2009, Olivier MATZ <zer0@droids-corp.org> - * All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the University of California, Berkeley nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _PARSE_OBJ_LIST_H_ -#define _PARSE_OBJ_LIST_H_ - -/* This file is an example of extension of libcmdline. It provides an - * example of objects stored in a list. - */ - -#include <sys/queue.h> -#include <cmdline_parse.h> - -#define OBJ_NAME_LEN_MAX 64 - -struct object { - SLIST_ENTRY(object) next; - char name[OBJ_NAME_LEN_MAX]; - cmdline_ipaddr_t ip; -}; - -/* define struct object_list */ -SLIST_HEAD(object_list, object); - -/* data is a pointer to a list */ -struct token_obj_list_data { - struct object_list *list; -}; - -struct token_obj_list { - struct cmdline_token_hdr hdr; - struct token_obj_list_data obj_list_data; -}; -typedef struct token_obj_list parse_token_obj_list_t; - -extern struct cmdline_token_ops token_obj_list_ops; - -int parse_obj_list(cmdline_parse_token_hdr_t *tk, const char *srcbuf, - void *res, unsigned int buf_len); -int complete_get_nb_obj_list(cmdline_parse_token_hdr_t *tk); -int complete_get_elt_obj_list(cmdline_parse_token_hdr_t *tk, int idx, - char *dstbuf, unsigned int size); -int get_help_obj_list(cmdline_parse_token_hdr_t *tk, char *dstbuf, - unsigned int size); - -#define TOKEN_OBJ_LIST_INITIALIZER(structure, field, obj_list_ptr) \ -{ \ - .hdr = { \ - .ops = &token_obj_list_ops, \ - .offset = offsetof(structure, field), \ - }, \ - .obj_list_data = { \ - .list = obj_list_ptr, \ - }, \ -} - -#endif /* _PARSE_OBJ_LIST_H_ */ diff --git a/QDMA/DPDK/examples/qdma_testapp/pcierw.c b/QDMA/DPDK/examples/qdma_testapp/pcierw.c deleted file mode 100755 index ed68303..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/pcierw.c +++ /dev/null @@ -1,56 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/ioctl.h> -#include <net/if.h> -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <rte_ethdev.h> -#include "../../drivers/net/qdma/rte_pmd_qdma.h" - - -#include "pcierw.h" - -unsigned int PciRead(unsigned int bar, unsigned int offset, int port_id) -{ - return rte_pmd_qdma_compat_pci_read_reg(port_id, bar, offset); -} - - -void PciWrite(unsigned int bar, unsigned int offset, unsigned int reg_val, - int port_id) -{ - rte_pmd_qdma_compat_pci_write_reg(port_id, bar, offset, reg_val); -} diff --git a/QDMA/DPDK/examples/qdma_testapp/pcierw.h b/QDMA/DPDK/examples/qdma_testapp/pcierw.h deleted file mode 100755 index e88f91c..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/pcierw.h +++ /dev/null @@ -1,43 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __PCIERW_H__ -#define __PCIERW_H__ - -unsigned int PciRead(unsigned int bar, unsigned int offset, int port_id); -void PciWrite(unsigned int bar, unsigned int offset, unsigned int reg_val, - int port_id); -void qdma_pci_write_reg(struct rte_eth_dev *dev, uint32_t bar, uint32_t reg, - uint32_t val); -uint32_t qdma_pci_read_reg(struct rte_eth_dev *dev, uint32_t bar, uint32_t reg); -#endif diff --git a/QDMA/DPDK/examples/qdma_testapp/qdma_regs.h b/QDMA/DPDK/examples/qdma_testapp/qdma_regs.h deleted file mode 100755 index aaf7022..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/qdma_regs.h +++ /dev/null @@ -1,231 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** Target definations **/ -#define QDMA_TRQ_SEL_GLBL 0x00000200 -#define QDMA_TRQ_SEL_FMAP 0x00000400 -#define QDMA_TRQ_SEL_IND 0x00000800 -#define QDMA_TRQ_SEL_C2H 0x00000A00 -#define QDMA_TRQ_SEL_H2H 0x00000E00 -#define QDMA_TRQ_SEL_C2H_MM0 0x00001000 -#define QDMA_TRQ_SEL_H2C_MM0 0x00001200 -#define QDMA_TRQ_SEL_QUEUE_PF 0x00006400 - -#define QDMA_CONFIG_BLOCK_ID 0x1fd00000UL -/** Global registers **/ -#define QDMA_GLBL_RING_SZ 0x04 -#define QDMA_GLBL_SCRATCH 0x44 -#define QDMA_GLBL_WB_ACC 0x50 -#define QDMA_RING_SZ_MSK 0x0000ffff -#define QDMA_WB_ACC_MSK 0x00000007 - -/** Fmap registers **/ -#define QID_BASE_MSK (0x000007ff) -#define QID_MAX_MSK (0x003ff800) -#define QID_MAX_SHIFT_B (11) - -/** Queue Indirect programming commands **/ - -#define QDMA_IND_Q_PRG_OFF (0x4) - -#define QDMA_CNTXT_CMD_RD (2) - -#define QDMA_CNTXT_SEL_DESC_SW_C2H (0) -#define QDMA_CNTXT_SEL_DESC_SW_H2C (1) -#define QDMA_CNTXT_SEL_DESC_HW_C2H (2) -#define QDMA_CNTXT_SEL_DESC_HW_H2C (3) -#define QDMA_CNTXT_SEL_DESC_CMPT (6) -#define QDMA_CNTXT_SEL_PFTCH (7) - -#define QID_SHIFT_B (7) -#define OP_CODE_SHIFT_B (5) -#define CTXT_SEL_SHIFT_B (1) -#define BUSY_BIT_MSK (1) - -#define WB_EN_SHIFT_B (20) -#define MM_CHAN_SHIFT_B (19) -#define MM_DESC_SZ_SHIFT_B (17) -#define ST_H2C_DESC_SZ_SHIFT_B (16) -#define DESC_RING_SZ_SHIFT_B (12) -#define ST_H2C_DESC_SZ_SHIFT_B (16) -#define MM_DESC_SZ_WB_SHIFT_B (29) -#define C2H_WB_CTXT_V_SHIFT_B (24) - -/** C2H target registers **/ -#define QDMA_C2H_CNT_TH_BASE 0x40 -#define QDMA_C2H_BUF_SZ_BASE 0xB0 - -/** PF Queue index registers */ -#define QDMA_H2C_PIDX_Q_OFF (0x04) -#define QDMA_C2H_PIDX_Q_OFF (0x08) -#define QDMA_SEL_CMPT_CIDX_Q_OFF (0x0c) - - -/** QDMA Target registers **/ -#define QDMA_C2H_MM0_CONTROL 0x00000004 -#define QDMA_H2C_MM0_CONTROL 0x00000004 -#define QDMA_MM_CTRL_START (1 << 0) - -/** QDMA Descriptor definations **/ -#define QDMA_DESC_SOP 0x1 -#define QDMA_DESC_EOP 0x1 -#define QDMA_DESC_VALID 0x1 - - -/** Queue Indirect programming registers **/ -struct __attribute__ ((packed)) q_ind_prg -{ - uint32_t ctxt_data[8]; - uint32_t ctxt_mask[8]; - uint32_t ctxt_cmd; -}; - -union __attribute__ ((packed)) h2c_c2h_ctxt -{ - struct __attribute__ ((packed)) ctxt_data - { - uint32_t data[5]; - } c_data; - struct __attribute__ ((packed)) ctxt_fields - { - uint16_t pidx; - uint16_t irq_ack:1; - uint16_t fnc_id:8; - uint16_t rsv0:7; - uint16_t qen:1; - uint16_t fcrd_en:1; - uint16_t wbi_chk:1; - uint16_t wbi_acc_en:1; - uint16_t at:1; - uint16_t fetch_max:3; - uint16_t rsv1:4; - uint16_t rng_sz:4; - uint16_t dsc_sz:2; - uint16_t byp:1; - uint16_t mm_chn:1; - uint16_t wbk_en:1; - uint16_t irq_en:1; - uint16_t port_id:3; - uint16_t irq_no_last:1; - uint16_t err:2; - uint16_t err_wb_sent:1; - uint16_t irq_req:1; - uint16_t mrkr_dis:1; - uint16_t is_mm:1; - uint64_t dsc_base; - uint16_t int_vec:11; - uint16_t int_aggr:1; - } c_fields; -}; - -union __attribute__ ((packed)) c2h_cmpt_ctxt -{ - struct __attribute__ ((packed)) c2h_cmpt_data - { - uint32_t data[5]; - } c_data; - struct __attribute__ ((packed)) c2h_cmpt_fields - { - uint32_t en_stat_desc:1; - uint32_t en_int:1; - uint32_t trig_mode:3; - uint32_t fnc_id:12; - uint32_t count_idx:4; - uint32_t timer_idx:4; - uint32_t int_st:2; - uint32_t color:1; - uint32_t size:4; - uint32_t cmpt_dsc_base_l; - uint32_t cmpt_dsc_base_h:26; - uint32_t desc_sz:2; - uint32_t pidx:16; - uint32_t cidx:16; - uint32_t valid:1; - uint32_t err:2; - uint32_t usr_trig_pend:1; - uint32_t timer_run:1; - uint32_t full_upd:1; - uint32_t ovf_chk_dis:1; - uint32_t at:1; - } c_fields; -}; - -union __attribute__ ((packed)) h2c_c2h_hw_ctxt -{ - struct __attribute__ ((packed)) hw_ctxt_data - { - uint32_t data[2]; - } c_data; - struct __attribute__ ((packed)) hw_ctxt_fields - { - uint32_t cidx:16; - uint32_t crd_use:16; - uint32_t rsvd0:8; - uint32_t pnd:1; - uint32_t idl_stp_b:1; - uint32_t event_pend:1; - uint32_t fetch_pend:4; - uint32_t rsvd1:1; - } c_fields; -}; - -union __attribute__ ((packed)) prefetch_ctxt -{ - struct __attribute__ ((packed)) pref_ctxt_data - { - uint32_t data[2]; - } c_data; - - struct __attribute__ ((packed)) pref_ctxt_fields - { - uint8_t bypass:1; - uint8_t buf_sz_idx:4; - uint8_t port_id:3; - uint32_t rsvd:18; - uint8_t err:1; - uint8_t pfch_en:1; - uint8_t pfch:1; - uint16_t sw_crdt:16; - uint8_t valid:1; - } c_fields; -}; - -#define PIDX_MSK (0) -#define Q_STATUS_MSK (0) -#define Q_STATUS_EN_MSK (3) -#define Q_STATUS_RST_MSK (1) -#define WBI_CHK_MSK (6) -#define WBI_ACC_EN_MSK (7) -#define FUNC_ID_MSK (8) -#define RING_SZ_MSK (16) -#define DESC_SZ_MSK (16) diff --git a/QDMA/DPDK/examples/qdma_testapp/testapp.c b/QDMA/DPDK/examples/qdma_testapp/testapp.c deleted file mode 100755 index e8d7703..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/testapp.c +++ /dev/null @@ -1,1118 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <stdio.h> -#include <string.h> /**> memset */ -#include <signal.h> -#include <termios.h> -#include <rte_eal.h> /**> rte_eal_init */ -#include <rte_debug.h> /**> for rte_panic */ -#include <rte_ethdev.h> /**> rte_eth_rx_burst */ -#include <rte_errno.h> /**> rte_errno global var */ -#include <rte_memzone.h> /**> rte_memzone_dump */ -#include <rte_memcpy.h> -#include <rte_malloc.h> -#include <rte_cycles.h> -#include <rte_log.h> -#include <rte_string_fns.h> -#include <rte_spinlock.h> -#include <cmdline_rdline.h> -#include <cmdline_parse.h> -#include <cmdline_socket.h> -#include <cmdline.h> -#include <time.h> /** For SLEEP **/ -#include <getopt.h> -#include <unistd.h> -#include <fcntl.h> -#include <rte_mbuf.h> - -#include "pcierw.h" -#include "commands.h" -#include "qdma_regs.h" -#include "testapp.h" -#include "../../drivers/net/qdma/rte_pmd_qdma.h" - -#define RTE_LIBRTE_QDMA_PMD 1 - -int num_ports; -char *filename; - -struct port_info pinfo[QDMA_MAX_PORTS]; - -int do_recv_mm(int port_id, int fd, int queueid, int ld_size, int tot_num_desc) -{ - struct rte_mbuf *pkts[NUM_RX_PKTS] = { NULL }; - int nb_rx = 0, i = 0, ret = 0, num_pkts; - int tdesc; -#ifdef PERF_BENCHMARK - uint64_t prev_tsc, cur_tsc, diff_tsc; -#endif - - if (tot_num_desc == 0) { - printf("Error: tot_num_desc : invalid value\n"); - return -1; - } - - rte_spinlock_lock(&pinfo[port_id].port_update_lock); - - if (rte_pmd_qdma_get_device(port_id) == NULL) { - printf("Port id %d already removed. " - "Relaunch application to use the port again\n", - port_id); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } - - printf("recv start num-desc: %d, with data-len: %u, " - "last-desc-size:%d\n", - tot_num_desc, pinfo[port_id].buff_size, ld_size); - tdesc = tot_num_desc; - if (ld_size) - tdesc--; - - while (tdesc) { - if (tdesc > NUM_RX_PKTS) - num_pkts = NUM_RX_PKTS; - else - num_pkts = tdesc; -#ifdef PERF_BENCHMARK - prev_tsc = rte_rdtsc_precise(); -#endif - /* try to receive RX_BURST_SZ packets */ - nb_rx = rte_eth_rx_burst(port_id, queueid, pkts, num_pkts); - -#ifdef PERF_BENCHMARK - cur_tsc = rte_rdtsc_precise(); - diff_tsc = cur_tsc - prev_tsc; -#endif - - if (nb_rx == 0) { - printf("Error: dma_from_device failed to " - "receive packets\n"); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } -#ifdef PERF_BENCHMARK - /* Calculate average operations processed per second */ - double pkts_per_second = ((double)nb_rx * rte_get_tsc_hz() / - diff_tsc); - - /* Calculate average throughput (Gbps) in bits per second */ - double throughput_gbps = ((pkts_per_second * - pinfo[port_id].buff_size) / 1000000000); - printf("Throughput GBps %lf\n", throughput_gbps); - printf("%16s%16s%16s%16s%16s%16s%16s\n\n", - "Buf Size", "Burst Size", - "pps", "Gbps", "freq", "Cycles", - "Cycles/Buf"); - - printf("%16u%16u%16.4lf%16.4lf%16 " - ""PRIu64"%16"PRIu64"%16"PRIu64"\n", - pinfo[port_id].buff_size, - nb_rx, - pkts_per_second, - throughput_gbps, - rte_get_tsc_hz(), - diff_tsc, - diff_tsc/nb_rx); -#endif - - for (i = 0; i < nb_rx; i++) { - struct rte_mbuf *mb = pkts[i]; - ret = write(fd, rte_pktmbuf_mtod(mb, void*), - pinfo[port_id].buff_size); - rte_pktmbuf_free(mb); -#ifndef PERF_BENCHMARK - printf("recv count: %d, with data-len: %d\n", i, ret); -#endif - } - tdesc = tdesc - nb_rx; - } - if (ld_size) { - struct rte_mbuf *mb; - nb_rx = rte_eth_rx_burst(port_id, queueid, pkts, 1); - if (nb_rx != 0) { - mb = pkts[0]; - ret = write(fd, rte_pktmbuf_mtod(mb, void*), ld_size); - rte_pktmbuf_free(mb); - } - } - fsync(fd); - - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - ret = 0; - - printf("DMA received number of packets: %d, on queue-id:%d\n", - nb_rx, queueid); - return ret; -} - -int do_recv_st(int port_id, int fd, int queueid, int input_size) -{ - struct rte_mbuf *pkts[NUM_RX_PKTS] = { NULL }; - int nb_rx = 0, ret = 0, tmp = 0, num_pkts, nb_pkts; - int reg_val, loopback_en; - int regval; - int user_bar_idx; - struct rte_mbuf *nxtmb; - int qbase = pinfo[port_id].queue_base, diag; - unsigned int max_completion_size, last_pkt_size = 0, total_rcv_pkts = 0; - unsigned int max_rx_retry, rcv_count = 0, num_pkts_recv = 0; - unsigned int i = 0, only_pkt = 0; - -#ifdef DUMP_MEMPOOL_USAGE_STATS - struct rte_mempool *mp; -#endif //DUMP_MEMPOOL_USAGE_STATS - - rte_spinlock_lock(&pinfo[port_id].port_update_lock); - - if (rte_pmd_qdma_get_device(port_id) == NULL) { - printf("Port id %d already removed. " - "Relaunch application to use the port again\n", - port_id); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } - -#ifdef DUMP_MEMPOOL_USAGE_STATS - mp = rte_mempool_lookup(pinfo[port_id].mem_pool); - - /* get the mempool from which to acquire buffers */ - if (mp == NULL) { - printf("Could not find mempool with name %s\n", - pinfo[port_id].mem_pool); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } -#endif //DUMP_MEMPOOL_USAGE_STATS - - user_bar_idx = pinfo[port_id].user_bar_idx; - PciWrite(user_bar_idx, C2H_ST_QID_REG, (queueid + qbase), port_id); - - reg_val = PciRead(user_bar_idx, C2H_CONTROL_REG, port_id); - reg_val &= C2H_CONTROL_REG_MASK; - loopback_en = reg_val & ST_LOOPBACK_EN; - - /* As per hardware design a single completion will point to atmost - * 7 descriptors. So If the size of the buffer in descriptor is 4KB , - * then a single completion which corresponds a packet can give you - * atmost 28KB data. - * - * As per this when testing sizes beyond 28KB, one needs to split it - * up in chunks of 28KB, example : to test 56KB data size, set 28KB - * as packet length in AXI Master Lite BAR(user bar) 0x04 register and no of packets as 2 - * in AXI Master Lite BAR(user bar) 0x20 register this would give you completions or - * packets, which needs to be combined as one in application. - */ - - if (!loopback_en) - max_completion_size = pinfo[port_id].buff_size * 7; - else { - /* For loopback case, each packet handles 4KB only, - * so limiting to buffer size. - */ - max_completion_size = pinfo[port_id].buff_size; - } - - /* Calculate number of packets to receive and programming AXI Master Lite bar(user bar) */ - if (input_size == 0) /* zerobyte support uses one descriptor */ - num_pkts = 1; - else if (input_size % max_completion_size != 0) { - num_pkts = input_size / max_completion_size; - last_pkt_size = input_size % max_completion_size; - } else - num_pkts = input_size / max_completion_size; - - if ((num_pkts == 0) && last_pkt_size) { - num_pkts = 1; - only_pkt = 1; - } - - if (!loopback_en) { - PciWrite(user_bar_idx, C2H_PACKET_COUNT_REG, num_pkts, port_id); - - if (num_pkts > 1) - PciWrite(user_bar_idx, C2H_ST_LEN_REG, - max_completion_size, port_id); - else if ((only_pkt == 1) && (last_pkt_size)) - PciWrite(user_bar_idx, C2H_ST_LEN_REG, - last_pkt_size, port_id); - else if (input_size == 0) - PciWrite(user_bar_idx, C2H_ST_LEN_REG, input_size, - port_id); - else if (num_pkts == 1) - PciWrite(user_bar_idx, C2H_ST_LEN_REG, - max_completion_size, port_id); - - /* Start the C2H Engine */ - reg_val |= ST_C2H_START_VAL; - PciWrite(user_bar_idx, C2H_CONTROL_REG, reg_val, - port_id); - regval = PciRead(user_bar_idx, C2H_PACKET_COUNT_REG, port_id); - printf("BAR-%d is the QDMA C2H number of packets:0x%x,\n", - user_bar_idx, regval); - } - - while (num_pkts) { - if (num_pkts > NUM_RX_PKTS) - nb_pkts = NUM_RX_PKTS; - else - nb_pkts = num_pkts; - - max_rx_retry = RX_TX_MAX_RETRY; - - if ((only_pkt == 1) && (last_pkt_size)) - last_pkt_size = 0; - - /* Immediate data Enabled*/ - if ((reg_val & ST_C2H_IMMEDIATE_DATA_EN)) { - /* payload received is zero for the immediate data case. - * Therefore, no need to call the rx_burst function - * again in this case and set the num_pkts to nb_rx - * which is always Zero. - */ - diag = rte_pmd_qdma_set_immediate_data_state(port_id, - queueid, 1); - if (diag < 0) { - printf("rte_pmd_qdma_set_immediate_data_state : " - "failed\n"); - rte_spinlock_unlock( - &pinfo[port_id].port_update_lock); - return -1; - } - - nb_rx = rte_eth_rx_burst(port_id, queueid, pkts, - nb_pkts); - num_pkts = num_pkts_recv = nb_rx; - - /* Reset the queue's DUMP_IMMEDIATE_DATA mode */ - diag = rte_pmd_qdma_set_immediate_data_state(port_id, - queueid, 0); - if (diag < 0) { - printf("rte_pmd_qdma_set_immediate_data_state : " - "failed\n"); - rte_spinlock_unlock( - &pinfo[port_id].port_update_lock); - return -1; - } - } else { - /* try to receive RX_BURST_SZ packets */ - - nb_rx = rte_eth_rx_burst(port_id, queueid, pkts, - nb_pkts); - - /* For zero byte packets, do not continue looping */ - if (input_size == 0) - break; - - tmp = nb_rx; - while ((nb_rx < nb_pkts) && max_rx_retry) { - rte_delay_us(1); - nb_pkts -= nb_rx; - nb_rx = rte_eth_rx_burst(port_id, queueid, - &pkts[tmp], - nb_pkts); - tmp += nb_rx; - max_rx_retry--; - } - num_pkts_recv = tmp; - if ((max_rx_retry == 0) && (num_pkts_recv == 0)) { - printf("ERROR: rte_eth_rx_burst failed for " - "port %d queue id %d, Expected pkts = %d " - "Received pkts = %u\n", - port_id, queueid, - nb_pkts, num_pkts_recv); - break; - } - } - -#ifdef DUMP_MEMPOOL_USAGE_STATS - printf("%s(): %d: queue id = %d, mbuf_avail_count = %d, " - "mbuf_in_use_count = %d\n", - __func__, __LINE__, queueid, - rte_mempool_avail_count(mp), - rte_mempool_in_use_count(mp)); -#endif //DUMP_MEMPOOL_USAGE_STATS - for (i = 0; i < num_pkts_recv; i++) { - struct rte_mbuf *mb = pkts[i]; - while (mb != NULL) { - ret += write(fd, rte_pktmbuf_mtod(mb, void*), - rte_pktmbuf_data_len(mb)); - nxtmb = mb->next; - mb = nxtmb; - } - - mb = pkts[i]; - rte_pktmbuf_free(mb); -#ifndef PERF_BENCHMARK - printf("recv count: %u, with data-len: %d\n", - i + rcv_count, ret); -#endif - ret = 0; - } - rcv_count += i; -#ifdef DUMP_MEMPOOL_USAGE_STATS - printf("%s(): %d: queue id = %d, mbuf_avail_count = %d, " - "mbuf_in_use_count = %d, num_pkts_recv = %u\n", - __func__, __LINE__, queueid, - rte_mempool_avail_count(mp), - rte_mempool_in_use_count(mp), num_pkts_recv); -#endif //DUMP_MEMPOOL_USAGE_STATS - num_pkts = num_pkts - num_pkts_recv; - total_rcv_pkts += num_pkts_recv; - if ((num_pkts == 0) && last_pkt_size) { - num_pkts = 1; - if (!loopback_en) { - /* Stop the C2H Engine */ - reg_val = PciRead(user_bar_idx, - C2H_CONTROL_REG, - port_id); - reg_val &= C2H_CONTROL_REG_MASK; - reg_val &= ~(ST_C2H_START_VAL); - PciWrite(user_bar_idx, C2H_CONTROL_REG, reg_val, - port_id); - - /* Update number of packets as 1 and - * packet size as last packet length - */ - PciWrite(user_bar_idx, C2H_PACKET_COUNT_REG, - num_pkts, port_id); - - PciWrite(user_bar_idx, C2H_ST_LEN_REG, - last_pkt_size, port_id); - - /* Start the C2H Engine */ - reg_val = PciRead(user_bar_idx, - C2H_CONTROL_REG, - port_id); - reg_val &= C2H_CONTROL_REG_MASK; - reg_val |= ST_C2H_START_VAL; - PciWrite(user_bar_idx, C2H_CONTROL_REG, reg_val, - port_id); - } - last_pkt_size = 0; - continue; - } - } - /* Stop the C2H Engine */ - if (!loopback_en) { - reg_val = PciRead(user_bar_idx, C2H_CONTROL_REG, port_id); - reg_val &= C2H_CONTROL_REG_MASK; - reg_val &= ~(ST_C2H_START_VAL); - PciWrite(user_bar_idx, C2H_CONTROL_REG, reg_val, - port_id); - } - printf("DMA received number of packets: %u, on queue-id:%d\n", - total_rcv_pkts, queueid); - fsync(fd); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return 0; -} - -int do_xmit(int port_id, int fd, int queueid, int ld_size, int tot_num_desc, - int zbyte) -{ - struct rte_mempool *mp; - struct rte_mbuf *mb[NUM_TX_PKTS] = { NULL }; - int ret = 0, nb_tx, i = 0, tdesc, num_pkts = 0, total_tx = 0, reg_val; - int tmp = 0, user_bar_idx; - int qbase = pinfo[port_id].queue_base; - uint32_t max_tx_retry; - -#ifdef PERF_BENCHMARK - uint64_t prev_tsc, cur_tsc, diff_tsc; -#endif - - rte_spinlock_lock(&pinfo[port_id].port_update_lock); - - if (rte_pmd_qdma_get_device(port_id) == NULL) { - printf("Port id %d already removed. " - "Relaunch application to use the port again\n", - port_id); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } - - mp = rte_mempool_lookup(pinfo[port_id].mem_pool); - /* get the mempool from which to acquire buffers */ - if (mp == NULL) { - printf("Could not find mempool with name %s\n", - pinfo[port_id].mem_pool); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } - - tdesc = tot_num_desc; - user_bar_idx = pinfo[port_id].user_bar_idx; - - if (ld_size) - tdesc--; - - while (tdesc) { - if (tdesc > NUM_TX_PKTS) - num_pkts = NUM_TX_PKTS; - else - num_pkts = tdesc; - - max_tx_retry = RX_TX_MAX_RETRY; -#ifdef DUMP_MEMPOOL_USAGE_STATS - printf("%s(): %d: queue id %d, mbuf_avail_count = %d, " - "mbuf_in_use_count = %d", - __func__, __LINE__, queueid, - rte_mempool_avail_count(mp), - rte_mempool_in_use_count(mp)); -#endif //DUMP_MEMPOOL_USAGE_STATS - for (i = 0; i < num_pkts; i++) { - mb[i] = rte_pktmbuf_alloc(mp); - if (mb[i] == NULL) { - printf(" #####Cannot " - "allocate mbuf packet\n"); - rte_spinlock_unlock( - &pinfo[port_id].port_update_lock); - return -1; - } - - if (!zbyte) - ret = read(fd, rte_pktmbuf_mtod(mb[i], void *), - pinfo[port_id].buff_size); - if (ret < 0) { - printf("Error: Could not the read " - "input-file\n"); - rte_spinlock_unlock( - &pinfo[port_id].port_update_lock); - return -1; - } - mb[i]->nb_segs = 1; - mb[i]->next = NULL; - rte_pktmbuf_data_len(mb[i]) = (uint16_t)ret; - rte_pktmbuf_pkt_len(mb[i]) = (uint16_t)ret; - } - -#ifdef DUMP_MEMPOOL_USAGE_STATS - printf("%s(): %d: queue id %d, mbuf_avail_count = %d, " - "mbuf_in_use_count = %d, num_pkts_tx = %d", - __func__, __LINE__, queueid, - rte_mempool_avail_count(mp), - rte_mempool_in_use_count(mp), num_pkts); -#endif //DUMP_MEMPOOL_USAGE_STATS - - total_tx = num_pkts; - -#ifndef TANDEM_BOOT_SUPPORTED - PciWrite(user_bar_idx, C2H_ST_QID_REG, (queueid + qbase), - port_id); -#endif - /* try to transmit TX_BURST_SZ packets */ - -#ifdef PERF_BENCHMARK - prev_tsc = rte_rdtsc_precise(); -#endif - nb_tx = rte_eth_tx_burst(port_id, queueid, mb, num_pkts); -#ifdef PERF_BENCHMARK - cur_tsc = rte_rdtsc_precise(); - diff_tsc = cur_tsc - prev_tsc; - /* Calculate average operations processed per second */ - double pkts_per_second = ((double)nb_tx * rte_get_tsc_hz() / - diff_tsc); - - /* Calculate average throughput (Gbps) in bits per second */ - double throughput_gbps = ((pkts_per_second * - pinfo[port_id].buff_size) / 1000000000); - printf("Throughput GBps %lf\n", throughput_gbps); - printf("%12s%12s%12s%12s%12s%12s%12s\n\n", - "Buf Size", "Burst Size", - "pps", "Gbps", "freq", "Cycles", - "Cycles/Buf"); - - printf("%12u%12u%12.4lf%12.4lf%12" - ""PRIu64"%12"PRIu64"%12"PRIu64"\n", - pinfo[port_id].buff_size, - nb_tx, - pkts_per_second, - throughput_gbps, - rte_get_tsc_hz(), - diff_tsc, - diff_tsc/nb_tx); -#endif - tmp = nb_tx; - while ((nb_tx < num_pkts) && max_tx_retry) { - printf("Couldn't transmit all the packets: Expected = %d " - "Transmitted = %d.\n" - "Calling rte_eth_tx_burst again\n", - num_pkts, nb_tx); - rte_delay_us(1); - num_pkts -= nb_tx; - nb_tx = rte_eth_tx_burst(port_id, queueid, &mb[tmp], - num_pkts); - tmp += nb_tx; - max_tx_retry--; - } - - if ((max_tx_retry == 0)) { - for (i = tmp; i < total_tx; i++) - rte_pktmbuf_free(mb[i]); - if (tmp == 0) { - printf("ERROR: rte_eth_tx_burst failed " - "for port %d queue %d\n", - port_id, queueid); - break; - } - } - - tdesc = tdesc - tmp; - printf("\nDMA transmitted number of packets: %d, " - "on Queue-id:%d\n", - tmp, queueid); - } - - if (ld_size) { - mb[0] = rte_pktmbuf_alloc(mp); - if (mb[0] == NULL) { - printf(" #####Cannot allocate mbuf " - "packet\n"); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } - ret = read(fd, rte_pktmbuf_mtod(mb[0], void *), ld_size); - if (ret < 0) { - printf("Error: Could not read the input-file\n"); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } - mb[0]->nb_segs = 1; - mb[0]->next = NULL; - rte_pktmbuf_data_len(mb[0]) = (uint16_t)ret; - rte_pktmbuf_pkt_len(mb[0]) = (uint16_t)ret; - - nb_tx = rte_eth_tx_burst(port_id, queueid, mb, 1); - if (nb_tx == 0) - rte_pktmbuf_free(mb[0]); - } - -#ifndef TANDEM_BOOT_SUPPORTED - reg_val = PciRead(user_bar_idx, C2H_CONTROL_REG, port_id); - reg_val &= C2H_CONTROL_REG_MASK; - if (!(reg_val & ST_LOOPBACK_EN)) { - reg_val = PciRead(user_bar_idx, H2C_STATUS_REG, port_id); - printf("BAR-%d is the QDMA H2C transfer match: 0x%x,\n", - user_bar_idx, reg_val); - - /** TO clear H2C DMA write **/ - PciWrite(user_bar_idx, H2C_CONTROL_REG, 0x1, port_id); - } -#endif - - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return 0; -} - -static int dev_reset_callback(uint16_t port_id, - enum rte_eth_event_type type, - void *param __rte_unused, void *ret_param) -{ - int ret = 0; - - RTE_SET_USED(ret_param); - printf("%s is received\n", __func__); - - if (type != RTE_ETH_EVENT_INTR_RESET) { - printf("Error: Invalid event value. " - "Expected = %d, Received = %d\n", - RTE_ETH_EVENT_INTR_RESET, type); - return -ENOMSG; - } - - ret = port_reset(port_id, pinfo[port_id].num_queues, - pinfo[port_id].st_queues, - pinfo[port_id].nb_descs, - pinfo[port_id].buff_size); - if (ret < 0) - printf("Error: Failed to reset port: %d\n", port_id); - - return ret; -} - -static int dev_remove_callback(uint16_t port_id, - enum rte_eth_event_type type, - void *param __rte_unused, void *ret_param) -{ - int ret = 0; - - RTE_SET_USED(ret_param); - printf("%s is received\n", __func__); - - if (type != RTE_ETH_EVENT_INTR_RMV) { - printf("Error: Invalid event value. " - "Expected = %d, Received = %d\n", - RTE_ETH_EVENT_INTR_RMV, type); - return -ENOMSG; - } - - ret = port_remove(port_id); - if (ret < 0) - printf("Error: Failed to remove port: %d\n", port_id); - - return 0; -} - -void port_close(int port_id) -{ - struct rte_mempool *mp; - struct rte_pmd_qdma_dev_attributes dev_attr; - int user_bar_idx; - int reg_val; - int ret = 0; - - if (rte_pmd_qdma_get_device(port_id) == NULL) { - printf("Port id %d already removed. " - "Relaunch application to use the port again\n", - port_id); - return; - } - - user_bar_idx = pinfo[port_id].user_bar_idx; - ret = rte_pmd_qdma_get_device_capabilities(port_id, &dev_attr); - if (ret < 0) { - printf("rte_pmd_qdma_get_device_capabilities failed for port: %d\n", - port_id); - return; - } - - if ((dev_attr.device_type == RTE_PMD_QDMA_DEVICE_SOFT) - && (dev_attr.ip_type == RTE_PMD_EQDMA_SOFT_IP)) { - PciWrite(user_bar_idx, C2H_CONTROL_REG, - C2H_STREAM_MARKER_PKT_GEN_VAL, - port_id); - unsigned int retry = 50; - while (retry) { - usleep(500); - reg_val = PciRead(user_bar_idx, - C2H_STATUS_REG, port_id); - if (reg_val & MARKER_RESPONSE_COMPLETION_BIT) - break; - - printf("Failed to receive c2h marker completion, retry count = %u\n", - (50 - (retry-1))); - retry--; - } - } - - rte_eth_dev_stop(port_id); - - rte_pmd_qdma_dev_close(port_id); - - pinfo[port_id].num_queues = 0; - - mp = rte_mempool_lookup(pinfo[port_id].mem_pool); - - if (mp != NULL) - rte_mempool_free(mp); -} - -int port_reset(int port_id, int num_queues, int st_queues, - int nb_descs, int buff_size) -{ - int ret = 0; - - printf("%s is received\n", __func__); - - if (rte_pmd_qdma_get_device(port_id) == NULL) { - printf("Port id %d already removed. " - "Relaunch application to use the port again\n", - port_id); - return -1; - } - - rte_spinlock_lock(&pinfo[port_id].port_update_lock); - - port_close(port_id); - - ret = rte_eth_dev_reset(port_id); - if (ret < 0) { - printf("Error: Failed to reset device for port: %d\n", port_id); - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - return -1; - } - - ret = port_init(port_id, num_queues, st_queues, - nb_descs, buff_size); - if (ret < 0) - printf("Error: Failed to initialize port: %d\n", port_id); - - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - - if (!ret) - printf("Port reset done successfully on port-id: %d\n", - port_id); - - return ret; -} - -int port_remove(int port_id) -{ - int ret = 0; - - printf("%s is received\n", __func__); - - /* Detach the port, it will invoke device remove/uninit */ - printf("Removing a device with port id %d\n", port_id); - if (rte_pmd_qdma_get_device(port_id) == NULL) { - printf("Port id %d already removed\n", port_id); - return 0; - } - - rte_spinlock_lock(&pinfo[port_id].port_update_lock); - - port_close(port_id); - - ret = rte_pmd_qdma_dev_remove(port_id); - if (ret < 0) - printf("Failed to remove device on port_id: %d\n", port_id); - - rte_spinlock_unlock(&pinfo[port_id].port_update_lock); - - if (!ret) - printf("Port remove done successfully on port-id: %d\n", - port_id); - - return ret; -} - -static struct option const long_opts[] = { -{"filename", 1, 0, 0}, -{NULL, 0, 0, 0} -}; - -int parse_cmdline(int argc, char **argv) -{ - int cmd_opt; - int option_index; - char **argvopt; - - argvopt = argv; - while ((cmd_opt = getopt_long(argc, argvopt, "c:n:b:w", long_opts, - &option_index)) != EOF) { - switch (cmd_opt) { - case 'c': - /* eal option */ - break; - case 'n': - /* eal option */ - break; - case 'b': - /* eal option */ - break; - case 'w': - /* eal option */ - break; - case '?': - /* Long eal options */ - break; - case 0: - if (!strncmp(long_opts[option_index].name, - "filename", - sizeof("filename"))) { - - filename = optarg; - } - break; - default: - printf("please pass valid parameters as follows:\n"); - return -1; - } - } - return 0; -} - -int port_init(int port_id, int num_queues, int st_queues, - int nb_descs, int buff_size) -{ - struct rte_mempool *mbuf_pool; - struct rte_eth_conf port_conf; - struct rte_eth_txconf tx_conf; - struct rte_eth_rxconf rx_conf; - int diag, x; - uint32_t queue_base, nb_buff; - - printf("Setting up port :%d.\n", port_id); - - if (rte_pmd_qdma_get_device(port_id) == NULL) { - printf("Port id %d already removed. " - "Relaunch application to use the port again\n", - port_id); - return -1; - } - - snprintf(pinfo[port_id].mem_pool, RTE_MEMPOOL_NAMESIZE, - MBUF_POOL_NAME_PORT, port_id); - - /* Mbuf packet pool */ - nb_buff = ((nb_descs) * num_queues * 2); - - /* NUM_TX_PKTS should be added to every queue as that many descriptors - * can be pending with application after Rx processing but before - * consumed by application or sent to Tx - */ - nb_buff += ((NUM_TX_PKTS) * num_queues); - - /* - * rte_mempool_create_empty() has sanity check to refuse large cache - * size compared to the number of elements. - * CACHE_FLUSHTHRESH_MULTIPLIER (1.5) is defined in a C file, so using a - * constant number 2 instead. - */ - nb_buff = RTE_MAX(nb_buff, MP_CACHE_SZ * 2); - - mbuf_pool = rte_pktmbuf_pool_create(pinfo[port_id].mem_pool, nb_buff, - MP_CACHE_SZ, 0, buff_size + - RTE_PKTMBUF_HEADROOM, - rte_socket_id()); - - if (mbuf_pool == NULL) - rte_exit(EXIT_FAILURE, " Cannot create mbuf pkt-pool\n"); -#ifdef DUMP_MEMPOOL_USAGE_STATS - printf("%s(): %d: mpool = %p, mbuf_avail_count = %d," - " mbuf_in_use_count = %d," - "nb_buff = %u\n", __func__, __LINE__, mbuf_pool, - rte_mempool_avail_count(mbuf_pool), - rte_mempool_in_use_count(mbuf_pool), nb_buff); -#endif //DUMP_MEMPOOL_USAGE_STATS - - /* - * Make sure the port is configured. Zero everything and - * hope for sane defaults - */ - memset(&port_conf, 0x0, sizeof(struct rte_eth_conf)); - memset(&tx_conf, 0x0, sizeof(struct rte_eth_txconf)); - memset(&rx_conf, 0x0, sizeof(struct rte_eth_rxconf)); - diag = rte_pmd_qdma_get_bar_details(port_id, - &(pinfo[port_id].config_bar_idx), - &(pinfo[port_id].user_bar_idx), - &(pinfo[port_id].bypass_bar_idx)); - - if (diag < 0) - rte_exit(EXIT_FAILURE, "rte_pmd_qdma_get_bar_details failed\n"); - - printf("QDMA Config bar idx: %d\n", pinfo[port_id].config_bar_idx); - printf("QDMA AXI Master Lite bar idx: %d\n", pinfo[port_id].user_bar_idx); - printf("QDMA AXI Bridge Master bar idx: %d\n", pinfo[port_id].bypass_bar_idx); - - /* configure the device to use # queues */ - diag = rte_eth_dev_configure(port_id, num_queues, num_queues, - &port_conf); - if (diag < 0) - rte_exit(EXIT_FAILURE, "Cannot configure port %d (err=%d)\n", - port_id, diag); - - diag = rte_pmd_qdma_get_queue_base(port_id, &queue_base); - if (diag < 0) - rte_exit(EXIT_FAILURE, "rte_pmd_qdma_get_queue_base : Querying of " - "QUEUE_BASE failed\n"); - pinfo[port_id].queue_base = queue_base; - pinfo[port_id].num_queues = num_queues; - pinfo[port_id].st_queues = st_queues; - pinfo[port_id].buff_size = buff_size; - pinfo[port_id].nb_descs = nb_descs; - - for (x = 0; x < num_queues; x++) { - if (x < st_queues) { - diag = rte_pmd_qdma_set_queue_mode(port_id, x, - RTE_PMD_QDMA_STREAMING_MODE); - if (diag < 0) - rte_exit(EXIT_FAILURE, "rte_pmd_qdma_set_queue_mode : " - "Passing of QUEUE_MODE " - "failed\n"); - } else { - diag = rte_pmd_qdma_set_queue_mode(port_id, x, - RTE_PMD_QDMA_MEMORY_MAPPED_MODE); - if (diag < 0) - rte_exit(EXIT_FAILURE, "rte_pmd_qdma_set_queue_mode : " - "Passing of QUEUE_MODE " - "failed\n"); - } - - diag = rte_eth_tx_queue_setup(port_id, x, nb_descs, 0, - &tx_conf); - if (diag < 0) - rte_exit(EXIT_FAILURE, "Cannot setup port %d " - "TX Queue id:%d " - "(err=%d)\n", port_id, x, diag); - rx_conf.rx_thresh.wthresh = DEFAULT_RX_WRITEBACK_THRESH; - diag = rte_eth_rx_queue_setup(port_id, x, nb_descs, 0, - &rx_conf, mbuf_pool); - if (diag < 0) - rte_exit(EXIT_FAILURE, "Cannot setup port %d " - "RX Queue 0 (err=%d)\n", port_id, diag); - } - - diag = rte_eth_dev_start(port_id); - if (diag < 0) - rte_exit(EXIT_FAILURE, "Cannot start port %d (err=%d)\n", - port_id, diag); - - return 0; -} - -static inline void do_sanity_checks(void) -{ -#if (!defined(RTE_LIBRTE_QDMA_PMD)) - rte_exit(EXIT_FAILURE, "CONFIG_RTE_LIBRTE_QDMA_PMD must be set " - "to 'Y' in the .config file\n"); -#endif /* RTE_LIBRTE_XDMA_PMD */ - -} - -void load_file_cmds(struct cmdline *cl) -{ - FILE *fp; - char buff[256]; - - cmdline_printf(cl, "load commands from file:%s\n\n", filename); - fp = fopen((const char *)filename, "r"); - if (fp == NULL) { - cmdline_printf(cl, "Error: Invalid filename: %s\n", filename); - return; - } - - struct rdline *rdl = cmdline_get_rdline(cl); - rdline_reset(rdl); - { - cmdline_in(cl, "\r", 1); - while (fgets(buff, sizeof(buff), fp)) - cmdline_in(cl, buff, strlen(buff)); - - cmdline_in(cl, "\r", 1); - } - fclose(fp); -} - -/** XDMA DPDK testapp */ - -int main(int argc, char **argv) -{ - const struct rte_memzone *mz = 0; - struct cmdline *cl; - int port_id = 0; - int ret = 0; - int curr_avail_ports = 0; - - /* Make sure the port is configured. Zero everything and - * hope for same defaults - */ - - printf("QDMA testapp rte eal init...\n"); - - /* Make sure things are initialized ... */ - ret = rte_eal_init(argc, argv); - if (ret < 0) - rte_exit(EXIT_FAILURE, "Error with EAL initialization\n"); - rte_log_set_global_level(RTE_LOG_DEBUG); - - printf("Ethernet Device Count: %d\n", (int)rte_eth_dev_count_avail()); - printf("Logical Core Count: %d\n", rte_lcore_count()); - - num_ports = rte_eth_dev_count_avail(); - if (num_ports < 1) - rte_exit(EXIT_FAILURE, "No Ethernet devices found." - " Try updating the FPGA image.\n"); - - for (port_id = 0; port_id < num_ports; port_id++) - rte_spinlock_init(&pinfo[port_id].port_update_lock); - - ret = rte_eth_dev_callback_register(RTE_ETH_ALL, RTE_ETH_EVENT_INTR_RMV, - dev_remove_callback, NULL); - if (ret < 0) - rte_exit(EXIT_FAILURE, "Failed to register dev_remove_callback\n"); - - ret = rte_eth_dev_callback_register(RTE_ETH_ALL, - RTE_ETH_EVENT_INTR_RESET, - dev_reset_callback, NULL); - if (ret < 0) - rte_exit(EXIT_FAILURE, "Failed to register dev_reset_callback\n"); - -#if 1 - ret = parse_cmdline(argc, argv); - if (ret < 0) - rte_exit(EXIT_FAILURE, "Invalid argument\n"); -#endif - - /* Make sure things are defined ... */ - do_sanity_checks(); - - /* Allocate aligned mezone */ - rte_pmd_qdma_compat_memzone_reserve_aligned(); - - cl = cmdline_stdin_new(main_ctx, "xilinx-app> "); - if (cl == NULL) - rte_panic("Cannot create cmdline instance\n"); - - /* if input commands file exists, then load commands from the file */ - if (filename != NULL) { - load_file_cmds(cl); - rte_delay_ms(100); - } else - cmdline_interact(cl); - - rte_eth_dev_callback_unregister(RTE_ETH_ALL, RTE_ETH_EVENT_INTR_RMV, - dev_remove_callback, NULL); - - rte_eth_dev_callback_unregister(RTE_ETH_ALL, RTE_ETH_EVENT_INTR_RESET, - dev_reset_callback, NULL); - - curr_avail_ports = rte_eth_dev_count_avail(); - if (!curr_avail_ports) - printf("Ports already removed\n"); - else { - for (port_id = num_ports - 1; port_id >= 0; port_id--) { - - if (pinfo[port_id].num_queues) - port_close(port_id); - - printf("Removing a device with port id %d\n", port_id); - if (rte_pmd_qdma_get_device(port_id) == NULL) { - printf("Port id %d already removed\n", port_id); - continue; - } - /* Detach the port, it will invoke - * device remove/uninit - */ - if (rte_pmd_qdma_dev_remove(port_id)) - printf("Failed to detach port '%d'\n", port_id); - } - } - - cmdline_stdin_exit(cl); - - rte_delay_ms(5000); - return 0; -} diff --git a/QDMA/DPDK/examples/qdma_testapp/testapp.h b/QDMA/DPDK/examples/qdma_testapp/testapp.h deleted file mode 100755 index 5d58a0d..0000000 --- a/QDMA/DPDK/examples/qdma_testapp/testapp.h +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#define QDMA_MAX_PORTS 256 - -#define PORT_0 0 - -#define NUM_DESC_PER_RING 1024 -#ifdef PERF_BENCHMARK -#define NUM_RX_PKTS (NUM_DESC_PER_RING - 2) -#else -#define NUM_RX_PKTS 32 -#endif - -/* Tandem boot feature involves DMA transfer of - * second stage bootloader size greater than 2MB - * from Host to Slave Boot Interface(SBI) buffer. - * Increased the limit of pending tx packets that need - * to process by application to avoid transfer timeouts. - */ -#ifdef TANDEM_BOOT_SUPPORTED -#define NUM_TX_PKTS 128 -#else -#define NUM_TX_PKTS 32 -#endif - -#define MAX_NUM_QUEUES 4096 -#define DEFAULT_NUM_QUEUES 64 -#define RX_TX_MAX_RETRY 1500 -#define DEFAULT_RX_WRITEBACK_THRESH (64) - -#define MP_CACHE_SZ 512 -#define MBUF_POOL_NAME_PORT "mbuf_pool_%d" - -/* AXI Master Lite bar(user bar) registers */ -#define C2H_ST_QID_REG 0x0 -#define C2H_ST_LEN_REG 0x4 -#define C2H_CONTROL_REG 0x8 -#define ST_LOOPBACK_EN 0x1 -#define ST_C2H_START_VAL 0x2 -#define ST_C2H_IMMEDIATE_DATA_EN 0x4 -#define C2H_CONTROL_REG_MASK 0xF -#define H2C_CONTROL_REG 0xC -#define H2C_STATUS_REG 0x10 -#define C2H_PACKET_COUNT_REG 0x20 -#define C2H_STATUS_REG 0x18 -#define C2H_STREAM_MARKER_PKT_GEN_VAL 0x22 -#define MARKER_RESPONSE_COMPLETION_BIT 0x1 - -extern int num_ports; - -struct port_info { - int config_bar_idx; - int user_bar_idx; - int bypass_bar_idx; - unsigned int queue_base; - unsigned int num_queues; - unsigned int nb_descs; - unsigned int st_queues; - unsigned int buff_size; - rte_spinlock_t port_update_lock; - char mem_pool[RTE_MEMPOOL_NAMESIZE]; -}; - -extern struct port_info pinfo[QDMA_MAX_PORTS]; -int port_init(int port_id, int num_queues, int st_queues, - int nb_descs, int buff_size); -int do_recv_st(int port_id, int fd, int queueid, int input_size); -int do_recv_mm(int port_id, int fd, int queueid, - int ld_size, int tot_num_desc); -int do_xmit(int port_id, int fd, int queueid, - int ld_size, int tot_num_desc, int zbyte); -void load_file_cmds(struct cmdline *cl); -void port_close(int port_id); -int port_reset(int port_id, int num_queues, int st_queues, - int nb_descs, int buff_size); -int port_remove(int port_id); -int parse_cmdline(int argc, char **argv); diff --git a/QDMA/DPDK/tools/0001-Add-QDMA-xdebug-to-proc-info-of-dpdk-22.11.patch b/QDMA/DPDK/tools/0001-Add-QDMA-xdebug-to-proc-info-of-dpdk-22.11.patch deleted file mode 100755 index e3501a4..0000000 --- a/QDMA/DPDK/tools/0001-Add-QDMA-xdebug-to-proc-info-of-dpdk-22.11.patch +++ /dev/null @@ -1,362 +0,0 @@ -From aa6931cc32ac9c7baea453717a34816f01803536 Mon Sep 17 00:00:00 2001 -From: Suryanarayana Raju Sangani <ssangani@xilinx.com> -Date: Mon, 19 Jun 2023 12:44:20 +0530 -Subject: [PATCH] Add QDMA xdebug to proc-info of dpdk-22.11 - -Signed-off-by: Nikhil agarwal <nagarwal@xilinx.com> -Signed-off-by: Prasad Pardeshi <prasadp@xilinx.com> -Signed-off-by: Sangani Suryanarayana Raju <ssangani@xilinx.com> ---- - app/proc-info/main.c | 195 ++++++++++++++++++++++++++++++++++++-- - app/proc-info/meson.build | 2 +- - app/test-pmd/config.c | 2 + - 3 files changed, 189 insertions(+), 10 deletions(-) - mode change 100644 => 100755 app/proc-info/main.c - mode change 100644 => 100755 app/proc-info/meson.build - mode change 100644 => 100755 app/test-pmd/config.c - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -old mode 100644 -new mode 100755 -index 53e852a..eeb20e7 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -32,6 +32,7 @@ - #ifdef RTE_LIB_METRICS - #include <rte_metrics.h> - #endif -+#include <rte_pmd_qdma.h> - #include <rte_cycles.h> - #ifdef RTE_LIB_SECURITY - #include <rte_security.h> -@@ -55,9 +56,31 @@ - STATS_BDR_FMT, s, w, STATS_BDR_FMT) - - /* mask of enabled ports */ --static unsigned long enabled_port_mask; -+static uint64_t enabled_port_mask; -+/**< QID for queue context */ -+static uint32_t qid; -+/**< desc dump type */ -+static uint32_t desc_type; -+/**< QID for desc start value */ -+static uint32_t start; -+/**< QID for desc end value */ -+static uint32_t end; -+/**< Enable desc dump. */ -+static uint32_t enable_desc_dump; - /* Enable stats. */ - static uint32_t enable_stats; -+/**< Enable Device Structs */ -+static uint32_t qdma_device; -+/**< Enable QDMA Tx and Rx queue stats */ -+static uint32_t qdma_qstats; -+/**< Clear QDMA Tx and Rx queue stats */ -+static uint32_t qdma_qstats_clear; -+/**< Enable Queue context and Queue structs. */ -+static uint32_t queue_info; -+/**< Enable register field information. */ -+static uint32_t reg_info; -+/**< Register address */ -+static uint32_t reg_addr; - /* Enable xstats. */ - static uint32_t enable_xstats; - /* Enable collectd format */ -@@ -76,6 +99,8 @@ static uint32_t reset_stats; - static uint32_t reset_xstats; - /* Enable memory info. */ - static uint32_t mem_info; -+/**< Enable Global Errors . */ -+static uint32_t qdma_csr_info; - /* Enable displaying xstat name. */ - static uint32_t enable_xstats_name; - static char *xstats_name; -@@ -138,8 +163,15 @@ proc_info_usage(const char *prgname) - { - printf("%s [EAL options] -- -p PORTMASK\n" - " -m to display DPDK memory zones, segments and TAILQ information\n" -+ " -g to display DPDK QDMA PMD global CSR info\n" - " -p PORTMASK: hexadecimal bitmask of ports to retrieve stats for\n" - " --stats: to display port statistics, enabled by default\n" -+ " --qdevice: to display QDMA device structure\n" -+ " --qstats: to display QDMA Tx and Rx queue stats\n" -+ " --qstats_clr: to clear QDMA Tx and Rx queue stats\n" -+ " --qinfo: to display QDMA queue context and queue structures\n" -+ " --reg-info {reg_addr}: to display field info of a register at reg_addr offset\n" -+ " --desc-dump {rx | tx | cmpt}: to dump QDMA queue descriptors\n" - " --xstats: to display extended port statistics, disabled by " - "default\n" - #ifdef RTE_LIB_METRICS -@@ -179,7 +211,7 @@ proc_info_usage(const char *prgname) - /* - * Parse the portmask provided at run time. - */ --static int -+static int64_t - parse_portmask(const char *portmask) - { - char *end = NULL; -@@ -196,6 +228,71 @@ parse_portmask(const char *portmask) - return 0; - } - -+/* -+ * * Parse the QID provided at run time. -+ **/ -+static int -+parse_int(const char *id) -+{ -+ char *end = NULL; -+ unsigned long val; -+ -+ errno = 0; -+ -+ /* parse hexadecimal string */ -+ val = strtoul(id, &end, 10); -+ if ((id[0] == '\0') || (end == NULL) || (*end != '\0') || -+ (errno != 0)) { -+ printf("%s ERROR parsing the QID\n", __func__); -+ return -1; -+ } -+ -+ return val; -+} -+ -+/* -+ * Parse the register address provided at run time. -+ */ -+static int32_t -+parse_reg_addr(const char *addr) -+{ -+ char *end = NULL; -+ -+ errno = 0; -+ -+ /* parse hexadecimal string */ -+ reg_addr = strtoul(addr, &end, 16); -+ if ((addr[0] == '\0') || (end == NULL) || (*end != '\0') || -+ (errno != 0)) { -+ printf("%s ERROR parsing the register address\n", __func__); -+ return -1; -+ } -+ -+ if (reg_addr == 0) -+ return -1; -+ -+ return reg_addr; -+} -+ -+/* -+ * * Parse the desc dump type provided at run time. -+ **/ -+static int -+parse_desc_type(const char *type) -+{ -+ if (!strcmp(type, "rx")) { -+ desc_type = RTE_PMD_QDMA_XDEBUG_DESC_C2H; -+ } else if (!strcmp(type, "tx")) { -+ desc_type = RTE_PMD_QDMA_XDEBUG_DESC_H2C; -+ } else if (!strcmp(type, "cmpt")) { -+ desc_type = RTE_PMD_QDMA_XDEBUG_DESC_CMPT; -+ } else { -+ printf("%s ERROR parsing the desc type\n", __func__); -+ return -1; -+ } -+ return 0; -+} -+ - /* - * Parse ids value list into array - */ -@@ -273,11 +370,17 @@ proc_info_preparse_args(int argc, char **argv) - static int - proc_info_parse_args(int argc, char **argv) - { -- int opt; -+ int opt, ret; - int option_index; - char *prgname = argv[0]; - static struct option long_option[] = { - {"stats", 0, NULL, 0}, -+ {"qdevice", 0, NULL, 0}, -+ {"qstats", 0, NULL, 0}, -+ {"qstats_clr", 0, NULL, 0}, -+ {"qinfo", 0, NULL, 0}, -+ {"reg-info", required_argument, NULL, 1}, -+ {"desc-dump", required_argument, NULL, 1}, - {"stats-reset", 0, NULL, 0}, - {"xstats", 0, NULL, 0}, - #ifdef RTE_LIB_METRICS -@@ -309,7 +412,7 @@ proc_info_parse_args(int argc, char **argv) - proc_info_usage(prgname); - - /* Parse command line */ -- while ((opt = getopt_long(argc, argv, "p:m", -+ while ((opt = getopt_long(argc, argv, "p:mq:gs:e:", - long_option, &option_index)) != EOF) { - switch (opt) { - /* portmask */ -@@ -322,11 +425,54 @@ proc_info_parse_args(int argc, char **argv) - case 'm': - mem_info = 1; - break; -+ case 'g': -+ qdma_csr_info = 1; -+ break; -+ case 'q': -+ ret = parse_int(optarg); -+ if (ret < 0) { -+ printf("Invalid queue\n"); -+ return -1; -+ } -+ qid = ret; -+ break; -+ case 's': -+ ret = parse_int(optarg); -+ if (ret < 0) { -+ printf("Invalid start value\n"); -+ return -1; -+ } -+ start = ret; -+ break; -+ case 'e': -+ ret = parse_int(optarg); -+ if (ret < 0) { -+ printf("Invalid end value\n"); -+ return -1; -+ } -+ end = ret; -+ break; - case 0: - /* Print stats */ - if (!strncmp(long_option[option_index].name, "stats", - MAX_LONG_OPT_SZ)) - enable_stats = 1; -+ /* Print qdma device */ -+ if (!strncmp(long_option[option_index].name, "qdevice", -+ MAX_LONG_OPT_SZ)) -+ qdma_device = 1; -+ /* Print qdma Tx and Rx queue stats */ -+ if (!strncmp(long_option[option_index].name, "qstats", -+ MAX_LONG_OPT_SZ)) -+ qdma_qstats = 1; -+ /* Clear qdma Tx and Rx queue stats */ -+ if (!strncmp(long_option[option_index].name, "qstats_clr", -+ MAX_LONG_OPT_SZ)) -+ qdma_qstats_clear = 1; -+ /* Print queue context and queue Structures*/ -+ if (!strncmp(long_option[option_index].name, "qinfo", -+ MAX_LONG_OPT_SZ)) -+ queue_info = 1; - /* Print xstats */ - else if (!strncmp(long_option[option_index].name, "xstats", - MAX_LONG_OPT_SZ)) -@@ -425,6 +571,24 @@ proc_info_parse_args(int argc, char **argv) - return -1; - } - enable_shw_tx_desc_dump = 1; -+ } else if (!strncmp(long_option[option_index].name, -+ "desc-dump", -+ MAX_LONG_OPT_SZ)) { -+ if (parse_desc_type(optarg) < 0) { -+ printf("desc-dump parse error.\n"); -+ proc_info_usage(prgname); -+ return -1; -+ } -+ enable_desc_dump = 1; -+ } else if (!strncmp(long_option[option_index].name, -+ "reg-info", -+ MAX_LONG_OPT_SZ)) { -+ if (parse_reg_addr(optarg) < 0) { -+ printf("reg-info parse error.\n"); -+ proc_info_usage(prgname); -+ return -1; -+ } -+ reg_info = 1; - } - break; - default: -@@ -1791,7 +1955,6 @@ main(int argc, char **argv) - - if (mem_info) { - meminfo_display(); -- return 0; - } - - nb_ports = rte_eth_dev_count_avail(); -@@ -1807,7 +1970,7 @@ main(int argc, char **argv) - for (i = 0; i < RTE_MAX_ETHPORTS; i++) { - - /* Skip if port is not in mask */ -- if ((enabled_port_mask & (1ul << i)) == 0) -+ if ((enabled_port_mask & ((uint64_t)1 << i)) == 0) - continue; - - /* Skip if port is unused */ -@@ -1832,6 +1995,23 @@ main(int argc, char **argv) - metrics_display(i); - #endif - -+ else if (qdma_csr_info) -+ rte_pmd_qdma_dbg_regdump(i); -+ else if (qdma_device) -+ rte_pmd_qdma_dbg_qdevice(i); -+ else if (qdma_qstats) -+ rte_pmd_qdma_qstats(i, qid); -+ else if (qdma_qstats_clear) -+ rte_pmd_qdma_qstats_clear(i, qid); -+ else if (queue_info) -+ rte_pmd_qdma_dbg_qinfo(i, qid); -+ else if (reg_info) -+ rte_pmd_qdma_dbg_reg_info_dump(i, -+ 1, reg_addr); -+ else if (enable_desc_dump) -+ rte_pmd_qdma_dbg_qdesc(i, qid, -+ start, end, desc_type); -+ - if (enable_shw_rx_desc_dump) - nic_rx_descriptor_display(i, &rx_desc_param); - if (enable_shw_tx_desc_dump) -@@ -1870,9 +2050,6 @@ main(int argc, char **argv) - if (enable_shw_module_eeprom) - show_module_eeprom_info(); - -- RTE_ETH_FOREACH_DEV(i) -- rte_eth_dev_close(i); -- - ret = rte_eal_cleanup(); - if (ret) - printf("Error from rte_eal_cleanup(), %d\n", ret); -diff --git a/app/proc-info/meson.build b/app/proc-info/meson.build -old mode 100644 -new mode 100755 -index 1563ce6..340b9ab ---- a/app/proc-info/meson.build -+++ b/app/proc-info/meson.build -@@ -8,7 +8,7 @@ if is_windows - endif - - sources = files('main.c') --deps += ['ethdev', 'security'] -+deps += ['ethdev', 'metrics', 'security', 'net_qdma'] - if dpdk_conf.has('RTE_LIB_METRICS') - deps += 'metrics' - endif -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -old mode 100644 -new mode 100755 -index acccb6b..6d51d62 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -58,6 +58,8 @@ - #include "testpmd.h" - #include "cmdline_mtr.h" - -+#include <ethdev_driver.h> -+ - #define ETHDEV_FWVERS_LEN 32 - - #ifdef CLOCK_MONOTONIC_RAW /* Defined in glibc bits/time.h */ --- -2.25.1 - diff --git a/QDMA/DPDK/tools/0001-PKTGEN-20.12.0-Patch-to-add-Jumbo-packet-support.patch b/QDMA/DPDK/tools/0001-PKTGEN-20.12.0-Patch-to-add-Jumbo-packet-support.patch deleted file mode 100755 index e0a11d4..0000000 --- a/QDMA/DPDK/tools/0001-PKTGEN-20.12.0-Patch-to-add-Jumbo-packet-support.patch +++ /dev/null @@ -1,320 +0,0 @@ -From 8d8204c48660cfe67ce27c95ce029e2cfa302958 Mon Sep 17 00:00:00 2001 -From: Suryanarayana Raju Sangani <ssangani@xilinx.com> -Date: Thu, 27 Feb 2020 05:13:38 -0700 -Subject: [PATCH] PKTGEN-20.12.0: Patch to add Jumbo packet support - -This patch include: -1. Jumbo frame support for Pktgen. -2. Increase default number of RX_DESC to 2K. -3. Disable RX classification. -4. Set user provided packet size as DMA packet size i.e. not to remove -CRC bytes - -Signed-off-by: Kumar Sanghvi <kumars@xilinx.com> -Signed-off-by: Nikhil Agarwal <nagarwal@xilinx.com> -Signed-off-by: Pankaj Darak <pankajd@xilinx.com> -Signed-off-by: Thanneeru Srinivasulu <sthannee@xilinx.com> -Signed-off-by: tarakr <tarakr@xilinx.com> -Signed-off-by: Suryanarayana Raju Sangani <ssangani@xilinx.com> ---- - app/pktgen-cmds.c | 15 +++++++++++---- - app/pktgen-constants.h | 3 ++- - app/pktgen-main.c | 24 +++++++++++++++++------- - app/pktgen-port-cfg.c | 12 ++++++++---- - app/pktgen-range.c | 3 ++- - app/pktgen.c | 19 +++++++++++++++++-- - app/pktgen.h | 4 +++- - 7 files changed, 60 insertions(+), 20 deletions(-) - -diff --git a/app/pktgen-cmds.c b/app/pktgen-cmds.c -index 4da9bab..065fbe8 100644 ---- a/app/pktgen-cmds.c -+++ b/app/pktgen-cmds.c -@@ -3125,18 +3125,22 @@ single_set_pkt_size(port_info_t *info, uint16_t size) - { - pkt_seq_t * pkt = &info->seq_pkt[SINGLE_PKT]; - -+ uint16_t pktsize = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MAX_PKT_SIZE: (PG_ETHER_MAX_LEN - PG_ETHER_CRC_LEN); -+ - if (size < PG_ETHER_CRC_LEN) - size = PG_ETHER_CRC_LEN; - - if ( (size - PG_ETHER_CRC_LEN) < MIN_PKT_SIZE) - size = pktgen.eth_min_pkt; -- if ( (size - PG_ETHER_CRC_LEN) > MAX_PKT_SIZE) -- size = pktgen.eth_max_pkt; -+ if ( (size - PG_ETHER_CRC_LEN) > pktsize) -+ size = pktsize + PG_ETHER_CRC_LEN; - - if ((pkt->ethType == PG_ETHER_TYPE_IPv6) && (size < (MIN_v6_PKT_SIZE + PG_ETHER_CRC_LEN))) - size = MIN_v6_PKT_SIZE + PG_ETHER_CRC_LEN; - - pkt->pktSize = (size - PG_ETHER_CRC_LEN); -+ pkt->pktSize = size; - - pktgen_packet_ctor(info, SINGLE_PKT, -1); - pktgen_packet_rate(info); -@@ -3924,6 +3928,9 @@ range_set_cos_id(port_info_t *info, char *what, uint8_t id) - void - range_set_pkt_size(port_info_t *info, char *what, uint16_t size) - { -+ uint32_t pktsize = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MAX_9K_SIZE : PG_ETHER_MAX_LEN; -+ - if (!strcmp(what, "inc") || !strcmp(what, "increment")) { - if (size > pktgen.eth_max_pkt) - size = pktgen.eth_max_pkt; -@@ -3931,8 +3938,8 @@ range_set_pkt_size(port_info_t *info, char *what, uint16_t size) - } else { - if (size < pktgen.eth_min_pkt) - size = MIN_PKT_SIZE; -- else if (size > pktgen.eth_max_pkt) -- size = MAX_PKT_SIZE; -+ else if (size > pktsize) -+ size = pktsize; - else - size -= PG_ETHER_CRC_LEN; - -diff --git a/app/pktgen-constants.h b/app/pktgen-constants.h -index ede4e65..8694e18 100644 ---- a/app/pktgen-constants.h -+++ b/app/pktgen-constants.h -@@ -17,7 +17,7 @@ extern "C" { - enum { - #ifndef RTE_LIBRTE_VMXNET3_PMD - DEFAULT_PKT_BURST = 64, /* Increasing this number consumes memory very fast */ -- DEFAULT_RX_DESC = (DEFAULT_PKT_BURST * 8 * 2), -+ DEFAULT_RX_DESC = (DEFAULT_PKT_BURST * 8 * 2 * 2), - DEFAULT_TX_DESC = DEFAULT_RX_DESC * 2, - #else - DEFAULT_PKT_BURST = 32, /* Increasing this number consumes memory very fast */ -@@ -31,6 +31,7 @@ enum { - - DEFAULT_PRIV_SIZE = 0, - -+ MBUF_9K_SIZE = 9018 + RTE_PKTMBUF_HEADROOM + DEFAULT_PRIV_SIZE, - NUM_Q = 16, /**< Number of cores per port. */ - }; - #define DEFAULT_MBUF_SIZE (PG_ETHER_MAX_JUMBO_FRAME_LEN + RTE_PKTMBUF_HEADROOM) /* See: http://dpdk.org/dev/patchwork/patch/4479/ */ -diff --git a/app/pktgen-main.c b/app/pktgen-main.c -index 96d1c0c..1ca2941 100644 ---- a/app/pktgen-main.c -+++ b/app/pktgen-main.c -@@ -188,7 +188,7 @@ pktgen_parse_args(int argc, char **argv) - pktgen.mbuf_buf_size = RTE_MBUF_DEFAULT_BUF_SIZE; - - pktgen.verbose = 0; -- while ((opt = getopt_long(argc, argvopt, "p:m:f:l:s:g:hPNGTvjtr", -+ while ((opt = getopt_long(argc, argvopt, "p:m:f:l:s:g:hPNGTvjtr9", - lgopts, &option_index)) != EOF) - switch (opt) { - case 't': -@@ -300,7 +300,12 @@ pktgen_parse_args(int argc, char **argv) - - case 'h': /* print out the help message */ - pktgen_usage(prgname); -- return -1; -+ return -1; -+ -+ case '9': /* MTU 9K support */ -+ pktgen_log_info("%s: case 9... \n", __func__); -+ pktgen.flags |= MTU9K_SUPPORT_FLAG; -+ break; - - case 0: /* crc-strip for all ports */ - printf(">>> Strip CRC in hardware is the default\n"); -@@ -407,8 +412,10 @@ RTE_FINI(pktgen_fini) - int - main(int argc, char **argv) - { -- uint32_t i; -+ uint32_t nb_ports; -+ int32_t i; - int32_t ret; -+ struct rte_device *dev; - - signal(SIGSEGV, sig_handler); - signal(SIGHUP, sig_handler); -@@ -563,10 +570,13 @@ main(int argc, char **argv) - /* Wait for all of the cores to stop running and exit. */ - rte_eal_mp_wait_lcore(); - -- RTE_ETH_FOREACH_DEV(i) { -- rte_eth_dev_stop(i); -- rte_delay_us_sleep(100 * 1000); -- rte_eth_dev_close(i); -+ nb_ports = rte_eth_dev_count_avail(); -+ for(i = nb_ports-1; i >= 0; i--) { -+ dev = rte_eth_devices[i].device; -+ if (rte_dev_remove(dev)) -+ printf("Failed to detach port '%d'\n", i); -+ else -+ printf("successfully removed port '%d'\n", i); - } - - cli_destroy(); -diff --git a/app/pktgen-port-cfg.c b/app/pktgen-port-cfg.c -index a982d0d..7a27602 100644 ---- a/app/pktgen-port-cfg.c -+++ b/app/pktgen-port-cfg.c -@@ -101,16 +101,19 @@ pktgen_mbuf_pool_create(const char *type, uint8_t pid, uint8_t queue_id, - struct rte_mempool *mp; - char name[RTE_MEMZONE_NAMESIZE]; - uint64_t sz; -+ uint16_t mbuf_sz = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MBUF_9K_SIZE :DEFAULT_MBUF_SIZE; -+ - - snprintf(name, sizeof(name), "%-12s%u:%u", type, pid, queue_id); - -- sz = nb_mbufs * (DEFAULT_MBUF_SIZE + sizeof(struct rte_mbuf)); -+ sz = nb_mbufs * (mbuf_sz + sizeof(struct rte_mbuf)); - sz = RTE_ALIGN_CEIL(sz + sizeof(struct rte_mempool), 1024); - - if (pktgen.verbose) - pktgen_log_info( - " Create: %-*s - Memory used (MBUFs %5u x (size %u + Hdr %lu)) + %lu = %6lu KB, headroom %d", -- 16, name, nb_mbufs, DEFAULT_MBUF_SIZE, -+ 16, name, nb_mbufs, mbuf_sz, - sizeof(struct rte_mbuf), sizeof(struct rte_mempool), - sz / 1024, RTE_PKTMBUF_HEADROOM); - -@@ -119,7 +122,7 @@ pktgen_mbuf_pool_create(const char *type, uint8_t pid, uint8_t queue_id, - - /* create the mbuf pool */ - mp = rte_pktmbuf_pool_create(name, nb_mbufs, cache_size, -- DEFAULT_PRIV_SIZE, DEFAULT_MBUF_SIZE, socket_id); -+ DEFAULT_PRIV_SIZE, mbuf_sz, socket_id); - if (mp == NULL) - pktgen_log_panic( - "Cannot create mbuf pool (%s) port %d, queue %d, nb_mbufs %d, socket_id %d: %s", -@@ -227,7 +230,8 @@ pktgen_config_ports(void) - pktgen_log_info( - ">>>> Configuring %d ports, MBUF Size %d, MBUF Cache Size %d", - pktgen.nb_ports, -- DEFAULT_MBUF_SIZE, -+ (pktgen.flags & MTU9K_SUPPORT_FLAG) ? MBUF_9K_SIZE : -+ DEFAULT_MBUF_SIZE, - MBUF_CACHE_SIZE); - } - -diff --git a/app/pktgen-range.c b/app/pktgen-range.c -index f88258d..bbaaa6f 100644 ---- a/app/pktgen-range.c -+++ b/app/pktgen-range.c -@@ -595,7 +595,8 @@ pktgen_range_setup(port_info_t *info) - range->pkt_size = MIN_PKT_SIZE; - range->pkt_size_inc = 0; - range->pkt_size_min = MIN_PKT_SIZE; -- range->pkt_size_max = MAX_PKT_SIZE; -+ range->pkt_size_max = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MAX_PKT_SIZE : (PG_ETHER_MAX_LEN - PG_ETHER_CRC_LEN); - - range->vxlan_gid = info->seq_pkt[SINGLE_PKT].group_id; - range->vxlan_gid_inc = 0; -diff --git a/app/pktgen.c b/app/pktgen.c -index 26cc80d..1042a47 100644 ---- a/app/pktgen.c -+++ b/app/pktgen.c -@@ -74,6 +74,7 @@ pktgen_wire_size(port_info_t *info) - } else - size = info->seq_pkt[SINGLE_PKT].pktSize + PKT_OVERHEAD_SIZE; - } -+ size -= (PKT_PREAMBLE_SIZE + INTER_FRAME_GAP + PG_ETHER_CRC_LEN); - return size; - } - -@@ -296,6 +297,7 @@ pktgen_send_burst(port_info_t *info, uint16_t qid) - struct qstats_s *qstats; - uint32_t ret, cnt, tap, rnd, tstamp, i; - int32_t seq_idx; -+ pkt_seq_t *pkt; - - if ((cnt = mtab->len) == 0) - return; -@@ -310,6 +312,10 @@ pktgen_send_burst(port_info_t *info, uint16_t qid) - else - seq_idx = SINGLE_PKT; - -+ pkt = &info->seq_pkt[seq_idx]; -+ for (i = 0; i < cnt; i++) -+ rte_pktmbuf_pkt_len(pkts[i]) = pkt->pktSize; -+ - tap = pktgen_tst_port_flags(info, PROCESS_TX_TAP_PKTS); - rnd = pktgen_tst_port_flags(info, SEND_RANDOM_PKTS); - tstamp = pktgen_tst_port_flags(info, (SEND_LATENCY_PKTS | SEND_RATE_PACKETS | SAMPLING_LATENCIES)); -@@ -912,6 +918,10 @@ pktgen_setup_cb(struct rte_mempool *mp, - pkt_seq_t *pkt; - uint16_t qid, idx; - -+ uint32_t pktsize = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MAX_PKT_SIZE: -+ (PG_ETHER_MAX_LEN - PG_ETHER_CRC_LEN); -+ - info = data->info; - qid = data->qid; - -@@ -941,7 +951,7 @@ pktgen_setup_cb(struct rte_mempool *mp, - pktgen_packet_ctor(info, idx, -1); - - rte_memcpy((uint8_t *)m->buf_addr + m->data_off, -- (uint8_t *)&pkt->hdr, MAX_PKT_SIZE); -+ (uint8_t *)&pkt->hdr, pktsize); - - m->pkt_len = pkt->pktSize; - m->data_len = pkt->pktSize; -@@ -1150,7 +1160,7 @@ pktgen_main_receive(port_info_t *info, uint8_t lid, - { - uint8_t pid; - uint16_t qid, nb_rx; -- capture_t *capture; -+ __rte_unused capture_t *capture; - struct qstats_s *qstats; - int i; - -@@ -1169,6 +1179,10 @@ pktgen_main_receive(port_info_t *info, uint8_t lid, - for(i = 0; i < nb_rx; i++) - qstats->rxbytes += rte_pktmbuf_data_len(pkts_burst[i]); - -+ info->sizes._64 += nb_rx; -+ rte_pktmbuf_free_bulk(pkts_burst, nb_rx); -+ -+#if 0 - pktgen_recv_tstamp(info, pkts_burst, nb_rx); - - /* packets are not freed in the next call. */ -@@ -1185,6 +1199,7 @@ pktgen_main_receive(port_info_t *info, uint8_t lid, - } - - rte_pktmbuf_free_bulk(pkts_burst, nb_rx); -+#endif - } - - static void -diff --git a/app/pktgen.h b/app/pktgen.h -index 66fa12e..20fb943 100644 ---- a/app/pktgen.h -+++ b/app/pktgen.h -@@ -253,8 +253,9 @@ enum { - SOCKET0 = 0 /**< Socket ID value for allocation */ - }; - -+#define MAX_9K_SIZE 9018 - #define MIN_PKT_SIZE (pktgen.eth_min_pkt - PG_ETHER_CRC_LEN) --#define MAX_PKT_SIZE (pktgen.eth_max_pkt - PG_ETHER_CRC_LEN) -+#define MAX_PKT_SIZE (MAX_9K_SIZE - PG_ETHER_CRC_LEN) - - typedef struct rte_mbuf rte_mbuf_t; - -@@ -351,6 +352,7 @@ enum { /* Pktgen flags bits */ - BLINK_PORTS_FLAG = (1 << 10), /**< Blink the port leds */ - ENABLE_THEME_FLAG = (1 << 11), /**< Enable theme or color support */ - -+ MTU9K_SUPPORT_FLAG = (1 << 15), /**< MTU 9K support */ - CONFIG_PAGE_FLAG = (1 << 16), /**< Display the configure page */ - SEQUENCE_PAGE_FLAG = (1 << 17), /**< Display the Packet sequence page */ - RANGE_PAGE_FLAG = (1 << 18), /**< Display the range page */ --- -2.17.1 - diff --git a/QDMA/DPDK/tools/0001-PKTGEN-22.04.1-Patch-to-add-Jumbo-packet-support.patch b/QDMA/DPDK/tools/0001-PKTGEN-22.04.1-Patch-to-add-Jumbo-packet-support.patch deleted file mode 100755 index e50d80d..0000000 --- a/QDMA/DPDK/tools/0001-PKTGEN-22.04.1-Patch-to-add-Jumbo-packet-support.patch +++ /dev/null @@ -1,466 +0,0 @@ -From fb3ffa15e6d1f6b1a576b393ff69317707351aae Mon Sep 17 00:00:00 2001 -From: Prasad Pardeshi <prasadp@xilinx.com> -Date: Tue, 28 Feb 2023 17:37:06 +0530 -Subject: [PATCH] [PATCH] PKTGEN-22.04.1: Patch to add Jumbo packet support - -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch include: -1. Jumbo frame support for Pktgen. -2. Increase default number of RX_DESC to 2K. -3. Disable RX classification. -4. Set user provided packet size as DMA packet size i.e. not to remove -CRC bytes Signed-off-by: Kumar Sanghvi <kumars@xilinx.com> -Signed-off-by: Nikhil Agarwal <nagarwal@xilinx.com> -Signed-off-by: Pankaj Darak <pankajd@xilinx.com> -Signed-off-by: Thanneeru Srinivasulu <sthannee@xilinx.com> -Signed-off-by: tarakr <tarakr@xilinx.com> -Signed-off-by: Suryanarayana Raju Sangani <ssangani@xilinx.com> ---- - app/lpktgenlib.c | 2 ++ - app/meson.build | 1 + - app/pktgen-cmds.c | 18 ++++++++++++++---- - app/pktgen-constants.h | 4 ++-- - app/pktgen-latency.c | 2 ++ - app/pktgen-main.c | 25 ++++++++++++++++++------- - app/pktgen-port-cfg.c | 15 ++++++++++----- - app/pktgen-port-cfg.h | 2 +- - app/pktgen-range.c | 3 ++- - app/pktgen-rate.c | 2 ++ - app/pktgen-stats.c | 2 ++ - app/pktgen.c | 19 +++++++++++++++++-- - app/pktgen.h | 5 +++-- - lib/cli/cli_map.c | 1 + - lib/common/pg_strings.c | 1 + - 15 files changed, 78 insertions(+), 24 deletions(-) - -diff --git a/app/lpktgenlib.c b/app/lpktgenlib.c -index bc24433..add5a16 100644 ---- a/app/lpktgenlib.c -+++ b/app/lpktgenlib.c -@@ -14,6 +14,8 @@ - #include <pg_inet.h> - #include "lpktgenlib.h" - -+#include <bus_driver.h> -+#include <bus_pci_driver.h> - #include <stdint.h> - #include <netinet/in.h> - -diff --git a/app/meson.build b/app/meson.build -index 66087a5..1027997 100644 ---- a/app/meson.build -+++ b/app/meson.build -@@ -35,6 +35,7 @@ deps += [cc.find_library('rte_net_i40e', required: false)] - deps += [cc.find_library('rte_net_ixgbe', required: false)] - deps += [cc.find_library('rte_net_ice', required: false)] - deps += [cc.find_library('rte_bus_vdev', required: false)] -+deps += [cc.find_library('rte_net_qdma', required: true)] - - deps += [dependency('threads')] - deps += [cc.find_library('numa', required: true)] -diff --git a/app/pktgen-cmds.c b/app/pktgen-cmds.c -index 9708b28..f92b890 100644 ---- a/app/pktgen-cmds.c -+++ b/app/pktgen-cmds.c -@@ -3054,18 +3054,25 @@ single_set_pkt_size(port_info_t *info, uint16_t size) - { - pkt_seq_t *pkt = &info->seq_pkt[SINGLE_PKT]; - -+ uint16_t pktsize = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MAX_PKT_SIZE: (RTE_ETHER_MAX_LEN - RTE_ETHER_CRC_LEN); -+ -+ - if (size < RTE_ETHER_CRC_LEN) - size = RTE_ETHER_CRC_LEN; - -+ -+ - if ((size - RTE_ETHER_CRC_LEN) < MIN_PKT_SIZE) - size = pktgen.eth_min_pkt; -- if ((size - RTE_ETHER_CRC_LEN) > MAX_PKT_SIZE) -- size = pktgen.eth_max_pkt; -+ if ( (size - RTE_ETHER_CRC_LEN) > pktsize) -+ size = pktsize + RTE_ETHER_CRC_LEN; - - if ((pkt->ethType == RTE_ETHER_TYPE_IPV6) && (size < (MIN_v6_PKT_SIZE + RTE_ETHER_CRC_LEN))) - size = MIN_v6_PKT_SIZE + RTE_ETHER_CRC_LEN; - - pkt->pktSize = (size - RTE_ETHER_CRC_LEN); -+ pkt->pktSize = size; - - pktgen_packet_ctor(info, SINGLE_PKT, -1); - pktgen_packet_rate(info); -@@ -3094,6 +3101,7 @@ rate_set_pkt_size(port_info_t *info, uint16_t size) - - if ((size - RTE_ETHER_CRC_LEN) < MIN_PKT_SIZE) - size = pktgen.eth_min_pkt; -+ - if ((size - RTE_ETHER_CRC_LEN) > MAX_PKT_SIZE) - size = pktgen.eth_max_pkt; - -@@ -4209,6 +4217,8 @@ range_set_cos_id(port_info_t *info, char *what, uint8_t id) - void - range_set_pkt_size(port_info_t *info, char *what, uint16_t size) - { -+ uint32_t pktsize = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MAX_9K_SIZE : RTE_ETHER_MAX_LEN; - if (!strcmp(what, "inc") || !strcmp(what, "increment")) { - if (size > pktgen.eth_max_pkt) - size = pktgen.eth_max_pkt; -@@ -4216,8 +4226,8 @@ range_set_pkt_size(port_info_t *info, char *what, uint16_t size) - } else { - if (size < pktgen.eth_min_pkt) - size = MIN_PKT_SIZE; -- else if (size > pktgen.eth_max_pkt) -- size = MAX_PKT_SIZE; -+ else if (size > pktsize) -+ size = pktsize; - else - size -= RTE_ETHER_CRC_LEN; - -diff --git a/app/pktgen-constants.h b/app/pktgen-constants.h -index 6c02f82..16d5f5c 100644 ---- a/app/pktgen-constants.h -+++ b/app/pktgen-constants.h -@@ -17,7 +17,7 @@ extern "C" { - enum { - #if !defined(RTE_LIBRTE_VMXNET3_PMD) && !defined(RTE_NET_VMXNET3) - DEFAULT_PKT_BURST = 64, /* Increasing this number consumes memory very fast */ -- DEFAULT_RX_DESC = (DEFAULT_PKT_BURST * 8 * 2), -+ DEFAULT_RX_DESC = (DEFAULT_PKT_BURST * 8 * 2 * 2), - DEFAULT_TX_DESC = DEFAULT_RX_DESC * 2, - #else - DEFAULT_PKT_BURST = 128, /* Increasing this number consumes memory very fast */ -@@ -30,7 +30,7 @@ enum { - MBUF_CACHE_SIZE = (MAX_MBUFS_PER_PORT / 8), - - DEFAULT_PRIV_SIZE = 0, -- -+ MBUF_9K_SIZE = 9018 + RTE_PKTMBUF_HEADROOM + DEFAULT_PRIV_SIZE, - NUM_Q = 16, /**< Number of cores per port. */ - }; - #define DEFAULT_MBUF_SIZE \ -diff --git a/app/pktgen-latency.c b/app/pktgen-latency.c -index bafaf1c..7787a6f 100644 ---- a/app/pktgen-latency.c -+++ b/app/pktgen-latency.c -@@ -8,6 +8,8 @@ - - #include <stdio.h> - -+#include <bus_driver.h> -+#include <bus_pci_driver.h> - #include "lua_config.h" - - #include "pktgen-cmds.h" -diff --git a/app/pktgen-main.c b/app/pktgen-main.c -index 7debdb3..11a118a 100644 ---- a/app/pktgen-main.c -+++ b/app/pktgen-main.c -@@ -29,6 +29,8 @@ - #include "pktgen-log.h" - #include "cli-functions.h" - -+#include <rte_pmd_qdma.h> -+ - /* Offset to the mbuf dynamic field holding pktgen data. */ - int pktgen_dynfield_offset = -1; - -@@ -206,7 +208,7 @@ pktgen_parse_args(int argc, char **argv) - pktgen.mbuf_buf_size = RTE_MBUF_DEFAULT_BUF_SIZE; - - pktgen.verbose = 0; -- while ((opt = getopt_long(argc, argvopt, "p:m:f:l:s:g:hPNGTvjtr", lgopts, &option_index)) != -+ while ((opt = getopt_long(argc, argvopt, "p:m:f:l:s:g:hPNGTvjtr9", lgopts, &option_index)) != - EOF) - switch (opt) { - case 't': -@@ -315,7 +317,12 @@ pktgen_parse_args(int argc, char **argv) - - case 'h': /* print out the help message */ - pktgen_usage(prgname); -- return -1; -+ return -1; -+ -+ case '9': /* MTU 9K support */ -+ pktgen_log_info("%s: case 9... \n", __func__); -+ pktgen.flags |= MTU9K_SUPPORT_FLAG; -+ break; - - case 0: /* crc-strip for all ports */ - printf(">>> Strip CRC in hardware is the default\n"); -@@ -421,7 +428,8 @@ RTE_FINI(pktgen_fini) - int - main(int argc, char **argv) - { -- uint32_t i; -+ uint32_t nb_ports; -+ int32_t i; - int32_t ret; - - setlocale(LC_ALL, ""); -@@ -574,10 +582,13 @@ main(int argc, char **argv) - /* Wait for all of the cores to stop running and exit. */ - rte_eal_mp_wait_lcore(); - -- RTE_ETH_FOREACH_DEV(i) -- { -- rte_eth_dev_stop(i); -- rte_delay_us_sleep(100 * 1000); -+ nb_ports = rte_eth_dev_count_avail(); -+ for(i = nb_ports-1; i >= 0; i--) { -+ if (rte_pmd_qdma_dev_remove(i)) -+ printf("Failed to detach port '%d'\n", i); -+ else -+ printf("successfully removed port '%d'\n", i); -+ - } - - cli_destroy(); -diff --git a/app/pktgen-port-cfg.c b/app/pktgen-port-cfg.c -index 7a61db3..3579d07 100644 ---- a/app/pktgen-port-cfg.c -+++ b/app/pktgen-port-cfg.c -@@ -10,6 +10,9 @@ - #include <cli_scrn.h> - #include <lua_config.h> - -+#include <bus_pci_driver.h> -+#include <bus_driver.h> -+ - #include "pktgen-port-cfg.h" - - #include "pktgen.h" -@@ -41,7 +44,6 @@ static struct rte_eth_conf default_port_conf = { - { - .mq_mode = RTE_ETH_MQ_RX_RSS, - .max_lro_pkt_size = RTE_ETHER_MAX_LEN, -- .split_hdr_size = 0, - }, - - .rx_adv_conf = -@@ -93,23 +95,25 @@ pktgen_mbuf_pool_create(const char *type, uint8_t pid, uint8_t queue_id, uint32_ - struct rte_mempool *mp; - char name[RTE_MEMZONE_NAMESIZE]; - uint64_t sz; -+ uint16_t mbuf_sz = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MBUF_9K_SIZE :DEFAULT_MBUF_SIZE; - - snprintf(name, sizeof(name), "%-12s%u:%u", type, pid, queue_id); - -- sz = nb_mbufs * (DEFAULT_MBUF_SIZE + sizeof(struct rte_mbuf)); -+ sz = nb_mbufs * (mbuf_sz + sizeof(struct rte_mbuf)); - sz = RTE_ALIGN_CEIL(sz + sizeof(struct rte_mempool), 1024); - - if (pktgen.verbose) - pktgen_log_info(" Create: %-*s - Memory used (MBUFs %5u x (size %u + Hdr %lu)) + %lu = " - "%6lu KB, headroom %d", -- 16, name, nb_mbufs, DEFAULT_MBUF_SIZE, sizeof(struct rte_mbuf), -+ 16, name, nb_mbufs, mbuf_sz, sizeof(struct rte_mbuf), - sizeof(struct rte_mempool), sz / 1024, RTE_PKTMBUF_HEADROOM); - - pktgen.mem_used += sz; - pktgen.total_mem_used += sz; - - /* create the mbuf pool */ -- mp = rte_pktmbuf_pool_create(name, nb_mbufs, cache_size, DEFAULT_PRIV_SIZE, DEFAULT_MBUF_SIZE, -+ mp = rte_pktmbuf_pool_create(name, nb_mbufs, cache_size, DEFAULT_PRIV_SIZE, mbuf_sz, - socket_id); - if (mp == NULL) - pktgen_log_panic( -@@ -194,7 +198,8 @@ pktgen_config_ports(void) - pg_port_matrix_dump(pktgen.l2p); - - pktgen_log_info(">>>> Configuring %d ports, MBUF Size %d, MBUF Cache Size %d", -- pktgen.nb_ports, DEFAULT_MBUF_SIZE, MBUF_CACHE_SIZE); -+ pktgen.nb_ports, (pktgen.flags & MTU9K_SUPPORT_FLAG) ? MBUF_9K_SIZE : -+ DEFAULT_MBUF_SIZE, MBUF_CACHE_SIZE); - } - - /* For each lcore setup each port that is handled by that lcore. */ -diff --git a/app/pktgen-port-cfg.h b/app/pktgen-port-cfg.h -index 820f131..6ee4f29 100644 ---- a/app/pktgen-port-cfg.h -+++ b/app/pktgen-port-cfg.h -@@ -421,7 +421,7 @@ rte_get_rx_capa_list(uint64_t rx_capa, char *buf, size_t len) - {RTE_ETH_RX_OFFLOAD_QINQ_STRIP, _(QINQ_STRIP)}, - {RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM, _(OUTER_IPV4_CKSUM)}, - {RTE_ETH_RX_OFFLOAD_MACSEC_STRIP, _(MACSEC_STRIP)}, -- {RTE_ETH_RX_OFFLOAD_HEADER_SPLIT, _(HEADER_SPLIT)}, -+ {RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT, _(HEADER_SPLIT)}, - {RTE_ETH_RX_OFFLOAD_VLAN_FILTER, _(VLAN_FILTER)}, - {RTE_ETH_RX_OFFLOAD_VLAN_EXTEND, _(VLAN_EXTEND)}, - {RTE_ETH_RX_OFFLOAD_SCATTER, _(SCATTER)}, -diff --git a/app/pktgen-range.c b/app/pktgen-range.c -index 7d0ece0..5d9bf04 100644 ---- a/app/pktgen-range.c -+++ b/app/pktgen-range.c -@@ -744,7 +744,8 @@ pktgen_range_setup(port_info_t *info) - range->pkt_size = MIN_PKT_SIZE; - range->pkt_size_inc = 0; - range->pkt_size_min = MIN_PKT_SIZE; -- range->pkt_size_max = MAX_PKT_SIZE; -+ range->pkt_size_max = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MAX_PKT_SIZE : (RTE_ETHER_MAX_LEN - RTE_ETHER_CRC_LEN); - - range->vxlan_gid = info->seq_pkt[SINGLE_PKT].group_id; - range->vxlan_gid_inc = 0; -diff --git a/app/pktgen-rate.c b/app/pktgen-rate.c -index 4599f8e..4f5aecb 100644 ---- a/app/pktgen-rate.c -+++ b/app/pktgen-rate.c -@@ -8,6 +8,8 @@ - - #include <stdio.h> - -+#include <bus_driver.h> -+#include <bus_pci_driver.h> - #include "lua_config.h" - - #include "pktgen-cmds.h" -diff --git a/app/pktgen-stats.c b/app/pktgen-stats.c -index e7f27ef..7840b08 100644 ---- a/app/pktgen-stats.c -+++ b/app/pktgen-stats.c -@@ -8,6 +8,8 @@ - - #include <stdio.h> - -+#include <bus_pci_driver.h> -+#include <bus_driver.h> - #include <pg_delay.h> - #include <lua_config.h> - -diff --git a/app/pktgen.c b/app/pktgen.c -index 448cc7f..14441f7 100644 ---- a/app/pktgen.c -+++ b/app/pktgen.c -@@ -75,6 +75,7 @@ pktgen_wire_size(port_info_t *info) - } else - size = info->seq_pkt[SINGLE_PKT].pktSize + PKT_OVERHEAD_SIZE; - } -+ size -= (PKT_PREAMBLE_SIZE + INTER_FRAME_GAP + RTE_ETHER_CRC_LEN); - return size; - } - -@@ -297,6 +298,7 @@ pktgen_send_burst(port_info_t *info, uint16_t qid) - struct qstats_s *qstats = &info->qstats[qid]; - uint32_t ret, cnt, tap, rnd, tstamp, i; - int32_t seq_idx; -+ pkt_seq_t *pkt; - - tap = pktgen_tst_port_flags(info, PROCESS_TX_TAP_PKTS); - -@@ -313,6 +315,10 @@ pktgen_send_burst(port_info_t *info, uint16_t qid) - else - seq_idx = SINGLE_PKT; - -+ pkt = &info->seq_pkt[seq_idx]; -+ for (i = 0; i < cnt; i++) -+ rte_pktmbuf_pkt_len(pkts[i]) = pkt->pktSize; -+ - rnd = pktgen_tst_port_flags(info, SEND_RANDOM_PKTS); - tstamp = - pktgen_tst_port_flags(info, (SEND_LATENCY_PKTS | SEND_RATE_PACKETS | SAMPLING_LATENCIES)); -@@ -930,6 +936,10 @@ pktgen_setup_cb(struct rte_mempool *mp, void *opaque, void *obj, unsigned obj_id - pkt_seq_t *pkt; - uint16_t qid, idx; - -+ uint32_t pktsize = (pktgen.flags & MTU9K_SUPPORT_FLAG) ? -+ MAX_PKT_SIZE: -+ (RTE_ETHER_MAX_LEN - RTE_ETHER_CRC_LEN); -+ - info = data->info; - qid = data->qid; - -@@ -958,7 +968,7 @@ pktgen_setup_cb(struct rte_mempool *mp, void *opaque, void *obj, unsigned obj_id - - pktgen_packet_ctor(info, idx, -1); - -- rte_memcpy((uint8_t *)m->buf_addr + m->data_off, (uint8_t *)&pkt->hdr, MAX_PKT_SIZE); -+ rte_memcpy((uint8_t *)m->buf_addr + m->data_off, (uint8_t *)&pkt->hdr, pktsize); - - m->pkt_len = pkt->pktSize; - m->data_len = pkt->pktSize; -@@ -1144,7 +1154,7 @@ pktgen_main_receive(port_info_t *info, uint8_t lid, struct rte_mbuf *pkts_burst[ - { - uint8_t pid; - uint16_t qid, nb_rx; -- capture_t *capture; -+ __rte_unused capture_t *capture; - struct qstats_s *qstats; - int i; - -@@ -1163,6 +1173,10 @@ pktgen_main_receive(port_info_t *info, uint8_t lid, struct rte_mbuf *pkts_burst[ - for (i = 0; i < nb_rx; i++) - qstats->rxbytes += rte_pktmbuf_data_len(pkts_burst[i]); - -+ info->qstats[qid].sizes._64 += nb_rx; -+ rte_pktmbuf_free_bulk(pkts_burst, nb_rx); -+ -+#if 0 - pktgen_recv_tstamp(info, pkts_burst, nb_rx); - - /* packets are not freed in the next call. */ -@@ -1178,6 +1192,7 @@ pktgen_main_receive(port_info_t *info, uint8_t lid, struct rte_mbuf *pkts_burst[ - } - - rte_pktmbuf_free_bulk(pkts_burst, nb_rx); -+#endif - } - - static void -diff --git a/app/pktgen.h b/app/pktgen.h -index 1be8389..4a70a3a 100644 ---- a/app/pktgen.h -+++ b/app/pktgen.h -@@ -239,8 +239,9 @@ enum { - SOCKET0 = 0 /**< Socket ID value for allocation */ - }; - -+#define MAX_9K_SIZE 9018 - #define MIN_PKT_SIZE (pktgen.eth_min_pkt - RTE_ETHER_CRC_LEN) --#define MAX_PKT_SIZE (pktgen.eth_max_pkt - RTE_ETHER_CRC_LEN) -+#define MAX_PKT_SIZE (MAX_9K_SIZE - RTE_ETHER_CRC_LEN) - - typedef struct rte_mbuf rte_mbuf_t; - -@@ -336,7 +337,7 @@ enum { /* Pktgen flags bits */ - FAKE_PORTS_FLAG = (1 << 9), /**< Fake ports enabled */ - BLINK_PORTS_FLAG = (1 << 10), /**< Blink the port leds */ - ENABLE_THEME_FLAG = (1 << 11), /**< Enable theme or color support */ -- -+ MTU9K_SUPPORT_FLAG = (1 << 15), /**< MTU 9K support */ - CONFIG_PAGE_FLAG = (1 << 16), /**< Display the configure page */ - SEQUENCE_PAGE_FLAG = (1 << 17), /**< Display the Packet sequence page */ - RANGE_PAGE_FLAG = (1 << 18), /**< Display the range page */ -diff --git a/lib/cli/cli_map.c b/lib/cli/cli_map.c -index 50e30e1..44b924c 100644 ---- a/lib/cli/cli_map.c -+++ b/lib/cli/cli_map.c -@@ -7,6 +7,7 @@ - #include <_atoip.h> - - #include "cli.h" -+#include "ctype.h" - - int - cli_map_list_search(const char *fmt, char *item, int index) -diff --git a/lib/common/pg_strings.c b/lib/common/pg_strings.c -index a81acf2..3320c43 100644 ---- a/lib/common/pg_strings.c -+++ b/lib/common/pg_strings.c -@@ -3,6 +3,7 @@ - */ - - #include "pg_strings.h" -+#include "ctype.h" - - #define SIZE_OF_PORTLIST (sizeof(portlist_t) * 8) - --- -2.27.0 - diff --git a/QDMA/DPDK/tools/README.txt b/QDMA/DPDK/tools/README.txt deleted file mode 100755 index 2cddef8..0000000 --- a/QDMA/DPDK/tools/README.txt +++ /dev/null @@ -1,45 +0,0 @@ -0001-PKTGEN-22.04.1-Patch-to-add-Jumbo-packet-support.patch -is the patch file over dpdk-pktgen v22.11.0 and -0001-PKTGEN-20.12.0-Patch-to-add-Jumbo-packet-support.patch -is the patch file over dpdk-pktgen v20.12.0 that extends -dpdk-pktgen application to handle packets with packet sizes -more than 1518 bytes and it disables the packet size -classification logic in dpdk-pktgen to remove application -overhead in performance measurement. - -This patch is used for performance testing with dpdk-pktgen application. - - -/*- - * BSD LICENSE - * - * Copyright (c) 2017-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - diff --git a/QDMA/linux-kernel/LICENSE b/QDMA/linux-kernel/LICENSE deleted file mode 100755 index 94e1237..0000000 --- a/QDMA/linux-kernel/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -BSD License - -For Xilinx DMA IP software - -Copyright (c) 2016-2022 Xilinx, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Xilinx nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/QDMA/linux-kernel/Makefile b/QDMA/linux-kernel/Makefile deleted file mode 100755 index 53b933d..0000000 --- a/QDMA/linux-kernel/Makefile +++ /dev/null @@ -1,184 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - - -SHELL = /bin/bash - -# -# makefile parameters: -# - KDIR/KSRC/KOBJ=, optional -# - install_path=, override all install directories -# - kernel_install_path=, override install directory for kernel module -# - dev_install_path=, override install directory for development headers -# - apps_install_path=, override install directory for applications -# - docs_install_path=, override install directory for man pages -# -# - enable_cmpt_immediate_data=<0|1> enable immediate data in writeback desc. -# - disable_st_c2h_completion=<0|1> disable completion -# - CROSS_COMPILE=, gcc compiler prefix for architecture eg. aarch64-linux-gnu- - -# Define grep error output to NULL, since -s is not portable. -grep = grep 2>/dev/null - -# Define paths. -srcdir := $(shell pwd) -topdir := $(shell cd $(srcdir)/.. && pwd) -bin_dir := $(srcdir)/bin -apps_dir := $(srcdir)/apps - - -# ALL subdirectories -ALLSUBDIRS := driver -DRIVER_SRC_DIR := driver - -# Exports. -export grep -export srcdir -export topdir -export bin_dir -export verbose - -# evaluate install paths -ifeq ($(install_path),) - # defaults - kernel_install_path ?= $(PREFIX)/lib/modules/$(utsrelease)/updates/kernel/drivers/qdma - dev_install_path ?= /usr/local/include/qdma - apps_install_path ?= /usr/local/sbin - docs_install_path ?= /usr/share/man/man8 -else # bundled install - kernel_install_path ?= $(install_path)/modules - dev_install_path ?= $(install_path)/include/qdma - apps_install_path ?= $(install_path)/bin - docs_install_path ?= $(install_path)/doc -endif - -.PHONY: eval.mak - -.PHONY: default -default: apps driver post - -.PHONY: install -install: install-apps install-dev install-mods - -.PHONY: uninstall -uninstall: uninstall-apps uninstall-dev uninstall-mods - -.PHONY: apps -apps: - @echo "#######################"; - @echo "#### apps ####"; - @echo "#######################"; - $(MAKE) -C apps - -.PHONY: driver -driver: - @echo "#######################"; - @echo "#### Driver ####"; - @echo "#######################"; - $(MAKE) $(MODULE) -C driver modulesymfile=$(srcdir)/driver/src/Module.symvers - -.PHONY: post -post: - @if [ -n "$(post_msg)" ]; then \ - echo -e "\nWARNING:\n $(post_msg)";\ - fi; - -.PHONY: clean -clean: - @echo "#######################"; - @echo "#### apps ####"; - @echo "#######################"; - $(MAKE) -C apps clean; - @for dir in $(ALLSUBDIRS); do \ - echo "#######################";\ - printf "#### %-8s%5s####\n" $$dir;\ - echo "#######################";\ - drvdir=$(shell pwd)/$$dir $(MAKE) -C $$dir clean;\ - done; - @-/bin/rm -f *.symvers eval.mak 2>/dev/null; - @rm -rf $(bin_dir) - -.PHONY: install-mods -install-mods: - @echo "installing kernel modules to /lib/modules/$(shell uname -r)/qdma ..." - @mkdir -p -m 755 /lib/modules/$(shell uname -r)/qdma - @install -v -m 644 $(bin_dir)/*.ko /lib/modules/$(shell uname -r)/qdma - @depmod -a || true - - -.PHONY: install-apps -install-apps: - @echo "installing apps to $(apps_install_path) ..." - @mkdir -p -m 755 $(apps_install_path) - @install -v -m 755 bin/dma-ctl* $(apps_install_path) - @install -v -m 755 bin/dma-xfer* $(apps_install_path) - @install -v -m 755 bin/dma-from-device $(apps_install_path) - @install -v -m 755 bin/dma-to-device $(apps_install_path) - @install -v -m 755 bin/dma-perf $(apps_install_path) - @install -v -m 755 bin/dma-latency $(apps_install_path) - @echo "MAN PAGES:" - @mkdir -p -m 755 $(docs_install_path) - @install -v -m 644 docs/dma-ctl.8.gz $(docs_install_path) - -.PHONY: install-dev -install-dev: - @echo "installing development headers to $(dev_install_path) ..." - @mkdir -p -m 755 $(dev_install_path) - @install -v -m 755 driver/include/* $(dev_install_path) - -.PHONY: uninstall-mods -uninstall-mods: - @echo "Un-installing /lib/modules/$(shell uname -r)/qdma ..." - @/bin/rm -rf /lib/modules/$(shell uname -r)/qdma - @depmod -a - -.PHONY: uninstall-apps -uninstall-apps: - @echo "Un-installing apps under $(apps_install_path) ..." - @/bin/rm -f $(apps_install_path)/dma-ctl - @/bin/rm -f $(apps_install_path)/dma-xfer - @/bin/rm -f $(apps_install_path)/dma-from-device - @/bin/rm -f $(apps_install_path)/dma-to-device - @/bin/rm -f $(apps_install_path)/dma-perf - @/bin/rm -f $(apps_install_path)/dma-latency - -.PHONY: uninstall-dev -uninstall-dev: - @echo "Un-installing development headers under $(dev_install_path) ..." - @/bin/rm -r $(dev_install_path) - -.PHONY: help -help: - @echo "Build Targets:";\ - echo " install - Installs apps and development headers.";\ - echo " uninstall - Uninstalls apps and development headers.";\ - echo " install-mods - Installs drivers.";\ - echo " uninstall-mods - Uninstalls drivers.";\ - echo;\ - echo "Build Options:";\ - echo " KOBJ=<path> - Kernel build (object) path.";\ - echo " KSRC=<path> - Kernel source path.";\ - echo " - Note: When using KSRC or KOBJ, both";\ - echo " variables must be specified.";\ - echo " KDIR=<path> - Kernel build and source path. Shortcut";\ - echo " for KOBJ=KSRC=<path>.";\ - echo " kernel_install_path=<path>";\ - echo " - kernel module install path.";\ - echo " apps_install_path=<path>";\ - echo " - user cli tool install path."; diff --git a/QDMA/linux-kernel/RELEASE b/QDMA/linux-kernel/RELEASE deleted file mode 100755 index 39807d7..0000000 --- a/QDMA/linux-kernel/RELEASE +++ /dev/null @@ -1,208 +0,0 @@ -RELEASE: 2023.2.1 -================= - -This release is validated - - On VCU1525 for QDMA5.0 2022.1 example design - - On VCU1525 for QDMA4.0 2020.2 example design - - On VCU1525 for QDMA3.1 2019.2 example design - - On XCVP1202 for CPM5 2022.1 example design - - On XCVC1902 for CPM4 2022.1 example design - -SUPPORTED FEATURES: -=================== -2018.2 Features ---------------- -- Support for both the AXI4 Memory Mapped(MM) and AXI4 Streaming(ST) Interfaces -- 2048 Queue Sets - - 2048 H2C Descriptor Rings - - 2048 C2H Descriptor Rings - - 2048 C2H Completion Rings -- Supports Polling Mode -- Interrupts - - 2048 MSI-X Vectors - - Up to 8 MSI-X per Function - - Interrupt Aggregation - - User Interrupts - - Error Interrupts -- C2H Stream Completion queue entry coalescing -- Supports SR-IOV with up to 4 Physical Functions(PF) and 252 Virtual Functions(VF) -- Allows only Privileged/Physical functions to program the contexts and registers -- Function Level Reset(FLR) Support -- Mailbox Support -- Descriptor bypass(8, 16, 32 descriptor sizes) -- Descriptor Prefetching -- Asynchronous and Synchronous IO support -- ST H2C to C2H and C2H to H2C loopback support -- Driver configuration through sysfs -- Zero byte transfer support -- Dynamic queue configuration -- Dynamic driver configuration - -2018.3 Features ---------------- -- Auto mode support for PF & VF driver - - MM and ST H2C requests are services in poll mode - - ST C2H is services in Interrupt Aggregation mode -- Support 64B descriptor format in bypass mode -- Support for Completion queue descriptors of 64 bytes size -- Support flexible BAR mapping for QDMA configuration register space -- Indirect programming of FMAP registers -- Support disabling overflow check in completion ring -- Version for SW and HW -- ECC Support -- Flexible interrupt allocation between PF/VF -- Greater than 32 vectors per function -- Legacy Interrupt Support -- VF driver support in direct and indirect interrupt mode - -2019.1 Features ---------------- -- Interrupt support for Mailbox events -- Support Completions in Memory mapped mode -- Interoperability between Linux driver (as PF/VF) and DPDK driver (as PF/VF) -- Driver restructuring to partition QDMA access code such that it can be used across different drivers - -2019.2 Features ---------------- -- Support for PF device removal when its VF devices are active -- Support for Interrupt moderation and adaptive counter threshold -- Support for configurable number of User and Data interrupts -- Added user logic pluggable interfaces for processing the descriptors and completions -- Added new interfaces for updating the Consumer Index and Producer Index - -2020.1 Updates --------------- -- Modified the directory structure for driver source code. -- Application names are changed as "dma-ctl", "dma-perf", "dma-to-device", "dma-from-device" -- Support QDMA4.0 context and register changes -- Common driver to support QDMA3.1 and QDMA4.0 designs -- Support multiple bus numbers on single card -- Updated and validated the example design with marker changes for QDMA4.0 and without marker changes for QDMA3.1 -- Added support for more than 256 functions -- Modified the driver interface to pass the module parameters for more than 256 functions -- Support for Function Level Reset (FLR) of both PFs and VFs. - -2020.1 Patch Updates --------------------- -- Resolved HW errors observed with QDMA4.0 MM only design -- Addressed VF performance issues. - -2020.2 Updates --------------- -- Added support for detailed register dump -- Added support for post processing HW error messages -- Added support for Debug mode and Internal only mode -- Added support for Versal PDI programming through keyhole interface - -2020.2 Patch Updates --------------------- -- Added support for MM Channel Selection and Keyhole feature in dmaperf -- Fixed bug in in driver which caused crash during performance run - -2022.1 Updates --------------- -CPM5 - - Tandem Boot support - - FMAP context dump - - Debug register dump for ST and MM Errors - - Dual Instance support - -2022.1.1 Patch Updates ----------------------- -- Ported changes from pull request https://github.com/Xilinx/dma_ip_drivers/pull/167 to fix XRT build issues while integrating qdma linux driver in to XRT stack - -2022.1.2 Patch Updates ----------------------- -- Added VF 4K queues support for CPM5 design. This feature is applicable only when corresponding RTL support is added. - -2022.1.3 Patch Updates ----------------------- -- Ported changes from pull request https://github.com/Xilinx/dma_ip_drivers/pull/170 to fix coverity issues - -2022.1.4 Patch Updates ----------------------- -- Added support for more than 2K queues for PF/VF -- Added support for Fedora36 - -2022.1.5 Patch Updates ----------------------- -- Added PF/VF 4K queues support for CPM5 design. This feature is applicable only when corresponding RTL support is added. - -2023.1.0 Updates ----------------- -- Updated the queue list command for >2048 Q's. -- Added support to accomodate H2C & C2H Q's offset with fixed intervals for dma-perf application. - -2023.1.1 Updates ----------------- -- Optimized the driver code and HW register settings for performance improvements. - -2023.1.2 Updates ----------------- -- Added support for Fedora37 & CentOS9 distros. - -2023.1.3 Updates ----------------- -- dma-ctl application is updated to append q params during queue start. - -2023.2.0 Updates ----------------- -- Added driver support for CPM4 design. - -2023.2.1 Updates ----------------- -- Added driver support to enable 10 bit tag for CPM5 design. - -KNOWN ISSUES: -============= -- CPM4 Only - - Due to HW PDI limitaion, - - VF is supported in poll mode only. - - VF functionality on VM is not verfied. - -- Observed MMAP failure for applications when device is binded QDMA Linux driver on Fedora37. Fix will be availbale in upcoming release. - -- CPM5 Only - - Performace optimizations are not finalized, Performance report with optimizations will be available in next patch release. - -- All Designs - - In interrupt mode, Sometimes completions are not received when C2H PIDX updates are held for 64 descriptors - - On QDMA4.0 2020.1 design, HW error observed during the probe of the VFs - -DRIVER LIMITATIONS: -=================== -- CPM5 Only - - VF functionality is verified with 240 VF's as per CPM5 HW limitation - -- All Designs - - Driver compilation on Fedora 28 with gcc8.1 results in compilation warnings - - Big endian systems are not supported - - For optimal QDMA streaming performance, packet buffers of the descriptor ring should be aligned to at least 256 bytes. - - FLR is not supported in the Driver for CentOS because linux kernels provided in CentOS versions does not support the driver call back registration for FLR functionality - -- XRT Only - - QDMA: Bypass user BAR check for XRT application - - The existing driver code assmues the presence of the user BAR as indicated in the functional example design. If this user BAR is not detected during the driver probing process, - it results in a failure. However, this check is specific to example design and some customer designs might not contain user BAR. So bypassing the user BAR check to prevent - driver returning error and proceed further. - - - -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ diff --git a/QDMA/linux-kernel/apps/Makefile b/QDMA/linux-kernel/apps/Makefile deleted file mode 100755 index 9b7e987..0000000 --- a/QDMA/linux-kernel/apps/Makefile +++ /dev/null @@ -1,122 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -SHELL = /bin/bash - -CFLAGS += -g -#CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += $(EXTRA_FLAGS) - -srcdir := $(shell pwd) -topdir := $(shell cd $(srcdir)/.. && pwd) -bin_dir := $(topdir)/bin -dma-ctl_dir = $(srcdir)/dma-ctl -dma-from-device_dir = $(srcdir)/dma-from-device -dma-to-device_dir = $(srcdir)/dma-to-device -dma-xfer_dir = $(srcdir)/dma-xfer -dma-perf_dir = $(srcdir)/dma-perf -dma-latency_dir = $(srcdir)/dma-latency - -export topdir -export bin_dir - -all: clean apps - -.PHONY: dma-from-device -dma-from-device: - @echo "#############################"; - @echo "#### dma-from-device ####"; - @echo "#############################"; - $(MAKE) -C dma-from-device - @cp -f $(dma-from-device_dir)/dma-from-device $(bin_dir) - -.PHONY: dma-to-device -dma-to-device: - @echo "###########################"; - @echo "#### dma-to-device ####"; - @echo "###########################"; - $(MAKE) -C dma-to-device - @cp -f $(dma-to-device_dir)/dma-to-device $(bin_dir) - -.PHONY: dma-xfer -dma-xfer: - @echo "###########################"; - @echo "#### dma-xfer #####"; - @echo "###########################"; - $(MAKE) -C dma-xfer - @cp -f $(dma-xfer_dir)/dma-xfer $(bin_dir) - -.PHONY: dma-ctl -dma-ctl: - @echo "#######################"; - @echo "#### dma-ctl ######"; - @echo "#######################"; - @mkdir -p -m 755 $(bin_dir) - $(MAKE) -C dma-ctl - @cp -f $(dma-ctl_dir)/dma-ctl $(bin_dir) - - -.PHONY: dma-perf -dma-perf: - @echo "########################"; - @echo "#### dma-perf #######"; - @echo "########################"; - $(MAKE) -C dma-perf - @cp -f $(dma-perf_dir)/dma-perf $(bin_dir) - -.PHONY: dma-latency -dma-latency: - @echo "########################"; - @echo "#### dma-latency #######"; - @echo "########################"; - $(MAKE) -C dma-latency - @cp -f $(dma-latency_dir)/dma-latency $(bin_dir) - -.PHONY: apps -apps: dma-ctl dma-from-device dma-to-device dma-xfer dma-perf dma-latency - - -.PHONY: clean -clean: - @echo "#############################"; - @echo "#### dma-from-device ####"; - @echo "#############################"; - $(MAKE) -C dma-from-device clean; - @echo "#############################"; - @echo "#### dma-to-device ####"; - @echo "#############################"; - $(MAKE) -C dma-to-device clean; - @echo "#############################"; - @echo "#### dma-xfer ####"; - @echo "#############################"; - $(MAKE) -C dma-xfer clean; - @echo "#############################"; - @echo "#### dma-ctl ####"; - @echo "#############################"; - $(MAKE) -C dma-ctl clean; - @echo "#############################"; - @echo "#### dma-perf ####"; - @echo "#############################"; - $(MAKE) -C dma-perf clean; - @echo "#############################"; - @echo "#### dma-latency ####"; - @echo "#############################"; - $(MAKE) -C dma-latency clean; - @rm -f $(bin_dir)/dma-ctl $(bin_dir)/dma-from-device $(bin_dir)/dma-to-device $(bin_dir)/dma-xfer $(bin_dir)/dma-perf $(bin_dir)/dma-latency - @for dir in $(ALLSUBDIRS); do \ - echo "#######################";\ - printf "#### %-8s%5s####\n" $$dir;\ - echo "#######################";\ - drvdir=$(shell pwd)/$$dir $(MAKE) -C $$dir clean;\ - done; - @-/bin/rm -f *.symvers eval.mak 2>/dev/null; - diff --git a/QDMA/linux-kernel/apps/dma-ctl/Makefile b/QDMA/linux-kernel/apps/dma-ctl/Makefile deleted file mode 100755 index ef55091..0000000 --- a/QDMA/linux-kernel/apps/dma-ctl/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -SHELL = /bin/bash - -CFLAGS += -g -#CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I../include -I../dma-utils -CFLAGS += $(EXTRA_FLAGS) - -DMA-CTL = dma-ctl -DMA-UTILS_OBJS := $(patsubst %.c,%.o,$(wildcard ../dma-utils/*.c)) -DMA-CTL_OBJS := $(patsubst %.c,%.o,$(wildcard *.c)) -DMA-CTL_OBJS += $(DMA-UTILS_OBJS) - -ifneq ($(CROSS_COMPILE_FLAG),) - CC=$(CROSS_COMPILE_FLAG)gcc -endif - -all: clean dma-ctl - -dma-ctl: $(DMA-CTL_OBJS) - $(CC) -pthread -lrt $^ -o $(DMA-CTL) -laio -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE - -%.o: %.c - $(CC) $(CFLAGS) -c -std=c99 -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE -D_AIO_AIX_SOURCE - -clean: - @rm -f *.o */*.o ../dma-utils/*.o $(DMA-CTL) diff --git a/QDMA/linux-kernel/apps/dma-ctl/cmd_parse.c b/QDMA/linux-kernel/apps/dma-ctl/cmd_parse.c deleted file mode 100755 index 18ecd7b..0000000 --- a/QDMA/linux-kernel/apps/dma-ctl/cmd_parse.c +++ /dev/null @@ -1,1259 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#include <stddef.h> -#include <stdint.h> -#include <unistd.h> -#include <ctype.h> -#include <err.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "cmd_parse.h" -#include "qdma_nl.h" -#include "version.h" - -static int read_range(int argc, char *argv[], int i, unsigned int *v1, - unsigned int *v2); - -static const char *progname; -#define DESC_SIZE_64B 3 - -#define Q_ADD_ATTR_IGNORE_MASK ~((1 << QPARM_IDX) | \ - (1 << QPARM_MODE) | \ - (1 << QPARM_DIR)) -#define Q_START_ATTR_IGNORE_MASK ((1 << QPARM_MODE) | \ - (1 << QPARM_DESC) | \ - (1 << QPARM_CMPT)) -#define Q_STOP_ATTR_IGNORE_MASK ~((1 << QPARM_IDX) | \ - (1 << QPARM_DIR)) -#define Q_DEL_ATTR_IGNORE_MASK ~((1 << QPARM_IDX) | \ - (1 << QPARM_DIR)) -#define Q_DUMP_ATTR_IGNORE_MASK ~((1 << QPARM_IDX) | \ - (1 << QPARM_DIR) | \ - (1 << QPARM_DESC) | \ - (1 << QPARM_CMPT)) -#define Q_DUMP_PKT_ATTR_IGNORE_MASK ~((1 << QPARM_IDX) | \ - (1 << QPARM_DIR)) -#define Q_H2C_ATTR_IGNORE_MASK ((1 << QPARM_C2H_BUFSZ_IDX) | \ - (1 << QPARM_CMPT_TMR_IDX) | \ - (1 << QPARM_CMPT_CNTR_IDX) | \ - (1 << QPARM_CMPT_TRIG_MODE) | \ - (1 << QPARM_CMPTSZ)) -#define Q_CMPT_READ_ATTR_IGNORE_MASK ~((1 << QPARM_IDX) | \ - (1 << QPARM_DIR)) -#define Q_ADD_FLAG_IGNORE_MASK ~(XNL_F_QMODE_ST | \ - XNL_F_QMODE_MM | \ - XNL_F_QDIR_BOTH | XNL_F_Q_CMPL) -#define Q_START_FLAG_IGNORE_MASK (XNL_F_QMODE_ST | \ - XNL_F_QMODE_MM) -#define Q_STOP_FLAG_IGNORE_MASK ~(XNL_F_QMODE_ST | \ - XNL_F_QMODE_MM | \ - XNL_F_QDIR_BOTH | XNL_F_Q_CMPL) -#define Q_DEL_FLAG_IGNORE_MASK ~(XNL_F_QMODE_ST | \ - XNL_F_QMODE_MM | \ - XNL_F_QDIR_BOTH | XNL_F_Q_CMPL) -#define Q_DUMP_FLAG_IGNORE_MASK ~(XNL_F_QMODE_ST | \ - XNL_F_QMODE_MM | \ - XNL_F_QDIR_BOTH | XNL_F_Q_CMPL) -#define Q_DUMP_PKT_FLAG_IGNORE_MASK ~(XNL_F_QMODE_ST | \ - XNL_F_QMODE_MM | \ - XNL_F_QDIR_C2H) -#define Q_H2C_FLAG_IGNORE_MASK (XNL_F_C2H_CMPL_INTR_EN | \ - XNL_F_CMPL_UDD_EN) - -#define Q_CMPT_READ_FLAG_IGNORE_MASK ~(XNL_F_QMODE_ST | \ - XNL_F_QMODE_MM | \ - XNL_F_QDIR_BOTH | XNL_F_Q_CMPL) - -#ifdef ERR_DEBUG -char *qdma_err_str[qdma_errs] = { - "err_ram_sbe", - "err_ram_dbe", - "err_dsc", - "err_trq", - "err_h2c_mm_0", - "err_h2c_mm_1", - "err_c2h_mm_0", - "err_c2h_mm_1", - "err_c2h_st", - "ind_ctxt_cmd_err", - "err_bdg", - "err_h2c_st", - "poison", - "ur_ca", - "param", - "addr", - "tag", - "flr", - "timeout", - "dat_poison", - "flr_cancel", - "dma", - "dsc", - "rq_cancel", - "dbe", - "sbe", - "unmapped", - "qid_range", - "vf_access_err", - "tcp_timeout", - "mty_mismatch", - "len_mismatch", - "qid_mismatch", - "desc_rsp_err", - "eng_wpl_data_par_err", - "msi_int_fail", - "err_desc_cnt", - "portid_ctxt_mismatch", - "portid_byp_in_mismatch", - "cmpt_inv_q_err", - "cmpt_qfull_err", - "cmpt_cidx_err", - "cmpt_prty_err", - "fatal_mty_mismatch", - "fatal_len_mismatch", - "fatal_qid_mismatch", - "timer_fifo_ram_rdbe", - "fatal_eng_wpl_data_par_err", - "pfch_II_ram_rdbe", - "cmpt_ctxt_ram_rdbe", - "pfch_ctxt_ram_rdbe", - "desc_req_fifo_ram_rdbe", - "int_ctxt_ram_rdbe", - "cmpt_coal_data_ram_rdbe", - "tuser_fifo_ram_rdbe", - "qid_fifo_ram_rdbe", - "payload_fifo_ram_rdbe", - "wpl_data_par_err", - "zero_len_desc_err", - "csi_mop_err", - "no_dma_dsc_err", - "sb_mi_h2c0_dat", - "sb_mi_c2h0_dat", - "sb_h2c_rd_brg_dat", - "sb_h2c_wr_brg_dat", - "sb_c2h_rd_brg_dat", - "sb_c2h_wr_brg_dat", - "sb_func_map", - "sb_dsc_hw_ctxt", - "sb_dsc_crd_rcv", - "sb_dsc_sw_ctxt", - "sb_dsc_cpli", - "sb_dsc_cpld", - "sb_pasid_ctxt_ram", - "sb_timer_fifo_ram", - "sb_payload_fifo_ram", - "sb_qid_fifo_ram", - "sb_tuser_fifo_ram", - "sb_wrb_coal_data_ram", - "sb_int_qid2vec_ram", - "sb_int_ctxt_ram", - "sb_desc_req_fifo_ram", - "sb_pfch_ctxt_ram", - "sb_wrb_ctxt_ram", - "sb_pfch_ll_ram", - "sb_h2c_pend_fifo", - "db_mi_h2c0_dat", - "db_mi_c2h0_dat", - "db_h2c_rd_brg_dat", - "db_h2c_wr_brg_dat", - "db_c2h_rd_brg_dat", - "db_c2h_wr_brg_dat", - "db_func_map", - "db_dsc_hw_ctxt", - "db_dsc_crd_rcv", - "db_dsc_sw_ctxt", - "db_dsc_cpli", - "db_dsc_cpld", - "db_pasid_ctxt_ram", - "db_timer_fifo_ram", - "db_payload_fifo_ram", - "db_qid_fifo_ram", - "db_tuser_fifo_ram", - "db_wrb_coal_data_ram", - "db_int_qid2vec_ram", - "db_int_ctxt_ram", - "db_desc_req_fifo_ram", - "db_pfch_ctxt_ram", - "db_wrb_ctxt_ram", - "db_pfch_ll_ram", - "db_h2c_pend_fifo", -}; -#endif - -static void __attribute__((noreturn)) usage(FILE *fp) -{ - fprintf(fp, "Usage: %s [dev|qdma[vf]<N>] [operation] \n", progname); - fprintf(fp, "\tdev [operation]: system wide FPGA operations\n"); - fprintf(fp, - "\t\tlist list all qdma functions\n"); - fprintf(fp, - "\tqdma[N] [operation]: per QDMA FPGA operations\n"); - fprintf(fp, - "\t\tcap.... lists the Hardware and Software version and capabilities\n" - "\t\tstat statistics of qdma[N] device\n" - "\t\tstat clear clear all statistics data of qdma[N} device\n" - "\t\tglobal_csr dump the Global CSR of qdma[N} device\n" - "\t\tq list <start_idx> <num_Qs> - List <num_Qs> queues from idx <start_idx>\n" - "\t\tq add idx <N> [mode <mm|st>] [dir <h2c|c2h|bi|cmpt>] - add a queue\n" - "\t\t *mode default to mm\n" - "\t\t *dir default to h2c\n" - "\t\tq add list <start_idx> <num_Qs> [mode <mm|st>] [dir <h2c|c2h|bi|cmpt>] - add multiple queues at once\n" - "\t\tq start idx <N> [dir <h2c|c2h|bi|cmpt>] [idx_ringsz <0:15>] [idx_bufsz <0:15>] [idx_tmr <0:15>]\n" - " [idx_cntr <0:15>] [trigmode <every|usr_cnt|usr|usr_tmr|dis>] [cmptsz <0|1|2|3>] [sw_desc_sz <3>]\n" - " [mm_chn <0|1>] [desc_bypass_en] [pfetch_en] [pfetch_bypass_en] [dis_cmpl_status]\n" - " [dis_cmpl_status_acc] [dis_cmpl_status_pend_chk] [c2h_udd_en]\n" - " [cmpl_ovf_dis] [fetch_credit <h2c|c2h|bi|none>] [dis_cmpl_status] [c2h_cmpl_intr_en] [aperture_sz <aperture size power of 2>]- start a single queue\n" - "\t\tq start list <start_idx> <num_Qs> [dir <h2c|c2h|bi|cmpt>] [idx_bufsz <0:15>] [idx_tmr <0:15>]\n" - " [idx_cntr <0:15>] [trigmode <every|usr_cnt|usr|usr_tmr|dis>] [cmptsz <0|1|2|3>] [sw_desc_sz <3>]\n" - " [mm_chn <0|1>] [desc_bypass_en] [pfetch_en] [pfetch_bypass_en] [dis_cmpl_status]\n" - " [dis_cmpl_status_acc] [dis_cmpl_status_pend_chk] [cmpl_ovf_dis]\n" - " [fetch_credit <h2c|c2h|bi|none>] [dis_cmpl_status] [c2h_cmpl_intr_en] [aperture_sz <aperture size power of 2>]- start multiple queues at once\n" - "\t\tq stop idx <N> dir [<h2c|c2h|bi|cmpt>] - stop a single queue\n" - "\t\tq stop list <start_idx> <num_Qs> dir [<h2c|c2h|bi|cmpt>] - stop list of queues at once\n" - "\t\tq del idx <N> dir [<h2c|c2h|bi|cmpt>] - delete a queue\n" - "\t\tq del list <start_idx> <num_Qs> dir [<h2c|c2h|bi|cmpt>] - delete list of queues at once\n" - "\t\tq dump idx <N> dir [<h2c|c2h|bi|cmpt>] dump queue param\n" - "\t\tq dump list <start_idx> <num_Qs> dir [<h2c|c2h|bi|cmpt>] - dump queue param\n" - "\t\tq dump idx <N> dir [<h2c|c2h|bi>] desc <x> <y> - dump desc ring entry x ~ y\n" - "\t\tq dump list <start_idx> <num_Qs> dir [<h2c|c2h|bi>] desc <x> <y> - dump desc ring entry x ~ y\n" - "\t\tq dump idx <N> dir [<h2c|c2h|bi|cmpt>] cmpt <x> <y> - dump cmpt ring entry x ~ y\n" - "\t\tq dump list <start_idx> <num_Qs> dir [<h2c|c2h|bi|cmpt>] cmpt <x> <y> - dump cmpt ring entry x ~ y\n" - "\t\tq cmpt_read idx <N> - read the completion data\n" -#ifdef ERR_DEBUG - "\t\tq err help - help to induce errors \n" - "\t\tq err idx <N> [<err <[1|0]>>] dir <[h2c|c2h|bi]> - induce errors on q idx <N> \n" -#endif - ); - fprintf(fp, - "\t\treg dump [dmap <Q> <N>] - register dump. Only dump dmap registers if dmap is specified.\n" - "\t\t specify dmap range to dump: Q=queue, N=num of queues\n" - "\t\treg read [bar <N>] <addr> - read a register\n" - "\t\treg write [bar <N>] <addr> <val> - write a register\n" - "\t\treg info bar <N> <addr> [num_regs <M>] - dump detailed fields information of a register\n"); - fprintf(fp, - "\t\tintring dump vector <N> <start_idx> <end_idx> - interrupt ring dump for vector number <N> \n" - "\t\t for intrrupt entries :<start_idx> --- <end_idx>\n"); -#ifdef TANDEM_BOOT_SUPPORTED - fprintf(fp, "\t\ten_st - enable streamig \n"); -#endif - exit(fp == stderr ? 1 : 0); -} - -static int arg_read_int(char *s, uint32_t *v) -{ - char *p; - - *v = strtoul(s, &p, 0); - if (*p) { - warnx("bad parameter \"%s\", integer expected", s); - return -EINVAL; - } - return 0; -} - -static int parse_ifname(char *name, struct xcmd_info *xcmd) -{ - int len = strlen(name); - int pos, i; - uint32_t v; - char *p; - - /* qdmaN of qdmavfN*/ - if (len > 11) { - warnx("interface name %s too long, expect qdma<N>.\n", name); - return -EINVAL; - } - if (strncmp(name, "qdma", 4)) { - warnx("bad interface name %s, expect qdma<N>.\n", name); - return -EINVAL; - } - if (name[4] == 'v' && name[5] == 'f') { - xcmd->vf = 1; - pos = 6; - } else { - xcmd->vf = 0; - pos = 4; - } - for (i = pos; i < len; i++) { - if (!isxdigit(name[i])) { - warnx("%s unexpected <qdmaN>, %d.\n", name, i); - return -EINVAL; - } - } - - v = strtoul(name + pos, &p, 16); - if (*p) { - warnx("bad parameter \"%s\", integer expected", name + pos); - return -EINVAL; - } - - xcmd->if_bdf = v; - return 0; -} - -#define get_next_arg(argc, argv, i) \ - if (++(*i) >= argc) { \ - warnx("%s missing parameter after \"%s\".\n", __FUNCTION__, argv[--(*i)]); \ - return -EINVAL; \ - } - -#define __get_next_arg(argc, argv, i) \ - if (++i >= argc) { \ - warnx("%s missing parameter aft \"%s\".\n", __FUNCTION__, argv[--i]); \ - return -EINVAL; \ - } - -static int next_arg_read_int(int argc, char *argv[], int *i, unsigned int *v) -{ - get_next_arg(argc, argv, i); - return arg_read_int(argv[*i], v); -} - -static int validate_regcmd(enum xnl_op_t qcmd, struct xcmd_reg *regcmd) -{ - int invalid = 0; - - switch(qcmd) { - case XNL_CMD_REG_DUMP: - break; - case XNL_CMD_REG_RD: - case XNL_CMD_REG_INFO_READ: - case XNL_CMD_REG_WRT: - if ((regcmd->bar != 0) && (regcmd->bar != 2) && (regcmd->bar != 4)) { - printf("dmactl: bar %u number out of range\n", - regcmd->bar); - invalid = -EINVAL; - break; - } - break; - default: - invalid = -EINVAL; - break; - } - - return invalid; -} - -static int parse_reg_cmd(int argc, char *argv[], int i, struct xcmd_info *xcmd) -{ - struct xcmd_reg *regcmd = &xcmd->req.reg; - int rv; - int args_valid; - - /* - * reg dump - * reg read [bar <N>] <addr> - * reg write [bar <N>] <addr> <val> - */ - - memset(regcmd, 0, sizeof(struct xcmd_reg)); - if (!strcmp(argv[i], "dump")) { - xcmd->op = XNL_CMD_REG_DUMP; - i++; - - if (i < argc) { - if (!strcmp(argv[i], "dmap")) { - get_next_arg(argc, argv, &i); - rv = read_range(argc, argv, i, ®cmd->range_start, - ®cmd->range_end); - if (rv < 0) - return rv; - i = rv; - } - } - - } else if (!strcmp(argv[i], "read")) { - xcmd->op = XNL_CMD_REG_RD; - - get_next_arg(argc, argv, &i); - if (!strcmp(argv[i], "bar")) { - rv = next_arg_read_int(argc, argv, &i, ®cmd->bar); - if (rv < 0) - return rv; - regcmd->sflags |= XCMD_REG_F_BAR_SET; - get_next_arg(argc, argv, &i); - } - rv = arg_read_int(argv[i], ®cmd->reg); - if (rv < 0) - return rv; - regcmd->sflags |= XCMD_REG_F_REG_SET; - - i++; - - } else if (!strcmp(argv[i], "write")) { - xcmd->op = XNL_CMD_REG_WRT; - - get_next_arg(argc, argv, &i); - if (!strcmp(argv[i], "bar")) { - rv = next_arg_read_int(argc, argv, &i, ®cmd->bar); - if (rv < 0) - return rv; - regcmd->sflags |= XCMD_REG_F_BAR_SET; - get_next_arg(argc, argv, &i); - } - rv = arg_read_int(argv[i], &xcmd->req.reg.reg); - if (rv < 0) - return rv; - regcmd->sflags |= XCMD_REG_F_REG_SET; - - rv = next_arg_read_int(argc, argv, &i, &xcmd->req.reg.val); - if (rv < 0) - return rv; - regcmd->sflags |= XCMD_REG_F_VAL_SET; - - i++; - } else if (!strcmp(argv[i], "info")) { - xcmd->op = XNL_CMD_REG_INFO_READ; - get_next_arg(argc, argv, &i); - if (!strcmp(argv[i], "bar")) { - rv = next_arg_read_int(argc, argv, &i, ®cmd->bar); - if (rv < 0) - return rv; - regcmd->sflags |= XCMD_REG_F_BAR_SET; - get_next_arg(argc, argv, &i); - } - rv = arg_read_int(argv[i], &xcmd->req.reg.reg); - if (rv < 0) - return rv; - regcmd->sflags |= XCMD_REG_F_REG_SET; - i++; - - if (i < argc) { - if (!strcmp(argv[i], "num_regs")) { - rv = next_arg_read_int(argc, argv, &i, ®cmd->range_end); - if (rv < 0) - return rv; - } - } else - regcmd->range_end = 1; - i++; - } - - args_valid = validate_regcmd(xcmd->op, regcmd); - - return (args_valid == 0) ? i : args_valid; -} - -static int read_range(int argc, char *argv[], int i, unsigned int *v1, - unsigned int *v2) -{ - int rv; - - /* range */ - rv = arg_read_int(argv[i], v1); - if (rv < 0) - return rv; - - get_next_arg(argc, argv, &i); - rv = arg_read_int(argv[i], v2); - if (rv < 0) - return rv; - - if (v2 < v1) { - warnx("invalid range %u ~ %u.\n", *v1, *v2); - return -EINVAL; - } - - return ++i; -} - -/** 1:1 mapping to entries in q_parm_type of nl_user.h */ -static char *qparm_type_str[QPARM_MAX] = { - "idx", - "mode", - "dir", - "desc", - "cmpt", - "cmptsz", - "sw_desc_sz", - "idx_ringsz", - "idx_bufsz", - "idx_tmr", - "idx_cntr", - "trigmode", -#ifdef ERR_DEBUG - "err_no" -#endif -}; - -/** 1:1 mapping for flags from qdma_nl.h #defines flags */ -static char *qflag_type_str[MAX_QFLAGS] = { - "mode", - "mode", - "dir", - "dir", - "pfetch_en", - "bypass", - "fetch_credit", - "fetch_credit", - "dis_cmpl_status_acc", - "dis_cmpl_status", - "dis_cmpl_status_pend_chk", - "dis_cmpl_status", - "c2h_cmpl_intr_en", - "c2h_udd_en", - "pftch_bypass_en", - "cmpl_ovf_dis", - "en_mm_cmpl" -}; - -#define IS_SIZE_IDX_VALID(x) (x < 16) - -static void print_ignored_params(uint32_t ignore_mask, uint8_t isflag, - char *ignored_dir) -{ - unsigned int maxcount = isflag ? MAX_QFLAGS : QPARM_MAX; - char **qparam = isflag ? qflag_type_str : qparm_type_str; - char *pdesc = isflag ? "flag" : "attr"; - unsigned int i; - - for (i = 0; ignore_mask && (i < maxcount); i++) { - if (ignore_mask & 0x01) { - if(ignored_dir == NULL) - warnx("Warn: Ignoring %s: %s", pdesc, qparam[i]); - else - warnx("Info: Ignoring %s \"%s\" for %s direction only", pdesc, qparam[i], - ignored_dir); - } - ignore_mask >>= 1; - } -} - - -static int validate_qcmd(enum xnl_op_t qcmd, struct xcmd_q_parm *qparm) -{ - int invalid = 0; - switch(qcmd) { - case XNL_CMD_Q_LIST: - if (qparm->sflags) - warnx("Warn: Ignoring all attributes and flags"); - break; - case XNL_CMD_Q_ADD: - print_ignored_params(qparm->sflags & - Q_ADD_ATTR_IGNORE_MASK, 0, NULL); - print_ignored_params(qparm->flags & - Q_ADD_FLAG_IGNORE_MASK, 1, NULL); - break; - case XNL_CMD_Q_START: - if (!IS_SIZE_IDX_VALID(qparm->c2h_bufsz_idx)) { - warnx("dmactl: C2H Buf index out of range"); - invalid = -EINVAL; - } - if (!IS_SIZE_IDX_VALID(qparm->qrngsz_idx)) { - warnx("dmactl: Queue ring size index out of range"); - invalid = -EINVAL; - } - if (!IS_SIZE_IDX_VALID(qparm->cmpt_cntr_idx)) { - warnx("dmactl: CMPT counter index out of range"); - invalid = -EINVAL; - } - if (!IS_SIZE_IDX_VALID(qparm->cmpt_tmr_idx)) { - warnx("dmactl: CMPT timer index out of range"); - invalid = -EINVAL; - } - if (qparm->cmpt_entry_size >= - XNL_ST_C2H_NUM_CMPT_DESC_SIZES) { - warnx("dmactl: CMPT entry size out of range"); - invalid = -EINVAL; - } - if (qparm->flags & XNL_F_PFETCH_BYPASS_EN) { - if (!(qparm->flags & XNL_F_DESC_BYPASS_EN)) { - printf("Error:desc bypass enable must be enabled for configuring pfetch bypass enable\n"); - invalid = -EINVAL; - break; - } - } - if (qparm->flags & XNL_F_CMPL_UDD_EN) { - if (!(qparm->sflags & (1 << QPARM_CMPTSZ))) { - printf("Error: cmptsz required for enabling c2h udd packet\n"); - invalid = -EINVAL; - break; - } - } - - print_ignored_params(qparm->sflags & - Q_START_ATTR_IGNORE_MASK, - 0, NULL); - - if ((qparm->sflags & (1 << QPARM_SW_DESC_SZ))) { - /* TODO: in 2018.3 RTL1 , only 64B sw_desc_size is supported */ - if (qparm->sw_desc_sz != DESC_SIZE_64B) { - warnx("dmactl: desc size out of range"); - invalid = -EINVAL; - } - } - break; - case XNL_CMD_Q_STOP: - print_ignored_params(qparm->sflags & - Q_STOP_ATTR_IGNORE_MASK, 0, NULL); - print_ignored_params(qparm->flags & - Q_STOP_FLAG_IGNORE_MASK, 1, NULL); - break; - case XNL_CMD_Q_DEL: - print_ignored_params(qparm->sflags & - Q_DEL_ATTR_IGNORE_MASK, 0, NULL); - print_ignored_params(qparm->flags & - Q_DEL_FLAG_IGNORE_MASK, 1, NULL); - break; - case XNL_CMD_Q_CMPT: - case XNL_CMD_Q_DUMP: - if ((qparm->sflags & ((1 << QPARM_DESC) | - (1 << QPARM_CMPT))) == ((1 << QPARM_DESC) | - (1 << QPARM_CMPT))) { - invalid = -EINVAL; - printf("Error: Both desc and cmpt attr cannot be taken for Q DUMP\n"); - break; - } - case XNL_CMD_Q_DESC: - print_ignored_params(qparm->sflags & - Q_DUMP_ATTR_IGNORE_MASK, 0, NULL); - print_ignored_params(qparm->flags & - Q_DUMP_FLAG_IGNORE_MASK, 1, NULL); - break; - case XNL_CMD_Q_RX_PKT: - if (qparm->flags & XNL_F_QDIR_H2C) { - printf("Rx dump packet is st c2h only command\n"); - invalid = -EINVAL; - break; - } - print_ignored_params(qparm->sflags & - Q_DUMP_PKT_ATTR_IGNORE_MASK, 0, NULL); - print_ignored_params(qparm->flags & - Q_DUMP_PKT_FLAG_IGNORE_MASK, 1, NULL); - break; - case XNL_CMD_Q_CMPT_READ: - print_ignored_params(qparm->sflags & - Q_CMPT_READ_ATTR_IGNORE_MASK, 0, NULL); - print_ignored_params(qparm->flags & - Q_CMPT_READ_FLAG_IGNORE_MASK, 1, NULL); - break; -#ifdef ERR_DEBUG - case XNL_CMD_Q_ERR_INDUCE: - break; -#endif - default: - invalid = -EINVAL; - break; - } - - return invalid; -} - -#ifdef ERR_DEBUG -static unsigned char get_err_num(char *err) -{ - uint32_t i; - - for (i = 0; i < qdma_errs; i++) - if (!strcmp(err, qdma_err_str[i])) - break; - - return i; -} -#endif - -static int read_qparm(int argc, char *argv[], int i, struct xcmd_q_parm *qparm, - unsigned int f_arg_required) -{ - int rv; - uint32_t v1; - unsigned int f_arg_set = 0;; - unsigned int mask; - - /* - * idx <val> - * list <start_idx> <num_q> - * ringsz <val> - * bufsz <val> - * mode <mm|st> - * dir <h2c|c2h|bi> - * cdev <0|1> - * bypass <0|1> - * desc <x> <y> - * cmpt <x> <y> - * cmptsz <0|1|2|3> - */ - - qparm->idx = XNL_QIDX_INVALID; - - while (i < argc) { -#ifdef ERR_DEBUG - if ((f_arg_required & (1 << QPARAM_ERR_NO)) && - (!strcmp(argv[i], "help"))) { - uint32_t j; - - fprintf(stdout, "q err idx <N> <num_errs> [list of <err <[1|0]>>] dir <[h2c|c2h|bi]>\n"); - fprintf(stdout, "Supported errors:\n"); - for (j = 0; j < qdma_errs; j++) - fprintf(stdout, "\t%s\n", qdma_err_str[j]); - - return argc; - } -#endif - if (!strcmp(argv[i], "idx")) { - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->idx = v1; - f_arg_set |= 1 << QPARM_IDX; - qparm->num_q = 1; -#ifdef ERR_DEBUG - if (f_arg_required & (1 << QPARAM_ERR_NO)) { - unsigned char err_no; - - get_next_arg(argc, argv, &i); - - err_no = get_err_num(argv[i]); - if (err_no >= qdma_errs) { - fprintf(stderr, - "unknown err %s.\n", - argv[i]); - return -EINVAL; - } - - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->err.en = v1 ? 1 : 0; - qparm->err.err_no = err_no; - printf("%s-%u: err_no/en: %u/%u\n", argv[i], qparm->idx, qparm->err.err_no, qparm->err.en); - i++; - f_arg_set |= 1 << QPARAM_ERR_NO; - } else - i++; -#else - i++; -#endif - - } else if (!strcmp(argv[i], "list")) { - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->idx = v1; - f_arg_set |= 1 << QPARM_IDX; - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->num_q = v1; - i++; - - } else if (!strcmp(argv[i], "mode")) { - get_next_arg(argc, argv, (&i)); - - if (!strcmp(argv[i], "mm")) { - qparm->flags |= XNL_F_QMODE_MM; - } else if (!strcmp(argv[i], "st")) { - qparm->flags |= XNL_F_QMODE_ST; - } else { - warnx("unknown q mode %s.\n", argv[i]); - return -EINVAL; - } - f_arg_set |= 1 << QPARM_MODE; - i++; - - } else if (!strcmp(argv[i], "dir")) { - get_next_arg(argc, argv, (&i)); - - if (!strcmp(argv[i], "h2c")) { - qparm->flags |= XNL_F_QDIR_H2C; - } else if (!strcmp(argv[i], "c2h")) { - qparm->flags |= XNL_F_QDIR_C2H; - } else if (!strcmp(argv[i], "bi")) { - qparm->flags |= XNL_F_QDIR_BOTH; - } else if (!strcmp(argv[i], "cmpt")) { - qparm->flags |= XNL_F_Q_CMPL; - } else { - warnx("unknown q dir %s.\n", argv[i]); - return -EINVAL; - } - f_arg_set |= 1 << QPARM_DIR; - i++; - } else if (!strcmp(argv[i], "idx_bufsz")) { - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->c2h_bufsz_idx = v1; - - f_arg_set |= 1 << QPARM_C2H_BUFSZ_IDX; - i++; - - } else if (!strcmp(argv[i], "idx_ringsz")) { - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->qrngsz_idx = v1; - f_arg_set |= 1 << QPARM_RNGSZ_IDX; - i++; - } else if (!strcmp(argv[i], "idx_tmr")) { - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->cmpt_tmr_idx = v1; - f_arg_set |= 1 << QPARM_CMPT_TMR_IDX; - i++; - } else if (!strcmp(argv[i], "idx_cntr")) { - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->cmpt_cntr_idx = v1; - f_arg_set |= 1 << QPARM_CMPT_CNTR_IDX; - i++; - } else if (!strcmp(argv[i], "mm_chn")) { - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - qparm->mm_channel = v1; - f_arg_set |= 1 << QPARM_MM_CHANNEL; - i++; - } else if (!strcmp(argv[i], "cmpl_ovf_dis")) { - qparm->flags |= XNL_F_CMPT_OVF_CHK_DIS; - i++; - } else if (!strcmp(argv[i], "trigmode")) { - get_next_arg(argc, argv, (&i)); - - if (!strcmp(argv[i], "every")) { - v1 = 1; - } else if (!strcmp(argv[i], "usr_cnt")) { - v1 = 2; - } else if (!strcmp(argv[i], "usr")) { - v1 = 3; - } else if (!strcmp(argv[i], "usr_tmr")) { - v1=4; - } else if (!strcmp(argv[i], "cntr_tmr")) { - v1=5; - } else if (!strcmp(argv[i], "dis")) { - v1 = 0; - } else { - warnx("unknown q trigmode %s.\n", argv[i]); - return -EINVAL; - } - - qparm->cmpt_trig_mode = v1; - f_arg_set |= 1 << QPARM_CMPT_TRIG_MODE; - i++; - } else if (!strcmp(argv[i], "desc")) { - get_next_arg(argc, argv, &i); - rv = read_range(argc, argv, i, &qparm->range_start, - &qparm->range_end); - if (rv < 0) - return rv; - i = rv; - f_arg_set |= 1 << QPARM_DESC; - - } else if (!strcmp(argv[i], "cmpt")) { - get_next_arg(argc, argv, &i); - rv = read_range(argc, argv, i, &qparm->range_start, - &qparm->range_end); - if (rv < 0) - return rv; - i = rv; - f_arg_set |= 1 << QPARM_CMPT; - } else if (!strcmp(argv[i], "cmptsz")) { - get_next_arg(argc, argv, &i); - sscanf(argv[i], "%hhu", &qparm->cmpt_entry_size); - f_arg_set |= 1 << QPARM_CMPTSZ; - i++; - } else if (!strcmp(argv[i], "sw_desc_sz")) { - get_next_arg(argc, argv, &i); - sscanf(argv[i], "%hhu", &qparm->sw_desc_sz); - f_arg_set |= 1 << QPARM_SW_DESC_SZ; - i++; - } else if (!strcmp(argv[i], "pfetch_en")) { - qparm->flags |= XNL_F_PFETCH_EN; - i++; - } else if (!strcmp(argv[i], "ping_pong_en")) { - f_arg_set |= 1 << QPARM_PING_PONG_EN; - i++; - } else if (!strcmp(argv[i], "aperture_sz")) { - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - - if(((v1 != 0) && ((v1 &(v1 - 1))))) { - warnx("Error: Keyhole aperture should be a size of 2\n"); - return -EINVAL; - } - - f_arg_set |= 1 << QPARM_KEYHOLE_EN; - qparm->aperture_sz = v1; - i++; - } else if (!strcmp(argv[i], "pfetch_bypass_en")) { - qparm->flags |= XNL_F_PFETCH_BYPASS_EN; - i++; - } else if (!strcmp(argv[i], "desc_bypass_en")) { - qparm->flags |= XNL_F_DESC_BYPASS_EN; - i++; - } else if (!strcmp(argv[i], "c2h_cmpl_intr_en")) { - qparm->flags |= XNL_F_C2H_CMPL_INTR_EN; - i++; - } else if (!strcmp(argv[i], "dis_cmpl_status")) { - qparm->flags &= ~XNL_F_CMPL_STATUS_EN; - i++; - } else if (!strcmp(argv[i], "dis_cmpl_status_acc")) { - qparm->flags &= ~XNL_F_CMPL_STATUS_ACC_EN; - i++; - } else if (!strcmp(argv[i], "dis_cmpl_status_pend_chk")) { - qparm->flags &= ~XNL_F_CMPL_STATUS_PEND_CHK; - i++; - } else if (!strcmp(argv[i], "fetch_credit")) { - get_next_arg(argc, argv, (&i)); - if (!strcmp(argv[i], "h2c")) { - if (((qparm->flags & XNL_F_QDIR_H2C) == XNL_F_QDIR_H2C) - || ((qparm->flags & XNL_F_QDIR_BOTH) == XNL_F_QDIR_BOTH)) - v1 = Q_ENABLE_H2C_FETCH_CREDIT; - else { - warnx("Invalid Fetch credit option,%s", - "Q direction mismatch, not H2C dir\n"); - return -EINVAL; - } - } else if (!strcmp(argv[i], "c2h")) { - if (((qparm->flags & XNL_F_QDIR_C2H) == XNL_F_QDIR_C2H) - || ((qparm->flags & XNL_F_QDIR_BOTH) == XNL_F_QDIR_BOTH)) - v1 = Q_ENABLE_C2H_FETCH_CREDIT; - else { - warnx("Invalid Fetch credit option,%s", - "Q direction mismatch, not C2H dir\n"); - return -EINVAL; - } - } else if (!strcmp(argv[i], "bi")) { - if (((qparm->flags & XNL_F_QDIR_BOTH) == XNL_F_QDIR_BOTH)) - v1 = Q_ENABLE_H2C_C2H_FETCH_CREDIT; - else { - warnx("Invalid Fetch credit option, %s", - "Q direction mismatch, not BI dir\n"); - return -EINVAL; - } - } else if (!strcmp(argv[i], "none")){ - v1 = Q_DISABLE_FETCH_CREDIT; - } else { - warnx("unknown fetch_credit option %s.\n", argv[i]); - return -EINVAL; - } - qparm->fetch_credit = v1; - i++; - } else if (!strcmp(argv[i], "c2h_udd_en")) { - qparm->flags |= XNL_F_CMPL_UDD_EN; - i++; - } else { - warnx("unknown q parameter %s.\n", argv[i]); - return -EINVAL; - } - } - if ((f_arg_required & (1 << QPARM_RNGSZ_IDX)) && - !(f_arg_set & (1 << QPARM_RNGSZ_IDX))) { - warnx("Info: Default ring size set to 2048"); - qparm->qrngsz_idx = 9; - f_arg_set |= 1 << QPARM_RNGSZ_IDX; - } - /* check for any missing mandatory parameters */ - mask = f_arg_set & f_arg_required; - if (mask != f_arg_required) { - int i; - unsigned int bit_mask = 1; - - for (i = 0; i < QPARM_MAX; i++, bit_mask <<= 1) { - if (!(bit_mask & f_arg_required)) - continue; - warnx("missing q parameter %s.\n", qparm_type_str[i]); - return -EINVAL; - } - } - - - if (!(f_arg_set & 1 << QPARM_DIR) && !(qparm->flags & XNL_F_Q_CMPL)) { - /* default to H2C */ - warnx("Warn: Default dir set to \'h2c\'"); - f_arg_set |= 1 << QPARM_DIR; - qparm->flags |= XNL_F_QDIR_H2C; - } - - qparm->sflags = f_arg_set; - - return argc; -} - -static int parse_q_cmd(int argc, char *argv[], int i, struct xcmd_info *xcmd) -{ - struct xcmd_q_parm *qparm = &xcmd->req.qparm; - uint32_t v1; - unsigned int f_arg_set = 0; - int rv; - int args_valid; - - /* - * q list - * q add idx <N> mode <mm|st> [dir <h2c|c2h|bi>] [cdev <0|1>] [cmptsz <0|1|2|3>] - * q start idx <N> dir <h2c|c2h|bi> - * q stop idx <N> dir <h2c|c2h|bi> - * q del idx <N> dir <h2c|c2h|bi> - * q dump idx <N> dir <h2c|c2h|bi> - * q dump idx <N> dir <h2c|c2h|bi> desc <x> <y> - * q dump idx <N> dir <h2c|c2h|bi> cmpt <x> <y> - * q pkt idx <N> - */ - - if (!strcmp(argv[i], "list")) { - xcmd->op = XNL_CMD_Q_LIST; - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - qparm->idx = v1; - f_arg_set |= 1 << QPARM_IDX; - rv = next_arg_read_int(argc, argv, &i, &v1); - if (rv < 0) - return rv; - qparm->num_q = v1; - return ++i; - } else if (!strcmp(argv[i], "add")) { - unsigned int mask; - - xcmd->op = XNL_CMD_Q_ADD; - get_next_arg(argc, argv, &i); - rv = read_qparm(argc, argv, i, qparm, (1 << QPARM_IDX)); - /* error checking of parameter values */ - if (qparm->sflags & (1 << QPARM_MODE)) { - mask = XNL_F_QMODE_MM | XNL_F_QMODE_ST; - if ((qparm->flags & mask) == mask) { - warnx("mode mm/st cannot be combined.\n"); - return -EINVAL; - } - } else { - /* default to MM */ - warnx("Warn: Default mode set to \'mm\'"); - qparm->sflags |= 1 << QPARM_MODE; - qparm->flags |= XNL_F_QMODE_MM; - } - - } else if (!strcmp(argv[i], "start")) { - xcmd->op = XNL_CMD_Q_START; - get_next_arg(argc, argv, &i); - qparm->fetch_credit = Q_ENABLE_C2H_FETCH_CREDIT; - qparm->flags |= (XNL_F_CMPL_STATUS_EN | XNL_F_CMPL_STATUS_ACC_EN | - XNL_F_CMPL_STATUS_PEND_CHK | XNL_F_CMPL_STATUS_DESC_EN | - XNL_F_FETCH_CREDIT); - rv = read_qparm(argc, argv, i, qparm, ((1 << QPARM_IDX) | - (1 << QPARM_RNGSZ_IDX))); - if ((qparm->flags & (XNL_F_QDIR_C2H | XNL_F_QMODE_ST)) == - (XNL_F_QDIR_C2H | XNL_F_QMODE_ST)) { - if (!(qparm->sflags & (1 << QPARM_CMPTSZ))) { - /* default to 8B */ - qparm->cmpt_entry_size = XNL_ST_C2H_CMPT_DESC_SIZE_8B; - qparm->sflags |= - (1 << QPARM_CMPTSZ); - } - } - } else if (!strcmp(argv[i], "stop")) { - xcmd->op = XNL_CMD_Q_STOP; - get_next_arg(argc, argv, &i); - rv = read_qparm(argc, argv, i, qparm, (1 << QPARM_IDX)); - } else if (!strcmp(argv[i], "del")) { - xcmd->op = XNL_CMD_Q_DEL; - get_next_arg(argc, argv, &i); - rv = read_qparm(argc, argv, i, qparm, (1 << QPARM_IDX)); - } else if (!strcmp(argv[i], "dump")) { - xcmd->op = XNL_CMD_Q_DUMP; - get_next_arg(argc, argv, &i); - rv = read_qparm(argc, argv, i, qparm, (1 << QPARM_IDX)); - } else if (!strcmp(argv[i], "pkt")) { - xcmd->op = XNL_CMD_Q_RX_PKT; - get_next_arg(argc, argv, &i); - rv = read_qparm(argc, argv, i, qparm, (1 << QPARM_IDX)); - } else if (!strcmp(argv[i], "cmpt_read")) { - xcmd->op = XNL_CMD_Q_CMPT_READ; - qparm->flags |= XNL_F_Q_CMPL; - get_next_arg(argc, argv, &i); - rv = read_qparm(argc, argv, i, qparm, (1 << QPARM_IDX)); -#ifdef ERR_DEBUG - } else if (!strcmp(argv[i], "err")) { - xcmd->op = XNL_CMD_Q_ERR_INDUCE; - get_next_arg(argc, argv, &i); - rv = read_qparm(argc, argv, i, qparm, ((1 << QPARM_IDX) | - (1 << QPARAM_ERR_NO))); -#endif - } else { - printf("Error: Unknown q command\n"); - return -EINVAL; - } - - if (rv < 0) - return rv; - i = rv; - - if (xcmd->op == XNL_CMD_Q_DUMP) { - unsigned int mask = (1 << QPARM_DESC) | (1 << QPARM_CMPT); - - if ((qparm->sflags & mask) == mask) { - warnx("dump cmpt/desc cannot be combined.\n"); - return -EINVAL; - } - if ((qparm->sflags & (1 << QPARM_DESC))) - xcmd->op = XNL_CMD_Q_DESC; - else if ((qparm->sflags & (1 << QPARM_CMPT))) - xcmd->op = XNL_CMD_Q_CMPT; - } - - args_valid = validate_qcmd(xcmd->op, qparm); - - qparm->sflags |= f_arg_set; - return (args_valid == 0) ? i : args_valid; -} - -static int parse_dev_cmd(int argc, char *argv[], int i, struct xcmd_info *xcmd) -{ - if (!strcmp(argv[i], "list")) { - xcmd->op = XNL_CMD_DEV_LIST; - i++; - } - - return i; -} - -static int parse_stat_cmd(int argc, char *argv[], int i, struct xcmd_info *xcmd) -{ - - xcmd->op = XNL_CMD_DEV_STAT; - if (i >= argc) - return i; - if (!strcmp(argv[i], "clear")) { - xcmd->op = XNL_CMD_DEV_STAT_CLEAR; - i++; - } - return i; -} - -static int parse_intr_cmd(int argc, char *argv[], int i, struct xcmd_info *xcmd) -{ - struct xcmd_intr *intrcmd = &xcmd->req.intr; - int rv; - - /* - * intr dump vector <N> - */ - - memset(intrcmd, 0, sizeof(struct xcmd_intr)); - if (!strcmp(argv[i], "dump")) { - xcmd->op = XNL_CMD_INTR_RING_DUMP; - - get_next_arg(argc, argv, &i); - if (!strcmp(argv[i], "vector")) { - rv = next_arg_read_int(argc, argv, &i, &intrcmd->vector); - if (rv < 0) - return rv; - } - rv = next_arg_read_int(argc, argv, &i, &intrcmd->start_idx); - if (rv < 0) { - intrcmd->start_idx = 0; - intrcmd->end_idx = QDMA_MAX_INT_RING_ENTRIES - 1; - goto func_ret; - } - rv = next_arg_read_int(argc, argv, &i, &intrcmd->end_idx); - if (rv < 0) - intrcmd->end_idx = QDMA_MAX_INT_RING_ENTRIES - 1; - } -func_ret: - i++; - return i; -} - -int parse_cmd(int argc, char *argv[], struct xcmd_info *xcmd) -{ - char *ifname; - int i; - int rv; - - memset(xcmd, 0, sizeof(struct xcmd_info)); - - progname = argv[0]; - - if (argc == 1) - usage(stderr); - - if (argc == 2) { - if (!strcmp(argv[1], "?") || !strcmp(argv[1], "-h") || - !strcmp(argv[1], "help") || !strcmp(argv[1], "--help")) - usage(stdout); - - if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) { - printf("%s version %s\n", PROGNAME, VERSION); - printf("%s\n", COPYRIGHT); - exit(0); - } - } - - if (!strcmp(argv[1], "dev")) { - rv = parse_dev_cmd(argc, argv, 2, xcmd); - goto done; - } - - /* which dma fpga */ - ifname = argv[1]; - rv = parse_ifname(ifname, xcmd); - if (rv < 0) - return rv; - - if (argc == 2) { - rv = 2; - xcmd->op = XNL_CMD_DEV_INFO; - goto done; - } - - i = 3; - if (!strcmp(argv[2], "reg")) { - rv = parse_reg_cmd(argc, argv, i, xcmd); - } else if (!strcmp(argv[2], "stat")) { - rv = parse_stat_cmd(argc, argv, i, xcmd); - } else if (!strcmp(argv[2], "q")) { - rv = parse_q_cmd(argc, argv, i, xcmd); - } else if (!strcmp(argv[2], "intring")){ - rv = parse_intr_cmd(argc, argv, i, xcmd); - } else if (!strcmp(argv[2], "cap")) { - rv = 3; - xcmd->op = XNL_CMD_DEV_CAP; - } else if (!strcmp(argv[2], "global_csr")) { - rv = 3; - xcmd->op = XNL_CMD_GLOBAL_CSR; - } else if (!strcmp(argv[2], "info")) { /* not exposed. only for debug */ - rv = 3; - xcmd->op = XNL_CMD_DEV_INFO; -#ifdef TANDEM_BOOT_SUPPORTED - } else if (!strcmp(argv[2], "en_st")) { - rv = 3; - xcmd->op = XNL_CMD_EN_ST; -#endif - } else { - warnx("bad parameter \"%s\".\n", argv[2]); - return -EINVAL; - } - -done: - if (rv < 0) - return rv; - i = rv; - - if (i < argc) { - warnx("unexpected parameter \"%s\".\n", argv[i]); - return -EINVAL; - } - return 0; -} diff --git a/QDMA/linux-kernel/apps/dma-ctl/cmd_parse.h b/QDMA/linux-kernel/apps/dma-ctl/cmd_parse.h deleted file mode 100755 index ecd9224..0000000 --- a/QDMA/linux-kernel/apps/dma-ctl/cmd_parse.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef USER_CLI_CMD_PARSE_H_ -#define USER_CLI_CMD_PARSE_H_ - -#include "qdma_nl.h" -#include "dmautils.h" - -int parse_cmd(int argc, char *argv[], struct xcmd_info *xcmd); - -#endif /* USER_CLI_CMD_PARSE_H_ */ diff --git a/QDMA/linux-kernel/apps/dma-ctl/main.c b/QDMA/linux-kernel/apps/dma-ctl/main.c deleted file mode 100755 index 2a80961..0000000 --- a/QDMA/linux-kernel/apps/dma-ctl/main.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#include <string.h> -#include <stdio.h> -#include <err.h> -#include <errno.h> - -#include "cmd_parse.h" -#include "dmautils.h" - -static int (*xnl_proc_fn[XNL_CMD_MAX])(struct xcmd_info *xcmd) = { - qdma_dev_list_dump, /* XNL_CMD_DEV_LIST */ - qdma_dev_info, /* XNL_CMD_DEV_INFO */ - qdma_dev_stat, /* XNL_CMD_DEV_STAT */ - qdma_dev_stat_clear, /* XNL_CMD_DEV_STAT_CLEAR */ - qdma_reg_dump, /* XNL_CMD_REG_DUMP */ - qdma_reg_read, /* XNL_CMD_REG_RD */ - qdma_reg_write, /* XNL_CMD_REG_WRT */ - qdma_dev_q_list_dump, /* XNL_CMD_Q_LIST */ - qdma_q_add, /* XNL_CMD_Q_ADD */ - qdma_q_start, /* XNL_CMD_Q_START */ - qdma_q_stop, /* XNL_CMD_Q_STOP */ - qdma_q_del, /* XNL_CMD_Q_DEL */ - qdma_q_dump, /* XNL_CMD_Q_DUMP */ - qdma_q_desc_dump, /* XNL_CMD_Q_DESC */ - qdma_q_desc_dump, /* XNL_CMD_Q_CMPT */ - NULL, /* XNL_CMD_Q_RX_PKT */ - qdma_q_cmpt_read, /* XNL_CMD_Q_CMPT_READ */ -#ifdef ERR_DEBUG - NULL, /* XNL_CMD_Q_ERR_INDUCE */ -#endif - qdma_dev_intr_ring_dump, /* XNL_CMD_INTR_RING_DUMP */ - NULL, /* XNL_CMD_Q_UDD */ - qdma_dev_get_global_csr, /* XNL_CMD_GLOBAL_CSR */ - qdma_dev_cap, /* XNL_CMD_DEV_CAP */ - NULL, /* XNL_CMD_GET_Q_STATE */ - qdma_reg_info_read, /* XNL_CMD_REG_INFO_READ */ -#ifdef TANDEM_BOOT_SUPPORTED - qdma_en_st, /* XNL_CMD_EN_ST */ -#endif -}; - -static const char *desc_engine_mode[] = { - "Internal and Bypass mode", - "Bypass only mode", - "Inernal only mode" -}; - -static void dump_dev_cap(struct xcmd_info *xcmd) -{ - printf("%s\n\n", xcmd->resp.cap.version_str); - printf("=============Hardware Capabilities============\n\n"); - printf("Number of PFs supported : %u\n", xcmd->resp.cap.num_pfs); - printf("Total number of queues supported : %u\n", xcmd->resp.cap.num_qs); - printf("MM channels : %u\n", xcmd->resp.cap.mm_channel_max); - printf("FLR Present : %s\n", xcmd->resp.cap.flr_present ? "yes":"no"); - printf("ST enabled : %s\n", xcmd->resp.cap.st_en ? "yes":"no"); - printf("MM enabled : %s\n", xcmd->resp.cap.mm_en ? "yes":"no"); - printf("Mailbox enabled : %s\n", xcmd->resp.cap.mailbox_en ? "yes":"no"); - printf("MM completion enabled : %s\n", xcmd->resp.cap.mm_cmpt_en ? "yes":"no"); - printf("Debug Mode enabled : %s\n", xcmd->resp.cap.debug_mode ? "yes":"no"); - - if (xcmd->resp.cap.desc_eng_mode < sizeof(desc_engine_mode) / sizeof(desc_engine_mode[0])) { - printf("Desc Engine Mode : %s\n", - desc_engine_mode[xcmd->resp.cap.desc_eng_mode]); - }else { - printf("Desc Engine Mode : INVALID\n"); - } -} - -static void dump_dev_info(struct xcmd_info *xcmd) -{ - printf("=============Device Information============\n"); - printf("PCI : %02x:%02x.%01x\n", - xcmd->resp.dev_info.pci_bus, - xcmd->resp.dev_info.pci_dev, - xcmd->resp.dev_info.dev_func); - printf("HW q base : %u\n", xcmd->resp.dev_info.qbase); - printf("Max queues : %u\n", xcmd->resp.dev_info.qmax); - printf("Config bar : %u\n", xcmd->resp.dev_info.config_bar); - printf("AXI Master Lite bar : %u\n", xcmd->resp.dev_info.user_bar); -} - -static void dump_dev_stat(struct xcmd_info *xcmd) -{ - unsigned long long mmh2c_pkts; - unsigned long long mmc2h_pkts; - unsigned long long sth2c_pkts; - unsigned long long stc2h_pkts; - unsigned long long min_ping_pong_lat = 0; - unsigned long long max_ping_pong_lat = 0; - unsigned long long avg_ping_pong_lat = 0; - - mmh2c_pkts = xcmd->resp.dev_stat.mm_h2c_pkts; - mmc2h_pkts = xcmd->resp.dev_stat.mm_c2h_pkts; - sth2c_pkts = xcmd->resp.dev_stat.st_h2c_pkts; - stc2h_pkts = xcmd->resp.dev_stat.st_c2h_pkts; - min_ping_pong_lat = xcmd->resp.dev_stat.ping_pong_lat_min; - max_ping_pong_lat = xcmd->resp.dev_stat.ping_pong_lat_max; - avg_ping_pong_lat = xcmd->resp.dev_stat.ping_pong_lat_avg; - - printf("qdma%s%05x:statistics\n", xcmd->vf ? "vf" : "", xcmd->if_bdf); - printf("Total MM H2C packets processed = %llu\n", mmh2c_pkts); - printf("Total MM C2H packets processed = %llu\n", mmc2h_pkts); - printf("Total ST H2C packets processed = %llu\n", sth2c_pkts); - printf("Total ST C2H packets processed = %llu\n", stc2h_pkts); - printf("Min Ping Pong Latency = %llu\n", min_ping_pong_lat); - printf("Max Ping Pong Latency = %llu\n", max_ping_pong_lat); - printf("Avg Ping Pong Latency = %llu\n", avg_ping_pong_lat); -} - -static void dump_dev_global_csr(struct xcmd_info *xcmd) -{ - printf("Global Ring Sizes:"); - for ( int i=0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) - printf("%d ",xcmd->resp.csr.ring_sz[i]); - printf("\nC2H Timer Counters:"); - for ( int i=0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) - printf("%d ",xcmd->resp.csr.c2h_timer_cnt[i]); - printf("\nC2H Counter Thresholds:"); - for ( int i=0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) - printf("%d ",xcmd->resp.csr.c2h_cnt_th[i]); - printf("\nC2H Buf Sizes:"); - for ( int i=0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) - printf("%d ",xcmd->resp.csr.c2h_buf_sz[i]); - printf("\nWriteback Interval:%d\n",xcmd->resp.csr.wb_intvl); - -} - -static void xnl_dump_response(const char *resp) -{ - printf("%s", resp); -} - -void xnl_dump_cmd_resp(struct xcmd_info *xcmd) -{ - - switch(xcmd->op) { - case XNL_CMD_DEV_CAP: - dump_dev_cap(xcmd); - break; - case XNL_CMD_DEV_INFO: - dump_dev_info(xcmd); - break; - case XNL_CMD_DEV_STAT: - dump_dev_stat(xcmd); - break; - case XNL_CMD_REG_RD: - printf("qdma%s%05x, %02x:%02x.%02x, bar#%u, 0x%x = 0x%x.\n", - xcmd->vf ? "vf" :"", - xcmd->if_bdf, xcmd->resp.dev_info.pci_bus, - xcmd->resp.dev_info.pci_dev, - xcmd->resp.dev_info.dev_func, xcmd->req.reg.bar, - xcmd->req.reg.reg, xcmd->req.reg.val); - break; - case XNL_CMD_REG_WRT: - printf("qdma%s%05x, %02x:%02x.%02x, bar#%u, reg 0x%x, read back 0x%x.\n", - xcmd->vf ? "vf" :"", - xcmd->if_bdf, xcmd->resp.dev_info.pci_bus, - xcmd->resp.dev_info.pci_dev, - xcmd->resp.dev_info.dev_func, xcmd->req.reg.bar, - xcmd->req.reg.reg, xcmd->req.reg.val); - break; - case XNL_CMD_GLOBAL_CSR: - dump_dev_global_csr(xcmd); - break; - case XNL_CMD_REG_INFO_READ: - break; - default: - break; - } -} - -static int xnl_proc_cmd(struct xcmd_info *xcmd) -{ - xcmd->log_msg_dump = xnl_dump_response; - if (xnl_proc_fn[xcmd->op]) - return xnl_proc_fn[xcmd->op](xcmd); - - return -EOPNOTSUPP; -} - -int main(int argc, char *argv[]) -{ - struct xcmd_info xcmd; - int rv = 0; - - memset(&xcmd, 0, sizeof(xcmd)); - - rv = parse_cmd(argc, argv, &xcmd); - if (rv < 0) - return rv; - rv = xnl_proc_cmd(&xcmd); - if (rv < 0) - return rv; - xnl_dump_cmd_resp(&xcmd); - - return 0; -} diff --git a/QDMA/linux-kernel/apps/dma-ctl/version.h b/QDMA/linux-kernel/apps/dma-ctl/version.h deleted file mode 100755 index e01b78a..0000000 --- a/QDMA/linux-kernel/apps/dma-ctl/version.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef __DMA_CTL_VERSION_H -#define __DMA_CTL_VERSION_H - -#define PROGNAME "dma-ctl" -#define VERSION "2023.2.0" -#define COPYRIGHT "Copyright (c) 2022-2023 Advanced Micro Devices Inc." - -#endif diff --git a/QDMA/linux-kernel/apps/dma-from-device/Makefile b/QDMA/linux-kernel/apps/dma-from-device/Makefile deleted file mode 100755 index 95e66d2..0000000 --- a/QDMA/linux-kernel/apps/dma-from-device/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -CC ?= gcc - -CFLAGS += -g -#CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I../include -I../dma-utils -CFLAGS += $(EXTRA_FLAGS) - -DMA-FROM-DEVICE = dma-from-device -DMA-UTILS_OBJS := $(patsubst %.c,%.o,$(wildcard ../dma-utils/*.c)) -DMA-FROM-DEVICE_OBJS := dma_from_device.o -DMA-FROM-DEVICE_OBJS += $(DMA-UTILS_OBJS) - -ifneq ($(CROSS_COMPILE_FLAG),) - CC=$(CROSS_COMPILE_FLAG)gcc -endif - -all: clean dma-from-device - -dma-from-device: $(DMA-FROM-DEVICE_OBJS) - $(CC) -lrt -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE - -%.o: %.c - $(CC) $(CFLAGS) -c -std=c99 -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE -D_AIO_AIX_SOURCE - -clean: - @rm -f *.o */*.o ../dma-utils/*.o - rm -rf *.o *.bin dma-from-device diff --git a/QDMA/linux-kernel/apps/dma-from-device/dma_from_device.c b/QDMA/linux-kernel/apps/dma-from-device/dma_from_device.c deleted file mode 100755 index fe34757..0000000 --- a/QDMA/linux-kernel/apps/dma-from-device/dma_from_device.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#define _DEFAULT_SOURCE -#define _XOPEN_SOURCE 500 -#include <assert.h> -#include <fcntl.h> -#include <getopt.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <time.h> - -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/types.h> -#include <unistd.h> - -#include "dma_xfer_utils.c" - -#define DEVICE_NAME_DEFAULT "/dev/qdma01000-MM-0" -#define SIZE_DEFAULT (32) -#define COUNT_DEFAULT (1) - - - - -static struct option const long_opts[] = { - {"device", required_argument, NULL, 'd'}, - {"address", required_argument, NULL, 'a'}, - {"size", required_argument, NULL, 's'}, - {"offset", required_argument, NULL, 'o'}, - {"count", required_argument, NULL, 'c'}, - {"file", required_argument, NULL, 'f'}, - {"help", no_argument, NULL, 'h'}, - {"verbose", no_argument, NULL, 'v'}, - {0, 0, 0, 0} -}; - -static int test_dma(char *devname, uint64_t addr, uint64_t size, - uint64_t offset, uint64_t count, char *ofname); -static int no_write = 0; - -static void usage(const char *name) -{ - int i = 0; - fprintf(stdout, "%s\n\n", name); - fprintf(stdout, "usage: %s [OPTIONS]\n\n", name); - fprintf(stdout, "Read via SGDMA, optionally save output to a file\n\n"); - - fprintf(stdout, " -%c (--%s) device (defaults to %s)\n", - long_opts[i].val, long_opts[i].name, DEVICE_NAME_DEFAULT); - i++; - fprintf(stdout, " -%c (--%s) the start address on the AXI bus\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, - " -%c (--%s) size of a single transfer in bytes, default %d.\n", - long_opts[i].val, long_opts[i].name, SIZE_DEFAULT); - i++; - fprintf(stdout, " -%c (--%s) page offset of transfer\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, " -%c (--%s) number of transfers, default is %d.\n", - long_opts[i].val, long_opts[i].name, COUNT_DEFAULT); - i++; - fprintf(stdout, - " -%c (--%s) file to write the data of the transfers\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, " -%c (--%s) print usage help and exit\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, " -%c (--%s) verbose output\n", - long_opts[i].val, long_opts[i].name); -} - -int main(int argc, char *argv[]) -{ - int cmd_opt; - char *device = DEVICE_NAME_DEFAULT; - uint64_t address = 0; - uint64_t size = SIZE_DEFAULT; - uint64_t offset = 0; - uint64_t count = COUNT_DEFAULT; - char *ofname = NULL; - - while ((cmd_opt = getopt_long(argc, argv, "vhxc:f:d:a:s:o:", long_opts, - NULL)) != -1) { - switch (cmd_opt) { - case 0: - /* long option */ - break; - case 'd': - /* device node name */ - device = strdup(optarg); - break; - case 'a': - /* RAM address on the AXI bus in bytes */ - address = getopt_integer(optarg); - break; - /* RAM size in bytes */ - case 's': - size = getopt_integer(optarg); - break; - case 'o': - offset = getopt_integer(optarg) & 4095; - break; - /* count */ - case 'c': - count = getopt_integer(optarg); - break; - /* count */ - case 'f': - ofname = strdup(optarg); - break; - /* print usage help and exit */ - case 'x': - no_write++; - break; - case 'v': - verbose = 1; - break; - case 'h': - default: - usage(argv[0]); - exit(0); - break; - } - } - if (verbose) - fprintf(stdout, - "dev %s, addr 0x%lx, size 0x%lx, offset 0x%lx, count %lu\n", - device, address, size, offset, count); - - return test_dma(device, address, size, offset, count, ofname); -} - -static int test_dma(char *devname, uint64_t addr, uint64_t size, - uint64_t offset, uint64_t count, char *ofname) -{ - ssize_t rc; - uint64_t i; - char *buffer = NULL; - char *allocated = NULL; - struct timespec ts_start, ts_end; - int out_fd = -1; - int fpga_fd = open(devname, O_RDWR | O_NONBLOCK); - double total_time = 0; - double result; - double avg_time = 0; - - if (fpga_fd < 0) { - fprintf(stderr, "unable to open device %s, %d.\n", - devname, fpga_fd); - perror("open device"); - return -EINVAL; - } - - /* create file to write data to */ - if (ofname) { - out_fd = open(ofname, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, - 0666); - if (out_fd < 0) { - fprintf(stderr, "unable to open output file %s, %d.\n", - ofname, out_fd); - perror("open output file"); - rc = -EINVAL; - goto out; - } - } - - posix_memalign((void **)&allocated, 4096 /*alignment */ , size + 4096); - if (!allocated) { - fprintf(stderr, "OOM %lu.\n", size + 4096); - rc = -ENOMEM; - goto out; - } - - buffer = allocated + offset; - if (verbose) - fprintf(stdout, "host buffer 0x%lx, %p.\n", size + 4096, buffer); - - for (i = 0; i < count; i++) { - clock_gettime(CLOCK_MONOTONIC, &ts_start); - /* lseek & read data from AXI MM into buffer using SGDMA */ - rc = read_to_buffer(devname, fpga_fd, buffer, size, addr); - if (rc < 0) - goto out; - clock_gettime(CLOCK_MONOTONIC, &ts_end); - - /* subtract the start time from the end time */ - timespec_sub(&ts_end, &ts_start); - total_time += (ts_end.tv_sec + ((double)ts_end.tv_nsec/NSEC_DIV)); - /* a bit less accurate but side-effects are accounted for */ - if (verbose) - fprintf(stdout, - "#%lu: CLOCK_MONOTONIC %ld.%09ld sec. read %lu bytes\n", - i, ts_end.tv_sec, ts_end.tv_nsec, size); - - /* file argument given? */ - if ((out_fd >= 0) & (no_write == 0)) { - rc = write_from_buffer(ofname, out_fd, buffer, - size, i*size); - if (rc < 0) - goto out; - } - } - avg_time = (double)total_time/(double)count; - result = ((double)size)/avg_time; - if (verbose) - printf("** Avg time device %s, total time %f nsec, avg_time = %f, size = %lu, BW = %f bytes/sec\n", - devname, total_time, avg_time, size, result); - dump_throughput_result(size, result); - - rc = 0; - -out: - close(fpga_fd); - if (out_fd >= 0) - close(out_fd); - free(allocated); - - return rc; -} diff --git a/QDMA/linux-kernel/apps/dma-from-device/version.h b/QDMA/linux-kernel/apps/dma-from-device/version.h deleted file mode 100755 index 9eeb784..0000000 --- a/QDMA/linux-kernel/apps/dma-from-device/version.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef __DMA_FROM_DEVICE_VERSION_H -#define __DMA_FROM_DEVICE_VERSION_H - -#define PROGNAME "dma-from-device" -#define VERSION "2023.2.0" -#define COPYRIGHT "Copyright (c) 2022-2023 Advanced Micro Devices Inc." - -#endif diff --git a/QDMA/linux-kernel/apps/dma-latency/Makefile b/QDMA/linux-kernel/apps/dma-latency/Makefile deleted file mode 100755 index 5654973..0000000 --- a/QDMA/linux-kernel/apps/dma-latency/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -CC ?= gcc - -CFLAGS += -g -#CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I../include -I../dma-utils -CFLAGS += $(EXTRA_FLAGS) - -DMA-LATENCY = dma-latency -DMA-UTILS_OBJS := $(patsubst %.c,%.o,$(wildcard ../dma-utils/*.c)) -DMA-LAT_OBJS := dmalat.o -DMA-LAT_OBJS += $(DMA-UTILS_OBJS) - -ifneq ($(CROSS_COMPILE_FLAG),) - CC=$(CROSS_COMPILE_FLAG)gcc -endif - -all: clean dma-latency - -dma-latency: $(DMA-LAT_OBJS) - $(CC) -pthread -lrt -o $@ $^ -laio -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE - -%.o: %.c - $(CC) $(CFLAGS) -c -std=c99 -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE -D_AIO_AIX_SOURCE - -clean: - @rm -f *.o */*.o ../dma-utils/*.o - rm -rf *.o *.bin dma-latency diff --git a/QDMA/linux-kernel/apps/dma-latency/Readme.txt b/QDMA/linux-kernel/apps/dma-latency/Readme.txt deleted file mode 100755 index 9c07c2c..0000000 --- a/QDMA/linux-kernel/apps/dma-latency/Readme.txt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - -What is the dma-lat tool? -The intent of the tool is to gather metrics related how much time do packets -take to loopback to the host when a packet is transmitted in the ST H2C direction -and the ST Traffic Generator loops back the same packet in the ST C2H direction. -The RDTSC timestamp is inserted into the packet that is transmitted in the H2C -direction at the time of PIDX update. The timestamp at the time when the -data interrupt is hit is taken and the difference in the timestamps is used to -measure the latency for the packet. The tool measures average, maximum and -minimum latency in CPU tick counts. To obtain the latency numbers in nanosecs, -the numbers reported by the tool need to be divided by the nominal CPU freq. - -How to use the tool? -The tool takes in a configuration file as input which contains data such as the -number of queues, packet sizes etc. Please refer to the Sample_dma_latency_config.txt -for more information on what are available the configuraion parameters. -The command syntax is - -dma-lat -c <config file> - -Important Note- -To be able to get correct results for the latency numbers it is necessary that the -number of CPUs be restricted to 1 and hyperthreading be turned OFF from BIOS. This is -to ensure that the CPU core that sends out the H2C packet which contains the timestamp -is the same CPU that receives that data interrupt for the loopback. If this is not done -then the packet might get transmitted from one CPU core with a different TSC timestamp, -and the interrupt might get hit on another CPU core which would cause an error in the -measurement. diff --git a/QDMA/linux-kernel/apps/dma-latency/dmalat.c b/QDMA/linux-kernel/apps/dma-latency/dmalat.c deleted file mode 100755 index 98c157b..0000000 --- a/QDMA/linux-kernel/apps/dma-latency/dmalat.c +++ /dev/null @@ -1,1133 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#include <time.h> -#include <sys/wait.h> -#include <fcntl.h> -#include <getopt.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <ctype.h> -#include <errno.h> -#include <error.h> -#include <sys/ioctl.h> -#include </usr/include/pthread.h> -#include "dmautils.h" -#include "qdma_nl.h" - -static struct option const long_opts[] = { - {"config", required_argument, NULL, 'c'}, - {0, 0, 0, 0} -}; - -static void prep_pci_dump(void); - -static void usage(const char *name) -{ - int i = 0; - fprintf(stdout, "%s\n\n", name); - fprintf(stdout, "usage: %s [OPTIONS]\n\n", name); - - fprintf(stdout, " -%c (--%s) config file that has configration for IO\n", - long_opts[i].val, long_opts[i].name); -} - -static unsigned int num_trailing_blanks(char *word) -{ - unsigned int i = 0; - unsigned int slen = strlen(word); - - if (!slen) return 0; - while (isspace(word[slen - i - 1])) { - i++; - } - - return i; -} - -static char * strip_blanks(char *word, long unsigned int *banlks) -{ - char *p = word; - unsigned int i = 0; - - while (isblank(p[0])) { - p++; - i++; - } - if (banlks) - *banlks = i; - - return p; -} - -static unsigned int copy_value(char *src, char *dst, unsigned int max_len) -{ - char *p = src; - unsigned int i = 0; - - while (max_len && !isspace(p[0])) { - dst[i] = p[0]; - p++; - i++; - max_len--; - } - - return i; -} - -static char * strip_comments(char *word) -{ - size_t numblanks; - char *p = strip_blanks(word, &numblanks); - - if (p[0] == '#') - return NULL; - else - p = strtok(word, "#"); - - return p; -} - -#define PCI_DUMP_CMD_LEN 100 -#define QDMA_GLBL_MAX_ENTRIES (16) - -enum q_mode { - Q_MODE_MM, - Q_MODE_ST, - Q_MODES -}; - -enum q_dir { - Q_DIR_H2C, - Q_DIR_C2H, - Q_DIR_BI, - Q_DIRS -}; - - -struct io_info { - int pid; - char q_name[20]; - char trig_mode[10]; - unsigned char q_ctrl; - unsigned int q_added; - unsigned int q_started; - int fd; - unsigned int pf; - unsigned int qid; - enum q_mode mode; - enum q_dir dir; - unsigned int idx_tmr; - unsigned int idx_cnt; - unsigned int idx_rngsz; - unsigned int pfetch_en; - unsigned int pkt_sz; - unsigned int cmptsz; - unsigned int thread_id; -}; - -#define container_of(ptr, type, member) ({ \ - const struct iocb *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - -static unsigned int io_exit = 0; -static unsigned int force_exit = 0; -static unsigned int num_q = 0; -static unsigned int pkt_sz = 0; -static unsigned int tsecs = 0; -struct io_info info[8]; -static char cfg_name[20]; -static unsigned int pci_bus = 0; -static unsigned int pci_dev = 0; -static unsigned int vf_perf = 0; -static char *dmactl_dev_prefix_str; -char *pf_dmactl_prefix_str = "qdma"; -char *vf_dmactl_prefix_str = "qdmavf"; -int base_pid; -enum q_mode mode = Q_MODE_ST; -enum q_dir dir = Q_DIR_BI; -unsigned int num_pf = 0; -unsigned int pf_start = 0; -unsigned int q_start = 0; -unsigned int idx_rngsz = 0; -unsigned int idx_tmr = 0; -unsigned int idx_cnt = 0; -unsigned int pfetch_en = 0; -unsigned int cmptsz = 0; -char trigmode[10]; -char pci_dump[PCI_DUMP_CMD_LEN]; -unsigned int dump_en = 0; -static struct timespec g_ts_start; -int *child_pid_lst = NULL; -unsigned int glbl_rng_sz[QDMA_GLBL_MAX_ENTRIES]; - -static int setup_thrd_env(struct io_info *_info, unsigned char is_new_fd); - -static int arg_read_int(char *s, uint32_t *v) -{ - char *p = NULL; - - - *v = strtoul(s, &p, 0); - if (*p && (*p != '\n') && !isblank(*p)) { - printf("Error:something not right%s %s %s",s, p, isblank(*p)? "true": "false"); - return -EINVAL; - } - return 0; -} - -static int arg_read_int_array(char *s, unsigned int *v, unsigned int max_arr_size) -{ - unsigned int slen = strlen(s); - unsigned int trail_blanks = num_trailing_blanks(s); - char *str = (char *)malloc(slen - trail_blanks + 1); - char *elem; - int cnt = 0; - - memset(str, '\0', slen + 1); - strncpy(str, s + 1, slen - trail_blanks - 2); - str[slen] = '\0'; - - elem = strtok(str, " ,");/* space or comma separated */ - while (elem != NULL) { - int ret; - - ret = arg_read_int(elem, &v[cnt]); - if (ret < 0) { - printf("ERROR: Invalid array element %sin %s\n", elem, s); - exit(0); - } - cnt++; - elem = strtok(NULL, " ,"); - if (cnt > (int)max_arr_size) { /* to avoid out of bounds */ - printf("ERROR: More than expected number of elements in %s - expected = %u\n", - str, max_arr_size); - exit(0); - } - } - free(str); - - return cnt; -} - -static int get_array_len(char *s) -{ - int i, len = 0; - - if (strlen(s) < 2) - return -EINVAL; - if ((s[0] != '(') && (s[strlen(s) - 1] != ')')) - return -EINVAL; - if ((s[0] == '(') && (s[1] == ')')) - return 0; - for (i = 0; i < (int)strlen(s); i++) { - if ((s[i] == ' ') || (s[i] == ',')) /* space or comma separated */ - len++; - if (s[i] == ')') - break; - } - - return (len + 1); - -} - -static void dump_thrd_info(struct io_info *_info) { - printf("q_name = %s\n", info->q_name); - printf("dir = %d\n", _info->dir); - printf("mode = %d\n", _info->mode); - printf("idx_cnt = %u\n", _info->idx_cnt); - printf("idx_rngsz = %u\n", _info->idx_rngsz); - printf("idx_tmr = %u\n", _info->idx_tmr); - printf("pf = %x\n", _info->pf); - printf("qid = %u\n", _info->qid); - printf("fd = %d\n", _info->fd); - printf("trig_mode = %s\n", _info->trig_mode); - printf("q_ctrl = %u\n", _info->q_ctrl); - printf("q_added = %u\n", _info->q_added); - printf("q_started = %u\n", _info->q_started); -} - -static void xnl_dump_response(const char *resp) -{ - printf("%s", resp); -} - -static int qdma_register_write(unsigned char is_vf, - unsigned int pf, int bar, unsigned long reg, - unsigned long value) -{ - struct xcmd_info xcmd; - struct xcmd_reg *regcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - - regcmd = &xcmd.req.reg; - xcmd.op = XNL_CMD_REG_WRT; - xcmd.vf = is_vf; - xcmd.if_bdf = pf; - xcmd.log_msg_dump = xnl_dump_response; - regcmd->bar = bar; - regcmd->reg = reg; - regcmd->val = value; - regcmd->sflags = XCMD_REG_F_BAR_SET | - XCMD_REG_F_REG_SET | - XCMD_REG_F_VAL_SET; - - ret = qdma_reg_write(&xcmd); - if (ret < 0) - printf("QDMA_REG_WRITE Failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_register_read(unsigned char is_vf, - unsigned int pf, int bar, unsigned long reg, - unsigned int *reg_val) -{ - struct xcmd_info xcmd; - struct xcmd_reg *regcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - - regcmd = &xcmd.req.reg; - xcmd.op = XNL_CMD_REG_RD; - xcmd.vf = is_vf; - xcmd.if_bdf = pf; - xcmd.log_msg_dump = xnl_dump_response; - regcmd->bar = bar; - regcmd->reg = reg; - regcmd->sflags = XCMD_REG_F_BAR_SET | - XCMD_REG_F_REG_SET; - - ret = qdma_reg_read(&xcmd); - if (ret < 0) - printf("QDMA_REG_READ Failed, ret :%d\n", ret); - - *reg_val = regcmd->val; - - return ret; -} - -static int qdma_prepare_reg_dump(struct xcmd_info *xcmd, - unsigned char is_vf, struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_REG_DUMP; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - - return 0; -} - -static int qdma_registers_dump(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_reg_dump(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_reg_dump(&xcmd); - if (ret < 0) - printf("Q_ failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_add(struct xcmd_info *xcmd, - unsigned char is_vf, struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_ADD; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - qparm->sflags = qparm->flags; - - return 0; -} - -static int qdma_add_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_add(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_q_add(&xcmd); - if (ret < 0) - printf("Q_ADD failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_start(struct xcmd_info *xcmd, - unsigned char is_vf, struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_START; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - qparm->fetch_credit = Q_ENABLE_C2H_FETCH_CREDIT; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - qparm->qrngsz_idx = info->idx_rngsz; - - if ((info->dir == Q_DIR_C2H) && (info->mode == Q_MODE_ST)) { - if (cmptsz) - qparm->cmpt_entry_size = info->cmptsz; - else - qparm->cmpt_entry_size = XNL_ST_C2H_CMPT_DESC_SIZE_8B; - qparm->cmpt_tmr_idx = info->idx_tmr; - qparm->cmpt_cntr_idx = info->idx_cnt; - - if (!strcmp(info->trig_mode, "every")) - qparm->cmpt_trig_mode = 1; - else if (!strcmp(info->trig_mode, "usr_cnt")) - qparm->cmpt_trig_mode = 2; - else if (!strcmp(info->trig_mode, "usr")) - qparm->cmpt_trig_mode = 3; - else if (!strcmp(info->trig_mode, "usr_tmr")) - qparm->cmpt_trig_mode=4; - else if (!strcmp(info->trig_mode, "cntr_tmr")) - qparm->cmpt_trig_mode=5; - else if (!strcmp(info->trig_mode, "dis")) - qparm->cmpt_trig_mode = 0; - else { - printf("Error: unknown q trigmode %s.\n", info->trig_mode); - return -EINVAL; - } - - if (pfetch_en) - qparm->flags |= XNL_F_PFETCH_EN; - } - - qparm->flags |= (XNL_F_CMPL_STATUS_EN | XNL_F_CMPL_STATUS_ACC_EN | - XNL_F_CMPL_STATUS_PEND_CHK | XNL_F_CMPL_STATUS_DESC_EN | - XNL_F_FETCH_CREDIT); - - qparm->sflags |= (1 << QPARM_PING_PONG_EN); - - return 0; -} - -static int qdma_start_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_start(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_q_start(&xcmd); - if (ret < 0) - printf("Q_START failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_stop(struct xcmd_info *xcmd, unsigned char is_vf, - struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) - return -EINVAL; - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_STOP; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - return 0; -} - -static int qdma_stop_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_stop(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_q_stop(&xcmd); - if (ret < 0) - printf("Q_STOP failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_del(struct xcmd_info *xcmd, unsigned char is_vf, - struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_DEL; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - return 0; -} - -static int qdma_del_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_del(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_q_del(&xcmd); - if (ret < 0) - printf("Q_DEL failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_dump(struct xcmd_info *xcmd, unsigned char is_vf, - struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_DUMP; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - return 0; -} - -static int qdma_dump_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_dump(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - return qdma_q_dump(&xcmd); -} - - -static void create_thread_info(void) -{ - unsigned int base = 0; - unsigned int q_ctrl = 1; - unsigned int i, k; - int last_fd = -1; - unsigned char is_new_fd = 1; - struct io_info *_info = info; - - prep_pci_dump(); - - if ((mode == Q_MODE_ST) && (dir != Q_DIR_H2C)) { - qdma_register_write(vf_perf, (pci_bus << 12) | (pci_dev << 4) | pf_start, 2, 0x50, cmptsz); - } - - for (k = 0; k < num_pf; k++) { - for (i = 0 ; i < num_q; i++) { - is_new_fd = 1; - snprintf(_info[base].q_name, 20, "%s%02x%02x%01x-%s-%u", - dmactl_dev_prefix_str, pci_bus, pci_dev, - pf_start+k, (mode == Q_MODE_MM) ? "MM" : "ST", q_start + i); - - _info[base].dir = Q_DIR_H2C; - _info[base].mode = mode; - _info[base].idx_rngsz = idx_rngsz; - _info[base].pf = (pci_bus << 12) | (pci_dev << 4) | (pf_start + k); - _info[base].qid = q_start + i; - _info[base].q_ctrl = q_ctrl; - _info[base].pkt_sz = pkt_sz; - last_fd = setup_thrd_env(&_info[base], is_new_fd); - _info[base].fd = last_fd; - is_new_fd = 0; - // Adding the Queue in the C2H direction also - _info[base].dir = Q_DIR_C2H; - _info[base].pfetch_en = pfetch_en; - _info[base].idx_cnt = idx_cnt; - _info[base].idx_tmr = idx_tmr; - _info[base].cmptsz = cmptsz; - strncpy(_info[base].trig_mode, trigmode, 10); - last_fd = setup_thrd_env(&_info[base], is_new_fd); - _info[base].thread_id = base; - base++; - } - - } - // Reset ST Traffic generator - qdma_register_write(vf_perf, (pci_bus << 12) | (pci_dev << 4) | pf_start, 2, 0x08, 0); - // Set the loopback bit for the ST traffic generator - qdma_register_write(vf_perf, (pci_bus << 12) | (pci_dev << 4) | pf_start, 2, 0x08, 1); - - usleep(1000); - -} - -static void parse_config_file(const char *cfg_fname) -{ - char *linebuf = NULL; - char *realbuf; - FILE *fp; - size_t linelen = 0; - size_t numread; - size_t numblanks; - unsigned int linenum = 0; - char *config, *value; - unsigned int dir_factor = 1; - char rng_sz[100] = {'\0'}; - char rng_sz_path[512] = {'\0'}; - int rng_sz_fd, ret = 0; - - fp = fopen(cfg_fname, "r"); - if (fp == NULL) - exit(EXIT_FAILURE); - - while ((numread = getline(&linebuf, &linelen, fp)) != -1) { - numread--; - linenum++; - linebuf = strip_comments(linebuf); - if (!linebuf) - continue; - realbuf = strip_blanks(linebuf, &numblanks); - linelen -= numblanks; - if (0 == linelen) - continue; - config = strtok(realbuf, "="); - value = strtok(NULL, "="); - if (!strncmp(config, "name", 3)) { - copy_value(value, cfg_name, 20); - } else if (!strncmp(config, "pf_range", 8)) { - char *pf_range_start = strtok(value, ":"); - char *pf_range_end = strtok(NULL, ":"); - unsigned int start; - unsigned int end; - if (arg_read_int(pf_range_start, &start)) { - printf("Error: Invalid pf range start:%s\n", pf_range_start); - goto prase_cleanup; - } - if (arg_read_int(pf_range_end, &end)) { - printf("Error: Invalid pf range end:%s\n", pf_range_end); - goto prase_cleanup; - } - - pf_start = start; - num_pf = end - start + 1; - } else if (!strncmp(config, "q_range", 7)) { - char *q_range_start = strtok(value, ":"); - char *q_range_end = strtok(NULL, ":"); - unsigned int start; - unsigned int end; - if (arg_read_int(q_range_start, &start)) { - printf("Error: Invalid q range start:%s\n", q_range_start); - goto prase_cleanup; - } - if (arg_read_int(q_range_end, &end)) { - printf("Error: Invalid q range end:%s\n", q_range_end); - goto prase_cleanup; - } - - q_start = start; - num_q = end - start + 1; - } else if (!strncmp(config, "rngidx", 6)) { - if (arg_read_int(value, &idx_rngsz)) { - printf("Error: Invalid idx_rngsz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "tmr_idx", 7)) { - if (arg_read_int(value, &idx_tmr)) { - printf("Error: Invalid idx_tmr:%s\n", value); - goto prase_cleanup; - } - } - if (!strncmp(config, "cntr_idx", 8)) { - if (arg_read_int(value, &idx_cnt)) { - printf("Error: Invalid idx_cnt:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pfetch_en", 9)) { - if (arg_read_int(value, &pfetch_en)) { - printf("Error: Invalid pfetch_en:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "cmptsz", 5)) { - if (arg_read_int(value, &cmptsz)) { - printf("Error: Invalid cmptsz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "dump_en", 5)) { - if (arg_read_int(value, &dump_en)) { - printf("Error: Invalid dump_en:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "trig_mode", 9)) { - copy_value(value, trigmode, 10); - } else if (!strncmp(config, "runtime", 9)) { - if (arg_read_int(value, &tsecs)) { - printf("Error: Invalid tsecs:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pkt_sz", 6)) { - if (arg_read_int(value, &pkt_sz)) { - printf("Error: Invalid pkt_sz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pci_bus", 7)) { - char *p; - - pci_bus = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pci_dev", 7)) { - char *p; - - pci_dev = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "vf_perf", 7)) { - char *p; - - vf_perf = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - - } - } - fclose(fp); - if (vf_perf == 0) { - dmactl_dev_prefix_str = pf_dmactl_prefix_str; - } else { - dmactl_dev_prefix_str = vf_dmactl_prefix_str; - } - - if (!pci_bus && !pci_dev) { - printf("Error: PCI bus information not provided\n"); - exit(1); - } - - snprintf(rng_sz_path, 200,"dma-ctl %s%05x global_csr | grep Global| cut -d : -f 2 > glbl_rng_sz", - dmactl_dev_prefix_str, (pci_bus << 12) | (pci_dev << 4) | pf_start); - printf("%s\n", rng_sz_path); - system(rng_sz_path); - memset(rng_sz_path, 0, 200); - snprintf(rng_sz_path, 200, "glbl_rng_sz"); - - rng_sz_fd = open(rng_sz_path, O_RDONLY); - if (rng_sz_fd < 0) { - printf("Could not open %s\n", rng_sz_path); - exit(1); - } - ret = read(rng_sz_fd, &rng_sz[1], 99); - if (ret < 0) { - printf("Error: Could not read the file\n"); - exit(1); - } - close(rng_sz_fd); - /* below 2 line a work around to use arg_read_int_array */ - rng_sz[0] = ' '; - rng_sz[strlen(rng_sz)] = ' '; - ret = arg_read_int_array(rng_sz, glbl_rng_sz, QDMA_GLBL_MAX_ENTRIES); - if (ret <= 0) { - printf("Error: Invalid ring size array:%s\n", rng_sz); - exit(1); - } - - create_thread_info(); - - return; - -prase_cleanup: - fclose(fp); - exit(-1); -} - -/* Subtract timespec t2 from t1 - * - * Both t1 and t2 must already be normalized - * i.e. 0 <= nsec < 1000000000 - */ -static int timespec_check(struct timespec *t) -{ - if ((t->tv_nsec < 0) || (t->tv_nsec >= 1000000000)) - return -1; - return 0; - -} - -static void timespec_sub(struct timespec *t1, struct timespec *t2) -{ - if (timespec_check(t1) < 0) { - fprintf(stderr, "invalid time #1: %lld.%.9ld.\n", - (long long)t1->tv_sec, t1->tv_nsec); - return; - } - if (timespec_check(t2) < 0) { - fprintf(stderr, "invalid time #2: %lld.%.9ld.\n", - (long long)t2->tv_sec, t2->tv_nsec); - return; - } - t1->tv_sec -= t2->tv_sec; - t1->tv_nsec -= t2->tv_nsec; - if (t1->tv_nsec >= 1000000000) { - t1->tv_sec++; - t1->tv_nsec -= 1000000000; - } else if (t1->tv_nsec < 0) { - t1->tv_sec--; - t1->tv_nsec += 1000000000; - } -} - -static void io_proc_cleanup(struct io_info *_info) -{ - int s; - char reg_cmd[100] = {'\0'}; - - if (dump_en) { - s = qdma_dump_queue(vf_perf, _info); - if (s < 0) { - printf("Failed: queue_dump\nerrcode = %d\n", s); - } - } - - s = qdma_stop_queue(vf_perf, _info); - if (s < 0) { - printf("Failed: queue_stop\nerrcode = %d\n", s); - } - _info->q_started = 0; - - system(reg_cmd); - - s = qdma_del_queue(vf_perf, _info); - if (s < 0) { - printf("Failed: queue_del\nerrcode = %d\n", s); - } - _info->q_added = 0; -} - -static void *io_thread(void *argp) -{ - - struct io_info *_info = (struct io_info *)argp; - char *buffer = NULL; - - unsigned int io_sz = _info->pkt_sz; - - posix_memalign((void **)&buffer, 4096 /*alignment */ , io_sz + 4096); - if (!buffer) { - printf("OOM \n"); - return NULL; - } - - do { - - struct timespec ts_cur; - - if (tsecs) { - if (clock_gettime(CLOCK_MONOTONIC, &ts_cur) != 0) - break; - timespec_sub(&ts_cur, &g_ts_start); - if (ts_cur.tv_sec >= tsecs) - break; - } - - write(_info->fd, buffer ,io_sz); - read(_info->fd, buffer ,io_sz); - - - } while (tsecs && !force_exit); - - free(buffer); - - return NULL; -} - -static void prep_pci_dump(void) -{ - memset(pci_dump, '\0', PCI_DUMP_CMD_LEN); - snprintf(pci_dump, PCI_DUMP_CMD_LEN, "lspci -s %02x:%02x.%01x -vvv", pci_bus, pci_dev, pf_start); -} - -static int setup_thrd_env(struct io_info *_info, unsigned char is_new_fd) -{ - int s; - - /* add queue */ - s = qdma_add_queue(vf_perf, _info); - if (s < 0) { - exit(1); - } - _info->q_added++; - - /* start queue */ - /* start queue */ - s = qdma_start_queue(vf_perf, _info); - if (s < 0) - exit(1); - _info->q_started++; - - if (is_new_fd) { - char node[25] = {'\0'}; - - snprintf(node, 25, "/dev/%s", _info->q_name); - _info->fd = open(node, O_RDWR); - if (_info->fd < 0) { - printf("Error: Cannot find %s\n", node); - exit(1); - } - } - - return _info->fd; -} - -static void dump_result() -{ - char reg_cmd[100] = {'\0'}; - - snprintf(reg_cmd, 100, "dma-ctl %s%05x stat", - dmactl_dev_prefix_str, info[0].pf); - system(reg_cmd); - memset(reg_cmd, 0, 100); - snprintf(reg_cmd, 100, "dma-ctl %s%05x stat clear", - dmactl_dev_prefix_str, info[0].pf); - system(reg_cmd); - memset(reg_cmd, 0, 100); - -} - -static int is_valid_fd(int fd) -{ - return fcntl(fd, F_GETFL) != -1 || errno != EBADF; -} - -static void cleanup(void) { - - if (getpid() != base_pid) - return; - - for (int i=0;i<num_q; i++) { - if (info[i].fd > 0 && is_valid_fd(info[i].fd)) - close(info[i].fd); - info[i].dir = Q_DIR_H2C; - io_proc_cleanup(&info[i]); - info[i].dir = Q_DIR_C2H; - io_proc_cleanup(&info[i]); - } - dump_result(); -} - -int main(int argc, char *argv[]) -{ - - int cmd_opt; - char *cfg_fname = NULL; - unsigned int i = 0; - cpu_set_t set; - while ((cmd_opt = getopt_long(argc, argv, "vhxc:c:", long_opts, - NULL)) != -1) { - switch (cmd_opt) { - case 0: - /* long option */ - break; - case 'c': - /* config file name */ - cfg_fname = strdup(optarg); - break; - default: - usage(argv[0]); - exit(0); - break; - } - } - if (cfg_fname == NULL) - return 1; - - parse_config_file(cfg_fname); - atexit(cleanup); - - printf("dmautils(%u) threads\n", num_q); - child_pid_lst = calloc(num_q, sizeof(int)); - base_pid = getpid(); - - CPU_ZERO(&set); - CPU_SET(0, &set); - if (sched_setaffinity(getpid(), sizeof(set), &set) == -1) - printf("setaffinity for thrd%u failed\n", info[i].thread_id); - - for (i = 0; i < num_q; i++) { - if (getpid() == base_pid) - child_pid_lst[i] = fork(); - else - break; - } - - clock_gettime(CLOCK_MONOTONIC, &g_ts_start); - if (getpid() == base_pid) { - for(i = 0; i < num_q; i++) { - waitpid(child_pid_lst[i], NULL, 0); - } - free(child_pid_lst); - child_pid_lst = NULL; - - qdma_register_write(vf_perf, (pci_bus << 12) | (pci_dev << 4) | pf_start, 2, 0x08, 0); - - } else { - info[i-1].pid = getpid(); - io_thread(&info[i-1]); - } - return 0; -} - diff --git a/QDMA/linux-kernel/apps/dma-latency/sample_dma_latency_config.txt b/QDMA/linux-kernel/apps/dma-latency/sample_dma_latency_config.txt deleted file mode 100755 index f710845..0000000 --- a/QDMA/linux-kernel/apps/dma-latency/sample_dma_latency_config.txt +++ /dev/null @@ -1,28 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -pf_range=0:0 -q_range=0:0 -flags= -cmpl_status_acc=5 -dump_en=0 -tmr_idx=9 -cntr_idx=0 -trig_mode=cntr_tmr -pfetch_en=1 -cmptsz=1 -rngidx=9 -runtime=1 -pkt_sz=64 -pci_bus=41 -pci_device=00 - diff --git a/QDMA/linux-kernel/apps/dma-latency/version.h b/QDMA/linux-kernel/apps/dma-latency/version.h deleted file mode 100755 index 650deb9..0000000 --- a/QDMA/linux-kernel/apps/dma-latency/version.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef __DMA_LATENCY_VERSION_H -#define __DMA_LATENCY_VERSION_H - -#define PROGNAME "dma-latency" -#define VERSION "2023.2.0" -#define COPYRIGHT "Copyright (c) 2022-2023 Advanced Micro Devices Inc." - -#endif diff --git a/QDMA/linux-kernel/apps/dma-perf/Makefile b/QDMA/linux-kernel/apps/dma-perf/Makefile deleted file mode 100755 index 34ba484..0000000 --- a/QDMA/linux-kernel/apps/dma-perf/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -CC ?= gcc - -CFLAGS += -g -#CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I../include -I../dma-utils -CFLAGS += $(EXTRA_FLAGS) - -DMA-PERF = dma-perf -DMA-UTILS_OBJS := $(patsubst %.c,%.o,$(wildcard ../dma-utils/*.c)) -DMA-PERF_OBJS := dmaperf.o -DMA-PERF_OBJS += $(DMA-UTILS_OBJS) - -ifneq ($(CROSS_COMPILE_FLAG),) - CC=$(CROSS_COMPILE_FLAG)gcc -endif - -all: clean dma-perf - -dma-perf: $(DMA-PERF_OBJS) - $(CC) -pthread -lrt -o $@ $^ -laio -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE - -%.o: %.c - $(CC) $(CFLAGS) -c -std=c99 -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE -D_AIO_AIX_SOURCE - -clean: - @rm -f *.o */*.o ../dma-utils/*.o - rm -rf *.o *.bin dma-perf diff --git a/QDMA/linux-kernel/apps/dma-perf/dmaperf.c b/QDMA/linux-kernel/apps/dma-perf/dmaperf.c deleted file mode 100755 index 1d9638e..0000000 --- a/QDMA/linux-kernel/apps/dma-perf/dmaperf.c +++ /dev/null @@ -1,2275 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#include <semaphore.h> -#include <time.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/shm.h> -#include <sys/wait.h> -#include <fcntl.h> -#include <stdbool.h> -#include <linux/types.h> -#include <getopt.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <ctype.h> -#include <signal.h> -#include <stddef.h> -#include <errno.h> -#include <error.h> -#include <sys/mman.h> -#include <sys/time.h> -#include <sys/ioctl.h> -#include </usr/include/pthread.h> -#include <libaio.h> -#include <sys/sysinfo.h> -#include "dmautils.h" -#include "qdma_nl.h" - -#define SEC2NSEC 1000000000 -#define SEC2USEC 1000000 -#define DEFAULT_PAGE_SIZE 4096 -#define PAGE_SHIFT 12 - -#define DATA_VALIDATION 0 - -static struct option const long_opts[] = { - {"config", required_argument, NULL, 'c'}, - {0, 0, 0, 0} -}; - -static void prep_pci_dump(void); - -static void usage(const char *name) -{ - int i = 0; - fprintf(stdout, "%s\n\n", name); - fprintf(stdout, "usage: %s [OPTIONS]\n\n", name); - - fprintf(stdout, " -%c (--%s) config file that has configration for IO\n", - long_opts[i].val, long_opts[i].name); -} - -static unsigned int num_trailing_blanks(char *word) -{ - unsigned int i = 0; - unsigned int slen = strlen(word); - - if (!slen) return 0; - while (isspace(word[slen - i - 1])) { - i++; - } - - return i; -} - -static char * strip_blanks(char *word, long unsigned int *banlks) -{ - char *p = word; - unsigned int i = 0; - - while (isblank(p[0])) { - p++; - i++; - } - if (banlks) - *banlks = i; - - return p; -} - -static unsigned int copy_value(char *src, char *dst, unsigned int max_len) -{ - char *p = src; - unsigned int i = 0; - - while (max_len && !isspace(p[0])) { - dst[i] = p[0]; - p++; - i++; - max_len--; - } - - return i; -} - -static char * strip_comments(char *word) -{ - size_t numblanks; - char *p = strip_blanks(word, &numblanks); - - if (p[0] == '#') - return NULL; - else - p = strtok(word, "#"); - - return p; -} - -#define MSEC2NSEC 1000000 -#define CMPL_STATUS_ACC_CMD_LEN 200 -#define PCI_DUMP_CMD_LEN 100 - -#define QDMA_UL_SEND_MARKER_PACKET (1 << 5) -#define QDMA_UL_IMM_DUMP_C2H_DATA (1 << 17) -#define QDMA_UL_STOP_C2H_TRANSFER (1 << 18) -#define QDMA_UL_DROP_ENABLE (1 << 19) -#define QDMA_UL_IMM_DUMP_CMPT_FIFO (1 << 20) -#define QDMA_UL_STOP_CMPT_TRANSFER (1 << 21) - -#define QDMA_GLBL_MAX_ENTRIES (16) -//#define DEBUG - -enum q_mode { - Q_MODE_MM, - Q_MODE_ST, - Q_MODES -}; - -enum q_dir { - Q_DIR_H2C, - Q_DIR_C2H, - Q_DIR_BI, - Q_DIRS -}; - - -enum mm_channel_ctrl { - MM_CHANNEL_0, /*All Qs are assigned to channel 0*/ - MM_CHANNEL_1, /*All Qs are assigned to channel 1*/ - MM_CHANNEL_INTERLEAVE /*Odd queues are assigned to ch 1 and even Qs are assigned to channel 0*/ -}; - -#define THREADS_SET_CPU_AFFINITY 0 - -struct io_info { - unsigned int num_req_submitted; - unsigned int num_req_completed; - unsigned int num_req_completed_in_time; - int exit_check_count; - struct list_head *head; - struct list_head *tail; - sem_t llock; - int pid; - pthread_t evt_id; - char q_name[20]; - char trig_mode[10]; - unsigned char q_ctrl; - unsigned int q_added; - unsigned int q_started; - unsigned int q_wait_for_stop; - int fd; - unsigned int pf; - unsigned int qid; - enum q_mode mode; - enum q_dir dir; - unsigned int idx_tmr; - unsigned int idx_cnt; - unsigned int idx_rngsz; - unsigned int pfetch_en; - unsigned int pkt_burst; - unsigned int pkt_sz; - unsigned int cmptsz; - unsigned int stm_mode; - unsigned int pipe_gl_max; - unsigned int pipe_flow_id; - unsigned int pipe_slr_id; - unsigned int pipe_tdest; - unsigned int mm_chnl; - int keyhole_en; - unsigned int aperture_sz; - unsigned long int offset; -#ifdef DEBUG - unsigned long long total_nodes; - unsigned long long freed_nodes; -#endif - unsigned int thread_id; -#if THREADS_SET_CPU_AFFINITY - int cpu; -#endif -}; - -struct list_head { - struct list_head *next; - unsigned int max_events; - unsigned int completed_events; - io_context_t ctxt; -}; - -#define container_of(ptr, type, member) ({ \ - const struct iocb *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) - -static unsigned int *io_exit = 0; -int io_exit_id; -static unsigned int mm_chnl = 0; -static unsigned int force_exit = 0; -static unsigned int num_q = 0; -static unsigned int pkt_sz = 0; -static unsigned int num_pkts; -static int keyhole_en = 0; -static unsigned int aperture_sz = 0; -/* For MM Channel =0 or 1 , offset is used for both MM Channels */ -static unsigned long int offset_ch0 = 0; -/*In MM Channel interleaving offset_ch1 is the offset used for Channel 1*/ -static unsigned long int offset_ch1 = 0; -static int offset_q_en= 0; -static unsigned long int h2c_q_offset_intvl = 0; -static unsigned long int c2h_q_offset_intvl = 0; -static unsigned long int h2c_q_start_offset= 0; -static unsigned long int c2h_q_start_offset= 0; -static unsigned int tsecs = 0; -struct io_info *info = NULL; -static char cfg_name[20]; -static unsigned int pci_bus = 0; -static unsigned int pci_dev = 0; -static unsigned int vf_perf = 0; -static char *dmactl_dev_prefix_str; -char *pf_dmactl_prefix_str = "qdma"; -char *vf_dmactl_prefix_str = "qdmavf"; -unsigned int num_thrds = 0; -unsigned int num_thrds_per_q = 1; -int shmid; -int base_pid; -enum q_mode mode; -enum q_dir dir; -unsigned int num_pf = 0; -unsigned int pf_start = 0; -unsigned int q_start = 0; -unsigned int idx_rngsz = 0; -unsigned int idx_tmr = 0; -unsigned int idx_cnt = 0; -unsigned int pfetch_en = 0; -unsigned int cmptsz = 0; -unsigned int no_memcpy = 1; -unsigned int stm_mode = 0; -unsigned int *pipe_gl_max_lst = NULL; -unsigned int *pipe_flow_id_lst = NULL; -unsigned int *pipe_slr_id_lst = NULL; -unsigned int *pipe_tdest_lst = NULL; -char trigmode[10]; -char pci_dump[PCI_DUMP_CMD_LEN]; -unsigned int dump_en = 0; -unsigned int marker_en = 1; -static struct timespec g_ts_start; -static unsigned char *q_lst_stop = NULL; -int q_lst_stop_mid; -int *child_pid_lst = NULL; -unsigned int glbl_rng_sz[QDMA_GLBL_MAX_ENTRIES]; -#if THREADS_SET_CPU_AFFINITY -unsigned int num_processors = 1; -#endif -#if DATA_VALIDATION -unsigned short valid_data[2*1024]; -#endif - -static void clear_events(struct io_info *_info, struct list_head *node); -static int setup_thrd_env(struct io_info *_info, unsigned char is_new_fd); - -static int arg_read_int(char *s, uint32_t *v) -{ - char *p = NULL; - - - *v = strtoul(s, &p, 0); - if (*p && (*p != '\n') && !isblank(*p)) { - printf("Error:something not right%s %s %s",s, p, isblank(*p)? "true": "false"); - return -EINVAL; - } - return 0; -} - -static int arg_read_long_uint(char *s, uint64_t *v) -{ - char *p = NULL; - *v = strtoull(s, &p, 0); - if (*p && (*p != '\n') && !isblank(*p)) { - printf("Error:something not right%s %s %s",s, p, isblank(*p)? "true": "false"); - return -EINVAL; - } - return 0; -} - -static int update_q_off(struct io_info *info) -{ - if (info->dir == Q_DIR_H2C) { - info->offset += h2c_q_start_offset + (info->qid * h2c_q_offset_intvl); - } else { - info->offset += c2h_q_start_offset + (info->qid * c2h_q_offset_intvl); - } -} - -static int arg_read_int_array(char *s, unsigned int *v, unsigned int max_arr_size) -{ - unsigned int slen = strlen(s); - unsigned int trail_blanks = num_trailing_blanks(s); - char *str = (char *)malloc(slen - trail_blanks + 1); - char *elem; - int cnt = 0; - - memset(str, '\0', slen + 1); - strncpy(str, s + 1, slen - trail_blanks - 2); - str[slen] = '\0'; - - elem = strtok(str, " ,");/* space or comma separated */ - while (elem != NULL) { - int ret; - - ret = arg_read_int(elem, &v[cnt]); - if (ret < 0) { - printf("ERROR: Invalid array element %sin %s\n", elem, s); - exit(0); - } - cnt++; - elem = strtok(NULL, " ,"); - if (cnt > (int)max_arr_size) { /* to avoid out of bounds */ - printf("ERROR: More than expected number of elements in %s - expected = %u\n", - str, max_arr_size); - exit(0); - } - } - free(str); - - return cnt; -} - -static int get_array_len(char *s) -{ - int i, len = 0; - - if (strlen(s) < 2) - return -EINVAL; - if ((s[0] != '(') && (s[strlen(s) - 1] != ')')) - return -EINVAL; - if ((s[0] == '(') && (s[1] == ')')) - return 0; - for (i = 0; i < (int)strlen(s); i++) { - if ((s[i] == ' ') || (s[i] == ',')) /* space or comma separated */ - len++; - if (s[i] == ')') - break; - } - - return (len + 1); - -} - -static void dump_thrd_info(struct io_info *_info) { - - printf("q_name = %s\n", _info->q_name); - printf("dir = %d\n", _info->dir); - printf("mode = %d\n", _info->mode); - printf("idx_cnt = %u\n", _info->idx_cnt); - printf("idx_rngsz = %u\n", _info->idx_rngsz); - printf("idx_tmr = %u\n", _info->idx_tmr); - printf("pf = %x\n", _info->pf); - printf("qid = %u\n", _info->qid); - printf("fd = %d\n", _info->fd); - printf("trig_mode = %s\n", _info->trig_mode); - printf("q_ctrl = %u\n", _info->q_ctrl); - printf("q_added = %u\n", _info->q_added); - printf("q_started = %u\n", _info->q_started); - printf("offset = 0x%lx\n", _info->offset); - if (stm_mode) { - printf("pipe_gl_max = %u\n", _info->pipe_gl_max); - printf("pipe_flow_id = %u\n", _info->pipe_flow_id); - printf("pipe_slr_id = %u\n", _info->pipe_slr_id); - printf("pipe_tdest = %u\n", _info->pipe_tdest); - } -#if THREADS_SET_CPU_AFFINITY - printf("cpu = %u\n", _info->cpu); -#endif -} - -struct dma_meminfo { - void *memptr; - unsigned int num_blks; -}; - -#define USE_MEMPOOL - -struct mempool_handle { - void *mempool; - unsigned int mempool_blkidx; - unsigned int mempool_blksz; - unsigned int total_memblks; - struct dma_meminfo *mempool_info; -#ifdef DEBUG - unsigned int id; - unsigned int loop; -#endif -}; - -static struct mempool_handle ctxhandle; -static struct mempool_handle iocbhandle; -static struct mempool_handle datahandle; - -static void mempool_create(struct mempool_handle *mpool, unsigned int entry_size, unsigned int max_entries) -{ -#ifdef USE_MEMPOOL - if (posix_memalign((void **)&mpool->mempool, DEFAULT_PAGE_SIZE, - max_entries * (entry_size + sizeof(struct dma_meminfo)))) { - printf("OOM\n"); - exit(1); - } - mpool->mempool_info = (struct dma_meminfo *)(((char *)mpool->mempool) + (max_entries * entry_size)); -#endif - mpool->mempool_blksz = entry_size; - mpool->total_memblks = max_entries; - mpool->mempool_blkidx = 0; -} - -static void mempool_free(struct mempool_handle *mpool) -{ -#ifdef USE_MEMPOOL - free(mpool->mempool); - mpool->mempool = NULL; -#endif -} - -static void *dma_memalloc(struct mempool_handle *mpool, unsigned int num_blks) -{ - unsigned int _mempool_blkidx = mpool->mempool_blkidx; - unsigned int tmp_blkidx = _mempool_blkidx; - unsigned int max_blkcnt = tmp_blkidx + num_blks; - unsigned int i, avail = 0; - void *memptr = NULL; - char *mempool = mpool->mempool; - struct dma_meminfo *_mempool_info = mpool->mempool_info; - unsigned int _total_memblks = mpool->total_memblks; - -#ifdef USE_MEMPOOL - if (max_blkcnt > _total_memblks) { - tmp_blkidx = 0; - max_blkcnt = num_blks; - } - for (i = tmp_blkidx; (i < _total_memblks) && (i < max_blkcnt); i++) { - if (_mempool_info[i].memptr) { /* occupied blks ahead */ - i += _mempool_info[i].num_blks; - max_blkcnt = i + num_blks; - avail = 0; - tmp_blkidx = i; - } else - avail++; - if (max_blkcnt > _total_memblks) { /* reached the end of mempool. circle through*/ - if (num_blks > _mempool_blkidx) return NULL; /* Continuous num_blks not available */ - i = 0; - avail = 0; - max_blkcnt = num_blks; - tmp_blkidx = 0; - } - } - if (avail < num_blks) { /* no required available blocks */ - return NULL; - } - - memptr = &(mempool[tmp_blkidx * mpool->mempool_blksz]); - _mempool_info[tmp_blkidx].memptr = memptr; - _mempool_info[tmp_blkidx].num_blks = num_blks; - mpool->mempool_blkidx = tmp_blkidx + num_blks; -#else - memptr = calloc(num_blks, mpool->mempool_blksz); -#endif - - return memptr; -} - -static void dma_free(struct mempool_handle *mpool, void *memptr) -{ -#ifdef USE_MEMPOOL - struct dma_meminfo *_meminfo = mpool->mempool_info; - unsigned int idx; - - if (!memptr) return; - - idx = (memptr - mpool->mempool)/mpool->mempool_blksz; -#ifdef DEBUG - if (idx >= mpool->total_memblks) { - printf("Asserting: %u:Invalid memory index %u acquired\n", mpool->id, idx); - while(1); - } -#endif - - _meminfo[idx].num_blks = 0; - _meminfo[idx].memptr = NULL; -#else - free(memptr); -#endif -} - -static void xnl_dump_response(const char *resp) -{ - printf("%s", resp); -} - -static int qdma_register_write(unsigned char is_vf, - unsigned int pf, int bar, unsigned long reg, - unsigned long value) -{ - struct xcmd_info xcmd; - struct xcmd_reg *regcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - - regcmd = &xcmd.req.reg; - xcmd.op = XNL_CMD_REG_WRT; - xcmd.vf = is_vf; - xcmd.if_bdf = pf; - xcmd.log_msg_dump = xnl_dump_response; - regcmd->bar = bar; - regcmd->reg = reg; - regcmd->val = value; - regcmd->sflags = XCMD_REG_F_BAR_SET | - XCMD_REG_F_REG_SET | - XCMD_REG_F_VAL_SET; - - ret = qdma_reg_write(&xcmd); - if (ret < 0) - printf("QDMA_REG_WRITE Failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_register_read(unsigned char is_vf, - unsigned int pf, int bar, unsigned long reg, - unsigned int *reg_val) -{ - struct xcmd_info xcmd; - struct xcmd_reg *regcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - - regcmd = &xcmd.req.reg; - xcmd.op = XNL_CMD_REG_RD; - xcmd.vf = is_vf; - xcmd.if_bdf = pf; - xcmd.log_msg_dump = xnl_dump_response; - regcmd->bar = bar; - regcmd->reg = reg; - regcmd->sflags = XCMD_REG_F_BAR_SET | - XCMD_REG_F_REG_SET; - - ret = qdma_reg_read(&xcmd); - if (ret < 0) - printf("QDMA_REG_READ Failed, ret :%d\n", ret); - - *reg_val = regcmd->val; - - return ret; -} - -static void create_thread_info(void) -{ - unsigned int base = 0; - unsigned int dir_factor = 1; - unsigned int q_ctrl = 1; - unsigned int i, j, k; - struct io_info *_info; - int last_fd = -1; - unsigned char is_new_fd = 1; -#if THREADS_SET_CPU_AFFINITY - int h2c_cpu = 0; - int max_h2c_cpu = (num_processors / 2); - int c2h_cpu = max_h2c_cpu; - int max_c2h_cpu = (num_processors / 2) + ((num_processors % 2) ? 1 : 0); -#endif - - if (dir == Q_DIR_BI) - dir_factor = 2; - if ((shmid = shmget(IPC_PRIVATE, num_thrds * sizeof(struct io_info), IPC_CREAT | 0666)) < 0) - { - perror("smget returned -1\n"); - error(-1, errno, " "); - exit(-1); - } - if ((q_lst_stop_mid = shmget(IPC_PRIVATE, dir_factor * num_q * num_pf, IPC_CREAT | 0666)) < 0) - { - perror("smget returned -1\n"); - error(-1, errno, " "); - exit(-1); - } - if ((q_lst_stop = (unsigned char *) shmat(q_lst_stop_mid, NULL, 0)) == (unsigned char *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - exit(1); - } - memset(q_lst_stop, 0 , num_q); - if (shmdt(q_lst_stop) == -1) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - if ((_info = (struct io_info *) shmat(shmid, NULL, 0)) == (struct io_info *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - } - - if ((io_exit_id = shmget(IPC_PRIVATE,sizeof(unsigned int), IPC_CREAT | 0666)) < 0) - { - perror("smget returned -1\n"); - error(-1, errno, " "); - exit(-1); - } - - if ((io_exit = (unsigned int *) shmat(io_exit_id, NULL, 0)) == (unsigned int *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - } - prep_pci_dump(); - if ((mode == Q_MODE_ST) && (dir != Q_DIR_H2C)) { - qdma_register_write(vf_perf, (pci_bus << 12) | (pci_dev << 4) | pf_start, 2, 0x50, cmptsz); - qdma_register_write(vf_perf, (pci_bus << 12) | (pci_dev << 4) | pf_start, 2, 0x90, pkt_sz); - usleep(1000); - } - - base = 0; - for (k = 0; k < num_pf; k++) { - for (i = 0 ; i < num_q; i++) { - q_ctrl = 1; -#if THREADS_SET_CPU_AFFINITY - if (h2c_cpu >= max_h2c_cpu) - h2c_cpu = 0; - if (c2h_cpu >= (max_h2c_cpu + max_h2c_cpu)) - c2h_cpu = max_h2c_cpu; -#endif - for (j = 0; j < num_thrds_per_q; j++) { - is_new_fd = 1; - if ((dir == Q_DIR_H2C) || (dir == Q_DIR_BI)) { - snprintf(_info[base].q_name, 20, "%s%02x%02x%01x-%s-%u", - dmactl_dev_prefix_str, pci_bus, pci_dev, - pf_start+k, (mode == Q_MODE_MM) ? "MM" : "ST", q_start + i); - _info[base].dir = Q_DIR_H2C; - _info[base].mode = mode; - _info[base].idx_rngsz = idx_rngsz; - _info[base].pf = (pci_bus << 12) | (pci_dev << 4) | (pf_start + k); - _info[base].qid = q_start + i; - _info[base].q_ctrl = q_ctrl; - _info[base].fd = last_fd; - _info[base].pkt_burst = num_pkts; - if(mm_chnl == MM_CHANNEL_INTERLEAVE) - _info[base].mm_chnl = _info[base].qid % 2; - else - _info[base].mm_chnl = mm_chnl; - _info[base].pkt_sz = pkt_sz; - if ((_info[base].mode == Q_MODE_ST) && - (stm_mode)) { - _info[base].stm_mode = stm_mode; - _info[base].pipe_gl_max = pipe_gl_max_lst[(k*num_q) + i]; - _info[base].pipe_flow_id = pipe_flow_id_lst[(k*num_q) + i]; - _info[base].pipe_slr_id = pipe_slr_id_lst[(k*num_q) + i]; - _info[base].pipe_tdest = pipe_tdest_lst[(k*num_q) + i]; - } - - if (_info[base].mode == Q_MODE_MM && - keyhole_en) { - _info[base].aperture_sz = aperture_sz; - } - if(mm_chnl == MM_CHANNEL_INTERLEAVE && _info[base].mm_chnl ) - _info[base].offset = offset_ch1; - else - _info[base].offset = offset_ch0; - if(offset_q_en) - update_q_off(&_info[base]); -#if THREADS_SET_CPU_AFFINITY - _info[base].cpu = h2c_cpu; -#endif - sem_init(&_info[base].llock, 0, 1); - if (q_ctrl != 0) { - last_fd = setup_thrd_env(&_info[base], is_new_fd); - } - _info[base].thread_id = base; -// dump_thrd_info(&_info[base]); - _info[base].exit_check_count = 0; - base++; - is_new_fd = 0; - } - if (dir != Q_DIR_H2C) - { - snprintf(_info[base].q_name, 20, "%s%02x%02x%01x-%s-%u", - dmactl_dev_prefix_str, pci_bus, pci_dev, pf_start+k, (mode == Q_MODE_MM) ? "MM" : "ST", q_start + i); - _info[base].exit_check_count = 0; - _info[base].dir = Q_DIR_C2H; - _info[base].mode = mode; - _info[base].idx_rngsz = idx_rngsz; - _info[base].pf = (pci_bus << 12) | (pci_dev << 4) | (pf_start + k); - _info[base].qid = q_start + i; - _info[base].q_ctrl = q_ctrl; - _info[base].pkt_burst = num_pkts; - if(mm_chnl == MM_CHANNEL_INTERLEAVE) - _info[base].mm_chnl = _info[base].qid % 2; - else - _info[base].mm_chnl = mm_chnl; - if(mm_chnl == MM_CHANNEL_INTERLEAVE && _info[base].mm_chnl ) - _info[base].offset = offset_ch1; - else - _info[base].offset = offset_ch0; - if(offset_q_en) - update_q_off(&_info[base]); - - _info[base].pkt_sz = pkt_sz; -#if THREADS_SET_CPU_AFFINITY - _info[base].cpu = c2h_cpu; -#endif - if (_info[base].mode == Q_MODE_ST) { - _info[base].pfetch_en = pfetch_en; - _info[base].idx_cnt = idx_cnt; - _info[base].idx_tmr = idx_tmr; - _info[base].cmptsz = cmptsz; - strncpy(_info[base].trig_mode, trigmode, 10); - if (stm_mode) { - _info[base].stm_mode = stm_mode; - _info[base].pipe_gl_max = pipe_gl_max_lst[(k*num_q) + i]; - _info[base].pipe_flow_id = pipe_flow_id_lst[(k*num_q) + i]; - _info[base].pipe_slr_id = pipe_slr_id_lst[(k*num_q) + i]; - _info[base].pipe_tdest = pipe_tdest_lst[(k*num_q) + i]; - } - } - sem_init(&_info[base].llock, 0, 1); - _info[base].fd = last_fd; - if (q_ctrl != 0) { - last_fd = setup_thrd_env(&_info[base], is_new_fd); - } - _info[base].thread_id = base; -// dump_thrd_info(&_info[base]); - base++; - } - q_ctrl = 0; - } -#if THREADS_SET_CPU_AFFINITY - h2c_cpu++; - c2h_cpu++; -#endif - } - } - if ((mode == Q_MODE_ST) && (dir != Q_DIR_H2C)) { - if (!stm_mode) { - qdma_register_write(vf_perf, (pci_bus << 12) | (pci_dev << 4) | pf_start, 2, 0x08, - QDMA_UL_IMM_DUMP_C2H_DATA | QDMA_UL_IMM_DUMP_CMPT_FIFO/* | QDMA_UL_DROP_ENABLE*/); - usleep(1000); - } - } - if (shmdt(_info) == -1) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } -} - -static void parse_config_file(const char *cfg_fname) -{ - char *linebuf = NULL; - char *realbuf; - FILE *fp; - size_t linelen = 0; - size_t numread; - size_t numblanks; - unsigned int linenum = 0; - char *config, *value; - unsigned int dir_factor = 1; - char rng_sz[100] = {'\0'}; - char rng_sz_path[200] = {'\0'}; - int rng_sz_fd, ret = 0; - - fp = fopen(cfg_fname, "r"); - if (fp == NULL) - exit(EXIT_FAILURE); - - while ((numread = getline(&linebuf, &linelen, fp)) != -1) { - numread--; - linenum++; - linebuf = strip_comments(linebuf); - if (!linebuf) - continue; - realbuf = strip_blanks(linebuf, &numblanks); - linelen -= numblanks; - if (0 == linelen) - continue; - config = strtok(realbuf, "="); - value = strtok(NULL, "="); - if (!strncmp(config, "mode", 4)) { - if (!strncmp(value, "mm", 2)) - mode = Q_MODE_MM; - else if(!strncmp(value, "st", 2)) - mode = Q_MODE_ST; - else { - printf("Error: Unkown mode"); - goto prase_cleanup; - } - } else if (!strncmp(config, "dir", 3)) { - if (!strncmp(value, "h2c", 3)) - dir = Q_DIR_H2C; - else if(!strncmp(value, "c2h", 3)) - dir = Q_DIR_C2H; - else if(!strncmp(value, "bi", 2)) - dir = Q_DIR_BI; - else { - printf("Error: Unkown dir"); - goto prase_cleanup; - } - } else if (!strncmp(config, "name", 3)) { - copy_value(value, cfg_name, 20); - } else if (!strncmp(config, "pf_range", 8)) { - char *pf_range_start = strtok(value, ":"); - char *pf_range_end = strtok(NULL, ":"); - unsigned int start; - unsigned int end; - if (arg_read_int(pf_range_start, &start)) { - printf("Error: Invalid pf range start:%s\n", pf_range_start); - goto prase_cleanup; - } - if (arg_read_int(pf_range_end, &end)) { - printf("Error: Invalid pf range end:%s\n", pf_range_end); - goto prase_cleanup; - } - - pf_start = start; - num_pf = end - start + 1; - } else if (!strncmp(config, "q_range", 7)) { - char *q_range_start = strtok(value, ":"); - char *q_range_end = strtok(NULL, ":"); - unsigned int start; - unsigned int end; - if (arg_read_int(q_range_start, &start)) { - printf("Error: Invalid q range start:%s\n", q_range_start); - goto prase_cleanup; - } - if (arg_read_int(q_range_end, &end)) { - printf("Error: Invalid q range end:%s\n", q_range_end); - goto prase_cleanup; - } - - q_start = start; - num_q = end - start + 1; - } else if (!strncmp(config, "rngidx", 6)) { - if (arg_read_int(value, &idx_rngsz)) { - printf("Error: Invalid idx_rngsz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "tmr_idx", 7)) { - if (arg_read_int(value, &idx_tmr)) { - printf("Error: Invalid idx_tmr:%s\n", value); - goto prase_cleanup; - } - } - if (!strncmp(config, "cntr_idx", 8)) { - if (arg_read_int(value, &idx_cnt)) { - printf("Error: Invalid idx_cnt:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pfetch_en", 9)) { - if (arg_read_int(value, &pfetch_en)) { - printf("Error: Invalid pfetch_en:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "cmptsz", 5)) { - if (arg_read_int(value, &cmptsz)) { - printf("Error: Invalid cmptsz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "dump_en", 5)) { - if (arg_read_int(value, &dump_en)) { - printf("Error: Invalid dump_en:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "trig_mode", 9)) { - copy_value(value, trigmode, 10); - } else if (!strncmp(config, "runtime", 9)) { - if (arg_read_int(value, &tsecs)) { - printf("Error: Invalid tsecs:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "num_threads", 11)) { - if (arg_read_int(value, &num_thrds_per_q)) { - printf("Error: Invalid num_threads:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pkt_sz", 6)) { - if (arg_read_int(value, &pkt_sz)) { - printf("Error: Invalid pkt_sz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "mm_chnl", 7)) { - if (arg_read_int(value, &mm_chnl)) { - printf("Error: Invalid mm_chnl:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "num_pkt", 7)) { - if (arg_read_int(value, &num_pkts)) { - printf("Error: Invalid num_pkt:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "aperture_sz", 11)) { - if (arg_read_int(value, &aperture_sz)) { - printf("Error: Invalid aperture size:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "offset_ch1", 10)) { - if (arg_read_long_uint(value, &offset_ch1)) { - printf("Error: Invalid aperture offset:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "offset_q_en", 11)) { - if (arg_read_int(value, &offset_q_en)) { - printf("Error: Invalid offset_q_en option:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "h2c_q_offset_intvl", 18)) { - if (arg_read_long_uint(value, &h2c_q_offset_intvl)) { - printf("Error: Invalid H2C q offset:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "c2h_q_offset_intvl", 18)) { - if (arg_read_long_uint(value, &c2h_q_offset_intvl)) { - printf("Error: Invalid C2H q offset:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "h2c_q_start_offset", 18)) { - if (arg_read_long_uint(value, &h2c_q_start_offset)) { - printf("Error: Invalid H2C q offset:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "c2h_q_start_offset", 18)) { - if (arg_read_long_uint(value, &c2h_q_start_offset)) { - printf("Error: Invalid H2C q offset:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "offset_ch0", 10)) { - if (arg_read_long_uint(value, &offset_ch0)) { - printf("Error: Invalid aperture offset:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "keyhole_en", 7)) { - if (arg_read_int(value, &keyhole_en)) { - printf("Error: Invalid keyhole option:%s\n", value); - goto prase_cleanup; - } - } - else if (!strncmp(config, "no_memcpy", 9)) { - if (arg_read_int(value, &no_memcpy)) { - printf("Error: Invalid no_memcpy:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "stm_mode", 8)) { - if (arg_read_int(value, &stm_mode)) { - printf("Error: Invalid stm_mode:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pipe_gl_max_lst", 15)) { - int arr_len = get_array_len(value); - int i; - - if ((arr_len < 0) || (arr_len != (int)(num_q*num_pf))) { - printf("ERROR: Invalid number of entries in pipe_gl_max_lst - %s\n", value); - exit(1); - } - if (arr_len) { - pipe_gl_max_lst = (unsigned int *)calloc(arr_len, sizeof(unsigned int)); - int ret = arg_read_int_array(value, pipe_gl_max_lst, arr_len); - if (ret <= 0) { - printf("Error: Invalid pipe_gl_max_lst:%s\n", value); - exit(1); - } - } - } else if (!strncmp(config, "pipe_flow_id_lst", 16)) { - int arr_len = get_array_len(value); - int i; - - if ((arr_len < 0) || (arr_len != (int)(num_q*num_pf))) { - printf("ERROR: Invalid number of entries in pipe_flow_id_lst - %s\n", value); - exit(1); - } - if (arr_len) { - pipe_flow_id_lst = (unsigned int *)calloc(arr_len, sizeof(unsigned int)); - int ret = arg_read_int_array(value, pipe_flow_id_lst, arr_len); - if (ret <= 0) { - printf("Error: Invalid pipe_flow_id_lst:%s\n", value); - exit(1); - } - } - } else if (!strncmp(config, "pipe_slr_id_lst", 15)) { - int arr_len = get_array_len(value); - int i; - - if ((arr_len < 0) || (arr_len != (int)(num_q*num_pf))) { - printf("ERROR: Invalid number of entries in pipe_slr_id_lst - %s\n", value); - exit(1); - } - if (arr_len) { - pipe_slr_id_lst = (unsigned int *)calloc(arr_len, sizeof(unsigned int)); - int ret = arg_read_int_array(value, pipe_slr_id_lst, arr_len); - if (ret <= 0) { - printf("Error: Invalid pipe_slr_id_lst:%s\n", value); - exit(1); - } - } - } else if (!strncmp(config, "pipe_tdest_lst", 15)) { - int arr_len = get_array_len(value); - int i; - - if ((arr_len < 0) || (arr_len != (int)(num_q*num_pf))) { - printf("ERROR: Invalid number of entries in pipe_tdest_lst - %s\n", value); - exit(1); - } - if (arr_len) { - pipe_tdest_lst = (unsigned int *)calloc(arr_len, sizeof(unsigned int)); - int ret = arg_read_int_array(value, pipe_tdest_lst, arr_len); - if (ret <= 0) { - printf("Error: Invalid pipe_tdest_lst:%s\n", value); - exit(1); - } - } - } else if (!strncmp(config, "pci_bus", 7)) { - char *p; - - pci_bus = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pci_dev", 7)) { - char *p; - - pci_dev = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - - } else if (!strncmp(config, "marker_en", 9)) { - char *p; - - marker_en = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "vf_perf", 7)) { - char *p; - - vf_perf = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - - } - } - - fclose(fp); - if (vf_perf == 0) { - dmactl_dev_prefix_str = pf_dmactl_prefix_str; - } else { - dmactl_dev_prefix_str = vf_dmactl_prefix_str; - } - if (stm_mode && (!pipe_gl_max_lst || !pipe_flow_id_lst || - !pipe_slr_id_lst || !pipe_tdest_lst)) { - printf("Error: STM Attributes missing\n"); - exit(1); - } - - if (!pci_bus && !pci_dev) { - printf("Error: PCI bus information not provided\n"); - exit(1); - } - - snprintf(rng_sz_path, 200,"dma-ctl %s%05x global_csr | grep \"Global Ring\"| cut -d \":\" -f 2 > glbl_rng_sz", - dmactl_dev_prefix_str, (pci_bus << 12) | (pci_dev << 4) | pf_start); - system(rng_sz_path); - snprintf(rng_sz_path, 200, "glbl_rng_sz"); - - rng_sz_fd = open(rng_sz_path, O_RDONLY); - if (rng_sz_fd < 0) { - printf("Could not open %s\n", rng_sz_path); - exit(1); - } - ret = read(rng_sz_fd, &rng_sz[1], 99); - if (ret < 0) { - printf("Error: Could not read the file\n"); - exit(1); - } - close(rng_sz_fd); - /* below 2 line a work around to use arg_read_int_array */ - rng_sz[0] = ' '; - rng_sz[strlen(rng_sz)] = ' '; - ret = arg_read_int_array(rng_sz, glbl_rng_sz, QDMA_GLBL_MAX_ENTRIES); - if (ret <= 0) { - printf("Error: Invalid ring size array:%s\n", rng_sz); - exit(1); - } - - if (dir == Q_DIR_BI) - dir_factor = 2; - num_thrds = num_pf * num_q * dir_factor * num_thrds_per_q; - create_thread_info(); - if (stm_mode) { - free(pipe_tdest_lst); - free(pipe_slr_id_lst); - free(pipe_flow_id_lst); - free(pipe_gl_max_lst); - } - return; - -prase_cleanup: - fclose(fp); -} - -#define MAX_AIO_EVENTS 65536 - -static void list_add_tail(struct io_info *_info, struct list_head *node) -{ - sem_wait(&_info->llock); - if (_info->head == NULL) { - _info->head = node; - _info->tail = node; - } else { - _info->tail->next = node; - _info->tail = node; - } -#ifdef DEBUG - _info->total_nodes++; -#endif - sem_post( &_info->llock); -} - -static void list_add_head(struct io_info *_info, struct list_head *node) -{ - sem_wait(&_info->llock); - node->next = _info->head; - if (_info->head == NULL) { - _info->tail = node; - } - _info->head = node; - sem_post( &_info->llock); -} - -static struct list_head *list_pop(struct io_info *_info) -{ - struct list_head *node = NULL; - - sem_wait(&_info->llock); - node = _info->head; - if (_info->head == _info->tail) - _info->tail = NULL; - - if (node) - _info->head = node->next; - - sem_post(&_info->llock); - - return node; -} - -static void list_free(struct io_info *_info) -{ - struct list_head *node = NULL; - - sem_wait(&_info->llock); -#ifdef DEBUG - printf("Need to free %llu nodes in thrd%u\n", _info->total_nodes - _info->freed_nodes, _info->thread_id); -#endif - node = _info->head; - - while (node != NULL) { - struct list_head *prev_node = NULL; - - clear_events(_info, node); - io_destroy(node->ctxt); - prev_node = node; - node = node->next; - dma_free(&ctxhandle, prev_node); -#ifdef DEBUG - _info->freed_nodes++; -#endif - } - sem_post(&_info->llock); -} - -/* Subtract timespec t2 from t1 - * - * Both t1 and t2 must already be normalized - * i.e. 0 <= nsec < 1000000000 - */ -static int timespec_check(struct timespec *t) -{ - if ((t->tv_nsec < 0) || (t->tv_nsec >= 1000000000)) - return -1; - return 0; - -} - -static void timespec_sub(struct timespec *t1, struct timespec *t2) -{ - if (timespec_check(t1) < 0) { - fprintf(stderr, "invalid time #1: %lld.%.9ld.\n", - (long long)t1->tv_sec, t1->tv_nsec); - return; - } - if (timespec_check(t2) < 0) { - fprintf(stderr, "invalid time #2: %lld.%.9ld.\n", - (long long)t2->tv_sec, t2->tv_nsec); - return; - } - t1->tv_sec -= t2->tv_sec; - t1->tv_nsec -= t2->tv_nsec; - if (t1->tv_nsec >= 1000000000) { - t1->tv_sec++; - t1->tv_nsec -= 1000000000; - } else if (t1->tv_nsec < 0) { - t1->tv_sec--; - t1->tv_nsec += 1000000000; - } -} - -static void clear_events(struct io_info *_info, struct list_head *node) { - struct io_event *events = NULL; - int num_events = 0; - unsigned int j, bufcnt; - struct timespec ts_cur = {1, 0}; - - if (node->max_events <= node->completed_events) - return; -#ifdef DEBUG - printf("Thrd%u: Need to clear %u/%u events in node %p\n", - _info->thread_id, node->max_events - node->completed_events, - node->max_events, node); -#endif - events = calloc(node->max_events - node->completed_events, sizeof(struct io_event)); - if (events == NULL) { - printf("OOM\n"); - return; - } - do { - num_events = io_getevents(node->ctxt, 1, - node->max_events - node->completed_events, events, - &ts_cur); - for (j = 0; (num_events > 0) && (j < num_events); j++) { - struct iocb *iocb = (struct iocb *)events[j].obj; - struct iovec *iov; - - node->completed_events++; - if (!iocb) { - printf("Error: Invalid IOCB from events\n"); - continue; - } - - iov = (struct iovec *)iocb->u.c.buf; - - for (bufcnt = 0; bufcnt < iocb->u.c.nbytes; bufcnt++) - dma_free(&datahandle, iov[bufcnt].iov_base); - dma_free(&iocbhandle, iocb); - } - } while ((num_events > 0) && (node->max_events > node->completed_events)); - - free(events); -} - -// this function returns 1 as long as long as traffic can run, -// returns 0 when it is safe to exit the thread -static int thread_exit_check(struct io_info *_info) { - if((0 == *io_exit) && (0 == force_exit) ){ - return 1; - } else { - if ((_info->num_req_submitted != _info->num_req_completed) && _info->exit_check_count < 10000) { - if(_info->exit_check_count == 0) { - _info->num_req_completed_in_time = _info->num_req_completed; - } - _info->exit_check_count++; - usleep(100); - return 1; - } else { - printf("Exit Check: tid =%u, req_sbmitted=%u req_completed=%u dir=%s, intime=%u loop_count=%d, \n", - _info->thread_id, _info->num_req_submitted, - _info->num_req_completed,_info->dir == Q_DIR_H2C ? "H2C": "C2H", - _info->num_req_completed_in_time, _info->exit_check_count); - if(_info->exit_check_count != 0 ) { - _info->num_req_completed = _info->num_req_completed_in_time; - } - return 0; - } - - } -} - - - -static void *event_mon(void *argp) -{ - struct io_info *_info = (struct io_info *)argp; - unsigned int j, bufcnt; - struct io_event *events = NULL; - int num_events = 0; - struct timespec ts_cur = {0, 0}; -#if DATA_VALIDATION - unsigned short *rcv_data; - unsigned int k; -#endif - - events = calloc(MAX_AIO_EVENTS, sizeof(struct io_event)); - if (events == NULL) { - printf("OOM\n"); - exit(1); - } - - while (thread_exit_check(_info)) { - struct list_head *node = list_pop(_info); - - if (!node) - continue; - - memset(events, 0, MAX_AIO_EVENTS * sizeof(struct io_event)); - do { - num_events = io_getevents(node->ctxt, 1, - node->max_events - node->completed_events, events, - &ts_cur); - for (j = 0; (num_events > 0) && (j < num_events); j++) { - struct iocb *iocb = (struct iocb *)events[j].obj; - struct iovec *iov = NULL; - - if (!iocb) { - printf("Error: Invalid IOCB from events\n"); - continue; - } - _info->num_req_completed += events[j].res; - - iov = (struct iovec *)(iocb->u.c.buf); - if (!iov) { - printf("invalid buffer\n"); - continue; - } -#if DATA_VALIDATION - rcv_data = iov[0].iov_base; - for (k = 0; k < (iov[0].iov_len/2) && events[j].res && !(events[j].res2); k += 8) { - printf("%04x: %04x %04x %04x %04x %04x %04x %04x %04x\n", k, - rcv_data[k], rcv_data[k+1], rcv_data[k+2], - rcv_data[k+3], rcv_data[k+4], rcv_data[k+5], - rcv_data[k+6], rcv_data[k+7]); - } -#endif - for (bufcnt = 0; (bufcnt < iocb->u.c.nbytes) && iov; bufcnt++) - dma_free(&datahandle, iov[bufcnt].iov_base); - dma_free(&iocbhandle, iocb); - } - if (num_events > 0) - node->completed_events += num_events; - if (node->completed_events >= node->max_events) { - io_destroy(node->ctxt); - dma_free(&ctxhandle, node); - break; - } - } while(thread_exit_check(_info)); - if (node->completed_events < node->max_events) - list_add_head(_info, node); - } - free(events); -#ifdef DEBUG - printf("Exiting evt_thrd: %u\n", _info->thread_id); -#endif - - return NULL; -} - -static int qdma_prepare_reg_dump(struct xcmd_info *xcmd, - unsigned char is_vf, struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_REG_DUMP; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - - return 0; -} - -static int qdma_registers_dump(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_reg_dump(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_reg_dump(&xcmd); - if (ret < 0) - printf("Q_ failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_add(struct xcmd_info *xcmd, - unsigned char is_vf, struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_ADD; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - qparm->sflags = qparm->flags; - - return 0; -} - -static int qdma_add_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_add(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_q_add(&xcmd); - if (ret < 0) - printf("Q_ADD failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_start(struct xcmd_info *xcmd, - unsigned char is_vf, struct io_info *info) -{ - struct xcmd_q_parm *qparm; - unsigned int f_arg_set = 0; - - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_START; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - f_arg_set |= 1 << QPARM_IDX; - qparm->fetch_credit = Q_ENABLE_C2H_FETCH_CREDIT; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - f_arg_set |= 1 << QPARM_MODE; - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - f_arg_set |= 1 << QPARM_DIR; - qparm->qrngsz_idx = info->idx_rngsz; - f_arg_set |= 1 << QPARM_RNGSZ_IDX; - if ((info->dir == Q_DIR_C2H) && (info->mode == Q_MODE_ST)) { - if (cmptsz) - qparm->cmpt_entry_size = info->cmptsz; - else - qparm->cmpt_entry_size = XNL_ST_C2H_CMPT_DESC_SIZE_8B; - f_arg_set |= 1 << QPARM_CMPTSZ; - qparm->cmpt_tmr_idx = info->idx_tmr; - f_arg_set |= 1 << QPARM_CMPT_TMR_IDX; - qparm->cmpt_cntr_idx = info->idx_cnt; - f_arg_set |= 1 << QPARM_CMPT_CNTR_IDX; - - if (!strcmp(info->trig_mode, "every")) - qparm->cmpt_trig_mode = 1; - else if (!strcmp(info->trig_mode, "usr_cnt")) - qparm->cmpt_trig_mode = 2; - else if (!strcmp(info->trig_mode, "usr")) - qparm->cmpt_trig_mode = 3; - else if (!strcmp(info->trig_mode, "usr_tmr")) - qparm->cmpt_trig_mode=4; - else if (!strcmp(info->trig_mode, "cntr_tmr")) - qparm->cmpt_trig_mode=5; - else if (!strcmp(info->trig_mode, "dis")) - qparm->cmpt_trig_mode = 0; - else { - printf("Error: unknown q trigmode %s.\n", info->trig_mode); - return -EINVAL; - } - f_arg_set |= 1 << QPARM_CMPT_TRIG_MODE; - if (pfetch_en) - qparm->flags |= XNL_F_PFETCH_EN; - } - - if (info->mode == Q_MODE_MM) { - qparm->mm_channel = info->mm_chnl; - f_arg_set |= 1 <<QPARM_MM_CHANNEL; - } - - - if ((info->dir == Q_DIR_H2C) && (info->mode == Q_MODE_MM)) { - if (keyhole_en) { - qparm->aperture_sz = info->aperture_sz; - f_arg_set |= 1 << QPARM_KEYHOLE_EN; - } - } - - qparm->flags |= (XNL_F_CMPL_STATUS_EN | XNL_F_CMPL_STATUS_ACC_EN | - XNL_F_CMPL_STATUS_PEND_CHK | XNL_F_CMPL_STATUS_DESC_EN | - XNL_F_FETCH_CREDIT); - - qparm->sflags = f_arg_set; - return 0; -} - -static int qdma_start_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_start(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_q_start(&xcmd); - if (ret < 0) - printf("Q_START failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_stop(struct xcmd_info *xcmd, unsigned char is_vf, - struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) - return -EINVAL; - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_STOP; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - return 0; -} - -static int qdma_stop_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_stop(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_q_stop(&xcmd); - if (ret < 0) - printf("Q_STOP failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_del(struct xcmd_info *xcmd, unsigned char is_vf, - struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_DEL; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - return 0; -} - -static int qdma_del_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_del(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - ret = qdma_q_del(&xcmd); - if (ret < 0) - printf("Q_DEL failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_prepare_q_dump(struct xcmd_info *xcmd, unsigned char is_vf, - struct io_info *info) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_DUMP; - xcmd->vf = is_vf; - xcmd->if_bdf = info->pf; - xcmd->log_msg_dump = xnl_dump_response; - qparm->idx = info->qid; - qparm->num_q = 1; - - if (info->mode == Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (info->mode == Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (info->dir == Q_DIR_H2C) - qparm->flags |= XNL_F_QDIR_H2C; - else if (info->dir == Q_DIR_C2H) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - return 0; -} - -static int qdma_dump_queue(unsigned char is_vf, struct io_info *info) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_dump(&xcmd, is_vf, info); - if (ret < 0) - return ret; - - return qdma_q_dump(&xcmd); -} - -static void io_proc_cleanup(struct io_info *_info) -{ - unsigned int i; - unsigned int q_offset; - unsigned int dir_factor = (dir == Q_DIR_BI) ? 1 : 2; - unsigned int q_lst_idx_base; - unsigned char is_q_stop = (_info->q_ctrl && _info->q_started); - int reg_value = 0; - - *io_exit = 1; - pthread_join(_info->evt_id, NULL); - - q_offset = (_info->dir == Q_DIR_H2C) ? 0 : num_q; - if (dir != Q_DIR_BI) - q_offset = 0; - q_lst_idx_base = ((((_info->pf & 0x0000F) - pf_start) * num_q * dir_factor) - + q_offset); - _info->q_wait_for_stop = 1; - - while (is_q_stop) { - unsigned int j = 0; - for (i = 0; i < num_thrds; i++) { - if ((info[i].pf != _info->pf) || (info[i].qid != _info->qid) - || (info[i].dir != _info->dir)) - continue; - if (info[i].q_wait_for_stop) - j++; - else - break; - } - if (j != num_thrds_per_q) - sched_yield(); - else - break; - } - - if ((mode == Q_MODE_ST) && (dir != Q_DIR_H2C)) { - do { - for (i = 0; i < num_thrds; i++) { - if (!info[i].q_wait_for_stop) - break; - } - if (i == num_thrds) - break; - } while (1); - - if (!stm_mode && _info->pid == base_pid) { - qdma_register_write(vf_perf, _info->pf, 2, 0x08, - QDMA_UL_STOP_C2H_TRANSFER | QDMA_UL_STOP_CMPT_TRANSFER | - QDMA_UL_IMM_DUMP_CMPT_FIFO | QDMA_UL_IMM_DUMP_C2H_DATA); - - if (marker_en) { - qdma_register_write(vf_perf, _info->pf, 2, 0x08, - QDMA_UL_IMM_DUMP_C2H_DATA | QDMA_UL_IMM_DUMP_CMPT_FIFO - | QDMA_UL_SEND_MARKER_PACKET); - - usleep(1000); - - unsigned retry = 50; - while (retry) { - qdma_register_read(vf_perf, _info->pf, 2, 0x18, ®_value); - - usleep(500); - if (reg_value == 0x1) - break; - else - printf("Didnt received the c2h marker completion, retry count = %u\n", - (50 - (retry - 1))); - - usleep(500); - retry--; - } - } - } - } - - if (is_q_stop) { - int s; - if (dump_en) { - s = qdma_dump_queue(vf_perf, _info); - if (s < 0) { - printf("Failed: queue_dump\nerrcode = %d\n", s); - } - } - - if (_info->q_started) { - s = qdma_stop_queue(vf_perf, _info); - if (s < 0) { - printf("Failed: queue_stop\nerrcode = %d\n", s); - } - } - _info->q_started = 0; - - q_lst_stop[q_lst_idx_base + _info->qid - q_start] = 1; - } - - while (!(q_lst_stop[q_lst_idx_base + _info->qid - q_start])) { - sched_yield(); - } - - if (shmdt(q_lst_stop) == -1) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - - list_free(_info); - - mempool_free(&iocbhandle); - mempool_free(&ctxhandle); - mempool_free(&datahandle); -} - -static void *io_thread(void *argp) -{ - struct io_info *_info = (struct io_info *)argp; - int ret; - int s; - unsigned int max_io = MAX_AIO_EVENTS; - unsigned int cnt = 0; - pthread_attr_t attr; - unsigned int io_sz = _info->pkt_sz; - unsigned int burst_cnt = _info->pkt_burst; - unsigned int num_desc; - unsigned int max_reqs; - struct iocb *io_list[1]; - - if ((_info->mode == Q_MODE_ST) && (_info->dir == Q_DIR_C2H)) { - io_sz = _info->pkt_burst * _info->pkt_sz; - burst_cnt = 1; - } - num_desc = (io_sz + DEFAULT_PAGE_SIZE - 1) >> PAGE_SHIFT; - max_reqs = glbl_rng_sz[idx_rngsz]; - mempool_create(&datahandle, num_desc*DEFAULT_PAGE_SIZE, max_reqs + (burst_cnt * num_desc)); - mempool_create(&ctxhandle, sizeof(struct list_head), max_reqs); - mempool_create(&iocbhandle, sizeof(struct iocb) + (burst_cnt * sizeof(struct iovec)), max_reqs + (burst_cnt * num_desc)); -#ifdef DEBUG - ctxhandle.id = 1; - datahandle.id = 0; - iocbhandle.id = 2; -#endif - s = pthread_attr_init(&attr); - if (s != 0) - printf("pthread_attr_init failed\n"); - if (pthread_create(&_info->evt_id, &attr, event_mon, _info)) - exit(1); - - do { - struct list_head *node = NULL; - struct timespec ts_cur; - - if (tsecs) { - if (clock_gettime(CLOCK_MONOTONIC, &ts_cur) != 0) - break; - timespec_sub(&ts_cur, &g_ts_start); - if (ts_cur.tv_sec >= tsecs) - break; - } - node = dma_memalloc(&ctxhandle, 1); - if (!node) { - continue; - } - ret = io_queue_init(max_io, &node->ctxt); - if (ret != 0) { - printf("Error: io_setup error %d on %u\n", ret, _info->thread_id); - dma_free(&ctxhandle, node); - sched_yield(); - continue; - } - cnt = 0; - node->max_events = max_io; - list_add_tail(_info, node); - do { - struct iovec *iov = NULL; - unsigned int iovcnt; - if (tsecs) { - ret = clock_gettime(CLOCK_MONOTONIC, &ts_cur); - timespec_sub(&ts_cur, &g_ts_start); - if (ts_cur.tv_sec >= tsecs) { - node->max_events = cnt; - break; - } - } - - if (((_info->num_req_submitted - _info->num_req_completed) * - num_desc) > max_reqs) { - sched_yield(); - continue; - } - - io_list[0] = dma_memalloc(&iocbhandle, 1); - if (io_list[0] == NULL) { - if (cnt) { - node->max_events = cnt; - break; - } - else { - sched_yield(); - continue; - } - } - iov = (struct iovec *)(io_list[0] + 1); - for (iovcnt = 0; iovcnt < burst_cnt; iovcnt++) { - iov[iovcnt].iov_base = dma_memalloc(&datahandle, 1); - if (iov[iovcnt].iov_base == NULL) - break; - iov[iovcnt].iov_len = io_sz; - } - if (iovcnt == 0) { - dma_free(&iocbhandle, io_list[0]); - continue; - } - if (_info->dir == Q_DIR_H2C) { - io_prep_pwritev(io_list[0], - _info->fd, - iov, - iovcnt, - _info->offset); - } else { - io_prep_preadv(io_list[0], - _info->fd, - iov, - iovcnt, - _info->offset); - } - - ret = io_submit(node->ctxt, 1, io_list); - if(ret != 1) { - printf("Error: io_submit error:%d on %s for %u\n", ret, _info->q_name, cnt); - for (; iovcnt > 0; iovcnt--) - dma_free(&datahandle, iov[iovcnt].iov_base); - dma_free(&iocbhandle, io_list[0]); - node->max_events = cnt; - break; - } else { - cnt++; - _info->num_req_submitted += iovcnt; - } - } while (tsecs && !force_exit && (cnt < max_io)); - } while (tsecs && !force_exit); - - io_proc_cleanup(_info); - - return NULL; -} - -static void prep_pci_dump(void) -{ - memset(pci_dump, '\0', PCI_DUMP_CMD_LEN); - snprintf(pci_dump, PCI_DUMP_CMD_LEN, "lspci -s %02x:%02x.%01x -vvv", pci_bus, pci_dev, pf_start); -} - -static int setup_thrd_env(struct io_info *_info, unsigned char is_new_fd) -{ - int s; - - /* add queue */ - s = qdma_add_queue(vf_perf, _info); - if (s < 0) { - exit(1); - } - _info->q_added++; - - /* start queue */ - s = qdma_start_queue(vf_perf, _info); - if (s < 0) - exit(1); - _info->q_started++; - - if (is_new_fd) { - char node[25] = {'\0'}; - - snprintf(node, 25, "/dev/%s", _info->q_name); - _info->fd = open(node, O_RDWR); - if (_info->fd < 0) { - printf("Error: Cannot find %s\n", node); - exit(1); - } - } - - s = ioctl(_info->fd, 0, &no_memcpy); - if (s != 0) { - printf("failed to set non memcpy\n"); - exit(1); - } - - return _info->fd; -} - -static void dump_result(unsigned long long total_io_sz) -{ - unsigned long long gig_div = ((unsigned long long)tsecs * 1000000000); - unsigned long long meg_div = ((unsigned long long)tsecs * 1000000); - unsigned long long kil_div = ((unsigned long long)tsecs * 1000); - unsigned long long byt_div = ((unsigned long long)tsecs); - - if ((total_io_sz/gig_div)) { - printf("BW = %f GB/sec\n", ((double)total_io_sz/gig_div)); - } else if ((total_io_sz/meg_div)) { - printf("BW = %f MB/sec\n", ((double)total_io_sz/meg_div)); - } else if ((total_io_sz/kil_div)) { - printf("BW = %f KB/sec\n", ((double)total_io_sz/kil_div)); - } else - printf("BW = %f Bytes/sec\n", ((double)total_io_sz/byt_div)); -} - -static int is_valid_fd(int fd) -{ - return fcntl(fd, F_GETFL) != -1 || errno != EBADF; -} - -static void cleanup(void) -{ - int i; - unsigned long long total_num_h2c_ios = 0; - unsigned long long total_num_c2h_ios = 0; - unsigned long long total_io_sz = 0; - int s; - - if ((*io_exit == 0)) { - printf("force exit: cleaning up\n"); - force_exit = 1; - if (getpid() != base_pid) { - if (shmdt(info) == -1){ - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - if ((shmdt(q_lst_stop) == -1)) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - } else - for (i = 1; i < num_thrds; i++) - wait(NULL); - }/* else - printf("normal exit: cleaning up\n");*/ - - if (getpid() != base_pid) return; - - if (child_pid_lst != NULL) - free(child_pid_lst); - if (shmctl(q_lst_stop_mid, IPC_RMID, NULL) == -1) { - perror("shmctl returned -1\n"); - error(-1, errno, " "); - } - if (info == NULL) return; - - if (dump_en) { - s = system(pci_dump); - if (s != 0) { - printf("Failed: %s\nerrcode = %d\n", pci_dump, s); - } - - if(!vf_perf) { - s = qdma_registers_dump(vf_perf, &info[0]); - if (s < 0) { - printf("qdma_registers_dump failed. Errcode = %d\n", s); - } - } - } - - for (i = 0; i < num_thrds; i++) { - if (info[i].q_ctrl && info[i].q_started) { - if (dump_en) { - s = qdma_dump_queue(vf_perf, &info[i]); - if (s < 0) { - printf("Failed: queue_dump\nerrcode = %d\n", s); - } - } - - s = qdma_stop_queue(vf_perf, &info[i]); - if (s < 0) { - printf("Failed: queue_stop\nerrcode = %d\n", s); - } - info[i].q_started = 0; - } - if ((info[i].q_ctrl != 0) && (info[i].fd > 0) && is_valid_fd(info[i].fd)) - close(info[i].fd); - if (info[i].q_ctrl && info[i].q_added) { - s = qdma_del_queue(vf_perf, &info[i]); - if (s < 0) { - printf("Failed: queue_del\nerrcode = %d\n", s); - } - info[i].q_added = 0; - } - } - - - if(marker_en) { - if (info[0].mode == Q_MODE_ST && info[0].dir == Q_DIR_C2H) { - qdma_register_write(vf_perf, info[0].pf, 2, 0x08, - QDMA_UL_IMM_DUMP_C2H_DATA | QDMA_UL_IMM_DUMP_CMPT_FIFO); - } - } - - /* accumulate the statistics */ - for (i = 0; i < num_thrds; i++) { - if (info[i].dir == Q_DIR_H2C) - total_num_h2c_ios += info[i].num_req_completed; - else { - if (info[i].mode == Q_MODE_ST) - info[i].num_req_completed *= info[i].pkt_burst; - total_num_c2h_ios += info[i].num_req_completed; - } - } - if (shmdt(info) == -1){ - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - if (shmctl(shmid, IPC_RMID, NULL) == -1) { - perror("shmctl returned -1\n"); - error(-1, errno, " "); - } - if (shmdt(io_exit) == -1){ - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - if (shmctl(io_exit_id, IPC_RMID, NULL) == -1) { - perror("shmctl returned -1\n"); - error(-1, errno, " "); - } - if (tsecs == 0) tsecs = 1; - if (0 != total_num_h2c_ios) { - total_io_sz = (total_num_h2c_ios*pkt_sz); - printf("WRITE: total pps = %llu", total_num_h2c_ios/tsecs); - printf(" "); - dump_result(total_io_sz); - } - if (0 != total_num_c2h_ios) { - total_io_sz = (total_num_c2h_ios*pkt_sz); - printf("READ: total pps = %llu", total_num_c2h_ios/tsecs); - printf(" "); - dump_result(total_io_sz); - } - if ((0 == total_num_h2c_ios) && (0 == total_num_c2h_ios)) - printf("No IOs happened\n"); -} - -int main(int argc, char *argv[]) -{ - int cmd_opt; - char *cfg_fname = NULL; - unsigned int i; - unsigned int aio_max_nr = 0xFFFFFFFF; - char aio_max_nr_cmd[100] = {'\0'}; -#if THREADS_SET_CPU_AFFINITY - cpu_set_t set; -#endif - - while ((cmd_opt = getopt_long(argc, argv, "vhxc:c:", long_opts, - NULL)) != -1) { - switch (cmd_opt) { - case 0: - /* long option */ - break; - case 'c': - /* config file name */ - cfg_fname = strdup(optarg); - break; - default: - usage(argv[0]); - exit(0); - break; - } - } - if (cfg_fname == NULL) - return 1; - -#if THREADS_SET_CPU_AFFINITY - num_processors = get_nprocs_conf(); - CPU_ZERO(&set); -#endif -#if DATA_VALIDATION - for (i = 0; i < 2*1024; i++) - valid_data[i] = i; -#endif - parse_config_file(cfg_fname); - atexit(cleanup); - - snprintf(aio_max_nr_cmd, 100, "echo %u > /proc/sys/fs/aio-max-nr", aio_max_nr); - system(aio_max_nr_cmd); - - printf("dmautils(%u) threads\n", num_thrds); - child_pid_lst = calloc(num_thrds, sizeof(int)); - base_pid = getpid(); - child_pid_lst[0] = base_pid; - for (i = 1; i < num_thrds; i++) { - if (getpid() == base_pid) - child_pid_lst[i] = fork(); - else - break; - } - if ((info = (struct io_info *) shmat(shmid, NULL, 0)) == (struct io_info *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - exit(1); - } - if ((q_lst_stop = (unsigned char *) shmat(q_lst_stop_mid, NULL, 0)) == (unsigned char *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - exit(1); - } - - clock_gettime(CLOCK_MONOTONIC, &g_ts_start); - if (getpid() == base_pid) { - io_thread(&info[0]); -#if THREADS_SET_CPU_AFFINITY - for (j = 0; j < num_processors; j++) { - if (j != info[0].cpu) - CPU_SET(j, &set); - } - if (sched_setaffinity(base_pid, sizeof(set), &set) == -1) - printf("setaffinity for thrd%u failed\n", info[i].thread_id); -#endif - for(i = 1; i < num_thrds; i++) { - waitpid(child_pid_lst[i], NULL, 0); - } - free(child_pid_lst); - child_pid_lst = NULL; - } else { - info[i].pid = getpid(); -#if THREADS_SET_CPU_AFFINITY - for (j = 0; j < num_processors; j++) { - if (j != info[i].cpu) - CPU_SET(j, &set); - } - if (sched_setaffinity(getpid(), sizeof(set), &set) == -1) - printf("setaffinity for thrd%u failed\n", info[i].thread_id); -#endif - io_thread(&info[i - 1]); - if ((shmdt(info) == -1)) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - } - - *io_exit = 1; - return 0; -} - diff --git a/QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-bi.zip b/QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-bi.zip deleted file mode 100644 index d22e34b60e59af5345d7ab816aed07a7f895cd40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112903 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 diff --git a/QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-c2h-pfetch1.zip b/QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-c2h-pfetch1.zip deleted file mode 100644 index ad4ee63946fb6e86a615f3c4884a4b5ebb2ea274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111916 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 LAykWzfq?-4Gjtx| diff --git a/QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-h2c.zip b/QDMA/linux-kernel/apps/dma-perf/dmaperf_config/st-h2c.zip deleted file mode 100644 index 7203da66afd92e6603ca511d048a8dc64566564c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105919 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 diff --git a/QDMA/linux-kernel/apps/dma-perf/version.h b/QDMA/linux-kernel/apps/dma-perf/version.h deleted file mode 100755 index 53a766a..0000000 --- a/QDMA/linux-kernel/apps/dma-perf/version.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef __DMA_PERF_VERSION_H -#define __DMA_PERF_VERSION_H - -#define PROGNAME "dma-perf" -#define VERSION "2023.2.0" -#define COPYRIGHT "Copyright (c) 2022-2023 Advanced Micro Devices Inc." - -#endif diff --git a/QDMA/linux-kernel/apps/dma-to-device/Makefile b/QDMA/linux-kernel/apps/dma-to-device/Makefile deleted file mode 100755 index bccb834..0000000 --- a/QDMA/linux-kernel/apps/dma-to-device/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -CC ?= gcc - -CFLAGS += -g -#CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I../include -I../dma-utils -CFLAGS += $(EXTRA_FLAGS) - -DMA-TO-DEVICE = dma-to-device -DMA-UTILS_OBJS := $(patsubst %.c,%.o,$(wildcard ../dma-utils/*.c)) -DMA-TO-DEVICE_OBJS := dma_to_device.o -DMA-TO-DEVICE_OBJS += $(DMA-UTILS_OBJS) - -ifneq ($(CROSS_COMPILE_FLAG),) - CC=$(CROSS_COMPILE_FLAG)gcc -endif - -all: clean dma-to-device - -dma-to-device: $(DMA-TO-DEVICE_OBJS) - $(CC) -lrt -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE - -%.o: %.c - $(CC) $(CFLAGS) -c -std=c99 -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE -D_AIO_AIX_SOURCE - -clean: - @rm -f *.o */*.o ../dma-utils/*.o - rm -rf *.o *.bin dma-to-device diff --git a/QDMA/linux-kernel/apps/dma-to-device/dma_to_device.c b/QDMA/linux-kernel/apps/dma-to-device/dma_to_device.c deleted file mode 100755 index 49d53b0..0000000 --- a/QDMA/linux-kernel/apps/dma-to-device/dma_to_device.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#define _DEFAULT_SOURCE -#define _XOPEN_SOURCE 500 -#include <assert.h> -#include <fcntl.h> -#include <getopt.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <time.h> - -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/types.h> -#include <unistd.h> - -#include "dma_xfer_utils.c" - -#define DEVICE_NAME_DEFAULT "/dev/qdma01000-MM-0" -#define SIZE_DEFAULT (32) -#define COUNT_DEFAULT (1) - -static struct option const long_opts[] = { - {"device", required_argument, NULL, 'd'}, - {"address", required_argument, NULL, 'a'}, - {"size", required_argument, NULL, 's'}, - {"offset", required_argument, NULL, 'o'}, - {"count", required_argument, NULL, 'c'}, - {"data infile", required_argument, NULL, 'f'}, - {"data outfile", required_argument, NULL, 'w'}, - {"help", no_argument, NULL, 'h'}, - {"verbose", no_argument, NULL, 'v'}, - {0, 0, 0, 0} -}; - -static int test_dma(char *devname, uint64_t addr, uint64_t size, - uint64_t offset, uint64_t count, char *infname, char *); - -static void usage(const char *name) -{ - int i = 0; - - fprintf(stdout, "%s\n\n", name); - fprintf(stdout, "usage: %s [OPTIONS]\n\n", name); - fprintf(stdout, - "Write via SGDMA, optionally read input from a file.\n\n"); - - fprintf(stdout, " -%c (--%s) device (defaults to %s)\n", - long_opts[i].val, long_opts[i].name, DEVICE_NAME_DEFAULT); - i++; - fprintf(stdout, " -%c (--%s) the start address on the AXI bus\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, - " -%c (--%s) size of a single transfer in bytes, default %d,\n", - long_opts[i].val, long_opts[i].name, SIZE_DEFAULT); - i++; - fprintf(stdout, " -%c (--%s) page offset of transfer\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, " -%c (--%s) number of transfers, default %d\n", - long_opts[i].val, long_opts[i].name, COUNT_DEFAULT); - i++; - fprintf(stdout, " -%c (--%s) filename to read the data from.\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, - " -%c (--%s) filename to write the data of the transfers\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, " -%c (--%s) print usage help and exit\n", - long_opts[i].val, long_opts[i].name); - i++; - fprintf(stdout, " -%c (--%s) verbose output\n", - long_opts[i].val, long_opts[i].name); -} - -int main(int argc, char *argv[]) -{ - int cmd_opt; - char *device = DEVICE_NAME_DEFAULT; - uint64_t address = 0; - uint64_t size = SIZE_DEFAULT; - uint64_t offset = 0; - uint64_t count = COUNT_DEFAULT; - char *infname = NULL; - char *ofname = NULL; - - while ((cmd_opt = - getopt_long(argc, argv, "vhc:f:d:a:s:o:w:", long_opts, - NULL)) != -1) { - switch (cmd_opt) { - case 0: - /* long option */ - break; - case 'd': - /* device node name */ - //fprintf(stdout, "'%s'\n", optarg); - device = strdup(optarg); - break; - case 'a': - /* RAM address on the AXI bus in bytes */ - address = getopt_integer(optarg); - break; - case 's': - /* size in bytes */ - size = getopt_integer(optarg); - break; - case 'o': - offset = getopt_integer(optarg) & 4095; - break; - /* count */ - case 'c': - count = getopt_integer(optarg); - break; - /* count */ - case 'f': - infname = strdup(optarg); - break; - case 'w': - ofname = strdup(optarg); - break; - /* print usage help and exit */ - case 'v': - verbose = 1; - break; - case 'h': - default: - usage(argv[0]); - exit(0); - break; - } - } - - if (verbose) - fprintf(stdout, - "dev %s, address 0x%lx, size 0x%lx, offset 0x%lx, count %lu\n", - device, address, size, offset, count); - - return test_dma(device, address, size, offset, count, infname, ofname); -} - -static int test_dma(char *devname, uint64_t addr, uint64_t size, - uint64_t offset, uint64_t count, char *infname, - char *ofname) -{ - uint64_t i; - ssize_t rc; - char *buffer = NULL; - char *allocated = NULL; - struct timespec ts_start, ts_end; - int infile_fd = -1; - int outfile_fd = -1; - int fpga_fd = open(devname, O_RDWR); - double total_time = 0; - double result; - double avg_time = 0; - - - if (fpga_fd < 0) { - fprintf(stderr, "unable to open device %s, %d.\n", - devname, fpga_fd); - perror("open device"); - return -EINVAL; - } - - if (infname) { - infile_fd = open(infname, O_RDONLY); - if (infile_fd < 0) { - fprintf(stderr, "unable to open input file %s, %d.\n", - infname, infile_fd); - perror("open input file"); - rc = -EINVAL; - goto out; - } - } - - if (ofname) { - outfile_fd = - open(ofname, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, - 0666); - if (outfile_fd < 0) { - fprintf(stderr, "unable to open output file %s, %d.\n", - ofname, outfile_fd); - perror("open output file"); - rc = -EINVAL; - goto out; - } - } - - posix_memalign((void **)&allocated, 4096 /*alignment */ , size + 4096); - if (!allocated) { - fprintf(stderr, "OOM %lu.\n", size + 4096); - rc = -ENOMEM; - goto out; - } - buffer = allocated + offset; - if (verbose) - fprintf(stdout, "host buffer 0x%lx = %p\n", - size + 4096, buffer); - - if (infile_fd >= 0) { - rc = read_to_buffer(infname, infile_fd, buffer, size, 0); - if (rc < 0) - goto out; - } - - for (i = 0; i < count; i++) { - /* write buffer to AXI MM address using SGDMA */ - clock_gettime(CLOCK_MONOTONIC, &ts_start); - - rc = write_from_buffer(devname, fpga_fd, buffer, size, addr); - if (rc < 0) - goto out; - - rc = clock_gettime(CLOCK_MONOTONIC, &ts_end); - /* subtract the start time from the end time */ - timespec_sub(&ts_end, &ts_start); - total_time += (ts_end.tv_sec + ((double)ts_end.tv_nsec/NSEC_DIV)); - /* a bit less accurate but side-effects are accounted for */ - if (verbose) - fprintf(stdout, - "#%lu: CLOCK_MONOTONIC %ld.%09ld sec. write %lu bytes\n", - i, ts_end.tv_sec, ts_end.tv_nsec, size); - - if (outfile_fd >= 0) { - rc = write_from_buffer(ofname, outfile_fd, buffer, - size, i * size); - if (rc < 0) - goto out; - } - } - avg_time = (double)total_time/(double)count; - result = ((double)size)/avg_time; - if (verbose) - printf("** Avg time device %s, total time %f nsec, avg_time = %f, size = %lu, BW = %f bytes/sec\n", - devname, total_time, avg_time, size, result); - dump_throughput_result(size, result); - - rc = 0; - -out: - close(fpga_fd); - if (infile_fd >= 0) - close(infile_fd); - if (outfile_fd >= 0) - close(outfile_fd); - free(allocated); - - return rc; -} diff --git a/QDMA/linux-kernel/apps/dma-to-device/version.h b/QDMA/linux-kernel/apps/dma-to-device/version.h deleted file mode 100755 index b14cefc..0000000 --- a/QDMA/linux-kernel/apps/dma-to-device/version.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef __DMA_TO_DEVICE_VERSION_H -#define __DMA_TO_DEVICE_VERSION_H - -#define PROGNAME "dma-to-device" -#define VERSION "2023.2.0" -#define COPYRIGHT "Copyright (c) 2022-2023 Advanced Micro Devices Inc." - -#endif diff --git a/QDMA/linux-kernel/apps/dma-utils/Makefile b/QDMA/linux-kernel/apps/dma-utils/Makefile deleted file mode 100755 index f6d9ecd..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -CC ?= gcc - -CFLAGS += -g -#CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I../include -CFLAGS += $(EXTRA_FLAGS) - -all: dmautils.o dmactl.o dmactl_reg.o dmaxfer.o dma_xfer_utils.o - -%.o: %.c - $(CC) $(CFLAGS) -c -std=c99 -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE -D_AIO_AIX_SOURCE - -clean: - rm -rf *.o diff --git a/QDMA/linux-kernel/apps/dma-utils/dma_xfer_utils.c b/QDMA/linux-kernel/apps/dma-utils/dma_xfer_utils.c deleted file mode 100755 index d3fefd2..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/dma_xfer_utils.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#include <stdio.h> -#include <stdint.h> -#include <unistd.h> -#include <time.h> -#include <errno.h> -#include <sys/types.h> - -/* - * man 2 write: - * On Linux, write() (and similar system calls) will transfer at most - * 0x7ffff000 (2,147,479,552) bytes, returning the number of bytes - * actually transferred. (This is true on both 32-bit and 64-bit - * systems.) - */ - -#define RW_MAX_SIZE 0x7ffff000 -#define GB_DIV 1000000000 -#define MB_DIV 1000000 -#define KB_DIV 1000 -#define NSEC_DIV 1000000000 - -int verbose = 0; - -void dump_throughput_result(uint64_t size, float result) { - printf("size=%lu ", size); - if (((long long)(result)/GB_DIV)) { - printf("Average BW = %f GB/sec\n", ((double)result/GB_DIV)); - } else if (((long long)(result)/MB_DIV)) { - printf("Average BW = %f MB/sec\n", ((double)result/MB_DIV)); - } else if (((long long)(result)/KB_DIV)) { - printf("Average BW = %f KB/sec\n", ((double)result/KB_DIV)); - } else - printf("Average BW = %f Bytes/sec\n", ((double)result)); -} - -uint64_t getopt_integer(char *optarg) -{ - int rc; - uint64_t value; - - rc = sscanf(optarg, "0x%lx", &value); - if (rc <= 0) - sscanf(optarg, "%lu", &value); - //printf("sscanf() = %d, value = 0x%lx\n", rc, value); - - return value; -} - -ssize_t read_to_buffer(char *fname, int fd, char *buffer, uint64_t size, - uint64_t base) -{ - ssize_t rc; - uint64_t count = 0; - char *buf = buffer; - off_t offset = base; - - do { /* Support zero byte transfer */ - uint64_t bytes = size - count; - - if (bytes > RW_MAX_SIZE) - bytes = RW_MAX_SIZE; - - if (offset) { - rc = lseek(fd, offset, SEEK_SET); - if (rc < 0) { - fprintf(stderr, - "%s, seek off 0x%lx failed %zd.\n", - fname, offset, rc); - perror("seek file"); - return -EIO; - } - if (rc != offset) { - fprintf(stderr, - "%s, seek off 0x%lx != 0x%lx.\n", - fname, rc, offset); - return -EIO; - } - } - - /* read data from file into memory buffer */ - rc = read(fd, buf, bytes); - if (rc < 0) { - fprintf(stderr, - "%s, read off 0x%lx + 0x%lx failed %zd.\n", - fname, offset, bytes, rc); - perror("read file"); - return -EIO; - } - if (rc != bytes) { - fprintf(stderr, - "%s, R off 0x%lx, 0x%lx != 0x%lx.\n", - fname, count, rc, bytes); - return -EIO; - } - - count += bytes; - buf += bytes; - offset += bytes; - } while (count < size); - - if (count != size) { - fprintf(stderr, "%s, R failed 0x%lx != 0x%lx.\n", - fname, count, size); - return -EIO; - } - return count; -} - -ssize_t write_from_buffer(char *fname, int fd, char *buffer, uint64_t size, - uint64_t base) -{ - ssize_t rc; - uint64_t count = 0; - char *buf = buffer; - off_t offset = base; - - do { /* Support zero byte transfer */ - uint64_t bytes = size - count; - - if (bytes > RW_MAX_SIZE) - bytes = RW_MAX_SIZE; - - if (offset) { - rc = lseek(fd, offset, SEEK_SET); - if (rc < 0) { - fprintf(stderr, - "%s, seek off 0x%lx failed %zd.\n", - fname, offset, rc); - perror("seek file"); - return -EIO; - } - if (rc != offset) { - fprintf(stderr, - "%s, seek off 0x%lx != 0x%lx.\n", - fname, rc, offset); - return -EIO; - } - } - - /* write data to file from memory buffer */ - rc = write(fd, buf, bytes); - if (rc < 0) { - fprintf(stderr, "%s, W off 0x%lx, 0x%lx failed %zd.\n", - fname, offset, bytes, rc); - perror("write file"); - return -EIO; - } - if (rc != bytes) { - fprintf(stderr, "%s, W off 0x%lx, 0x%lx != 0x%lx.\n", - fname, offset, rc, bytes); - return -EIO; - } - - count += bytes; - buf += bytes; - offset += bytes; - } while (count < size); - - if (count != size) { - fprintf(stderr, "%s, R failed 0x%lx != 0x%lx.\n", - fname, count, size); - return -EIO; - } - return count; -} - - -/* Subtract timespec t2 from t1 - * - * Both t1 and t2 must already be normalized - * i.e. 0 <= nsec < 1000000000 - */ -static int timespec_check(struct timespec *t) -{ - if ((t->tv_nsec < 0) || (t->tv_nsec >= 1000000000)) - return -1; - return 0; - -} - -void timespec_sub(struct timespec *t1, struct timespec *t2) -{ - if (timespec_check(t1) < 0) { - fprintf(stderr, "invalid time #1: %lld.%.9ld.\n", - (long long)t1->tv_sec, t1->tv_nsec); - return; - } - if (timespec_check(t2) < 0) { - fprintf(stderr, "invalid time #2: %lld.%.9ld.\n", - (long long)t2->tv_sec, t2->tv_nsec); - return; - } - t1->tv_sec -= t2->tv_sec; - t1->tv_nsec -= t2->tv_nsec; - if (t1->tv_nsec >= 1000000000) { - t1->tv_sec++; - t1->tv_nsec -= 1000000000; - } else if (t1->tv_nsec < 0) { - t1->tv_sec--; - t1->tv_nsec += 1000000000; - } -} - diff --git a/QDMA/linux-kernel/apps/dma-utils/dmactl.c b/QDMA/linux-kernel/apps/dma-utils/dmactl.c deleted file mode 100755 index 988d482..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/dmactl.c +++ /dev/null @@ -1,884 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ -#include <stdlib.h> -#include <stdint.h> -#include <stdio.h> -#include <ctype.h> -#include <string.h> -#include <unistd.h> -#include <err.h> -#include <errno.h> -#include <sys/socket.h> -#include <linux/genetlink.h> -#include "qdma_nl.h" -#include "dmaxfer.h" -#include "dmactl_internal.h" - -#define MAX_KMALLOC_SIZE (4*1024*1024) - -//#define DEBUG 1 -/* - * netlink message - */ -struct xnl_hdr { - struct nlmsghdr n; - struct genlmsghdr g; -}; - -struct xnl_cb { - int fd; - unsigned short family; - unsigned int snd_seq; - unsigned int rcv_seq; -}; - -struct xnl_gen_msg { - struct xnl_hdr hdr; - char data[0]; -}; - -void xnl_close(struct xnl_cb *cb) -{ - close(cb->fd); -} - -static int xnl_send(struct xnl_cb *cb, struct xnl_hdr *hdr, - void (*log_err)(const char *)) -{ - int rv; - struct sockaddr_nl addr = { - .nl_family = AF_NETLINK, - }; - - hdr->n.nlmsg_seq = cb->snd_seq; - cb->snd_seq++; - - rv = sendto(cb->fd, (char *)hdr, hdr->n.nlmsg_len, 0, - (struct sockaddr *)&addr, sizeof(addr)); - if (rv != hdr->n.nlmsg_len) { - if (log_err) - log_err("nl send err"); - return -1; - } - - return 0; -} - -static int xnl_recv(struct xnl_cb *cb, struct xnl_hdr *hdr, int dlen, - void (*log_err)(const char *)) -{ - int rv; - - memset(hdr, 0, sizeof(struct xnl_gen_msg) + dlen); - - rv = recv(cb->fd, hdr, dlen, 0); - if (rv < 0) { - if (log_err) - log_err("nl recv err"); - return -1; - } - /* as long as there is attribute, even if it is shorter than expected */ - if (!NLMSG_OK((&hdr->n), rv) && (rv <= sizeof(struct xnl_hdr))) { - char err_msg[100] = {'\0'}; - - snprintf(err_msg, 100, - "nl recv:, invalid message, cmd 0x%x, %d,%d.\n", - hdr->g.cmd, dlen, rv); - if (log_err) - log_err(err_msg); - return -1; - } - - if (hdr->n.nlmsg_type == NLMSG_ERROR) { - char err_msg[100] = {'\0'}; - - snprintf(err_msg, 100, "nl recv, msg error, cmd 0x%x\n", - hdr->g.cmd); - if (log_err) - log_err(err_msg); - return -1; - } - - return 0; -} - -static inline struct xnl_gen_msg *xnl_msg_alloc(unsigned int dlen, - void (*log_err)(const char *)) -{ - struct xnl_gen_msg *msg; - unsigned int extra_mem = (XNL_ATTR_MAX * (sizeof(struct nlattr) + - sizeof(uint32_t))); - - if (dlen) - extra_mem = dlen; - - msg = malloc(sizeof(struct xnl_gen_msg) + extra_mem); - if (!msg) { - char err_msg[100] = {'\0'}; - - snprintf(err_msg, 100, "%s: OOM, %u.\n", - __FUNCTION__, extra_mem); - if (log_err) - log_err(err_msg); - return NULL; - } - - memset(msg, 0, sizeof(struct xnl_gen_msg) + extra_mem); - return msg; -} - -static int xnl_connect(struct xnl_cb *cb, int vf, void (*log_err)(const char *)) -{ - int fd; - struct sockaddr_nl addr; - struct xnl_gen_msg *msg = xnl_msg_alloc(0, log_err); - struct xnl_hdr *hdr = &msg->hdr; - struct nlattr *attr; - int rv = -1; - - fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); - if (fd < 0) { - if (log_err) - log_err("nl socket err"); - rv = fd; - goto out; - } - cb->fd = fd; - - memset(&addr, 0, sizeof(struct sockaddr_nl)); - addr.nl_family = AF_NETLINK; - rv = bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_nl)); - if (rv < 0) { - if (log_err) - log_err("nl bind err"); - goto out; - } - - hdr->n.nlmsg_type = GENL_ID_CTRL; - hdr->n.nlmsg_flags = NLM_F_REQUEST; - hdr->n.nlmsg_pid = getpid(); - hdr->n.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN); - - hdr->g.cmd = CTRL_CMD_GETFAMILY; - hdr->g.version = XNL_VERSION; - - attr = (struct nlattr *)(hdr + 1); - attr->nla_type = CTRL_ATTR_FAMILY_NAME; - cb->family = CTRL_ATTR_FAMILY_NAME; - - if (vf) { - attr->nla_len = strlen(XNL_NAME_VF) + 1 + NLA_HDRLEN; - memcpy((char *)(attr + 1), XNL_NAME_VF, sizeof(XNL_NAME_VF) - 1); - } else { - attr->nla_len = strlen(XNL_NAME_PF) + 1 + NLA_HDRLEN; - memcpy((char *)(attr + 1), XNL_NAME_PF, sizeof(XNL_NAME_PF) - 1); - } - hdr->n.nlmsg_len += NLMSG_ALIGN(attr->nla_len); - - rv = xnl_send(cb, hdr, log_err); - if (rv < 0) - goto out; - - rv = xnl_recv(cb, hdr, XNL_RESP_BUFLEN_MIN, NULL); - if (rv < 0) - goto out; - - attr = (struct nlattr *)((char *)attr + NLA_ALIGN(attr->nla_len)); - /* family ID */ - if (attr->nla_type == CTRL_ATTR_FAMILY_ID) - cb->family = *(__u16 *)(attr + 1); - - rv = 0; - -out: - free(msg); - return rv; -} - - -static void xnl_msg_set_hdr(struct xnl_hdr *hdr, int family, int op) -{ - hdr->n.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN); - hdr->n.nlmsg_type = family; - hdr->n.nlmsg_flags = NLM_F_REQUEST; - hdr->n.nlmsg_pid = getpid(); - - hdr->g.cmd = op; -} - -static int xnl_msg_add_int_attr(struct xnl_hdr *hdr, enum xnl_attr_t type, - unsigned int v) -{ - struct nlattr *attr = (struct nlattr *)((char *)hdr + hdr->n.nlmsg_len); - - attr->nla_type = (__u16)type; - attr->nla_len = sizeof(__u32) + NLA_HDRLEN; - *(__u32 *)(attr+ 1) = v; - - hdr->n.nlmsg_len += NLMSG_ALIGN(attr->nla_len); - return 0; -} - -static int xnl_msg_add_str_attr(struct xnl_hdr *hdr, enum xnl_attr_t type, - char *s) -{ - struct nlattr *attr = (struct nlattr *)((char *)hdr + hdr->n.nlmsg_len); - int len = strlen(s); - - attr->nla_type = (__u16)type; - attr->nla_len = len + 1 + NLA_HDRLEN; - - strcpy((char *)(attr + 1), s); - - hdr->n.nlmsg_len += NLMSG_ALIGN(attr->nla_len); - return 0; -} - -static int recv_attrs(struct xnl_hdr *hdr, struct xcmd_info *xcmd, - uint32_t *attrs) -{ - unsigned char *p = (unsigned char *)(hdr + 1); - int maxlen = hdr->n.nlmsg_len - NLMSG_LENGTH(GENL_HDRLEN); - - while (maxlen > 0) { - struct nlattr *na = (struct nlattr *)p; - int len = NLA_ALIGN(na->nla_len); - - if (na->nla_type >= XNL_ATTR_MAX) { - void (*log_err)(const char *) = xcmd->log_msg_dump; - char err_msg[100] = {'\0'}; - - snprintf(err_msg, 100, - "unknown attr type %d, len %d.\n", - na->nla_type, na->nla_len); - if (log_err) - log_err(err_msg); - return -EINVAL; - } - - if (na->nla_type == XNL_ATTR_GENMSG) { - if (xcmd->log_msg_dump) - xcmd->log_msg_dump((const char *)(na + 1)); - } else { - attrs[na->nla_type] = *(uint32_t *)(na + 1); - } - - p += len; - maxlen -= len; - } - - return 0; -} - -static int get_cmd_resp_buf_len(enum xnl_op_t op, struct xcmd_info *xcmd) -{ - int buf_len = XNL_RESP_BUFLEN_MAX; - unsigned int row_len = 50; - - switch (op) { - case XNL_CMD_Q_DESC: - row_len *= 2; - case XNL_CMD_Q_CMPT: - buf_len += ((xcmd->req.qparm.range_end - - xcmd->req.qparm.range_start)*row_len); - break; - case XNL_CMD_INTR_RING_DUMP: - buf_len += ((xcmd->req.intr.end_idx - - xcmd->req.intr.start_idx)*row_len); - break; - case XNL_CMD_DEV_LIST: - case XNL_CMD_DEV_INFO: - case XNL_CMD_DEV_CAP: - case XNL_CMD_Q_START: - case XNL_CMD_Q_STOP: - case XNL_CMD_Q_DEL: - case XNL_CMD_GLOBAL_CSR: - return buf_len; - case XNL_CMD_Q_ADD: - case XNL_CMD_Q_DUMP: - case XNL_CMD_Q_LIST: - case XNL_CMD_Q_CMPT_READ: - break; - case XNL_CMD_REG_DUMP: - case XNL_CMD_REG_INFO_READ: - buf_len = XNL_RESP_BUFLEN_MAX * 6; - break; - case XNL_CMD_DEV_STAT: - buf_len = XNL_RESP_BUFLEN_MAX; - break; - default: - buf_len = XNL_RESP_BUFLEN_MIN; - return buf_len; - } - if ((xcmd->req.qparm.flags & XNL_F_QDIR_BOTH) == XNL_F_QDIR_BOTH) - buf_len *= 2; - if(xcmd->req.qparm.num_q > 1) - buf_len *= xcmd->req.qparm.num_q; - if(buf_len > MAX_KMALLOC_SIZE) - buf_len = MAX_KMALLOC_SIZE; - return buf_len; -} - - -static int recv_nl_msg(struct xnl_hdr *hdr, struct xcmd_info *xcmd, - uint32_t *attrs) -{ - if (!attrs) - return 0; - recv_attrs(hdr, xcmd, attrs); - - if (attrs[XNL_ATTR_ERROR] != 0) - return (int)attrs[XNL_ATTR_ERROR]; - - return 0; -} - -static void xnl_msg_add_extra_config_attrs(struct xnl_hdr *hdr, - struct xcmd_info *xcmd) -{ - if (xcmd->req.qparm.sflags & (1 << QPARM_RNGSZ_IDX)) - xnl_msg_add_int_attr(hdr, XNL_ATTR_QRNGSZ_IDX, - xcmd->req.qparm.qrngsz_idx); - if (xcmd->req.qparm.sflags & (1 << QPARM_C2H_BUFSZ_IDX)) - xnl_msg_add_int_attr(hdr, XNL_ATTR_C2H_BUFSZ_IDX, - xcmd->req.qparm.c2h_bufsz_idx); - if (xcmd->req.qparm.sflags & (1 << QPARM_CMPTSZ)) - xnl_msg_add_int_attr(hdr, XNL_ATTR_CMPT_DESC_SIZE, - xcmd->req.qparm.cmpt_entry_size); - if (xcmd->req.qparm.sflags & (1 << QPARM_SW_DESC_SZ)) - xnl_msg_add_int_attr(hdr, XNL_ATTR_SW_DESC_SIZE, - xcmd->req.qparm.sw_desc_sz); - if (xcmd->req.qparm.sflags & (1 << QPARM_CMPT_TMR_IDX)) - xnl_msg_add_int_attr(hdr, XNL_ATTR_CMPT_TIMER_IDX, - xcmd->req.qparm.cmpt_tmr_idx); - if (xcmd->req.qparm.sflags & (1 << QPARM_CMPT_CNTR_IDX)) - xnl_msg_add_int_attr(hdr, XNL_ATTR_CMPT_CNTR_IDX, - xcmd->req.qparm.cmpt_cntr_idx); - if (xcmd->req.qparm.sflags & (1 << QPARM_MM_CHANNEL)) - xnl_msg_add_int_attr(hdr, XNL_ATTR_MM_CHANNEL, - xcmd->req.qparm.mm_channel); - if (xcmd->req.qparm.sflags & (1 << QPARM_CMPT_TRIG_MODE)) - xnl_msg_add_int_attr(hdr, XNL_ATTR_CMPT_TRIG_MODE, - xcmd->req.qparm.cmpt_trig_mode); - if (xcmd->req.qparm.sflags & (1 << QPARM_PING_PONG_EN)) { - xnl_msg_add_int_attr(hdr, XNL_ATTR_PING_PONG_EN, - xcmd->req.qparm.ping_pong_en); - } - if (xcmd->req.qparm.sflags & (1 << QPARM_KEYHOLE_EN)) { - xnl_msg_add_int_attr(hdr, XNL_ATTR_APERTURE_SZ, - xcmd->req.qparm.aperture_sz); - } -} - -static int xnl_parse_response(struct xnl_cb *cb, struct xnl_hdr *hdr, - struct xcmd_info *xcmd, unsigned int dlen, - uint32_t *attrs) -{ - struct nlattr *attr; - int rv; - - rv = xnl_recv(cb, hdr, dlen, xcmd->log_msg_dump); - if (rv < 0) - goto out; - - rv = recv_nl_msg(hdr, xcmd, attrs); -out: - return rv; -} - -static int xnl_send_cmd(struct xnl_cb *cb, struct xnl_hdr *hdr, - struct xcmd_info *xcmd, unsigned int dlen) -{ - struct nlattr *attr; - int rv; - - attr = (struct nlattr *)(hdr + 1); - - xnl_msg_add_int_attr(hdr, XNL_ATTR_DEV_IDX, xcmd->if_bdf); - - switch(xcmd->op) { - case XNL_CMD_DEV_LIST: - case XNL_CMD_DEV_INFO: - case XNL_CMD_DEV_STAT: - case XNL_CMD_DEV_STAT_CLEAR: - /* no parameter */ - break; - case XNL_CMD_Q_LIST: - xnl_msg_add_int_attr(hdr, XNL_ATTR_QIDX, xcmd->req.qparm.idx); - xnl_msg_add_int_attr(hdr, XNL_ATTR_NUM_Q, xcmd->req.qparm.num_q); - case XNL_CMD_Q_ADD: - xnl_msg_add_int_attr(hdr, XNL_ATTR_QIDX, xcmd->req.qparm.idx); - xnl_msg_add_int_attr(hdr, XNL_ATTR_NUM_Q, xcmd->req.qparm.num_q); - xnl_msg_add_int_attr(hdr, XNL_ATTR_QFLAG, xcmd->req.qparm.flags); - xnl_msg_add_int_attr(hdr, XNL_ATTR_RSP_BUF_LEN, dlen ); - break; - case XNL_CMD_Q_START: - xnl_msg_add_extra_config_attrs(hdr, xcmd); - case XNL_CMD_Q_STOP: - case XNL_CMD_Q_DEL: - case XNL_CMD_Q_DUMP: - xnl_msg_add_int_attr(hdr, XNL_ATTR_QIDX, xcmd->req.qparm.idx); - xnl_msg_add_int_attr(hdr, XNL_ATTR_NUM_Q, xcmd->req.qparm.num_q); - xnl_msg_add_int_attr(hdr, XNL_ATTR_QFLAG, xcmd->req.qparm.flags); - xnl_msg_add_int_attr(hdr, XNL_ATTR_RSP_BUF_LEN, dlen); - break; - case XNL_CMD_Q_DESC: - case XNL_CMD_Q_CMPT: - xnl_msg_add_int_attr(hdr, XNL_ATTR_QIDX, xcmd->req.qparm.idx); - xnl_msg_add_int_attr(hdr, XNL_ATTR_NUM_Q, xcmd->req.qparm.num_q); - xnl_msg_add_int_attr(hdr, XNL_ATTR_QFLAG, xcmd->req.qparm.flags); - xnl_msg_add_int_attr(hdr, XNL_ATTR_RANGE_START, - xcmd->req.qparm.range_start); - xnl_msg_add_int_attr(hdr, XNL_ATTR_RANGE_END, - xcmd->req.qparm.range_end); - xnl_msg_add_int_attr(hdr, XNL_ATTR_RSP_BUF_LEN, dlen); - break; - case XNL_CMD_Q_RX_PKT: - xnl_msg_add_int_attr(hdr, XNL_ATTR_QIDX, xcmd->req.qparm.idx); - xnl_msg_add_int_attr(hdr, XNL_ATTR_NUM_Q, xcmd->req.qparm.num_q); - /* hard coded to C2H */ - xnl_msg_add_int_attr(hdr, XNL_ATTR_QFLAG, XNL_F_QDIR_C2H); - break; - case XNL_CMD_Q_CMPT_READ: - xnl_msg_add_int_attr(hdr, XNL_ATTR_QIDX, xcmd->req.qparm.idx); - xnl_msg_add_int_attr(hdr, XNL_ATTR_QFLAG, xcmd->req.qparm.flags); - /*xnl_msg_add_int_attr(hdr, XNL_ATTR_NUM_ENTRIES, - xcmd->u.qparm.num_entries);*/ - break; - case XNL_CMD_INTR_RING_DUMP: - xnl_msg_add_int_attr(hdr, XNL_ATTR_INTR_VECTOR_IDX, - xcmd->req.intr.vector); - xnl_msg_add_int_attr(hdr, XNL_ATTR_INTR_VECTOR_START_IDX, - xcmd->req.intr.start_idx); - xnl_msg_add_int_attr(hdr, XNL_ATTR_INTR_VECTOR_END_IDX, - xcmd->req.intr.end_idx); - xnl_msg_add_int_attr(hdr, XNL_ATTR_RSP_BUF_LEN, dlen); - break; - case XNL_CMD_REG_RD: - xnl_msg_add_int_attr(hdr, XNL_ATTR_REG_BAR_NUM, - xcmd->req.reg.bar); - xnl_msg_add_int_attr(hdr, XNL_ATTR_REG_ADDR, - xcmd->req.reg.reg); - break; - case XNL_CMD_REG_WRT: - xnl_msg_add_int_attr(hdr, XNL_ATTR_REG_BAR_NUM, - xcmd->req.reg.bar); - xnl_msg_add_int_attr(hdr, XNL_ATTR_REG_ADDR, - xcmd->req.reg.reg); - xnl_msg_add_int_attr(hdr, XNL_ATTR_REG_VAL, - xcmd->req.reg.val); - break; - case XNL_CMD_REG_INFO_READ: - xnl_msg_add_int_attr(hdr, XNL_ATTR_REG_BAR_NUM, - xcmd->req.reg.bar); - xnl_msg_add_int_attr(hdr, XNL_ATTR_REG_ADDR, - xcmd->req.reg.reg); - xnl_msg_add_int_attr(hdr, XNL_ATTR_NUM_REGS, - xcmd->req.reg.range_end); - xnl_msg_add_int_attr(hdr, XNL_ATTR_RSP_BUF_LEN, - dlen); - break; - case XNL_CMD_REG_DUMP: - xnl_msg_add_int_attr(hdr, XNL_ATTR_RSP_BUF_LEN, - dlen); - break; - case XNL_CMD_GLOBAL_CSR: - xnl_msg_add_int_attr(hdr, XNL_ATTR_CSR_INDEX, - 0); - xnl_msg_add_int_attr(hdr, XNL_ATTR_CSR_COUNT, - QDMA_GLOBAL_CSR_ARRAY_SZ); - break; - default: - break; - } - - rv = xnl_send(cb, hdr, xcmd->log_msg_dump); - if (rv < 0) - goto out; - -out: - return rv; -} - -void xnl_parse_dev_info_attrs(uint32_t *attrs, struct xcmd_info *xcmd) -{ - unsigned int usr_bar; - struct xnl_dev_info *dev_info = &xcmd->resp.dev_info; - - dev_info->config_bar = attrs[XNL_ATTR_DEV_CFG_BAR]; - usr_bar = (int)attrs[XNL_ATTR_DEV_USR_BAR]; - dev_info->qmax = attrs[XNL_ATTR_DEV_QSET_MAX]; - dev_info->qbase = attrs[XNL_ATTR_DEV_QSET_QBASE]; - dev_info->pci_bus = attrs[XNL_ATTR_PCI_BUS]; - dev_info->pci_dev = attrs[XNL_ATTR_PCI_DEV]; - dev_info->dev_func = attrs[XNL_ATTR_PCI_FUNC]; - - if (usr_bar+1 == 0) - dev_info->user_bar = 2; - else - dev_info->user_bar = usr_bar; -} - -void xnl_parse_dev_stat_attrs(uint32_t *attrs, struct xcmd_info *xcmd) -{ - unsigned int pkts; - struct xnl_dev_stat *dev_stat = &xcmd->resp.dev_stat; - - pkts = attrs[XNL_ATTR_DEV_STAT_MMH2C_PKTS1]; - dev_stat->mm_h2c_pkts = pkts; - pkts = attrs[XNL_ATTR_DEV_STAT_MMH2C_PKTS2]; - dev_stat->mm_h2c_pkts |= (((unsigned long long)pkts) << 32); - - pkts = attrs[XNL_ATTR_DEV_STAT_MMC2H_PKTS1]; - dev_stat->mm_c2h_pkts = pkts; - pkts = attrs[XNL_ATTR_DEV_STAT_MMC2H_PKTS2]; - dev_stat->mm_c2h_pkts |= (((unsigned long long)pkts) << 32); - - pkts = attrs[XNL_ATTR_DEV_STAT_STH2C_PKTS1]; - dev_stat->st_h2c_pkts = pkts; - pkts = attrs[XNL_ATTR_DEV_STAT_STH2C_PKTS2]; - dev_stat->st_h2c_pkts |= (((unsigned long long)pkts) << 32); - - pkts = attrs[XNL_ATTR_DEV_STAT_STC2H_PKTS1]; - dev_stat->st_c2h_pkts = pkts; - pkts = attrs[XNL_ATTR_DEV_STAT_STC2H_PKTS2]; - dev_stat->st_c2h_pkts |= (((unsigned long long)pkts) << 32); - - pkts = attrs[XNL_ATTR_DEV_STAT_PING_PONG_LATMAX1]; - dev_stat->ping_pong_lat_max = pkts; - pkts = attrs[XNL_ATTR_DEV_STAT_PING_PONG_LATMAX2]; - dev_stat->ping_pong_lat_max |= (((unsigned long long)pkts) << 32); - - pkts = attrs[XNL_ATTR_DEV_STAT_PING_PONG_LATMIN1]; - dev_stat->ping_pong_lat_min = pkts; - pkts = attrs[XNL_ATTR_DEV_STAT_PING_PONG_LATMIN2]; - dev_stat->ping_pong_lat_min |= (((unsigned long long)pkts) << 32); - - pkts = attrs[XNL_ATTR_DEV_STAT_PING_PONG_LATAVG1]; - dev_stat->ping_pong_lat_avg = pkts; - pkts = attrs[XNL_ATTR_DEV_STAT_PING_PONG_LATAVG2]; - dev_stat->ping_pong_lat_avg |= (((unsigned long long)pkts) << 32); -} - -void xnl_parse_dev_cap_attrs(struct xnl_hdr *hdr, uint32_t *attrs, - struct xcmd_info *xcmd) -{ - unsigned char *p = (unsigned char *)(hdr + 1); - struct nlattr *na = (struct nlattr *)p; - - xcmd->resp.cap.mailbox_en = attrs[XNL_ATTR_DEV_MAILBOX_ENABLE]; - xcmd->resp.cap.mm_channel_max = attrs[XNL_ATTR_DEV_MM_CHANNEL_MAX]; - xcmd->resp.cap.num_pfs = attrs[XNL_ATTR_DEV_NUM_PFS]; - xcmd->resp.cap.num_qs = attrs[XNL_ATTR_DEV_NUMQS]; - xcmd->resp.cap.flr_present = attrs[XNL_ATTR_DEV_FLR_PRESENT]; - xcmd->resp.cap.mm_en = attrs[XNL_ATTR_DEV_MM_ENABLE]; - xcmd->resp.cap.debug_mode = attrs[XNL_ATTR_DEBUG_EN]; - xcmd->resp.cap.desc_eng_mode = attrs[XNL_ATTR_DESC_ENGINE_MODE]; - xcmd->resp.cap.mm_cmpt_en = - attrs[XNL_ATTR_DEV_MM_CMPT_ENABLE]; - xcmd->resp.cap.st_en = attrs[XNL_ATTR_DEV_ST_ENABLE]; - if (na->nla_type == XNL_ATTR_VERSION_INFO) { - strncpy(xcmd->resp.cap.version_str, (char *)(na + 1), QDMA_VERSION_INFO_STR_LENGTH); - } - if (na->nla_type == XNL_ATTR_DEVICE_TYPE) { - strncpy(xcmd->resp.cap.version_str, (char *)(na + 1), QDMA_VERSION_INFO_STR_LENGTH); - } - if (na->nla_type == XNL_ATTR_IP_TYPE) { - strncpy(xcmd->resp.cap.version_str, (char *)(na + 1), QDMA_VERSION_INFO_STR_LENGTH); - } -} - -void xnl_parse_reg_attrs(uint32_t *attrs, struct xcmd_info *xcmd) -{ - xcmd->req.reg.val = attrs[XNL_ATTR_REG_VAL]; -} - -static void xnl_parse_q_state_attrs(uint32_t *attrs, struct xcmd_info *xcmd) -{ - xcmd->resp.q_info.flags = attrs[XNL_ATTR_QFLAG]; - xcmd->resp.q_info.qidx = attrs[XNL_ATTR_QIDX]; - xcmd->resp.q_info.state = attrs[XNL_ATTR_Q_STATE]; -} - -static void xnl_parse_csr_attrs(struct xnl_hdr *hdr, uint32_t *attrs, struct xcmd_info *xcmd) -{ - unsigned char *p = (unsigned char *)(hdr + 1); - struct nlattr *na = (struct nlattr *)p; - - if (na->nla_type == XNL_ATTR_GLOBAL_CSR) { - memcpy(&xcmd->resp.csr,(void *) (na + 1), - sizeof(struct global_csr_conf)); - - } - -} - -static void xnl_parse_cmd_attrs(struct xnl_hdr *hdr, struct xcmd_info *xcmd, - uint32_t *attrs) -{ - switch(xcmd->op) { - case XNL_CMD_DEV_INFO: - xnl_parse_dev_info_attrs(attrs, xcmd); - break; - case XNL_CMD_DEV_STAT: - xnl_parse_dev_stat_attrs(attrs, xcmd); - break; - case XNL_CMD_DEV_CAP: - xnl_parse_dev_cap_attrs(hdr, attrs, xcmd); - break; - case XNL_CMD_REG_RD: - case XNL_CMD_REG_WRT: - xnl_parse_reg_attrs(attrs, xcmd); - break; - case XNL_CMD_GET_Q_STATE: - xnl_parse_q_state_attrs(attrs, xcmd); - break; - case XNL_CMD_GLOBAL_CSR: - xnl_parse_csr_attrs(hdr, attrs, xcmd); - break; - default: - break; - } -} - -int xnl_common_msg_send(struct xcmd_info *cmd, uint32_t *attrs) -{ - int rv; - struct xnl_gen_msg *msg = NULL; - struct xnl_hdr *hdr; - struct xnl_cb cb; - unsigned int dlen; - - rv = xnl_connect(&cb, cmd->vf, cmd->log_msg_dump); - if (rv < 0) - return rv; - dlen = get_cmd_resp_buf_len(cmd->op, cmd); - msg = xnl_msg_alloc(dlen, cmd->log_msg_dump); - if (!msg) - goto close; - hdr = &msg->hdr; - - xnl_msg_set_hdr(hdr, cb.family, cmd->op); - - rv = xnl_send_cmd(&cb, hdr, cmd, dlen); - if (rv < 0) - goto free_mem; - - rv = xnl_parse_response(&cb, hdr, cmd, dlen, attrs); - if (rv < 0) - goto free_mem; - xnl_parse_cmd_attrs(hdr, cmd, attrs); -free_mem: - free(msg); -close: - xnl_close(&cb); - - return rv; -} - -int qdma_dev_list_dump(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - xnl_common_msg_send(cmd, attrs); - cmd->vf = 1; - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_dev_info(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - int rv; - - rv = xnl_common_msg_send(cmd, attrs); - if (rv < 0) - return rv; -} - -int qdma_dev_cap(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - int rv; - - rv = xnl_common_msg_send(cmd, attrs); - if (rv < 0) - return rv; -} - -int qdma_dev_stat(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - int rv; - - rv = xnl_common_msg_send(cmd, attrs); - if (rv < 0) - return rv; -} - -int qdma_dev_stat_clear(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_dev_intr_ring_dump(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_dev_get_global_csr(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_dev_q_list_dump(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_q_add(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_q_del(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_q_start(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - int rv = 0; - if ((cmd->req.qparm.flags & XNL_F_QDIR_BOTH) == - XNL_F_QDIR_BOTH) { - - if ((cmd->req.qparm.fetch_credit & - Q_ENABLE_C2H_FETCH_CREDIT) == Q_ENABLE_C2H_FETCH_CREDIT) - cmd->req.qparm.flags |= XNL_F_FETCH_CREDIT; - else - cmd->req.qparm.flags &= ~XNL_F_FETCH_CREDIT; - - cmd->req.qparm.flags = ((cmd->req.qparm.flags & - (~XNL_F_QDIR_BOTH)) | XNL_F_QDIR_C2H); - - rv = xnl_common_msg_send(cmd, attrs); - if (rv < 0) - return rv; - - if ((cmd->req.qparm.fetch_credit & - Q_ENABLE_H2C_FETCH_CREDIT) == Q_ENABLE_H2C_FETCH_CREDIT) - cmd->req.qparm.flags |= XNL_F_FETCH_CREDIT; - else - cmd->req.qparm.flags &= ~XNL_F_FETCH_CREDIT; - - cmd->req.qparm.flags = ((cmd->req.qparm.flags & - (~XNL_F_QDIR_BOTH)) | XNL_F_QDIR_H2C); - - return xnl_common_msg_send(cmd, attrs); - } else { - if ((cmd->req.qparm.flags & XNL_F_QDIR_H2C) == - XNL_F_QDIR_H2C) { - if ((cmd->req.qparm.fetch_credit & - Q_ENABLE_H2C_FETCH_CREDIT) == Q_ENABLE_H2C_FETCH_CREDIT) - cmd->req.qparm.flags |= XNL_F_FETCH_CREDIT; - else - cmd->req.qparm.flags &= ~XNL_F_FETCH_CREDIT; - } else if ((cmd->req.qparm.flags & XNL_F_QDIR_C2H) == - XNL_F_QDIR_C2H) { - if ((cmd->req.qparm.fetch_credit & - Q_ENABLE_C2H_FETCH_CREDIT) == Q_ENABLE_C2H_FETCH_CREDIT) - cmd->req.qparm.flags |= XNL_F_FETCH_CREDIT; - else - cmd->req.qparm.flags &= ~XNL_F_FETCH_CREDIT; - } - return xnl_common_msg_send(cmd, attrs); - } -} - -int qdma_q_stop(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_q_dump(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_q_get_state(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - - -int qdma_q_desc_dump(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_q_cmpt_read(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - return xnl_common_msg_send(cmd, attrs); -} - -int qdma_reg_read(struct xcmd_info *cmd) -{ - return proc_reg_cmd(cmd); -} - -int qdma_reg_write(struct xcmd_info *cmd) -{ - return proc_reg_cmd(cmd); -} - -int qdma_reg_info_read(struct xcmd_info *cmd) -{ - return proc_reg_cmd(cmd); -} - -int qdma_reg_dump(struct xcmd_info *cmd) -{ - return proc_reg_cmd(cmd); -} - -#ifdef TANDEM_BOOT_SUPPORTED -int qdma_en_st(struct xcmd_info *cmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - int rv; - - rv = xnl_common_msg_send(cmd, attrs); - if (rv < 0) - return rv; -} -#endif diff --git a/QDMA/linux-kernel/apps/dma-utils/dmactl_internal.h b/QDMA/linux-kernel/apps/dma-utils/dmactl_internal.h deleted file mode 100755 index 7283f7c..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/dmactl_internal.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2019 - 2022, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef _QDMACTL_INTERNAL_H_ -#define _QDMACTL_INTERNAL_H_ - -#include <stdint.h> - -#include "dmautils.h" - -int proc_reg_cmd(struct xcmd_info *xcmd); -int is_valid_addr(unsigned char bar_no, unsigned int reg_addr); -int xnl_common_msg_send(struct xcmd_info *cmd, uint32_t *attrs); - -#endif /* _QDMACTL_INTERNAL_H_ */ diff --git a/QDMA/linux-kernel/apps/dma-utils/dmactl_reg.c b/QDMA/linux-kernel/apps/dma-utils/dmactl_reg.c deleted file mode 100755 index 549d67a..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/dmactl_reg.c +++ /dev/null @@ -1,461 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2019 - 2022, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#include <endian.h> -#include <err.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/mman.h> -#include <unistd.h> -#include <stdio.h> -#include <string.h> -#include "qdma_nl.h" -#include "dmactl_internal.h" - -#define QDMA_CFG_BAR_SIZE 0xB400 -#define QDMA_USR_BAR_SIZE 0x100 - -/* Macros for reading device capability */ -#define QDMA_GLBL2_MISC_CAP 0x134 -#define QDMA_GLBL2_MM_CMPT_EN_MASK 0x4 -#define QDMA_GLBL2_CHANNEL_MDMA 0x118 -#define QDMA_GLBL2_ST_C2H_MASK 0x10000 -#define QDMA_GLBL2_ST_H2C_MASK 0x20000 -#define QDMA_GLBL2_MM_C2H_MASK 0x100 -#define QDMA_GLBL2_MM_H2C_MASK 0x1 - -#define QDMA_MM_EN_SHIFT 0 -#define QDMA_CMPT_EN_SHIFT 1 -#define QDMA_ST_EN_SHIFT 2 -#define QDMA_MAILBOX_EN_SHIFT 3 - -#define QDMA_MM_MODE (1 << QDMA_MM_EN_SHIFT) -#define QDMA_COMPLETION_MODE (1 << QDMA_CMPT_EN_SHIFT) -#define QDMA_ST_MODE (1 << QDMA_ST_EN_SHIFT) -#define QDMA_MAILBOX (1 << QDMA_MAILBOX_EN_SHIFT) - - -#define QDMA_MM_ST_MODE \ - (QDMA_MM_MODE | QDMA_COMPLETION_MODE | QDMA_ST_MODE) - -#define GET_CAPABILITY_MASK(mm_en, st_en, mm_cmpt_en, mailbox_en) \ - ((mm_en << QDMA_MM_EN_SHIFT) | \ - ((mm_cmpt_en | st_en) << QDMA_CMPT_EN_SHIFT) | \ - (st_en << QDMA_ST_EN_SHIFT) | \ - (mailbox_en << QDMA_MAILBOX_EN_SHIFT)) - -struct xreg_info { - const char name[32]; - uint32_t addr; - uint32_t repeat; - uint32_t step; - uint8_t shift; - uint8_t len; - uint8_t mode; -}; - -static struct xreg_info qdma_user_regs[] = { - {"ST_C2H_QID", 0x0, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKTLEN", 0x4, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CONTROL", 0x8, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - /* ST_C2H_CONTROL: - * [1] : start C2H - * [2] : immediate data - * [3] : every packet statrs with 00 instead of continuous data - * stream until # of packets is complete - * [31]: gen_user_reset_n - */ - {"ST_H2C_CONTROL", 0xC, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - /* ST_H2C_CONTROL: - * [0] : clear match for H2C transfer - */ - {"ST_H2C_STATUS", 0x10, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_H2C_XFER_CNT", 0x14, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_CNT", 0x20, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CMPT_DATA", 0x30, 8, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CMPT_SIZE", 0x50, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_SCRATCH_REG", 0x60, 2, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_DROP", 0x88, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_ACCEPT", 0x8C, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"DSC_BYPASS_LOOP", 0x90, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT", 0x94, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT_MASK", 0x98, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT_VEC", 0x9C, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"DMA_CONTROL", 0xA0, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"VDM_MSG_READ", 0xA4, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - - {"", 0, 0, 0 } -}; - - -static struct xreg_info qdma_cpm_dmap_regs[] = { -/* QDMA_TRQ_SEL_QUEUE_PF (0x6400) */ - {"DMAP_SEL_INT_CIDX", 0x6400, 512, 0x10, 0, 0, QDMA_MM_ST_MODE}, - {"DMAP_SEL_H2C_DSC_PIDX", 0x6404, 512, 0x10, 0, 0, QDMA_MM_ST_MODE}, - {"DMAP_SEL_C2H_DSC_PIDX", 0x6408, 512, 0x10, 0, 0, QDMA_MM_ST_MODE}, - {"DMAP_SEL_CMPT_CIDX", 0x640C, 512, 0x10, 0, 0, QDMA_MM_ST_MODE}, - {"", 0, 0, 0 } -}; - -static struct xreg_info qdma_dmap_regs[] = { -/* QDMA_TRQ_SEL_QUEUE_PF (0x6400) */ - {"DMAP_SEL_INT_CIDX", 0x6400, 512, 0x10, 0, 0, QDMA_MM_ST_MODE}, - {"DMAP_SEL_H2C_DSC_PIDX", 0x6404, 512, 0x10, 0, 0, QDMA_MM_ST_MODE}, - {"DMAP_SEL_C2H_DSC_PIDX", 0x6408, 512, 0x10, 0, 0, QDMA_MM_ST_MODE}, - {"DMAP_SEL_CMPT_CIDX", 0x640C, 512, 0x10, 0, 0, QDMA_MM_ST_MODE}, - {"", 0, 0, 0 } -}; - -/* - * Register I/O through mmap of BAR0. - */ - -/* /sys/bus/pci/devices/0000:<bus>:<dev>.<func>/resource<bar#> */ -#define get_syspath_bar_mmap(s, bus,dev,func,bar) \ - snprintf(s, sizeof(s), \ - "/sys/bus/pci/devices/0000:%02x:%02x.%x/resource%u", \ - bus, dev, func, bar) - -static uint32_t *mmap_bar(char *fname, size_t len, int prot) -{ - int fd; - uint32_t *bar; - - fd = open(fname, (prot & PROT_WRITE) ? O_RDWR : O_RDONLY); - if (fd < 0) - return NULL; - - bar = mmap(NULL, len, prot, MAP_SHARED, fd, 0); - close(fd); - - return bar == MAP_FAILED ? NULL : bar; -} - -static int32_t reg_read_mmap(struct xnl_dev_info *dev_info, - unsigned char barno, - struct xcmd_info *xcmd) -{ - uint32_t *bar; - char fname[256]; - int rv = 0; - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - get_syspath_bar_mmap(fname, dev_info->pci_bus, dev_info->pci_dev, - dev_info->dev_func, barno); - - bar = mmap_bar(fname, xcmd->req.reg.reg + 4, PROT_READ); - if (!bar) { - if (xcmd->op == XNL_CMD_REG_WRT) - xcmd->op = XNL_CMD_REG_RD; - - rv = xnl_common_msg_send(xcmd, attrs); - - return rv; - } - - xcmd->req.reg.val = le32toh(bar[xcmd->req.reg.reg / 4]); - munmap(bar, xcmd->req.reg.reg + 4); - - return rv; -} - -static int32_t reg_write_mmap(struct xnl_dev_info *dev_info, - unsigned char barno, - struct xcmd_info *xcmd) -{ - uint32_t *bar; - char fname[256]; - int rv = 0; - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - get_syspath_bar_mmap(fname, dev_info->pci_bus, dev_info->pci_dev, - dev_info->dev_func, barno); - - bar = mmap_bar(fname, xcmd->req.reg.reg + 4, PROT_WRITE); - if (!bar) { - rv = xnl_common_msg_send(xcmd, attrs); - - return rv; - } - - bar[xcmd->req.reg.reg / 4] = htole32(xcmd->req.reg.val); - munmap(bar, xcmd->req.reg.reg + 4); - return 0; -} - -static void print_repeated_reg(uint32_t *bar, struct xreg_info *xreg, - unsigned start, unsigned limit, struct xnl_dev_info *dev_info, - struct xcmd_info *xcmd, void (*log_reg)(const char *)) -{ - int i; - int end = start + limit; - int step = xreg->step ? xreg->step : 4; - uint32_t val; - int32_t rv = 0; - char reg_dump[100]; - - for (i = start; i < end; i++) { - uint32_t addr = xreg->addr + (i * step); - char name[40]; - snprintf(name, 40, "%s_%d", - xreg->name, i); - - if (xcmd == NULL) { - val = le32toh(bar[addr / 4]); - } else { - xcmd->req.reg.reg = addr; - rv = reg_read_mmap(dev_info, xcmd->req.reg.bar, xcmd); - if (rv < 0) { - snprintf(reg_dump, 100, "\n"); - if (log_reg) - log_reg(reg_dump); - continue; - } - } - snprintf(reg_dump, 100, "[%#7x] %-47s %#-10x %u\n", - addr, name, val, val); - if (log_reg) - log_reg(reg_dump); - } -} - -static void read_config_regs(uint32_t *bar, struct xnl_dev_info *xdev, - struct xcmd_info *xcmd) -{ - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - /* Get the capabilities of the Device */ - xcmd->op = XNL_CMD_REG_DUMP; - xnl_common_msg_send(xcmd, attrs); -} - -static void read_regs(uint32_t *bar, struct xreg_info *reg_list, - struct xnl_dev_info *xdev, struct xcmd_info *xcmd, - void (*log_reg)(const char *)) -{ - struct xreg_info *xreg = reg_list; - uint32_t val; - int32_t rv = 0; - char reg_dump[100] = {'\0'}; - - for (xreg = reg_list; strlen(xreg->name); xreg++) { - - if (!xreg->len) { - if (xreg->repeat) { - if (xcmd == NULL) - print_repeated_reg(bar, xreg, 0, - xreg->repeat, NULL, - NULL, log_reg); - else - print_repeated_reg(NULL, xreg, 0, - xreg->repeat, xdev, - xcmd, log_reg); - } else { - uint32_t addr = xreg->addr; - if (xcmd == NULL) { - val = le32toh(bar[addr / 4]); - } else { - xcmd->req.reg.reg = addr; - rv = reg_read_mmap(xdev, - xcmd->req.reg.bar, - xcmd); - if (rv < 0) - continue; - } - snprintf(reg_dump, 100, - "[%#7x] %-47s %#-10x %u\n", - addr, xreg->name, val, val); - if (log_reg) - log_reg(reg_dump); - } - } else { - uint32_t addr = xreg->addr; - uint32_t val = 0; - if (xcmd == NULL) { - val = le32toh(bar[addr / 4]); - } else { - xcmd->req.reg.reg = addr; - rv = reg_read_mmap(xdev, xcmd->req.reg.bar, - xcmd); - if (rv < 0) - continue; - } - - uint32_t v = (val >> xreg->shift) & - ((1 << xreg->len) - 1); - - snprintf(reg_dump, 100, - " %*u:%d %-47s %#-10x %u\n", - xreg->shift < 10 ? 3 : 2, - xreg->shift + xreg->len - 1, - xreg->shift, xreg->name, v, v); - if (log_reg) - log_reg(reg_dump); - } - memset(reg_dump, '\0', 100); - } -} - -static void reg_dump_mmap(struct xnl_dev_info *dev_info, unsigned char barno, - struct xreg_info *reg_list, unsigned int max, - struct xcmd_info *xcmd) -{ - uint32_t *bar; - char fname[256]; - - get_syspath_bar_mmap(fname, dev_info->pci_bus, dev_info->pci_dev, - dev_info->dev_func, barno); - - if ((barno == dev_info->config_bar) && (reg_list == NULL)) - read_config_regs(NULL, dev_info, xcmd); - else { - bar = mmap_bar(fname, max, PROT_READ); - if (!bar) { - xcmd->req.reg.bar = barno; - xcmd->op = XNL_CMD_REG_RD; - read_regs(NULL, reg_list, dev_info, xcmd, - xcmd->log_msg_dump); - } else { - read_regs(bar, reg_list, NULL, NULL, xcmd->log_msg_dump); - munmap(bar, max); - } - } - return; -} - - -static void reg_dump_range(struct xnl_dev_info *dev_info, unsigned char barno, - unsigned int max, struct xreg_info *reg_list, - unsigned int start, unsigned int limit, - struct xcmd_info *xcmd) -{ - struct xreg_info *xreg = reg_list; - uint32_t *bar; - char fname[256]; - - get_syspath_bar_mmap(fname, dev_info->pci_bus, dev_info->pci_dev, - dev_info->dev_func, barno); - - bar = mmap_bar(fname, max, PROT_READ); - if (!bar) { - xcmd->op = XNL_CMD_REG_RD; - xcmd->req.reg.bar = barno; - for (xreg = reg_list; strlen(xreg->name); xreg++) { - print_repeated_reg(NULL, xreg, start, limit, dev_info, - xcmd, xcmd->log_msg_dump); - } - return; - } - - for (xreg = reg_list; strlen(xreg->name); xreg++) { - print_repeated_reg(bar, xreg, start, limit, NULL, NULL, - xcmd->log_msg_dump); - } - - munmap(bar, max); -} - -static inline void print_seperator(struct xcmd_info *xcmd) -{ - char buffer[81]; - - memset(buffer, '#', 80); - buffer[80] = '\0'; - - if (xcmd && xcmd->log_msg_dump) - xcmd->log_msg_dump(buffer); -} - -int proc_reg_cmd(struct xcmd_info *xcmd) -{ - struct xcmd_reg *regcmd; - struct xcmd_info dev_xcmd; - int32_t rv = 0; - char reg_dump[100]; - unsigned int barno; - unsigned char version[QDMA_VERSION_INFO_STR_LENGTH]; - int32_t v; - unsigned char op; - uint32_t attrs[XNL_ATTR_MAX] = {0}; - - memcpy(&dev_xcmd, xcmd, sizeof(dev_xcmd)); - - dev_xcmd.op = XNL_CMD_DEV_CAP; - rv = qdma_dev_cap(&dev_xcmd); - if (rv < 0) - return rv; - - strcpy(version, dev_xcmd.resp.cap.version_str); - - op = xcmd->op; - xcmd->op = XNL_CMD_DEV_INFO; - rv = qdma_dev_info(xcmd); - if (rv < 0) - return rv; - xcmd->op = op; - regcmd = &xcmd->req.reg; - barno = (regcmd->sflags & XCMD_REG_F_BAR_SET) ? - regcmd->bar : xcmd->resp.dev_info.config_bar; - regcmd->bar = barno; - - switch (xcmd->op) { - case XNL_CMD_REG_RD: - rv = reg_read_mmap(&xcmd->resp.dev_info, barno, xcmd); - if (rv < 0) - return rv; - break; - case XNL_CMD_REG_WRT: - v = reg_write_mmap(&xcmd->resp.dev_info, barno, xcmd); - if (v < 0) - return rv; - rv = reg_read_mmap(&xcmd->resp.dev_info, barno, xcmd); - if (rv < 0) - return rv; - break; - case XNL_CMD_REG_DUMP: - print_seperator(xcmd); - - if (xcmd->vf) - snprintf(reg_dump, 100, "\n###\t\tqdmavf%05x, pci %02x:%02x.%02x, reg dump\n", - xcmd->if_bdf, xcmd->resp.dev_info.pci_bus, - xcmd->resp.dev_info.pci_dev, xcmd->resp.dev_info.dev_func); - else - snprintf(reg_dump, 100, "\n###\t\tqdma%05x, pci %02x:%02x.%02x, reg dump\n", - xcmd->if_bdf, xcmd->resp.dev_info.pci_bus, - xcmd->resp.dev_info.pci_dev, xcmd->resp.dev_info.dev_func); - if (xcmd->log_msg_dump) - xcmd->log_msg_dump(reg_dump); - - print_seperator(xcmd); - snprintf(reg_dump, 100, "\nAXI Master Lite Bar #%d\n", - xcmd->resp.dev_info.user_bar); - if (xcmd->log_msg_dump) - xcmd->log_msg_dump(reg_dump); - - reg_dump_mmap(&xcmd->resp.dev_info, xcmd->resp.dev_info.user_bar, - qdma_user_regs, QDMA_USR_BAR_SIZE, xcmd); - - snprintf(reg_dump, 100, "\nCONFIG BAR #%d\n", - xcmd->resp.dev_info.config_bar); - if (xcmd->log_msg_dump) - xcmd->log_msg_dump(reg_dump); - reg_dump_mmap(&xcmd->resp.dev_info, xcmd->resp.dev_info.config_bar, NULL, - QDMA_CFG_BAR_SIZE, xcmd); - break; - case XNL_CMD_REG_INFO_READ: - xnl_common_msg_send(xcmd, attrs); - break; - default: - break; - } - - return 0; -} diff --git a/QDMA/linux-kernel/apps/dma-utils/dmautils.c b/QDMA/linux-kernel/apps/dma-utils/dmautils.c deleted file mode 100755 index 358530b..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/dmautils.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2019 - 2022, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ -#include "dmautils.h" - -#include <stdint.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/ioctl.h> - -#include "qdma_nl.h" -#include "dmaxfer.h" -#include "version.h" - -#define QDMA_Q_NAME_LEN 100 - -enum qdma_reg_op { - QDMA_Q_REG_DUMP, - QDMA_Q_REG_RD, - QDMA_Q_REG_WR, -}; - - -int qdmautils_sync_xfer(char *filename, enum qdmautils_io_dir dir, void *buf, - unsigned int xfer_len) -{ - return dmaxfer_iosubmit(filename, dir, DMAXFER_IO_SYNC, buf, xfer_len); -} - -int qdmautils_async_xfer(char *filename, enum qdmautils_io_dir dir, void *buf, - unsigned int xfer_len) -{ - return dmaxfer_iosubmit(filename, dir, DMAXFER_IO_ASYNC, buf, xfer_len); -} diff --git a/QDMA/linux-kernel/apps/dma-utils/dmautils.h b/QDMA/linux-kernel/apps/dma-utils/dmautils.h deleted file mode 100755 index 2df9416..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/dmautils.h +++ /dev/null @@ -1,619 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2019 - 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ -#ifndef QDMAUTILS_H -#define QDMAUTILS_H - - -/** @QDMA_GLOBAL_CSR_ARRAY_SZ: QDMA Global CSR array size */ -#define QDMA_GLOBAL_CSR_ARRAY_SZ 16 - -/** - * enum dmautils_io_dir - DMA direction to perform - */ -enum qdmautils_io_dir { - /** @DMAXFER_IO_READ: DMA card to host */ - DMAXFER_IO_READ, - /** @DMAXFER_IO_WRITE: DMA host to card */ - DMAXFER_IO_WRITE, -}; - - -enum qdma_q_fetch_credit { - /** @NONE: Disable Fetch Credit**/ - Q_DISABLE_FETCH_CREDIT = 0, - /** @Q_H2C: Enable fetch credit for H2C direction */ - Q_ENABLE_H2C_FETCH_CREDIT, - /** @Q_C2H: Enable fetch credit for C2H direction */ - Q_ENABLE_C2H_FETCH_CREDIT, - /** @Q_H2C_C2H: Enable fetch credit for H2C and C2H direction */ - Q_ENABLE_H2C_C2H_FETCH_CREDIT, -}; - - -/** - * enum qdma_q_state - QDMA q state - */ -enum qdma_q_state { - /** @Q_STATE_DISABLED: Queue is not taken */ - Q_STATE_DISABLED = 0, - /** @Q_STATE_ENABLED: Assigned/taken. Partial config is done */ - Q_STATE_ENABLED, - /** @Q_STATE_ONLINE: Resource/context is initialized for the queue and is available for - * data consumption - */ - Q_STATE_ONLINE, -}; - -/** @set_qparam - helper macro to set q param - * @xcmd: pointer to xcmd_info - * @var_ptr: pointer to the variable to be updated in xcmd->u.qparm - * @param_type: type of the q param that is being updated - * @val: calue to be updated in @var_ptr - */ -#define set_qparam(xcmd, var_ptr, param_type, val) \ - do {\ - *var_ptr = val; \ - xcmd->sflags |= (1 << param_type); \ - } while (0); - -/** - * enum qdma_q_parm_type - QDMA q param type to indicate what all params are - * provided - */ -enum qdma_q_parm_type { - /** @QPARM_IDX: q index param */ - QPARM_IDX, - /** @QPARM_MODE: q mode param */ - QPARM_MODE, - /** @QPARM_DIR: q direction param */ - QPARM_DIR, - /** @QPARM_DESC: q desc request param */ - QPARM_DESC, - /** @QPARM_CMPT: q cmpt desc request param */ - QPARM_CMPT, - /** @QPARM_CMPTSZ: q cmpt size param */ - QPARM_CMPTSZ, - /** @QPARM_SW_DESC_SZ: q sw desc size param */ - QPARM_SW_DESC_SZ, - /** @QPARM_RNGSZ_IDX: q ring size idx param */ - QPARM_RNGSZ_IDX, - /** @QPARM_C2H_BUFSZ_IDX: q c2h buf size idx param */ - QPARM_C2H_BUFSZ_IDX, - /** @QPARM_CMPT_TMR_IDX: q cmpt timer idx param */ - QPARM_CMPT_TMR_IDX, - /** @QPARM_CMPT_CNTR_IDX: q cmpt counter idx param */ - QPARM_CMPT_CNTR_IDX, - /** @QPARM_CMPT_TRIG_MODE: q cmpt trigger mode param */ - QPARM_CMPT_TRIG_MODE, - /** @QPARM_PING_PONG_EN: ping pong param */ - QPARM_PING_PONG_EN, - /** @KEYHOLE_PARAM: keyhole feature aperture */ - QPARM_KEYHOLE_EN, - /** @QPARM_MM_CHANNEL: q mm channel enable param */ - QPARM_MM_CHANNEL, - /** @QPARM_MAX: max q param */ - QPARM_MAX, -}; - -/** - * struct xcmd_q_parm - QDMA q param information - */ -struct xcmd_q_parm { - /** @sflags: flgas to indicate the presence of parms with - * @qdma_q_parm_type */ - unsigned int sflags; - /** @sflags: flgas to indicate the presence of features */ - unsigned int flags; - /** @idx: index of queue */ - unsigned int idx; - /** @num_q: num of queue */ - unsigned int num_q; - /** @range_start: start of range */ - unsigned int range_start; - /** @range_end: end of range */ - unsigned int range_end; - /** @sw_desc_sz: SW desc size */ - unsigned char sw_desc_sz; - /** @cmpt_entry_size: completion desc size */ - unsigned char cmpt_entry_size; - /** @qrngsz_idx: ring size idx */ - unsigned char qrngsz_idx; - /** @c2h_bufsz_idx: c2h buf size index */ - unsigned char c2h_bufsz_idx; - /** @cmpt_tmr_idx: cmpt timer index */ - unsigned char cmpt_tmr_idx; - /** @cmpt_cntr_idx: cmpt counter index */ - unsigned char cmpt_cntr_idx; - /** @cmpt_trig_mode: cmpt trigger mode */ - unsigned char cmpt_trig_mode; - /** @mm_channel: mm channel enable */ - unsigned char mm_channel; - /** @fetch_credit: fetch credit enable */ - unsigned char fetch_credit; - /** @is_qp: queue pair */ - unsigned char is_qp; - /** @ping_pong_en: ping pong en */ - unsigned char ping_pong_en; - /** @aperture_sz: aperture_size for keyhole transfers*/ - unsigned int aperture_sz; -}; - -/** - * struct xcmd_intr - QDMA dev interrupt ring dump - */ -struct xcmd_intr { - /** @vector: vector number */ - unsigned int vector; - /** @start_idx: start idx of interrupt ring descriptor */ - int start_idx; - /** @end_idx: end idx of interrupt ring descriptor */ - int end_idx; -}; - -/** @QDMA_VERSION_INFO_STR_LENGTH: QDMA version string length */ -#define QDMA_VERSION_INFO_STR_LENGTH 256 - -/** - * struct xcmd_dev_cap - QDMA device capabilites - */ -struct xcmd_dev_cap { - /** @version_str: qdma version string */ - char version_str[QDMA_VERSION_INFO_STR_LENGTH]; - /** @num_qs: HW qmax */ - unsigned int num_qs; - /** @num_pfs: HW number of pf */ - unsigned int num_pfs; - /** @flr_present: flr support */ - unsigned int flr_present; - /** @mm_en: MM mode support */ - unsigned int mm_en; - /** @mm_cmpt_en: MM CMPT mode support */ - unsigned int mm_cmpt_en; - /** @st_en: ST mode support */ - unsigned int st_en; - /** @mailbox_en: Mailbox support */ - unsigned int mailbox_en; - /** @mm_channel_max: Max MM channel */ - unsigned int mm_channel_max; - /** @debug_mode: Debug Mode*/ - unsigned int debug_mode; - /** @desc_eng_mode: Descriptor Engine Mode*/ - unsigned int desc_eng_mode; -}; - -/** - * struct xcmd_reg - register access command info - */ -struct xcmd_reg { - /** @sflags: flags to indicate parameter presence */ - unsigned int sflags; - /** @XCMD_REG_F_BAR_SET: bar param set */ -#define XCMD_REG_F_BAR_SET 0x1 - /** @XCMD_REG_F_REG_SET: reg param set */ -#define XCMD_REG_F_REG_SET 0x2 - /** @XCMD_REG_F_VAL_SET: val param set */ -#define XCMD_REG_F_VAL_SET 0x4 - /** @bar: bar number */ - unsigned int bar; - /** @reg: register offset */ - unsigned int reg; - /** @val: value */ - unsigned int val; - /** @range_start: range start */ - unsigned int range_start; - /** @range_end: range end */ - unsigned int range_end; -}; - -/** - * struct xnl_dev_info - device information - */ -struct xnl_dev_info { - /** @pci_bus: pci bus */ - unsigned char pci_bus; - /** @pci_dev: pci device */ - unsigned char pci_dev; - /** @dev_func: pci function */ - unsigned char dev_func; - /** @config_bar: config bar */ - unsigned char config_bar; - /** @user_bar: AXI Master Lite(user bar) */ - unsigned char user_bar; - /** @qmax: SW qmax */ - unsigned int qmax; - /** @qbase: HW q base */ - unsigned int qbase; -}; - -/** - * struct xnl_dev_stat - device statistics - */ -struct xnl_dev_stat { - /** @mm_h2c_pkts: MM H2C packets processed */ - unsigned long long mm_h2c_pkts; - /** @mm_c2h_pkts: MM C2H packets processed */ - unsigned long long mm_c2h_pkts; - /** @st_h2c_pkts: ST H2C packets processed */ - unsigned long long st_h2c_pkts; - /** @st_c2h_pkts: ST C2H packets processed */ - unsigned long long st_c2h_pkts; - /** max ping_pong latency */ - unsigned long long ping_pong_lat_max; - /** min ping_pong latency */ - unsigned long long ping_pong_lat_min; - /** avg ping_pong latency */ - unsigned long long ping_pong_lat_avg; -}; - -/** - * struct xnl_q_info - q state information - */ -struct xnl_q_info { - /** @flags: feature flags enabled */ - unsigned int flags; - /** @qidx: index of queue */ - unsigned int qidx; - /** @state: queue state */ - enum qdma_q_state state; -}; - -/** - * struct global_csr_conf - Global CSR information - */ -struct global_csr_conf { - /** @ring_sz: Descriptor ring size ie. queue depth */ - unsigned int ring_sz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @c2h_timer_cnt: C2H timer count list */ - unsigned int c2h_timer_cnt[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @c2h_cnt_th: C2H counter threshold list*/ - unsigned int c2h_cnt_th[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @c2h_buf_sz: C2H buffer size list */ - unsigned int c2h_buf_sz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @wb_intvl: Writeback interval */ - unsigned int wb_intvl; -}; - - -/** - * struct xcmd_info - command information - */ -struct xcmd_info { - /** @vf: is VF */ - unsigned char vf:1; - /** @op: operation */ - unsigned char op:7; - /** @req: union of other information for request */ - union { - /** @intr: interrupt ring info */ - struct xcmd_intr intr; - /** @reg: reg command info */ - struct xcmd_reg reg; - /** @qparm: q command info */ - struct xcmd_q_parm qparm; - } req; - /** @resp: union of information from response */ - union { - /** @cap: device capabilities response */ - struct xcmd_dev_cap cap; - /** @dev_stat: device stat response */ - struct xnl_dev_stat dev_stat; - /** @dev_info: device info response */ - struct xnl_dev_info dev_info; - /** @q_info: queue info response */ - struct xnl_q_info q_info; - /** @csr: CSR reponse */ - struct global_csr_conf csr; - } resp; - /** @if_bdf: interface BDF */ - unsigned int if_bdf; - /** @log_msg_dump: log messages dumping function */ - void (*log_msg_dump)(const char *resp_str); -}; - -/** @QDMAUTILS_VERSION_LEN: qdmautils version string length */ -#define QDMAUTILS_VERSION_LEN 10 -/** - * struct qdmautils_version - qdmautils version information - */ -struct qdmautils_version { - char version[QDMAUTILS_VERSION_LEN]; -}; - -/*****************************************************************************/ -/** - * qdmautils_get_version() - Get qdmautils version - * - * @ver: Pointer to the output data structure where version is to be - * updated - * - * Return: Nothing - * - *****************************************************************************/ -void qdmautils_get_version(struct qdmautils_version *ver); - -/*****************************************************************************/ -/** - * qdma_dev_list_dump() - dump device list - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_dev_list_dump(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_dev_info() - get device information provided by cmd->u.dev_info - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_dev_info(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_dev_cap() - get device capabilities provided by cmd->u.dev_cap - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_dev_cap(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_dev_stat() - get device statistics provided by cmd->u.dev_stat - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_dev_stat(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_dev_stat_clear() - clear device statistics - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_dev_stat_clear(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_dev_intr_ring_dump() - dump device interrupt ring - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_dev_intr_ring_dump(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_dev_get_global_csr() - get global CSR provided by cmd->u.csr - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_dev_get_global_csr(struct xcmd_info *cmd); - - -/*****************************************************************************/ -/** - * qdma_dev_q_list_dump() - dump device q list - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_dev_q_list_dump(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_q_add() - add a queue - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_q_add(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_q_del() - delete a queue - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_q_del(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_q_start() - start a queue - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_q_start(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_q_stop() - stop a queue - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_q_stop(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_q_get_state() - get q state information provided by cmd->u.q_info - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_q_get_state(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_q_dump() - dump q context - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_q_dump(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_q_desc_dump() - dump q sw/cmpt descriptors - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_q_desc_dump(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_q_cmpt_read() - dump last cmpt descriptor of the queue - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_q_cmpt_read(struct xcmd_info *cmd); - - -/*****************************************************************************/ -/** - * qdma_reg_read() - read register - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_reg_read(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_reg_info_read() - read register fields information - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_reg_info_read(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_reg_write() - write register - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_reg_write(struct xcmd_info *cmd); - -/*****************************************************************************/ -/** - * qdma_reg_dump() - dump registers - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_reg_dump(struct xcmd_info *cmd); - - -/*****************************************************************************/ -/** - * qdmautils_ioctl_nomemcpy() - set no memcpy from ioctl for the cdev - * - * @filename: filename on which ioctl needs to be done - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdmautils_ioctl_nomemcpy(char *filename); - -/*****************************************************************************/ -/** - * qdmautils_sync_xfer() - sync transfer - * - * @filename: filename on which transfer needs to be done - * @dir: direction oif operation - * @buf: pointer to buffer - * @xfer_len: size of transfer - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdmautils_sync_xfer(char *filename, enum qdmautils_io_dir dir, void *buf, - unsigned int xfer_len); - -/*****************************************************************************/ -/** - * qdmautils_async_xfer() - async trasnfer - * - * @filename: filename on which transfer needs to be done - * @dir: direction oif operation - * @buf: pointer to buffer - * @xfer_len: size of transfer - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdmautils_async_xfer(char *filename, enum qdmautils_io_dir dir, void *buf, - unsigned int xfer_len); - -#ifdef TANDEM_BOOT_SUPPORTED -/*****************************************************************************/ -/** - * qdma_en_st() - Enable Streaming - * - * @cmd: command information - * - * Return: >=0 for success and <0 for error - * - *****************************************************************************/ -int qdma_en_st(struct xcmd_info *cmd); -#endif - -#endif /* QDMAUTILS_H */ diff --git a/QDMA/linux-kernel/apps/dma-utils/dmaxfer.c b/QDMA/linux-kernel/apps/dma-utils/dmaxfer.c deleted file mode 100755 index b0c9b8e..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/dmaxfer.c +++ /dev/null @@ -1,1118 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#include <semaphore.h> -#include <time.h> -#include <sys/wait.h> -#include <sys/types.h> -#include <sys/shm.h> -#include <fcntl.h> -#include <stdbool.h> -#include <linux/types.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <ctype.h> -#include <signal.h> -#include <stddef.h> -#include <errno.h> -#include <error.h> -#include <sys/mman.h> -#include <sys/time.h> -#include <sys/ioctl.h> -#include </usr/include/pthread.h> -#include <libaio.h> -#include <sys/sysinfo.h> -#include <sys/uio.h> -#include "dmaxfer.h" - -#define SEC2NSEC 1000000000 -#define SEC2USEC 1000000 - -#define DATA_VALIDATION 0 -#define MSEC2NSEC 1000000 - -struct dmaxfer_perf_handle { - int shmid; - unsigned int active_threads; - int *child_pid_lst; -}; - -struct dma_meminfo { - void *memptr; - unsigned int num_blks; -}; - -enum dmaio_direction { - DMAIO_READ, - DMAIO_WRITE, - DMAIO_RDWR, -}; - -#define USE_MEMPOOL - -struct mempool_handle { - void *mempool; - unsigned int mempool_blkidx; - unsigned int mempool_blksz; - unsigned int total_memblks; - struct dma_meminfo *mempool_info; -#ifdef DEBUG - unsigned int id; - unsigned int loop; -#endif -}; - -struct io_info { - unsigned int num_req_submitted; - unsigned int num_req_completed; - struct list_head *head; - struct list_head *tail; - sem_t llock; - int pid; - int fd; - pthread_t evt_id; - enum dmaio_direction dir; -#ifdef DEBUG - unsigned long long total_nodes; - unsigned long long freed_nodes; -#endif - unsigned int thread_id; - unsigned int max_reqs; - struct dmaxfer_io_info *dinfo; - bool io_exit; - bool force_exit; - struct timespec g_ts_start; - struct timespec ts_cur; - struct mempool_handle ctxhandle; - struct mempool_handle iocbhandle; - struct mempool_handle datahandle; -}; - -struct list_head { - struct list_head *next; - unsigned int max_events; - unsigned int completed_events; - io_context_t ctxt; -}; - -#if DATA_VALIDATION -unsigned short valid_data[2*1024]; -#endif - -static void clear_events(struct io_info *_info, struct list_head *node); -static void dump_thrd_info(struct io_info *_info) { - printf("dir = %d\n", _info->dir); -} - -static int mempool_create(struct mempool_handle *mpool, unsigned int entry_size, - unsigned int max_entries) -{ -#ifdef USE_MEMPOOL - if (posix_memalign((void **)&mpool->mempool, DMAPERF_PAGE_SIZE, - max_entries * (entry_size + sizeof(struct dma_meminfo)))) { - printf("OOM Mempool\n"); - return -ENOMEM; - } - mpool->mempool_info = (struct dma_meminfo *)(((char *)mpool->mempool) + (max_entries * entry_size)); -#endif - mpool->mempool_blksz = entry_size; - mpool->total_memblks = max_entries; - mpool->mempool_blkidx = 0; - - return 0; -} - -static void mempool_free(struct mempool_handle *mpool) -{ -#ifdef USE_MEMPOOL - free(mpool->mempool); - mpool->mempool = NULL; -#endif -} - -static void *dma_memalloc(struct mempool_handle *mpool, unsigned int num_blks) -{ - unsigned int _mempool_blkidx = mpool->mempool_blkidx; - unsigned int tmp_blkidx = _mempool_blkidx; - unsigned int max_blkcnt = tmp_blkidx + num_blks; - unsigned int i, avail = 0; - void *memptr = NULL; - char *mempool = mpool->mempool; - struct dma_meminfo *_mempool_info = mpool->mempool_info; - unsigned int _total_memblks = mpool->total_memblks; - -#ifdef USE_MEMPOOL - if (max_blkcnt > _total_memblks) { - tmp_blkidx = 0; - max_blkcnt = num_blks; - } - for (i = tmp_blkidx; (i < _total_memblks) && (i < max_blkcnt); i++) { - if (_mempool_info[i].memptr) { /* occupied blks ahead */ - i += _mempool_info[i].num_blks; - max_blkcnt = i + num_blks; - avail = 0; - tmp_blkidx = i; - } else - avail++; - if (max_blkcnt > _total_memblks) { /* reached the end of mempool. circle through*/ - if (num_blks > _mempool_blkidx) return NULL; /* Continuous num_blks not available */ - i = 0; - avail = 0; - max_blkcnt = num_blks; - tmp_blkidx = 0; - } - } - if (avail < num_blks) { /* no required available blocks */ - return NULL; - } - - memptr = &(mempool[tmp_blkidx * mpool->mempool_blksz]); - _mempool_info[tmp_blkidx].memptr = memptr; - _mempool_info[tmp_blkidx].num_blks = num_blks; - mpool->mempool_blkidx = tmp_blkidx + num_blks; -#else - memptr = calloc(num_blks, mpool->mempool_blksz); -#endif - - return memptr; -} - -static void dma_free(struct mempool_handle *mpool, void *memptr) -{ -#ifdef USE_MEMPOOL - struct dma_meminfo *_meminfo = mpool->mempool_info; - unsigned int idx; - - if (!memptr) return; - - idx = (memptr - mpool->mempool)/mpool->mempool_blksz; -#ifdef DEBUG - if (idx >= mpool->total_memblks) { - printf("Asserting: %u:Invalid memory index %u acquired\n", mpool->id, idx); - while(1); - } -#endif - - _meminfo[idx].num_blks = 0; - _meminfo[idx].memptr = NULL; -#else - free(memptr); -#endif -} - -static int dmasetio_info(struct io_info *info, struct dmaxfer_io_info *ptr, - unsigned int base, enum dmaio_direction dir) -{ - - int fd; - unsigned int flags; - - info[base].dir = dir; - info[base].dinfo = ptr; - info[base].thread_id = base; - info[base].max_reqs = ptr->max_req_outstanding; - sem_init(&info[base].llock, 0, 1); - - if (dir == DMAIO_READ) - flags = O_RDONLY | O_NONBLOCK; - else - flags = O_WRONLY | O_NONBLOCK; - - fd = open(ptr->file_name, flags); - if (fd < 0) - return fd; - info[base].fd = fd; - - return 0; -} - -static int create_thread_info(struct dmaxfer_io_info *list, - unsigned int num_entries, - unsigned int num_jobs) -{ - unsigned int base = 0; - unsigned int i, j; - struct io_info *_info; - int shmid; - - if ((shmid = shmget(IPC_PRIVATE, - num_jobs * sizeof(struct io_info), - IPC_CREAT | 0666)) < 0) - { - perror("smget returned -1\n"); - error(-1, errno, " "); - return -EINVAL; - } - - if ((_info = (struct io_info *) shmat(shmid, NULL, 0)) == (struct io_info *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - } - - for (i = 0; i < num_entries; i++) { - for (j = 0; j < list[i].num_jobs; j++) { - if ((list[i].write == DMAIO_RDWR) || - (list[i].write == DMAIO_READ)) { - dmasetio_info(_info, list + i, base, - DMAIO_READ); - base++; - } - if ((list[i].write == DMAIO_RDWR) || - (list[i].write == DMAIO_WRITE)) { - dmasetio_info(_info, list + i, base, - DMAIO_WRITE); - base++; - } - //dump_thrd_info(&_info[i]); - } - } - - if (shmdt(_info) == -1) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - return shmid; -} - -#define MAX_AIO_EVENTS 65536 - -static void list_add_tail(struct io_info *_info, struct list_head *node) -{ - sem_wait(&_info->llock); - if (_info->head == NULL) { - _info->head = node; - _info->tail = node; - } else { - _info->tail->next = node; - _info->tail = node; - } -#ifdef DEBUG - _info->total_nodes++; -#endif - sem_post( &_info->llock); -} - -static void list_add_head(struct io_info *_info, struct list_head *node) -{ - sem_wait(&_info->llock); - node->next = _info->head; - if (_info->head == NULL) { - _info->tail = node; - } - _info->head = node; - sem_post( &_info->llock); -} - -static struct list_head *list_pop(struct io_info *_info) -{ - struct list_head *node = NULL; - - sem_wait(&_info->llock); - node = _info->head; - if (_info->head == _info->tail) - _info->tail = NULL; - - if (node) - _info->head = node->next; - - sem_post(&_info->llock); - - return node; -} - -static void list_free(struct io_info *_info) -{ - struct list_head *node = NULL; - struct list_head *prev_node = NULL; - - sem_wait(&_info->llock); -#ifdef DEBUG - printf("Need to free %llu nodes in thrd%u\n", _info->total_nodes - _info->freed_nodes, _info->thread_id); -#endif - node = _info->head; - - while (node != NULL) { - clear_events(_info, node); - io_destroy(node->ctxt); - prev_node = node; - node = node->next; - dma_free(&_info->ctxhandle, prev_node); -#ifdef DEBUG - _info->freed_nodes++; -#endif - } - sem_post(&_info->llock); -} - -/* Subtract timespec t2 from t1 - * - * Both t1 and t2 must already be normalized - * i.e. 0 <= nsec < 1000000000 - */ -static int timespec_check(struct timespec *t) -{ - if ((t->tv_nsec < 0) || (t->tv_nsec >= 1000000000)) - return -1; - return 0; - -} - -void xfer_timespec_sub(struct timespec *t1, struct timespec *t2) -{ - if (timespec_check(t1) < 0) { - fprintf(stderr, "invalid time #1: %lld.%.9ld.\n", - (long long)t1->tv_sec, t1->tv_nsec); - return; - } - if (timespec_check(t2) < 0) { - fprintf(stderr, "invalid time #2: %lld.%.9ld.\n", - (long long)t2->tv_sec, t2->tv_nsec); - return; - } - t1->tv_sec -= t2->tv_sec; - t1->tv_nsec -= t2->tv_nsec; - if (t1->tv_nsec >= 1000000000) { - t1->tv_sec++; - t1->tv_nsec -= 1000000000; - } else if (t1->tv_nsec < 0) { - t1->tv_sec--; - t1->tv_nsec += 1000000000; - } -} - -static void clear_events(struct io_info *_info, struct list_head *node) { - struct io_event *events = NULL; - int num_events = 0; - unsigned int j, bufcnt; - struct timespec ts_cur = {1, 0}; - struct mempool_handle *iocbhandle; - struct mempool_handle *datahandle; - - iocbhandle = &_info->iocbhandle; - datahandle = &_info->datahandle; - - if (node->max_events <= node->completed_events) - return; -#ifdef DEBUG - printf("Thrd%u: Need to clear %u/%u events in node %p\n", - _info->thread_id, node->max_events - node->completed_events, - node->max_events, node); -#endif - events = calloc(node->max_events - node->completed_events, sizeof(struct io_event)); - if (events == NULL) { - printf("[%s] OOM\n", __func__); - return; - } - do { - num_events = io_getevents(node->ctxt, 1, - node->max_events - node->completed_events, events, - &ts_cur); - for (j = 0; (num_events > 0) && (j < num_events); j++) { - struct iocb *iocb = (struct iocb *)events[j].obj; - struct iovec *iov; - - node->completed_events++; - if (!iocb) { - printf("Error: Invalid IOCB from events\n"); - continue; - } - - iov = (struct iovec *)iocb->u.c.buf; - - for (bufcnt = 0; bufcnt < iocb->u.c.nbytes; bufcnt++) - dma_free(datahandle, iov[bufcnt].iov_base); - dma_free(iocbhandle, iocb); - } - } while ((num_events > 0) && (node->max_events > node->completed_events)); - - free(events); -} - -static void *event_mon(void *handle) -{ - unsigned int j, bufcnt; - struct io_info *_info; - struct io_event *events = NULL; - int num_events = 0; - struct timespec ts_cur = {0, 0}; -#if DATA_VALIDATION - unsigned short *rcv_data; - unsigned int k; -#endif - struct mempool_handle *ctxhandle; - struct mempool_handle *iocbhandle; - struct mempool_handle *datahandle; - - _info = (struct io_info *) handle; - - - ctxhandle = &_info->ctxhandle; - iocbhandle = &_info->iocbhandle; - datahandle = &_info->datahandle; - - events = calloc(MAX_AIO_EVENTS, sizeof(struct io_event)); - if (events == NULL) { - printf("OOM AIO_EVENTS\n"); - return NULL; - } - while (_info->io_exit == 0 && _info->force_exit == 0) { - struct list_head *node = list_pop(_info); - - if (!node) - continue; - - memset(events, 0, MAX_AIO_EVENTS * sizeof(struct io_event)); - do { - num_events = io_getevents(node->ctxt, 1, - node->max_events - node->completed_events, - events, &ts_cur); - for (j = 0; (num_events > 0) && (j < num_events); j++) { - struct iocb *iocb = (struct iocb *)events[j].obj; - struct iovec *iov = NULL; - - if (!iocb) { - printf("Error: Invalid IOCB from events\n"); - continue; - } - _info->num_req_completed += events[j].res; - - iov = (struct iovec *)(iocb->u.c.buf); - if (!iov) { - printf("invalid buffer\n"); - continue; - } -#if DATA_VALIDATION - rcv_data = iov[0].iov_base; - for (k = 0; k < (iov[0].iov_len/2) && events[j].res && !(events[j].res2); k += 8) { - printf("%04x: %04x %04x %04x %04x %04x %04x %04x %04x\n", k, - rcv_data[k], rcv_data[k+1], rcv_data[k+2], - rcv_data[k+3], rcv_data[k+4], rcv_data[k+5], - rcv_data[k+6], rcv_data[k+7]); - } -#endif - for (bufcnt = 0; (bufcnt < iocb->u.c.nbytes) && iov; bufcnt++) - dma_free(datahandle, iov[bufcnt].iov_base); - dma_free(iocbhandle, iocb); - } - if (num_events > 0) - node->completed_events += num_events; - if (node->completed_events >= node->max_events) { - io_destroy(node->ctxt); - dma_free(ctxhandle, node); - break; - } - } while ((_info->io_exit == 0) && (_info->force_exit == 0)); - - if (node->completed_events < node->max_events) - list_add_head(_info, node); - } - free(events); -#ifdef DEBUG - printf("Exiting evt_thrd: %u\n", _info->thread_id); -#endif - - return NULL; -} - -static void io_proc_cleanup(struct io_info *_info) -{ - _info->io_exit = 1; - pthread_join(_info->evt_id, NULL); - list_free(_info); - mempool_free(&_info->iocbhandle); - mempool_free(&_info->ctxhandle); - mempool_free(&_info->datahandle); - close(_info->fd); -} - -static void *io_thread(struct io_info *_info) -{ - struct dmaxfer_io_info *dinfo; - int ret; - int s; - unsigned int tsecs; - unsigned int max_io = MAX_AIO_EVENTS; - unsigned int cnt = 0; - pthread_attr_t attr; - unsigned int io_sz; - unsigned int burst_cnt; - unsigned int num_desc; - unsigned int max_reqs; - struct iocb *io_list[1]; - struct mempool_handle *ctxhandle; - struct mempool_handle *iocbhandle; - struct mempool_handle *datahandle; - - ctxhandle = &_info->ctxhandle; - iocbhandle = &_info->iocbhandle; - datahandle = &_info->datahandle; - - dinfo = _info->dinfo; - io_sz = dinfo->pkt_sz; - burst_cnt = dinfo->pkt_burst; - tsecs = dinfo->runtime; - num_desc = (io_sz + DMAPERF_PAGE_SIZE - 1) >> DMAPERF_PAGE_SHIFT; - max_reqs = _info->max_reqs; - - mempool_create(datahandle, num_desc*DMAPERF_PAGE_SIZE, - max_reqs + (burst_cnt * num_desc)); - mempool_create(ctxhandle, sizeof(struct list_head), max_reqs); - mempool_create(iocbhandle, - sizeof(struct iocb) + (burst_cnt * sizeof(struct iovec)), - max_reqs + (burst_cnt * num_desc)); -#ifdef DEBUG - ctxhandle->id = 1; - datahandle->id = 0; - iocbhandle->id = 2; -#endif - s = pthread_attr_init(&attr); - if (s != 0) - printf("pthread_attr_init failed\n"); - if (pthread_create(&_info->evt_id, &attr, event_mon, _info)) - return NULL; - - clock_gettime(CLOCK_MONOTONIC, &_info->g_ts_start); - - do { - struct list_head *node = NULL; - struct timespec ts_cur; - - if (tsecs) { - ret = clock_gettime(CLOCK_MONOTONIC, &ts_cur); - xfer_timespec_sub(&ts_cur, &_info->g_ts_start); - if (ts_cur.tv_sec >= tsecs) - break; - } - node = dma_memalloc(ctxhandle, 1); - if (!node) { - continue; - } - ret = io_queue_init(max_io, &node->ctxt); - if (ret != 0) { - printf("Error: io_setup error %d on %u\n", ret, _info->thread_id); - dma_free(ctxhandle, node); - sched_yield(); - continue; - } - cnt = 0; - node->max_events = max_io; - list_add_tail(_info, node); - do { - struct iovec *iov = NULL; - unsigned int iovcnt; - if (tsecs) { - ret = clock_gettime(CLOCK_MONOTONIC, &ts_cur); - xfer_timespec_sub(&ts_cur, &_info->g_ts_start); - if (ts_cur.tv_sec >= tsecs) { - node->max_events = cnt; - break; - } - } - - if (((_info->num_req_submitted - _info->num_req_completed) * - num_desc) > max_reqs) { - sched_yield(); - continue; - } - - io_list[0] = dma_memalloc(iocbhandle, 1); - if (io_list[0] == NULL) { - if (cnt) { - node->max_events = cnt; - break; - } - else { - sched_yield(); - continue; - } - } - iov = (struct iovec *)(io_list[0] + 1); - for (iovcnt = 0; iovcnt < burst_cnt; iovcnt++) { - iov[iovcnt].iov_base = dma_memalloc(datahandle, 1); - if (iov[iovcnt].iov_base == NULL) - break; - iov[iovcnt].iov_len = io_sz; - } - if (iovcnt == 0) { - dma_free(iocbhandle, io_list[0]); - continue; - } - if (_info->dir == DMAIO_WRITE) { -#if 0 - printf("DEBUG WRITE: _info->fd :%d iov:%d iovcnt:%d\n", - - _info->fd, iov, iovcnt); -#endif - io_prep_pwritev(io_list[0], - _info->fd, - iov, - iovcnt, - 0); - } else { - io_prep_preadv(io_list[0], - _info->fd, - iov, - iovcnt, - 0); - } - - ret = io_submit(node->ctxt, 1, io_list); - if(ret != 1) { - for (; iovcnt > 0; iovcnt--) - dma_free(datahandle, iov[iovcnt].iov_base); - dma_free(iocbhandle, io_list[0]); - node->max_events = cnt; - break; - } else { - cnt++; - _info->num_req_submitted += iovcnt; - sched_yield(); - } - } while (!_info->force_exit && (cnt < max_io)); - } while (!_info->force_exit); - io_proc_cleanup(_info); - - return _info; -} - -#ifdef DEBUG -static void dump_result(unsigned long long total_io_sz) -{ - unsigned long long gig_div = ((unsigned long long)tsecs * 1000000000); - unsigned long long meg_div = ((unsigned long long)tsecs * 1000000); - unsigned long long kil_div = ((unsigned long long)tsecs * 1000); - unsigned long long byt_div = ((unsigned long long)tsecs); - - if ((total_io_sz/gig_div)) { - printf("BW = %f GB/sec\n", ((double)total_io_sz/gig_div)); - } else if ((total_io_sz/meg_div)) { - printf("BW = %f MB/sec\n", ((double)total_io_sz/meg_div)); - } else if ((total_io_sz/kil_div)) { - printf("BW = %f KB/sec\n", ((double)total_io_sz/kil_div)); - } else - printf("BW = %f Bytes/sec\n", ((double)total_io_sz/byt_div)); -} -#endif - -int is_valid_fd(int fd) -{ - return fcntl(fd, F_GETFL) != -1 || errno != EBADF; -} - -static void cleanup(struct dmaxfer_io_info *list, - unsigned int num_entries, - unsigned int num_threads) -{ - struct io_info *info; - struct dmaxfer_io_info *dinfo; - struct dmaxfer_perf_handle *handle; - int shmid; - int i; - - if (!list || !num_entries) - return; - - handle = (struct dmaxfer_perf_handle *)list->handle; - if (!handle) - return; - - if (handle->shmid > 0) - shmid = handle->shmid; - else - return; - - if ((info = (struct io_info *)shmat(shmid, NULL, 0)) == - (struct io_info *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - return; - } - - /* accumulate the statistics */ - for (i = 0; i < num_threads; i++) { - dinfo = info[i].dinfo; - dinfo->pps += info[i].num_req_completed; - } - for (i = 0; i < num_entries; i++) { - dinfo = &list[i]; - dinfo->pps /= dinfo->runtime; - } - - if (shmdt(info) == -1) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - - if (shmctl(shmid, IPC_RMID, NULL) == -1) { - perror("shmctl returned -1\n"); - error(-1, errno, " "); - } -} - -int dmaxfer_perf_run(struct dmaxfer_io_info *list, - unsigned int num_entries) -{ - unsigned int i; - unsigned int aio_max_nr = 0xFFFFFFFF; - char aio_max_nr_cmd[100] = {'\0'}; - unsigned int num_thrds = 0; - unsigned int tot_num_jobs; - struct dmaxfer_perf_handle *handle; - struct io_info *info; - int shmid; - int base_pid; - int *child_pid_lst; - -#if DATA_VALIDATION - for (i = 0; i < 2*1024; i++) - valid_data[i] = i; -#endif - - if (!list) { - perror("Invalid configuration\n"); - return -EINVAL; - } - - - snprintf(aio_max_nr_cmd, 100, "echo %u > /proc/sys/fs/aio-max-nr", - aio_max_nr); - system(aio_max_nr_cmd); - - handle = (struct dmaxfer_perf_handle *)calloc(1, sizeof(struct dmaxfer_perf_handle)); - if (!handle) - return -ENOMEM; - - /** Validate input config and calculate SHM segments required */ - tot_num_jobs = 0; - for (i = 0; i < num_entries; i++) { - if (!list[i].file_name) { - perror("Invalid device File Name\n"); - error(-1, errno, " "); - return -EINVAL; - } - - if (list[i].num_jobs <= 0) { - perror("Invalid number of jobs at entry\n"); - return -EINVAL; - } - if (list[i].write == DMAIO_RDWR) - tot_num_jobs += list[i].num_jobs * 2; - else - tot_num_jobs += list[i].num_jobs; - list[i].handle = (unsigned long)handle; - } - - shmid = create_thread_info(list, num_entries, tot_num_jobs); - if (shmid < 0) { - printf("ERROR: Invalid SHMID\n"); - return shmid; - } - - handle->shmid = shmid; - handle->active_threads = num_thrds = tot_num_jobs; - printf("dmautils(%u) threads\n", num_thrds); - base_pid = getpid(); - if (num_thrds > 1) { - handle->child_pid_lst = child_pid_lst = calloc(num_thrds, sizeof(int)); - child_pid_lst[0] = base_pid; - for (i = 1; i < num_thrds; i++) { - if (getpid() == base_pid) - child_pid_lst[i] = fork(); - else - break; - } - } - - if ((info = (struct io_info *) shmat(shmid, NULL, 0)) == (struct io_info *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - return -EINVAL; - } - - if (getpid() == base_pid) { - info->pid = base_pid; - io_thread(info); - if (num_thrds > 1) { - for(i = 1; i < num_thrds; i++) { - waitpid(child_pid_lst[i], NULL, 0); - info[i].pid = 0; - handle->active_threads--; - } - free(handle->child_pid_lst); - handle->child_pid_lst = NULL; - } - if ((shmdt(info) == -1)) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - cleanup(list, num_entries, num_thrds); - //active_threads = 0; - } else { - info[i - 1].pid = getpid(); - io_thread(&info[i - 1]); - if ((shmdt(info) == -1)) { - perror("shmdt returned -1\n"); - error(-1, errno, " "); - } - return (i - 1); - } - - return 0; -} - -#define RW_MAX_SIZE 0x7ffff000 -static ssize_t write_from_buffer(int fd, char *buffer, uint64_t size, - uint64_t base) -{ - ssize_t rc; - uint64_t count = 0; - char *buf = buffer; - off_t offset = base; - - do { /* Support zero byte transfer */ - uint64_t bytes = size - count; - - if (bytes > RW_MAX_SIZE) - bytes = RW_MAX_SIZE; - - if (offset) { - rc = lseek(fd, offset, SEEK_SET); - if (rc < 0) { - fprintf(stderr, - "seek off 0x%lx failed %zd.\n", - offset, rc); - perror("seek file"); - return -EIO; - } - if (rc != offset) { - fprintf(stderr, - "seek off 0x%lx != 0x%lx.\n", - rc, offset); - return -EIO; - } - } - - /* write data to file from memory buffer */ - rc = write(fd, buf, bytes); - if (rc < 0) { - fprintf(stderr, "W off 0x%lx, 0x%lx failed %zd.\n", - offset, bytes, rc); - perror("write file"); - return -EIO; - } - if (rc != bytes) { - fprintf(stderr, "W off 0x%lx, 0x%lx != 0x%lx.\n", - offset, rc, bytes); - return -EIO; - } - - count += bytes; - buf += bytes; - offset += bytes; - } while (count < size); - - if (count != size) { - fprintf(stderr, "R failed 0x%lx != 0x%lx.\n", - count, size); - return -EIO; - } - - return count; -} - -static ssize_t read_to_buffer(int fd, char *buffer, uint64_t size, - uint64_t base) -{ - ssize_t rc; - uint64_t count = 0; - char *buf = buffer; - off_t offset = base; - - do { /* Support zero byte transfer */ - uint64_t bytes = size - count; - - if (bytes > RW_MAX_SIZE) - bytes = RW_MAX_SIZE; - - if (offset) { - rc = lseek(fd, offset, SEEK_SET); - if (rc < 0) { - fprintf(stderr, - "seek off 0x%lx failed %zd.\n", - offset, rc); - perror("seek file"); - return -EIO; - } - if (rc != offset) { - fprintf(stderr, - "seek off 0x%lx != 0x%lx.\n", - rc, offset); - return -EIO; - } - } - - /* read data from file into memory buffer */ - rc = read(fd, buf, bytes); - if (rc < 0) { - fprintf(stderr, - "read off 0x%lx + 0x%lx failed %zd.\n", - offset, bytes, rc); - perror("read file"); - return -EIO; - } - if (rc != bytes) { - fprintf(stderr, - "R off 0x%lx, 0x%lx != 0x%lx.\n", - count, rc, bytes); - return -EIO; - } - - count += bytes; - buf += bytes; - offset += bytes; - } while (count < size); - - if (count != size) { - fprintf(stderr, "R failed 0x%lx != 0x%lx.\n", - count, size); - return -EIO; - } - - return count; -} - -ssize_t dmaperf_asynciosubmit(int fd, char *buffer, ssize_t size, - uint64_t offset, bool write) -{ - io_context_t aioctx; - struct iocb *iocb; - struct iocb *iocbp; - struct iovec *iov; - struct io_event event; - struct timespec ts_cur = {1, 0}; - unsigned int num_events; - int ret; - - memset(&aioctx, 0, sizeof(aioctx)); - ret = io_queue_init(1, &aioctx); - if (ret != 0) { - printf("Error: io_setup error %d\n", ret); - return ret; - } - - iocb = (struct iocb *) calloc(sizeof(struct iocb), 1); - if (!iocb) { - printf("Error: OOM iocb\n"); - return -ENOMEM; - } - - if (write) - io_prep_pwrite(iocb, fd, buffer, 1, offset); - else - io_prep_pread(iocb, fd, buffer, 1, offset); - - ret = io_submit(aioctx, 1, &iocb); - if(ret != 1) { - printf("Error: io_submit failed\n"); - io_destroy(aioctx); - return ret; - } - - num_events = io_getevents(aioctx, 1, 1, - &event, &ts_cur); - - if (num_events != 1) { - printf("Error: io_getevents timed out\n"); - return -EIO; - } - - iocbp = (struct iocb *)event.obj; - if (!iocbp) { - printf("Error: Invalid IOCB from events\n"); - return -EIO; - } - - iov = (struct iovec *)(iocbp->u.c.buf); - if (!iov) { - printf("invalid buffer\n"); - return -EIO; - } - - return size; -} - -ssize_t dmaxfer_iosubmit(char *fname, unsigned char write, - enum dmaxfer_io_type io_type, char *buffer, - uint64_t size) -{ - unsigned int flags; - ssize_t count; - int fd; - unsigned int base = 0; - - if (!fname || !buffer || size == 0) { - printf("Invalid arguments\n"); - return -EINVAL; - } - - if (write) - flags = O_WRONLY | O_NONBLOCK; - else - flags = O_RDONLY | O_NONBLOCK; - - fd = open(fname, flags); - if (fd < 0) - return fd; - - if (io_type == DMAXFER_IO_SYNC) - if (write) - count = write_from_buffer(fd, buffer, size, base); - else - count = read_to_buffer(fd, buffer, size, base); - else - count = dmaperf_asynciosubmit(fd, buffer, size, base, write); - - close(fd); - - return count; -} - -void dmaxfer_perf_stop(struct dmaxfer_io_info *list, - unsigned int num_entries) -{ - struct dmaxfer_perf_handle *handle; - struct io_info *info; - int shmid; - int i; - - handle = (struct dmaxfer_perf_handle *)list->handle; - if (!handle) - return; - - if (handle->shmid <= 0) - return; - shmid = handle->shmid; - - if ((info = (struct io_info *)shmat(shmid, NULL, 0)) == (struct io_info *) -1) { - perror("Process shmat returned NULL\n"); - error(-1, errno, " "); - return; - } - - for (i = 0; i < handle->active_threads; i++) { - sem_wait(&info[i].llock); - info[i].io_exit = 1; - sem_post(&info[i].llock); - } -} diff --git a/QDMA/linux-kernel/apps/dma-utils/dmaxfer.h b/QDMA/linux-kernel/apps/dma-utils/dmaxfer.h deleted file mode 100755 index 0dda0d1..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/dmaxfer.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2019 - 2022, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef __DMAXFER_H__ -#define __DMAXFER_H__ - -#include "dmautils.h" -#define DMAPERF_PAGE_SIZE 4096 -#define DMAPERF_PAGE_SHIFT 12 - - -enum dmaxfer_io_type { - DMAXFER_IO_SYNC, - DMAXFER_IO_ASYNC -}; - -struct dmaxfer_io_info { - char *file_name; - unsigned char write; - int num_jobs; - int pkt_sz; - int pkt_burst; - int runtime; - unsigned int max_req_outstanding; - unsigned long long int pps; - int (*app_env_init)(unsigned long *handle); - int (*app_env_exit)(unsigned long *handle); - unsigned long handle; -}; - -int dmaxfer_perf_run(struct dmaxfer_io_info *list, - unsigned int num_entries); -void dmaxfer_perf_stop(struct dmaxfer_io_info *list, - unsigned int num_entries); -ssize_t dmaxfer_iosubmit(char *fname, unsigned char write, - enum dmaxfer_io_type io_type, char *buffer, - uint64_t size); -#endif /* __DMAXFER_H__ */ diff --git a/QDMA/linux-kernel/apps/dma-utils/version.h b/QDMA/linux-kernel/apps/dma-utils/version.h deleted file mode 100755 index 7e540ef..0000000 --- a/QDMA/linux-kernel/apps/dma-utils/version.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef __DMA_UTILS_VERSION_H -#define __DMA_UTILS_VERSION_H - -#define LIBNAME "dma-utils" -#define QDMATUILS_VERSION "2023.2.0" -#define COPYRIGHT "Copyright (c) 2022-2023 Advanced Micro Devices Inc." - -#endif diff --git a/QDMA/linux-kernel/apps/dma-xfer/Makefile b/QDMA/linux-kernel/apps/dma-xfer/Makefile deleted file mode 100755 index f30478a..0000000 --- a/QDMA/linux-kernel/apps/dma-xfer/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -CC ?= gcc - -CFLAGS += -g -#CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I../include -I../dma-utils -CFLAGS += $(EXTRA_FLAGS) - -DMA-XFER = dma-xfer -DMA-UTILS_OBJS := $(patsubst %.c,%.o,$(wildcard ../dma-utils/*.c)) -DMA-XFER_OBJS := dmaxfer.o -DMA-XFER_OBJS += $(DMA-UTILS_OBJS) - -ifneq ($(CROSS_COMPILE_FLAG),) - CC=$(CROSS_COMPILE_FLAG)gcc -endif - -all: clean dma-xfer - -dma-xfer: $(DMA-XFER_OBJS) - $(CC) -pthread -lrt $^ -o $(DMA-XFER) -laio -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE - -%.o: %.c - $(CC) $(CFLAGS) -c -std=c99 -o $@ $< -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_LARGE_FILE_SOURCE -D_AIO_AIX_SOURCE - -clean: - @rm -f *.o */*.o ../dma-utils/*.o - rm -rf *.o *.bin dma-xfer diff --git a/QDMA/linux-kernel/apps/dma-xfer/dmaxfer.c b/QDMA/linux-kernel/apps/dma-xfer/dmaxfer.c deleted file mode 100755 index 23945bd..0000000 --- a/QDMA/linux-kernel/apps/dma-xfer/dmaxfer.c +++ /dev/null @@ -1,1266 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/shm.h> -#include <fcntl.h> -#include <stdbool.h> -#include <linux/types.h> -#include <getopt.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <stddef.h> -#include <ctype.h> -#include <errno.h> -#include <error.h> -#include <sys/stat.h> -#include <sys/mman.h> -#include <sys/time.h> -#include <sys/ioctl.h> -#include <sys/sysinfo.h> -#include "version.h" -#include "dmautils.h" -#include "qdma_nl.h" -#include "dmaxfer.h" - -#define QDMA_Q_NAME_LEN 100 -#define QDMA_ST_MAX_PKT_SIZE 0x7000 -#define QDMA_RW_MAX_SIZE 0x7ffff000 -#define QDMA_GLBL_MAX_ENTRIES (16) - -static struct queue_info *q_info; -static int q_count; - -enum qdma_q_dir { - QDMA_Q_DIR_H2C, - QDMA_Q_DIR_C2H, - QDMA_Q_DIR_BIDI -}; - -enum qdma_q_mode { - QDMA_Q_MODE_MM, - QDMA_Q_MODE_ST -}; - -struct queue_info { - char *q_name; - int qid; - int pf; - enum qdmautils_io_dir dir; -}; - -enum qdma_q_mode mode; -enum qdma_q_dir dir; -static char cfg_name[64]; -static unsigned int pkt_sz; -static unsigned int pci_bus; -static unsigned int pci_dev; -static int fun_id = -1; -static int is_vf; -static unsigned int q_start; -static unsigned int num_q; -static unsigned int idx_rngsz; -static unsigned int idx_tmr; -static unsigned int idx_cnt; -static unsigned int pfetch_en; -static unsigned int cmptsz; -static char input_file[128]; -static char output_file[128]; -static int io_type; -static char trigmode_str[10]; -static unsigned char trig_mode; - -static struct option const long_opts[] = { - {"config", required_argument, NULL, 'c'}, - {0, 0, 0, 0} -}; - -static void prep_reg_dump(void); - -static void usage(const char *name) -{ - fprintf(stdout, "%s\n\n", name); - fprintf(stdout, "usage: %s [OPTIONS]\n\n", name); - - fprintf(stdout, " -%c (--%s) config file that has configration for IO\n", - long_opts[0].val, long_opts[0].name); - fprintf(stdout, " -v (--version), to print version name\n"); -} - -static unsigned int num_trailing_blanks(char *word) -{ - unsigned int i = 0; - unsigned int slen = strlen(word); - - if (!slen) return 0; - while (isspace(word[slen - i - 1])) { - i++; - } - - return i; -} - -static char * strip_blanks(char *word, long unsigned int *banlks) -{ - char *p = word; - unsigned int i = 0; - - while (isblank(p[0])) { - p++; - i++; - } - if (banlks) - *banlks = i; - - return p; -} - -static unsigned int copy_value(char *src, char *dst, unsigned int max_len) -{ - char *p = src; - unsigned int i = 0; - - while (max_len && !isspace(p[0])) { - dst[i] = p[0]; - p++; - i++; - max_len--; - } - - return i; -} - -static char * strip_comments(char *word) -{ - size_t numblanks; - char *p = strip_blanks(word, &numblanks); - - if (p[0] == '#') - return NULL; - else - p = strtok(word, "#"); - - return p; -} - -static int arg_read_int(char *s, uint32_t *v) -{ - char *p = NULL; - - - *v = strtoul(s, &p, 0); - if (*p && (*p != '\n') && !isblank(*p)) { - printf("Error:something not right%s %s %s", - s, p, isblank(*p)? "true": "false"); - return -EINVAL; - } - return 0; -} - -static int arg_read_int_array(char *s, unsigned int *v, unsigned int max_arr_size) -{ - unsigned int slen = strlen(s); - unsigned int trail_blanks = num_trailing_blanks(s); - char *str = (char *)malloc(slen - trail_blanks + 1); - char *elem; - int cnt = 0; - int ret; - - memset(str, '\0', slen + 1); - strncpy(str, s + 1, slen - trail_blanks - 2); - str[slen] = '\0'; - - elem = strtok(str, " ,");/* space or comma separated */ - while (elem != NULL) { - ret = arg_read_int(elem, &v[cnt]); - if (ret < 0) { - printf("ERROR: Invalid array element %sin %s\n", elem, s); - exit(0); - } - cnt++; - elem = strtok(NULL, " ,"); - if (cnt > (int)max_arr_size) { /* to avoid out of bounds */ - printf("ERROR: More than expected number of elements in %s - expected = %u\n", - str, max_arr_size); - exit(0); - } - } - free(str); - - return cnt; -} - -static int get_array_len(char *s) -{ - int i, len = 0; - - if (strlen(s) < 2) - return -EINVAL; - if ((s[0] != '(') && (s[strlen(s) - 1] != ')')) - return -EINVAL; - if ((s[0] == '(') && (s[1] == ')')) - return 0; - for (i = 0; i < (int)strlen(s); i++) { - if ((s[i] == ' ') || (s[i] == ',')) /* space or comma separated */ - len++; - if (s[i] == ')') - break; - } - - return (len + 1); - -} - -static ssize_t read_to_buffer(char *fname, int fd, char *buffer, - uint64_t size, uint64_t base) -{ - ssize_t rc; - uint64_t count = 0; - char *buf = buffer; - off_t offset = base; - - do { /* Support zero byte transfer */ - uint64_t bytes = size - count; - - if (bytes > QDMA_RW_MAX_SIZE) - bytes = QDMA_RW_MAX_SIZE; - - if (offset) { - rc = lseek(fd, offset, SEEK_SET); - if (rc < 0) { - printf("Error: %s, seek off 0x%lx failed %zd\n", - fname, offset, rc); - return -EIO; - } - if (rc != offset) { - printf("Error: %s, seek off 0x%lx != 0x%lx\n", - fname, rc, offset); - return -EIO; - } - } - - /* read data from file into memory buffer */ - rc = read(fd, buf, bytes); - if (rc < 0) { - printf("Failed to Read %s, read off 0x%lx + 0x%lx failed %zd\n", - fname, offset, bytes, rc); - return -EIO; - } - if (rc != bytes) { - printf("Failed to read %lx bytes from file %s, curr read:%lx\n", - bytes, fname, rc); - return -EIO; - } - - count += bytes; - buf += bytes; - offset += bytes; - - } while (count < size); - - if (count != size) { - printf("Failed to read %lx bytes from %s 0x%lx != 0x%lx.\n", - size, fname, count, size); - return -EIO; - } - - return count; -} - -static ssize_t write_from_buffer(char *fname, int fd, char *buffer, - uint64_t size, uint64_t base) -{ - ssize_t rc; - uint64_t count = 0; - char *buf = buffer; - off_t offset = base; - - do { /* Support zero byte transfer */ - uint64_t bytes = size - count; - - if (bytes > QDMA_RW_MAX_SIZE) - bytes = QDMA_RW_MAX_SIZE; - - if (offset) { - rc = lseek(fd, offset, SEEK_SET); - if (rc < 0) { - printf("Error: %s, seek off 0x%lx failed %zd\n", - fname, offset, rc); - return -EIO; - } - if (rc != offset) { - printf("Error: %s, seek off 0x%lx != 0x%lx\n", - fname, rc, offset); - return -EIO; - } - } - - /* write data to file from memory buffer */ - rc = write(fd, buf, bytes); - if (rc < 0) { - printf("Failed to Read %s, read off 0x%lx + 0x%lx failed %zd\n", - fname, offset, bytes, rc); - return -EIO; - } - if (rc != bytes) { - printf("Failed to read %lx bytes from file %s, curr read:%lx\n", - bytes, fname, rc); - return -EIO; - } - - count += bytes; - buf += bytes; - offset += bytes; - - } while (count < size); - - if (count != size) { - printf("Failed to read %lx bytes from %s 0x%lx != 0x%lx\n", - size, fname, count, size); - return -EIO; - } - - return count; -} - -static int parse_config_file(const char *cfg_fname) -{ - char *linebuf = NULL; - char *realbuf; - FILE *fp; - size_t linelen = 0; - size_t numread; - size_t numblanks; - unsigned int linenum = 0; - char *config, *value; - unsigned int dir_factor = 1; - char rng_sz[100] = {'\0'}; - char rng_sz_path[200] = {'\0'}; - int rng_sz_fd, ret = 0; - int input_file_provided = 0; - int output_file_provided = 0; - struct stat st; - - fp = fopen(cfg_fname, "r"); - if (fp == NULL) { - printf("Failed to open Config File [%s]\n", cfg_fname); - return -EINVAL; - } - - while ((numread = getline(&linebuf, &linelen, fp)) != -1) { - numread--; - linenum++; - linebuf = strip_comments(linebuf); - if (linebuf == NULL) - continue; - realbuf = strip_blanks(linebuf, &numblanks); - linelen -= numblanks; - if (0 == linelen) - continue; - config = strtok(realbuf, "="); - value = strtok(NULL, "="); - if (!strncmp(config, "mode", 4)) { - if (!strncmp(value, "mm", 2)) - mode = QDMA_Q_MODE_MM; - else if(!strncmp(value, "st", 2)) - mode = QDMA_Q_MODE_ST; - else { - printf("Error: Unknown mode\n"); - goto prase_cleanup; - } - } else if (!strncmp(config, "dir", 3)) { - if (!strncmp(value, "h2c", 3)) - dir = QDMA_Q_DIR_H2C; - else if(!strncmp(value, "c2h", 3)) - dir = QDMA_Q_DIR_C2H; - else if(!strncmp(value, "bi", 2)) - dir = QDMA_Q_DIR_BIDI; - else if(!strncmp(value, "cmpt", 4)) { - printf("Error: cmpt type queue validation is not supported\n"); - goto prase_cleanup; - } else { - printf("Error: Unknown direction\n"); - goto prase_cleanup; - } - } else if (!strncmp(config, "name", 3)) { - copy_value(value, cfg_name, 64); - } else if (!strncmp(config, "function", 8)) { - if (arg_read_int(value, &fun_id)) { - printf("Error: Invalid function:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "is_vf", 5)) { - if (arg_read_int(value, &is_vf)) { - printf("Error: Invalid is_vf param:%s\n", value); - goto prase_cleanup; - } - if (is_vf > 1) { - printf("Error: is_vf value is %d, expected 0 or 1\n", - is_vf); - goto prase_cleanup; - } - } else if (!strncmp(config, "q_range", 7)) { - char *q_range_start = strtok(value, ":"); - char *q_range_end = strtok(NULL, ":"); - unsigned int start; - unsigned int end; - if (arg_read_int(q_range_start, &start)) { - printf("Error: Invalid q range start:%s\n", q_range_start); - goto prase_cleanup; - } - if (arg_read_int(q_range_end, &end)) { - printf("Error: Invalid q range end:%s\n", q_range_end); - goto prase_cleanup; - } - - q_start = start; - num_q = end - start + 1; - } else if (!strncmp(config, "rngidx", 6)) { - if (arg_read_int(value, &idx_rngsz)) { - printf("Error: Invalid idx_rngsz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "tmr_idx", 7)) { - if (arg_read_int(value, &idx_tmr)) { - printf("Error: Invalid idx_tmr:%s\n", value); - goto prase_cleanup; - } - } - if (!strncmp(config, "cntr_idx", 8)) { - if (arg_read_int(value, &idx_cnt)) { - printf("Error: Invalid idx_cnt:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pfetch_en", 9)) { - if (arg_read_int(value, &pfetch_en)) { - printf("Error: Invalid pfetch_en:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "cmptsz", 5)) { - if (arg_read_int(value, &cmptsz)) { - printf("Error: Invalid cmptsz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "trig_mode", 9)) { - copy_value(value, trigmode_str, 10); - } else if (!strncmp(config, "pkt_sz", 6)) { - if (arg_read_int(value, &pkt_sz)) { - printf("Error: Invalid pkt_sz:%s\n", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pci_bus", 7)) { - char *p; - - pci_bus = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "pci_dev", 7)) { - char *p; - - pci_dev = strtoul(value, &p, 16); - if (*p && (*p != '\n')) { - printf("Error: bad parameter \"%s\", integer expected", value); - goto prase_cleanup; - } - } else if (!strncmp(config, "inputfile", 7)) { - copy_value(value, input_file, 128); - input_file_provided = 1; - } else if (!strncmp(config, "outputfile", 7)) { - copy_value(value, output_file, 128); - output_file_provided = 1; - } else if (!strncmp(config, "io_type", 6)) { - if (!strncmp(value, "io_sync", 6)) - io_type = 0; - else if (!strncmp(value, "io_async", 6)) - io_type = 1; - else { - printf("Error: Unknown io_type\n"); - goto prase_cleanup; - } - } - } - fclose(fp); - - if (!pci_bus && !pci_dev) { - printf("Error: PCI bus information not provided\n"); - return -EINVAL; - } - - if (fun_id < 0) { - printf("Error: Valid function required\n"); - return -EINVAL; - } - - if (fun_id <= 3 && is_vf) { - printf("Error: invalid is_vf and fun_id values." - "Fun_id for vf must be higer than 3\n"); - return -EINVAL; - } - - if (mode == QDMA_Q_MODE_ST && pkt_sz > QDMA_ST_MAX_PKT_SIZE) { - printf("Error: Pkt size [%u] larger than supported size [%d]\n", - pkt_sz, QDMA_ST_MAX_PKT_SIZE); - return -EINVAL; - } - - if ((dir == QDMA_Q_DIR_H2C) || (dir == QDMA_Q_DIR_BIDI)) { - if (!input_file_provided) { - printf("Error: Input File required for Host to Card transfers\n"); - return -EINVAL; - } - - ret = stat(input_file, &st); - if (ret < 0) { - printf("Error: Failed to read input file [%s] length\n", - input_file); - return ret; - } - - if (pkt_sz > st.st_size) { - printf("Error: File [%s] length is lesser than pkt_sz %u\n", - input_file, pkt_sz); - return -EINVAL; - } - } - - if (((dir == QDMA_Q_DIR_C2H) || (dir == QDMA_Q_DIR_BIDI)) && - !output_file_provided) { - printf("Error: Data output file was not provided\n"); - return -EINVAL; - } - - if (!strcmp(trigmode_str, "every")) - trig_mode = 1; - else if (!strcmp(trigmode_str, "usr_cnt")) - trig_mode = 2; - else if (!strcmp(trigmode_str, "usr")) - trig_mode = 3; - else if (!strcmp(trigmode_str, "usr_tmr")) - trig_mode=4; - else if (!strcmp(trigmode_str, "cntr_tmr")) - trig_mode=5; - else if (!strcmp(trigmode_str, "dis")) - trig_mode = 0; - else { - printf("Error: unknown q trigmode %s.\n", trigmode_str); - return -EINVAL; - } - - return 0; - -prase_cleanup: - fclose(fp); - return -EINVAL; -} - -static inline void qdma_q_prep_name(struct queue_info *q_info, int qid, int pf) -{ - q_info->q_name = calloc(QDMA_Q_NAME_LEN, 1); - snprintf(q_info->q_name, QDMA_Q_NAME_LEN, "/dev/qdma%s%05x-%s-%d", - (is_vf) ? "vf" : "", - (pci_bus << 12) | (pci_dev << 4) | pf, - (mode == QDMA_Q_MODE_MM) ? "MM" : "ST", - qid); -} - -static int qdma_validate_qrange(void) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - xcmd.op = XNL_CMD_DEV_INFO; - xcmd.vf = is_vf; - xcmd.if_bdf = (pci_bus << 12) | (pci_dev << 4) | fun_id; - - /* Get dev info from qdma driver */ - ret = qdma_dev_info(&xcmd); - if (ret < 0) { - printf("Failed to read qmax for PF: %d\n", fun_id); - return ret; - } - - if (!xcmd.resp.dev_info.qmax) { - printf("Error: invalid qmax assigned to function :%d qmax :%u\n", - fun_id, xcmd.resp.dev_info.qmax); - return -EINVAL; - } - - if (xcmd.resp.dev_info.qmax < num_q) { - printf("Error: Q Range is beyond QMAX %u " - "Funtion: %x Q start :%u Q Range End :%u\n", - xcmd.resp.dev_info.qmax, fun_id, q_start, q_start + num_q); - return -EINVAL; - } - - return 0; -} - -static int qdma_prepare_q_stop(struct xcmd_info *xcmd, - enum qdmautils_io_dir dir, - int qid, int pf) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) - return -EINVAL; - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_STOP; - xcmd->vf = is_vf; - xcmd->if_bdf = (pci_bus << 12) | (pci_dev << 4) | pf; - qparm->idx = qid; - qparm->num_q = 1; - - if (mode == QDMA_Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (mode == QDMA_Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else - return -EINVAL; - - if (dir == DMAXFER_IO_WRITE) - qparm->flags |= XNL_F_QDIR_H2C; - else if (dir == DMAXFER_IO_READ) - qparm->flags |= XNL_F_QDIR_C2H; - else - return -EINVAL; - - - return 0; -} - -static int qdma_prepare_q_start(struct xcmd_info *xcmd, - enum qdmautils_io_dir dir, - int qid, int pf) -{ - struct xcmd_q_parm *qparm; - - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_START; - xcmd->vf = is_vf; - xcmd->if_bdf = (pci_bus << 12) | (pci_dev << 4) | pf; - qparm->idx = qid; - qparm->num_q = 1; - - if (mode == QDMA_Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (mode == QDMA_Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else { - printf("Error: Invalid mode\n"); - return -EINVAL; - } - - if (dir == DMAXFER_IO_WRITE) - qparm->flags |= XNL_F_QDIR_H2C; - else if (dir == DMAXFER_IO_READ) - qparm->flags |= XNL_F_QDIR_C2H; - else { - printf("Error: Invalid Direction\n"); - return -EINVAL; - } - - qparm->qrngsz_idx = idx_rngsz; - - if ((dir == QDMA_Q_DIR_C2H) && (mode == QDMA_Q_MODE_ST)) { - if (cmptsz) - qparm->cmpt_entry_size = cmptsz; - else - qparm->cmpt_entry_size = XNL_ST_C2H_CMPT_DESC_SIZE_8B; - qparm->cmpt_tmr_idx = idx_tmr; - qparm->cmpt_cntr_idx = idx_cnt; - qparm->cmpt_trig_mode = trig_mode; - if (pfetch_en) - qparm->flags |= XNL_F_PFETCH_EN; - } - - qparm->flags |= (XNL_F_CMPL_STATUS_EN | XNL_F_CMPL_STATUS_ACC_EN | - XNL_F_CMPL_STATUS_PEND_CHK | XNL_F_CMPL_STATUS_DESC_EN | - XNL_F_FETCH_CREDIT); - - return 0; -} - -static int qdma_prepare_q_del(struct xcmd_info *xcmd, - enum qdmautils_io_dir dir, - int qid, int pf) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_DEL; - xcmd->vf = is_vf; - xcmd->if_bdf = (pci_bus << 12) | (pci_dev << 4) | pf; - qparm->idx = qid; - qparm->num_q = 1; - - if (mode == QDMA_Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (mode == QDMA_Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else { - printf("Error: Invalid mode\n"); - return -EINVAL; - } - - if (dir == DMAXFER_IO_WRITE) - qparm->flags |= XNL_F_QDIR_H2C; - else if (dir == DMAXFER_IO_READ) - qparm->flags |= XNL_F_QDIR_C2H; - else { - printf("Error: Invalid Direction\n"); - return -EINVAL; - } - - return 0; -} - -static int qdma_prepare_q_add(struct xcmd_info *xcmd, - enum qdmautils_io_dir dir, - int qid, int pf) -{ - struct xcmd_q_parm *qparm; - - if (!xcmd) { - printf("Error: Invalid Input Param\n"); - return -EINVAL; - } - - qparm = &xcmd->req.qparm; - - xcmd->op = XNL_CMD_Q_ADD; - xcmd->vf = is_vf; - xcmd->if_bdf = (pci_bus << 12) | (pci_dev << 4) | pf; - qparm->idx = qid; - qparm->num_q = 1; - - if (mode == QDMA_Q_MODE_MM) - qparm->flags |= XNL_F_QMODE_MM; - else if (mode == QDMA_Q_MODE_ST) - qparm->flags |= XNL_F_QMODE_ST; - else { - printf("Error: Invalid mode\n"); - return -EINVAL; - } - if (dir == DMAXFER_IO_WRITE) - qparm->flags |= XNL_F_QDIR_H2C; - else if (dir == DMAXFER_IO_READ) - qparm->flags |= XNL_F_QDIR_C2H; - else { - printf("Error: Invalid Direction\n"); - return -EINVAL; - } - qparm->sflags = qparm->flags; - - return 0; -} - -static int qdma_destroy_queue(enum qdmautils_io_dir dir, - int qid, int pf) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_stop(&xcmd, dir, qid, pf); - if (ret < 0) - return ret; - - ret = qdma_q_stop(&xcmd); - if (ret < 0) - printf("Q_STOP failed, ret :%d\n", ret); - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - qdma_prepare_q_del(&xcmd, dir, qid, pf); - ret = qdma_q_del(&xcmd); - if (ret < 0) - printf("Q_DEL failed, ret :%d\n", ret); - - return ret; -} - -static int qdma_create_queue(enum qdmautils_io_dir dir, - int qid, int pf) -{ - struct xcmd_info xcmd; - int ret; - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_add(&xcmd, dir, qid, pf); - if (ret < 0) - return ret; - - ret = qdma_q_add(&xcmd); - if (ret < 0) { - printf("Q_ADD failed, ret :%d\n", ret); - return ret; - } - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - ret = qdma_prepare_q_start(&xcmd, dir, qid, pf); - if (ret < 0) - return ret; - - ret = qdma_q_start(&xcmd); - if (ret < 0) { - printf("Q_START failed, ret :%d\n", ret); - qdma_prepare_q_del(&xcmd, dir, qid, pf); - qdma_q_del(&xcmd); - } - - return ret; -} - -static int qdma_prepare_queue(struct queue_info *q_info, - enum qdmautils_io_dir dir, int qid, int pf) -{ - int ret; - - if (!q_info) { - printf("Error: Invalid queue info\n"); - return -EINVAL; - } - - qdma_q_prep_name(q_info, qid, pf); - q_info->dir = dir; - ret = qdma_create_queue(q_info->dir, qid, pf); - if (ret < 0) { - printf("Q creation Failed PF:%d QID:%d\n", - pf, qid); - return ret; - } - q_info->qid = qid; - q_info->pf = pf; - - return ret; -} - -static int qdma_register_write(unsigned int pf, int bar, - unsigned long reg, unsigned long value) -{ - struct xcmd_info xcmd; - struct xcmd_reg *regcmd; - int ret; - regcmd = &xcmd.req.reg; - xcmd.op = XNL_CMD_REG_WRT; - xcmd.vf = is_vf; - xcmd.if_bdf = (pci_bus << 12) | (pci_dev << 4) | pf; - regcmd->bar = bar; - regcmd->reg = reg; - regcmd->val = value; - regcmd->sflags = XCMD_REG_F_BAR_SET | - XCMD_REG_F_REG_SET | - XCMD_REG_F_VAL_SET; - - ret = qdma_reg_write(&xcmd); - if (ret < 0) - printf("QDMA_REG_WRITE Failed, ret :%d\n", ret); - - return ret; -} - -static void qdma_queues_cleanup(struct queue_info *q_info, int q_count) -{ - unsigned int q_index; - - if (!q_info || q_count < 0) - return; - - for (q_index = 0; q_index < q_count; q_index++) { - qdma_destroy_queue(q_info[q_index].dir, - q_info[q_index].qid, - q_info[q_index].pf); - free(q_info[q_index].q_name); - } -} - -static int qdma_setup_queues(struct queue_info **pq_info) -{ - struct queue_info *q_info; - unsigned int qid; - unsigned int q_count; - unsigned int q_index; - int ret; - - if (!pq_info) { - printf("Error: Invalid queue info\n"); - return -EINVAL; - } - - if (dir == QDMA_Q_DIR_BIDI) - q_count = num_q * 2; - else - q_count = num_q; - - *pq_info = q_info = (struct queue_info *)calloc(q_count, sizeof(struct queue_info)); - if (!q_info) { - printf("Error: OOM\n"); - return -ENOMEM; - } - - q_index = 0; - for (qid = 0; qid < num_q; qid++) { - if ((dir == QDMA_Q_DIR_BIDI) || - (dir == QDMA_Q_DIR_H2C)) { - ret = qdma_prepare_queue(q_info + q_index, - DMAXFER_IO_WRITE, - qid + q_start, - fun_id); - if (ret < 0) - break; - q_index++; - } - if ((dir == QDMA_Q_DIR_BIDI) || - (dir == QDMA_Q_DIR_C2H)) { - ret = qdma_prepare_queue(q_info + q_index, - DMAXFER_IO_READ, - qid + q_start, - fun_id); - if (ret < 0) - break; - q_index++; - } - } - if (ret < 0) { - qdma_queues_cleanup(q_info, q_index); - return ret; - } - - return q_count; -} - - -static void qdma_env_cleanup() -{ - qdma_queues_cleanup(q_info, q_count); - - if (q_info) - free(q_info); - q_info = NULL; - q_count = 0; -} - -static int qdma_trigger_data_generator(struct queue_info *q_info) -{ - struct xcmd_info xcmd; - unsigned char user_bar; - unsigned int qbase; - int ret; - - if (!q_info) { - printf("Error: Invalid queue info\n"); - return -EINVAL; - } - - memset(&xcmd, 0, sizeof(struct xcmd_info)); - xcmd.op = XNL_CMD_DEV_INFO; - xcmd.vf = is_vf; - xcmd.if_bdf = (pci_bus << 12) | (pci_dev << 4) | q_info->pf; - - ret = qdma_dev_info(&xcmd); - if (ret < 0) { - printf("Failed to read qmax for PF: %d\n", q_info->pf); - return ret; - } - - user_bar = xcmd.resp.dev_info.user_bar; - qbase = xcmd.resp.dev_info.qbase; - - /* Disable DMA Bypass */ - ret = qdma_register_write(q_info->pf, user_bar, 0x90, 0); - if (ret < 0) { - printf("Failed to program HWQID PF :%d QID :%d\n", - q_info->pf, q_info->qid); - return ret; - } - - /* Program HW QID */ - ret = qdma_register_write(q_info->pf, user_bar, 0x0, - q_info->qid + qbase); - if (ret < 0) { - printf("Failed to program HWQID PF :%d QID :%d\n", - q_info->pf, q_info->qid); - } - - /* Set the transfer size to data generator */ - ret = qdma_register_write(q_info->pf, user_bar, 0x04, - pkt_sz); - if (ret < 0) { - printf("Failed to set transfer size PF :%d QID :%d\n", - q_info->pf, q_info->qid); - } - - /* num packets to generate, setting to 1 */ - ret = qdma_register_write(q_info->pf, user_bar, 0x20, - 1); - if (ret < 0) { - printf("Failed to set transfer size PF :%d QID :%d\n", - q_info->pf, q_info->qid); - } - - /* trigger data generator */ - ret = qdma_register_write(q_info->pf, user_bar, 0x08, - 2); - if (ret < 0) { - printf("Failed to set transfer size PF :%d QID :%d\n", - q_info->pf, q_info->qid); - } - - return 0; -} - -static int qdmautils_read(struct queue_info *q_info, - char *output_file, int io_type) -{ - int outfile_fd = -1; - char *buffer = NULL; - char *allocated = NULL; - unsigned int size; - unsigned int offset; - int ret; - - if (!q_info || !input_file) { - printf("Error: Invalid input params\n"); - return -EINVAL; - } - - size = pkt_sz; - - outfile_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC); - if (outfile_fd < 0) { - printf("Error: unable to open/create output file %s, ret :%d\n", - output_file, outfile_fd); - perror("open/create output file"); - return outfile_fd; - } - - offset = 0; - posix_memalign((void **)&allocated, 4096 /*alignment */ , size + 4096); - if (!allocated) { - printf("Error: OOM %u.\n", size + 4096); - ret = -ENOMEM; - goto out; - } - buffer = allocated + offset; - - if (io_type == 0) { - ret = qdmautils_sync_xfer(q_info->q_name, - q_info->dir, buffer, size); - if (ret < 0) - printf("Error: QDMA SYNC transfer Failed, ret :%d\n", ret); - else - printf("PF :%d Queue :%d C2H Sync transfer success\n", q_info->pf, q_info->qid); - } else { - ret = qdmautils_async_xfer(q_info->q_name, - q_info->dir, buffer, size); - if (ret < 0) - printf("Error: QDMA ASYNC transfer Failed, ret :%d\n", ret); - else - printf("PF :%d Queue :%d C2H ASync transfer success\n", q_info->pf, q_info->qid); - } - if (ret < 0) - goto out; - - ret = write_from_buffer(output_file, outfile_fd, buffer, size, offset); - if (ret < 0) - printf("Error: Write from buffer to %s failed\n", output_file); -out: - free(allocated); - close(outfile_fd); - - return ret; -} - -static int qdmautils_write(struct queue_info *q_info, - char *input_file, int io_type) -{ - int infile_fd = -1; - int outfile_fd = -1; - char *buffer = NULL; - char *allocated = NULL; - unsigned int size; - unsigned int offset; - int ret; - enum qdmautils_io_dir dir; - - if (!q_info || !input_file) { - printf("Error: Invalid input params\n"); - return -EINVAL; - } - - size = pkt_sz; - - infile_fd = open(input_file, O_RDONLY | O_NONBLOCK); - if (infile_fd < 0) { - printf("Error: unable to open input file %s, ret :%d\n", - input_file, infile_fd); - return infile_fd; - } - - offset = 0; - posix_memalign((void **)&allocated, 4096 /*alignment */ , size + 4096); - if (!allocated) { - printf("Error: OOM %u.\n", size + 4096); - ret = -ENOMEM; - goto out; - } - - buffer = allocated + offset; - ret = read_to_buffer(input_file, infile_fd, buffer, size, 0); - if (ret < 0) - goto out; - - if (io_type == 0) { - ret = qdmautils_sync_xfer(q_info->q_name, - q_info->dir, buffer, size); - if (ret < 0) - printf("Error: QDMA SYNC transfer Failed, ret :%d\n", ret); - else - printf("PF :%d Queue :%d H2C Sync transfer success\n", q_info->pf, q_info->qid); - } else { - ret = qdmautils_async_xfer(q_info->q_name, - q_info->dir, buffer, size); - if (ret < 0) - printf("Error: QDMA ASYNC transfer Failed, ret :%d\n", ret); - else - printf("PF :%d Queue :%d H2C Async transfer success\n", q_info->pf, q_info->qid); - } - -out: - free(allocated); - close(infile_fd); - - return ret; -} - -static int qdmautils_xfer(struct queue_info *q_info, - unsigned int count, int io_type) -{ - int ret; - int i; - - if (!q_info || count == 0) { - printf("Error: Invalid input params\n"); - return -EINVAL; - } - - for (i = 0; i < count; i++) { - if (q_info[i].dir == DMAXFER_IO_WRITE) { - /* Transfer DATA from inputfile to Device */ - ret = qdmautils_write(q_info + i, input_file, io_type); - if (ret < 0) - printf("qdmautils_write failed, ret :%d\n", ret); - } else { - if (mode == QDMA_Q_MODE_ST) { - /* Generate ST - C2H Data before trying to read from Card */ - ret = qdma_trigger_data_generator(q_info + i); - if (ret < 0) { - printf("Failed to trigger data generator\n"); - return ret; - } - } - /* Reads data from Device and writes into output file */ - ret = qdmautils_read(q_info + i, output_file, io_type); - if (ret < 0) - printf("qdmautils_read failed, ret :%d\n", ret); - } - - if (ret < 0) - break; - } - - return ret; -} - -int main(int argc, char *argv[]) -{ - char *cfg_fname; - int cmd_opt; - int ret; - - if (argc == 2) { - if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) { - printf("%s version %s\n", PROGNAME, VERSION); - printf("%s\n", COPYRIGHT); - return 0; - } - } - - cfg_fname = NULL; - while ((cmd_opt = getopt_long(argc, argv, "vhxc:c:", long_opts, - NULL)) != -1) { - switch (cmd_opt) { - case 0: - /* long option */ - break; - case 'c': - /* config file name */ - cfg_fname = strdup(optarg); - break; - default: - usage(argv[0]); - exit(0); - break; - } - } - - if (cfg_fname == NULL) { - printf("Config file required.\n"); - usage(argv[0]); - return -EINVAL; - } - - ret = parse_config_file(cfg_fname); - if (ret < 0) { - printf("Config File has invalid parameters\n"); - return ret; - } - - ret = qdma_validate_qrange(); - if (ret < 0) - return ret; - - q_count = 0; - /* Addition and Starting of queues handled here */ - q_count = qdma_setup_queues(&q_info); - if (q_count < 0) { - printf("qdma_setup_queues failed, ret:%d\n", q_count); - return q_count; - } - - /* queues has to be deleted upon termination */ - atexit(qdma_env_cleanup); - /* Perform DMA transfers on each Queue */ - ret = qdmautils_xfer(q_info, q_count, io_type); - if (ret < 0) - printf("Qdmautils Transfer Failed, ret :%d\n", ret); - - return ret; -} diff --git a/QDMA/linux-kernel/apps/dma-xfer/sample_qdma_xfer_config.txt b/QDMA/linux-kernel/apps/dma-xfer/sample_qdma_xfer_config.txt deleted file mode 100755 index d4a2c82..0000000 --- a/QDMA/linux-kernel/apps/dma-xfer/sample_qdma_xfer_config.txt +++ /dev/null @@ -1,30 +0,0 @@ -# -#/* -# * This file is part of the QDMA userspace application -# * to enable the user to execute the QDMA functionality -# * -# * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is licensed under BSD-style license (found in the -# * LICENSE file in the root directory of this source tree) -# */ - -name=mm_sample -pci_bus=d8 -pci_device=00 -function=0 #fun_id -is_vf=0 -mode=mm #mode -dir=bi #dir -q_range=0:0 #no spaces -tmr_idx=6 -cntr_idx=6 -cmptsz=0 -trig_mode=cntr_tmr -pfetch_en=0 -rngidx=0 -pkt_sz=1024 -io_type=io_async -inputfile=INPUT -outputfile=OUTPUT diff --git a/QDMA/linux-kernel/apps/dma-xfer/version.h b/QDMA/linux-kernel/apps/dma-xfer/version.h deleted file mode 100755 index 31e8654..0000000 --- a/QDMA/linux-kernel/apps/dma-xfer/version.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * This file is part of the QDMA userspace application - * to enable the user to execute the QDMA functionality - * - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ -#ifndef __DMA_XFER_VERSION_H -#define __DMA_XFER_VERSION_H - -#define PROGNAME "dma-xfer" -#define VERSION "2023.2.0" -#define COPYRIGHT "Copyright (c) 2022-2023 Advanced Micro Devices Inc." - -#endif diff --git a/QDMA/linux-kernel/apps/include/qdma_nl.h b/QDMA/linux-kernel/apps/include/qdma_nl.h deleted file mode 100755 index fd8b43c..0000000 --- a/QDMA/linux-kernel/apps/include/qdma_nl.h +++ /dev/null @@ -1,480 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - -#ifndef QDMA_NL_H__ -#define QDMA_NL_H__ -/** - * @file - * @brief This file contains the declarations for qdma netlink interfaces - * - ** physical function name (no more than 15 characters) */ -#define XNL_NAME_PF "xnl_pf" -/** virtual function name */ -#define XNL_NAME_VF "xnl_vf" -/** qdma netlink interface version number */ -#define XNL_VERSION 0x1 - -/** qdma nl interface minimum response buffer length*/ -#define XNL_RESP_BUFLEN_MIN 256 -/** qdma nl interface maximum response buffer length*/ -#define XNL_RESP_BUFLEN_MAX (2048 * 10) -/** qdma nl interface error buffer length*/ -#define XNL_ERR_BUFLEN 64 -/** qdma nl command parameter length*/ -#define XNL_STR_LEN_MAX 20 - -/** Q parameter: value to indicate invalid qid*/ -#define XNL_QIDX_INVALID 0xFFFF -/** Q parameter: streaming mode*/ -#define XNL_F_QMODE_ST 0x00000001 -/** Q parameter: memory management mode*/ -#define XNL_F_QMODE_MM 0x00000002 -/** Q parameter: queue in h2c direction*/ -#define XNL_F_QDIR_H2C 0x00000004 -/** Q parameter: queue in c2h direction*/ -#define XNL_F_QDIR_C2H 0x00000008 -/** Q parameter: queue in both directions*/ -#define XNL_F_QDIR_BOTH (XNL_F_QDIR_H2C | XNL_F_QDIR_C2H) -/** Q parameter: queue in prefetch mode*/ -#define XNL_F_PFETCH_EN 0x00000010 -/** Q parameter: enable the bypass for the queue*/ -#define XNL_F_DESC_BYPASS_EN 0x00000020 -/** Q parameter: fetch credits*/ -#define XNL_F_FETCH_CREDIT 0x00000040 -/** Q parameter: enable writeback accumulation*/ -#define XNL_F_CMPL_STATUS_ACC_EN 0x00000080 -/** Q parameter: enable writeback*/ -#define XNL_F_CMPL_STATUS_EN 0x00000100 -/** Q parameter: enable writeback pending check*/ -#define XNL_F_CMPL_STATUS_PEND_CHK 0x00000200 -/** Q parameter: enable writeback status descriptor*/ -#define XNL_F_CMPL_STATUS_DESC_EN 0x00000400 -/** Q parameter: enable queue completion interrupt*/ -#define XNL_F_C2H_CMPL_INTR_EN 0x00000800 -/** Q parameter: enable user defined data*/ -#define XNL_F_CMPL_UDD_EN 0x00001000 -/** Q parameter: enable the pfetch bypass for the queue */ -#define XNL_F_PFETCH_BYPASS_EN 0x00002000 -/** Q parameter: disable CMPT overflow check */ -#define XNL_F_CMPT_OVF_CHK_DIS 0x00004000 -/** Q parameter: Completion Queue? */ -#define XNL_F_Q_CMPL 0x00008000 - -/** maximum number of queue flags to control queue configuration*/ -#define MAX_QFLAGS 17 - -/** maximum number of interrupt ring entries*/ -#define QDMA_MAX_INT_RING_ENTRIES 512 - -/** - * xnl_attr_t netlink attributes for qdma(variables): - * the index in this enum is used as a reference for the type, - * userspace application has to indicate the corresponding type - * the policy is used for security considerations - */ -enum xnl_attr_t { - XNL_ATTR_GENMSG, /**< generatl message */ - XNL_ATTR_DRV_INFO, /**< device info */ - - XNL_ATTR_DEV_IDX, /**< device index */ - XNL_ATTR_PCI_BUS, /**< pci bus number */ - XNL_ATTR_PCI_DEV, /**< pci device number */ - XNL_ATTR_PCI_FUNC, /**< pci function id */ - - XNL_ATTR_DEV_STAT_MMH2C_PKTS1, /**< number of MM H2C packets */ - XNL_ATTR_DEV_STAT_MMH2C_PKTS2, /**< number of MM H2C packets */ - XNL_ATTR_DEV_STAT_MMC2H_PKTS1, /**< number of MM C2H packets */ - XNL_ATTR_DEV_STAT_MMC2H_PKTS2, /**< number of MM C2H packets */ - XNL_ATTR_DEV_STAT_STH2C_PKTS1, /**< number of ST H2C packets */ - XNL_ATTR_DEV_STAT_STH2C_PKTS2, /**< number of ST H2C packets */ - XNL_ATTR_DEV_STAT_STC2H_PKTS1, /**< number of ST C2H packets */ - XNL_ATTR_DEV_STAT_STC2H_PKTS2, /**< number of ST C2H packets */ - - XNL_ATTR_DEV_CFG_BAR, /**< device config bar number */ - XNL_ATTR_DEV_USR_BAR, /**< device AXI Master Lite(user bar) number */ - XNL_ATTR_DEV_QSET_MAX, /**< max queue sets */ - XNL_ATTR_DEV_QSET_QBASE, /**< queue base start */ - - XNL_ATTR_VERSION_INFO, /**< version info */ - XNL_ATTR_DEVICE_TYPE, /**< device type */ - XNL_ATTR_IP_TYPE, /**< ip type */ - XNL_ATTR_DEV_NUMQS, /**< num of queues */ - XNL_ATTR_DEV_NUM_PFS, /**< num of PFs */ - XNL_ATTR_DEV_MM_CHANNEL_MAX, /**< mm channels */ - XNL_ATTR_DEV_MAILBOX_ENABLE, /**< mailbox enable */ - XNL_ATTR_DEV_FLR_PRESENT, /**< flr present */ - XNL_ATTR_DEV_ST_ENABLE, /**< device st capability */ - XNL_ATTR_DEV_MM_ENABLE, /**< device mm capability */ - XNL_ATTR_DEV_MM_CMPT_ENABLE, /**< device mm cmpt capability */ - - XNL_ATTR_REG_BAR_NUM, /**< register bar number */ - XNL_ATTR_REG_ADDR, /**< register address */ - XNL_ATTR_REG_VAL, /**< register value */ - - XNL_ATTR_CSR_INDEX, /**< csr index */ - XNL_ATTR_CSR_COUNT, /**< csr count */ - - XNL_ATTR_QIDX, /**< queue index */ - XNL_ATTR_NUM_Q, /**< number of queues */ - XNL_ATTR_QFLAG, /**< queue config flags */ - - XNL_ATTR_CMPT_DESC_SIZE, /**< completion descriptor size */ - XNL_ATTR_SW_DESC_SIZE, /**< software descriptor size */ - XNL_ATTR_QRNGSZ_IDX, /**< queue ring index */ - XNL_ATTR_C2H_BUFSZ_IDX, /**< c2h buffer idex */ - XNL_ATTR_CMPT_TIMER_IDX, /**< completion timer index */ - XNL_ATTR_CMPT_CNTR_IDX, /**< completion counter index */ - XNL_ATTR_CMPT_TRIG_MODE, /**< completion trigger mode */ - XNL_ATTR_MM_CHANNEL, /**< mm channel */ - XNL_ATTR_CMPT_ENTRIES_CNT, /**< completion entries count */ - - XNL_ATTR_RANGE_START, /**< range start */ - XNL_ATTR_RANGE_END, /**< range end */ - - XNL_ATTR_INTR_VECTOR_IDX, /**< interrupt vector index */ - XNL_ATTR_INTR_VECTOR_START_IDX, /**< interrupt vector start index */ - XNL_ATTR_INTR_VECTOR_END_IDX, /**< interrupt vector end index */ - XNL_ATTR_RSP_BUF_LEN, /**< response buffer length */ - XNL_ATTR_GLOBAL_CSR, /**< global csr data */ - XNL_ATTR_PIPE_GL_MAX, /**< max no. of gl for pipe */ - XNL_ATTR_PIPE_FLOW_ID, /**< pipe flow id */ - XNL_ATTR_PIPE_SLR_ID, /**< pipe slr id */ - XNL_ATTR_PIPE_TDEST, /**< pipe tdest */ - XNL_ATTR_DEV_STM_BAR, /**< device STM bar number */ - XNL_ATTR_Q_STATE, - XNL_ATTR_ERROR, - XNL_ATTR_PING_PONG_EN, - XNL_ATTR_APERTURE_SZ, - XNL_ATTR_DEV_STAT_PING_PONG_LATMIN1, - XNL_ATTR_DEV_STAT_PING_PONG_LATMIN2, - XNL_ATTR_DEV_STAT_PING_PONG_LATMAX1, - XNL_ATTR_DEV_STAT_PING_PONG_LATMAX2, - XNL_ATTR_DEV_STAT_PING_PONG_LATAVG1, - XNL_ATTR_DEV_STAT_PING_PONG_LATAVG2, - XNL_ATTR_DEV, - XNL_ATTR_DEBUG_EN, /** Debug Regs Capability*/ - XNL_ATTR_DESC_ENGINE_MODE, /** Descriptor Engine Capability */ -#ifdef ERR_DEBUG - XNL_ATTR_QPARAM_ERR_INFO, /**< queue param info */ -#endif - XNL_ATTR_NUM_REGS, /**< number of regs */ - XNL_ATTR_MAX, -}; - -/** - * xnl_st_c2h_cmpt_desc_size - * c2h writeback descriptor sizes - */ -enum xnl_st_c2h_cmpt_desc_size { - XNL_ST_C2H_CMPT_DESC_SIZE_8B, /**< 8B descriptor */ - XNL_ST_C2H_CMPT_DESC_SIZE_16B, /**< 16B descriptor */ - XNL_ST_C2H_CMPT_DESC_SIZE_32B, /**< 32B descriptor */ - XNL_ST_C2H_CMPT_DESC_SIZE_64B, /**< 64B descriptor */ - XNL_ST_C2H_NUM_CMPT_DESC_SIZES /**< Num of desc sizes */ -}; - -enum xnl_qdma_rngsz_idx { - XNL_QDMA_RNGSZ_2048_IDX, - XNL_QDMA_RNGSZ_64_IDX, - XNL_QDMA_RNGSZ_128_IDX, - XNL_QDMA_RNGSZ_192_IDX, - XNL_QDMA_RNGSZ_256_IDX, - XNL_QDMA_RNGSZ_384_IDX, - XNL_QDMA_RNGSZ_512_IDX, - XNL_QDMA_RNGSZ_768_IDX, - XNL_QDMA_RNGSZ_1024_IDX, - XNL_QDMA_RNGSZ_1536_IDX, - XNL_QDMA_RNGSZ_3072_IDX, - XNL_QDMA_RNGSZ_4096_IDX, - XNL_QDMA_RNGSZ_6144_IDX, - XNL_QDMA_RNGSZ_8192_IDX, - XNL_QDMA_RNGSZ_12288_IDX, - XNL_QDMA_RNGSZ_16384_IDX, - XNL_QDMA_RNGSZ_IDXS -}; - - -static const char *xnl_attr_str[XNL_ATTR_MAX + 1] = { - "GENMSG", /**< XNL_ATTR_GENMSG */ - "DRV_INFO", /**< XNL_ATTR_DRV_INFO */ - "DEV_IDX", /**< XNL_ATTR_DEV_IDX */ - "DEV_PCIBUS", /**< XNL_ATTR_PCI_BUS */ - "DEV_PCIDEV", /**< XNL_ATTR_PCI_DEV */ - "DEV_PCIFUNC", /**< XNL_ATTR_PCI_FUNC */ - "DEV_STAT_MMH2C_PKTS1", /**< number of MM H2C packkts */ - "DEV_STAT_MMH2C_PKTS2", /**< number of MM H2C packkts */ - "DEV_STAT_MMC2H_PKTS1", /**< number of MM C2H packkts */ - "DEV_STAT_MMC2H_PKTS2", /**< number of MM C2H packkts */ - "DEV_STAT_STH2C_PKTS1", /**< number of ST H2C packkts */ - "DEV_STAT_STH2C_PKTS2", /**< number of ST H2C packkts */ - "DEV_STAT_STC2H_PKTS1", /**< number of ST C2H packkts */ - "DEV_STAT_STC2H_PKTS2", /**< number of ST C2H packkts */ - "DEV_CFG_BAR", /**< XNL_ATTR_DEV_CFG_BAR */ - "DEV_USR_BAR", /**< XNL_ATTR_DEV_USER_BAR */ - "DEV_QSETMAX", /**< XNL_ATTR_DEV_QSET_MAX */ - "DEV_QBASE", /**< XNL_ATTR_DEV_QSET_QBASE */ - "VERSION_INFO", /**< XNL_ATTR_VERSION_INFO */ - "DEVICE_TYPE", /**< XNL_ATTR_DEVICE_TYPE */ - "IP_TYPE", /**< XNL_ATTR_IP_TYPE */ - "DEV_NUMQS", /**<XNL_ATTR_DEV_NUMQS */ - "DEV_NUM_PFS", /**<XNL_ATTR_DEV_NUM_PFS */ - "DEV_MM_CHANNEL_MAX", /**<XNL_ATTR_DEV_MM_CHANNEL_MAX */ - "DEV_MAILBOX_ENABLE", /**<XNL_ATTR_DEV_MAILBOX_ENABLE */ - "DEV_FLR_PRESENT", /**<XNL_ATTR_DEV_FLR_PRESENT */ - "DEV_ST_ENABLE", /**<XNL_ATTR_DEV_ST_ENABLE */ - "DEV_MM_ENABLE", /**<XNL_ATTR_DEV_MM_ENABLE */ - "DEV_MM_CMPT_ENABLE", /**<XNL_ATTR_DEV_MM_CMPT_ENABLE */ - "REG_BAR", /**< XNL_ATTR_REG_BAR_NUM */ - "REG_ADDR", /**< XNL_ATTR_REG_ADDR */ - "REG_VAL", /**< XNL_ATTR_REG_VAL */ - "CSR_INDEX", /**< XNL_ATTR_CSR_INDEX*/ - "CSR_COUNT", /**< XNL_ATTR_CSR_COUNT*/ - "QIDX", /**< XNL_ATTR_QIDX */ - "NUM_Q", /**< XNL_ATTR_NUM_Q */ - "QFLAG", /**< XNL_ATTR_QFLAG */ - "CMPT_DESC_SZ", /**< XNL_ATTR_CMPT_DESC_SIZE */ - "SW_DESC_SIZE", /**< XNL_ATTR_SW_DESC_SIZE */ - "QRINGSZ_IDX", /**< XNL_ATTR_QRNGSZ */ - "C2H_BUFSZ_IDX", /**< XNL_ATTR_QBUFSZ */ - "CMPT_TIMER_IDX", /**< XNL_ATTR_CMPT_TIMER_IDX */ - "CMPT_CNTR_IDX", /**< XNL_ATTR_CMPT_CNTR_IDX */ - "CMPT_TRIG_MODE", /**< XNL_ATTR_CMPT_TRIG_MODE */ - "RANGE_START", /**< XNL_ATTR_RANGE_START */ - "RANGE_END", /**< XNL_ATTR_RANGE_END */ - "INTR_VECTOR_IDX", /**< XNL_ATTR_INTR_VECTOR_IDX */ - "INTR_VECTOR_START_IDX", /**< XNL_ATTR_INTR_VECTOR_START_IDX */ - "INTR_VECTOR_END_IDX", /**< XNL_ATTR_INTR_VECTOR_END_IDX */ - "RSP_BUF_LEN", /**< XNL_ATTR_RSP_BUF_LEN */ - "GLOBAL_CSR", /**< global csr data */ - "PIPE_GL_MAX", /**< max no. of gl for pipe */ - "PIPE_FLOW_ID", /**< pipe flow id */ - "PIPE_SLR_ID", /**< pipe slr id */ - "PIPE_TDEST", /**< pipe tdest */ - "DEV_STM_BAR", /**< device STM bar number */ - "Q_STATE", /**< XNL_ATTR_Q_STATE*/ - "ERROR", /**< XNL_ATTR_ERROR */ - "PING_PONG_EN", /**< XNL_PING_PONG_EN */ - "DEV_ATTR", /**< XNL_ATTR_DEV */ - "XNL_ATTR_DEBUG_EN", /** XNL_ATTR_DEBUG_EN */ - "XNL_ATTR_DESC_ENGINE_MODE", /** XNL_ATTR_DESC_ENGINE_MODE */ -#ifdef ERR_DEBUG - "QPARAM_ERR_INFO", /**< queue param info */ -#endif - "ATTR_MAX", - -}; - - - -/* commands, 0 ~ 0x7F */ -/** - * xnl_op_t - XNL command types - */ -enum xnl_op_t { - XNL_CMD_DEV_LIST, /**< list all the qdma devices */ - XNL_CMD_DEV_INFO, /**< dump the device information */ - XNL_CMD_DEV_STAT, /**< dump the device statistics */ - XNL_CMD_DEV_STAT_CLEAR, /**< reset the device statistics */ - - XNL_CMD_REG_DUMP, /**< dump the register information */ - XNL_CMD_REG_RD, /**< read a register value */ - XNL_CMD_REG_WRT, /**< write value to a register */ - - XNL_CMD_Q_LIST, /**< list all the queue present in the system */ - XNL_CMD_Q_ADD, /**< add a queue */ - XNL_CMD_Q_START, /**< start a queue */ - XNL_CMD_Q_STOP, /**< stop a queue */ - XNL_CMD_Q_DEL, /**< delete a queue */ - XNL_CMD_Q_DUMP, /**< dump queue information*/ - XNL_CMD_Q_DESC, /**< dump descriptor information*/ - XNL_CMD_Q_CMPT, /**< dump writeback descriptor information*/ - XNL_CMD_Q_RX_PKT, /**< dump packet information*/ - XNL_CMD_Q_CMPT_READ, /**< read the cmpt data */ -#ifdef ERR_DEBUG - XNL_CMD_Q_ERR_INDUCE, /**< induce an error*/ -#endif - - XNL_CMD_INTR_RING_DUMP, /**< dump interrupt ring information*/ - XNL_CMD_Q_UDD, /**< dump the user defined data */ - XNL_CMD_GLOBAL_CSR, /**< get all global csr register values */ - XNL_CMD_DEV_CAP, /**< list h/w capabilities , hw and sw version */ - XNL_CMD_GET_Q_STATE, /**< get the queue state */ - XNL_CMD_REG_INFO_READ, /**< read register info */ -#ifdef TANDEM_BOOT_SUPPORTED - XNL_CMD_EN_ST, /**< Enable Streaming */ -#endif - XNL_CMD_MAX, /**< max number of XNL commands*/ -}; - -/** - * XNL command operation type - */ -static const char *xnl_op_str[XNL_CMD_MAX] = { - "DEV_LIST", /** XNL_CMD_DEV_LIST */ - "DEV_INFO", /** XNL_CMD_DEV_INFO */ - "DEV_STAT", /** XNL_CMD_DEV_STAT */ - "DEV_STAT_CLEAR", /** XNL_CMD_DEV_STAT_CLEAR */ - - "REG_DUMP", /** XNL_CMD_REG_DUMP */ - "REG_READ", /** XNL_CMD_REG_RD */ - "REG_WRITE", /** XNL_CMD_REG_WRT */ - - "Q_LIST", /** XNL_CMD_Q_LIST */ - "Q_ADD", /** XNL_CMD_Q_ADD */ - "Q_START", /** XNL_CMD_Q_START */ - "Q_STOP", /** XNL_CMD_Q_STOP */ - "Q_DEL", /** XNL_CMD_Q_DEL */ - "Q_DUMP", /** XNL_CMD_Q_DUMP */ - "Q_DESC", /** XNL_CMD_Q_DESC */ - "Q_CMPT", /** XNL_CMD_Q_CMPT */ - "Q_RX_PKT", /** XNL_CMD_Q_RX_PKT */ - "Q_CMPT_READ", /** XNL_CMD_Q_CMPT_READ */ -#ifdef ERR_DEBUG - "Q_ERR_INDUCE", /** XNL_CMD_Q_ERR_INDUCE */ -#endif - "INTR_RING_DUMP", /** XNL_CMD_INTR_RING_DUMP */ - "Q_UDD_DUMP", /** XNL_CMD_Q_UDD */ - "GLOBAL_CSR", /** XNL_CMD_GLOBAL_CSR*/ - "DEV_CAP", /** XNL_CMD_DEV_CAP */ - "GET_Q_STATE", /** XNL_CMD_GET_Q_STATE */ - "REG_INFO_READ", /** XNL_CMD_REG_INFO_READ */ -#ifdef TANDEM_BOOT_SUPPORTED - "EN_ST" /** XNL_CMD_EN_ST */ -#endif -}; - -enum qdma_queue_state { - QUEUE_DISABLED, - QUEUE_ENABLED, - QUEUE_ONLINE -}; - - -/** - * qdma_err_idx - Induce error - */ -enum qdma_err_idx { - err_ram_sbe, - err_ram_dbe, - err_dsc, - err_trq, - err_h2c_mm_0, - err_h2c_mm_1, - err_c2h_mm_0, - err_c2h_mm_1, - err_c2h_st, - ind_ctxt_cmd_err, - err_bdg, - err_h2c_st, - poison, - ur_ca, - param, - addr, - tag, - flr, - timeout, - dat_poison, - flr_cancel, - dma, - dsc, - rq_cancel, - dbe, - sbe, - unmapped, - qid_range, - vf_access_err, - tcp_timeout, - mty_mismatch, - len_mismatch, - qid_mismatch, - desc_rsp_err, - eng_wpl_data_par_err, - msi_int_fail, - err_desc_cnt, - portid_ctxt_mismatch, - portid_byp_in_mismatch, - cmpt_inv_q_err, - cmpt_qfull_err, - cmpt_cidx_err, - cmpt_prty_err, - fatal_mty_mismatch, - fatal_len_mismatch, - fatal_qid_mismatch, - timer_fifo_ram_rdbe, - fatal_eng_wpl_data_par_err, - pfch_II_ram_rdbe, - cmpt_ctxt_ram_rdbe, - pfch_ctxt_ram_rdbe, - desc_req_fifo_ram_rdbe, - int_ctxt_ram_rdbe, - cmpt_coal_data_ram_rdbe, - tuser_fifo_ram_rdbe, - qid_fifo_ram_rdbe, - payload_fifo_ram_rdbe, - wpl_data_par_err, - zero_len_desc_err, - csi_mop_err, - no_dma_dsc_err, - sb_mi_h2c0_dat, - sb_mi_c2h0_dat, - sb_h2c_rd_brg_dat, - sb_h2c_wr_brg_dat, - sb_c2h_rd_brg_dat, - sb_c2h_wr_brg_dat, - sb_func_map, - sb_dsc_hw_ctxt, - sb_dsc_crd_rcv, - sb_dsc_sw_ctxt, - sb_dsc_cpli, - sb_dsc_cpld, - sb_pasid_ctxt_ram, - sb_timer_fifo_ram, - sb_payload_fifo_ram, - sb_qid_fifo_ram, - sb_tuser_fifo_ram, - sb_wrb_coal_data_ram, - sb_int_qid2vec_ram, - sb_int_ctxt_ram, - sb_desc_req_fifo_ram, - sb_pfch_ctxt_ram, - sb_wrb_ctxt_ram, - sb_pfch_ll_ram, - sb_h2c_pend_fifo, - db_mi_h2c0_dat, - db_mi_c2h0_dat, - db_h2c_rd_brg_dat, - db_h2c_wr_brg_dat, - db_c2h_rd_brg_dat, - db_c2h_wr_brg_dat, - db_func_map, - db_dsc_hw_ctxt, - db_dsc_crd_rcv, - db_dsc_sw_ctxt, - db_dsc_cpli, - db_dsc_cpld, - db_pasid_ctxt_ram, - db_timer_fifo_ram, - db_payload_fifo_ram, - db_qid_fifo_ram, - db_tuser_fifo_ram, - db_wrb_coal_data_ram, - db_int_qid2vec_ram, - db_int_ctxt_ram, - db_desc_req_fifo_ram, - db_pfch_ctxt_ram, - db_wrb_ctxt_ram, - db_pfch_ll_ram, - db_h2c_pend_fifo, - qdma_errs -}; - -#endif /* ifndef QDMA_NL_H__ */ diff --git a/QDMA/linux-kernel/apps/include/qdma_user_reg_dump.h b/QDMA/linux-kernel/apps/include/qdma_user_reg_dump.h deleted file mode 100755 index 4e83373..0000000 --- a/QDMA/linux-kernel/apps/include/qdma_user_reg_dump.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - -#include "qdma_reg_dump.h" - -#ifndef __QDMA_USER_REG_DUMP_H__ -#define __QDMA_USER_REG_DUMP_H__ - - - -static struct xreg_info qdma_user_regs[] = { - {"ST_C2H_QID", 0x0, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKTLEN", 0x4, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CONTROL", 0x8, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - /* ST_C2H_CONTROL: - * [1] : start C2H - * [2] : immediate data - * [3] : every packet statrs with 00 instead of continuous data - * stream until # of packets is complete - * [31]: gen_user_reset_n - */ - {"ST_H2C_CONTROL", 0xC, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - /* ST_H2C_CONTROL: - * [0] : clear match for H2C transfer - */ - {"ST_H2C_STATUS", 0x10, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_H2C_XFER_CNT", 0x14, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_CNT", 0x20, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CMPT_DATA", 0x30, 8, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CMPT_SIZE", 0x50, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_SCRATCH_REG", 0x60, 2, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_DROP", 0x88, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_ACCEPT", 0x8C, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"DSC_BYPASS_LOOP", 0x90, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT", 0x94, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT_MASK", 0x98, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT_VEC", 0x9C, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"DMA_CONTROL", 0xA0, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"VDM_MSG_READ", 0xA4, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - - {"", 0, 0, 0 } -}; - - -#endif diff --git a/QDMA/linux-kernel/apps/include/xdev_regs.h b/QDMA/linux-kernel/apps/include/xdev_regs.h deleted file mode 100755 index 1434dce..0000000 --- a/QDMA/linux-kernel/apps/include/xdev_regs.h +++ /dev/null @@ -1,238 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - -#ifndef __XDEV_REGS_H__ -#define __XDEV_REGS_H__ - -struct xreg_info { - const char name[32]; - uint32_t addr; - unsigned int repeat; - unsigned int step; - unsigned char shift; - unsigned char len; - unsigned char filler[2]; -}; - -static struct xreg_info qdma_config_regs[] = { - - /* QDMA_TRQ_SEL_GLBL1 (0x00000) */ - {"CFG_BLOCK_ID", 0x00, 0, 0, 0, 0,}, - {"CFG_BUSDEV", 0x04, 0, 0, 0, 0,}, - {"CFG_PCIE_MAX_PL_SZ", 0x08, 0, 0, 0, 0,}, - {"CFG_PCIE_MAX_RDRQ_SZ", 0x0C, 0, 0, 0, 0,}, - {"CFG_SYS_ID", 0x10, 0, 0, 0, 0,}, - {"CFG_MSI_EN", 0x14, 0, 0, 0, 0,}, - {"CFG_PCIE_DATA_WIDTH", 0x18, 0, 0, 0, 0,}, - {"CFG_PCIE_CTRL", 0x1C, 0, 0, 0, 0,}, - {"CFG_AXI_USR_MAX_PL_SZ", 0x40, 0, 0, 0, 0,}, - {"CFG_AXI_USR_MAX_RDRQ_SZ", 0x44, 0, 0, 0, 0,}, - {"CFG_MISC_CTRL", 0x4C, 0, 0, 0, 0,}, - {"CFG_SCRATCH_REG", 0x80, 8, 0, 0, 0,}, - {"QDMA_RAM_SBE_MSK_A", 0xF0, 0, 0, 0, 0,}, - {"QDMA_RAM_SBE_STS_A", 0xF4, 0, 0, 0, 0,}, - {"QDMA_RAM_DBE_MSK_A", 0xF8, 0, 0, 0, 0,}, - {"QDMA_RAM_DBE_STS_A", 0xFC, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_GLBL2 (0x00100) */ - {"GLBL2_ID", 0x100, 0, 0, 0, 0,}, - {"GLBL2_PF_BL_INT", 0x104, 0, 0, 0, 0,}, - {"GLBL2_PF_VF_BL_INT", 0x108, 0, 0, 0, 0,}, - {"GLBL2_PF_BL_EXT", 0x10C, 0, 0, 0, 0,}, - {"GLBL2_PF_VF_BL_EXT", 0x110, 0, 0, 0, 0,}, - {"GLBL2_CHNL_INST", 0x114, 0, 0, 0, 0,}, - {"GLBL2_CHNL_QDMA", 0x118, 0, 0, 0, 0,}, - {"GLBL2_CHNL_STRM", 0x11C, 0, 0, 0, 0,}, - {"GLBL2_QDMA_CAP", 0x120, 0, 0, 0, 0,}, - {"GLBL2_PASID_CAP", 0x128, 0, 0, 0, 0,}, - {"GLBL2_FUNC_RET", 0x12C, 0, 0, 0, 0,}, - {"GLBL2_SYS_ID", 0x130, 0, 0, 0, 0,}, - {"GLBL2_MISC_CAP", 0x134, 0, 0, 0, 0,}, - {"GLBL2_DBG_PCIE_RQ", 0x1B8, 2, 0, 0, 0,}, - {"GLBL2_DBG_AXIMM_WR", 0x1C0, 2, 0, 0, 0,}, - {"GLBL2_DBG_AXIMM_RD", 0x1C8, 2, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_GLBL (0x00200) */ - {"GLBL_RNGSZ", 0x204, 16, 0, 0, 0,}, - {"GLBL_ERR_STAT", 0x248, 0, 0, 0, 0,}, - {"GLBL_ERR_MASK", 0x24C, 0, 0, 0, 0,}, - {"GLBL_DSC_CFG", 0x250, 0, 0, 0, 0,}, - {"GLBL_DSC_ERR_STS", 0x254, 0, 0, 0, 0,}, - {"GLBL_DSC_ERR_MSK", 0x258, 0, 0, 0, 0,}, - {"GLBL_DSC_ERR_LOG", 0x25C, 2, 0, 0, 0,}, - {"GLBL_TRQ_ERR_STS", 0x264, 0, 0, 0, 0,}, - {"GLBL_TRQ_ERR_MSK", 0x268, 0, 0, 0, 0,}, - {"GLBL_TRQ_ERR_LOG", 0x26C, 0, 0, 0, 0,}, - {"GLBL_DSC_DBG_DAT", 0x270, 2, 0, 0, 0,}, - {"GLBL_DSC_ERR_LOG2", 0x27C, 0, 0, 0, 0,}, - {"GLBL_INTERRUPT_CFG", 0x288, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_FMAP (0x00400 - 0x7FC) * TODO: max 256, display 4 for now */ - {"TRQ_SEL_FMAP", 0x400, 4, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_IND (0x00800) */ - {"IND_CTXT_DATA", 0x804, 8, 0, 0, 0,}, - {"IND_CTXT_MASK", 0x824, 8, 0, 0, 0,}, - {"IND_CTXT_CMD", 0x844, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_C2H (0x00A00) */ - {"C2H_TIMER_CNT", 0xA00, 16, 0, 0, 0,}, - {"C2H_CNT_THRESH", 0xA40, 16, 0, 0, 0,}, - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xA88, 0, 0, 0, 0,}, - {"C2H_STAT_S_AXIS_CMPT_ACCEPTED", 0xA8C, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xA90, 0, 0, 0, 0,}, - {"C2H_STAT_AXIS_PKG_CMP", 0xA94, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_ACCEPTED", 0xA98, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_CMP", 0xA9C, 0, 0, 0, 0,}, - {"C2H_STAT_WRQ_OUT", 0xAA0, 0, 0, 0, 0,}, - {"C2H_STAT_WPL_REN_ACCEPTED", 0xAA4, 0, 0, 0, 0,}, - {"C2H_STAT_TOTAL_WRQ_LEN", 0xAA8, 0, 0, 0, 0,}, - {"C2H_STAT_TOTAL_WPL_LEN", 0xAAC, 0, 0, 0, 0,}, - {"C2H_BUF_SZ", 0xAB0, 16, 0, 0, 0,}, - {"C2H_ERR_STAT", 0xAF0, 0, 0, 0, 0,}, - {"C2H_ERR_MASK", 0xAF4, 0, 0, 0, 0,}, - {"C2H_FATAL_ERR_STAT", 0xAF8, 0, 0, 0, 0,}, - {"C2H_FATAL_ERR_MASK", 0xAFC, 0, 0, 0, 0,}, - {"C2H_FATAL_ERR_ENABLE", 0xB00, 0, 0, 0, 0,}, - {"GLBL_ERR_INT", 0xB04, 0, 0, 0, 0,}, - {"C2H_PFCH_CFG", 0xB08, 0, 0, 0, 0,}, - {"C2H_INT_TIMER_TICK", 0xB0C, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xB10, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xB14, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_REQ", 0xB18, 0, 0, 0, 0,}, - {"C2H_STAT_DEBUG_DMA_ENG", 0xB1C, 4, 0, 0, 0,}, - {"C2H_DBG_PFCH_ERR_CTXT", 0xB2C, 0, 0, 0, 0,}, - {"C2H_FIRST_ERR_QID", 0xB30, 0, 0, 0, 0,}, - {"STAT_NUM_CMPT_IN", 0xB34, 0, 0, 0, 0,}, - {"STAT_NUM_CMPT_OUT", 0xB38, 0, 0, 0, 0,}, - {"STAT_NUM_CMPT_DRP", 0xB3C, 0, 0, 0, 0,}, - {"STAT_NUM_STAT_DESC_OUT", 0xB40, 0, 0, 0, 0,}, - {"STAT_NUM_DSC_CRDT_SENT", 0xB44, 0, 0, 0, 0,}, - {"STAT_NUM_FCH_DSC_RCVD", 0xB48, 0, 0, 0, 0,}, - {"STAT_NUM_BYP_DSC_RCVD", 0xB4C, 0, 0, 0, 0,}, - {"C2H_CMPT_COAL_CFG", 0xB50, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_REQ", 0xB54, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_MM_REQ", 0xB58, 0, 0, 0, 0,}, - {"C2H_INTR_ERR_INT_REQ", 0xB5C, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_REQ", 0xB60, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_ERR_MM_MSIX_ACK", 0xB64, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_ERR_MM_MSIX_FAIL", 0xB68, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_ERR_MM_NO_MSIX", 0xB6C, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_ERR_MM_CTXT_INVAL", 0xB70, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_MSIX_ACK", 0xB74, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_MSIX_FAIL", 0xB78, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_NO_MSIX", 0xB7C, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_CTXT_INVAL", 0xB80, 0, 0, 0, 0,}, - {"C2H_STAT_WR_CMP", 0xB84, 0, 0, 0, 0,}, - {"C2H_STAT_DEBUG_DMA_ENG_4", 0xB88, 0, 0, 0, 0,}, - {"C2H_STAT_DEBUG_DMA_ENG_5", 0xB8C, 0, 0, 0, 0,}, - {"C2H_DBG_PFCH_QID", 0xB90, 0, 0, 0, 0,}, - {"C2H_DBG_PFCH", 0xB94, 0, 0, 0, 0,}, - {"C2H_INT_DEBUG", 0xB98, 0, 0, 0, 0,}, - {"C2H_STAT_IMM_ACCEPTED", 0xB9C, 0, 0, 0, 0,}, - {"C2H_STAT_MARKER_ACCEPTED", 0xBA0, 0, 0, 0, 0,}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xBA4, 0, 0, 0, 0,}, - {"C2H_C2H_PAYLOAD_FIFO_CRDT_CNT", 0xBA8, 0, 0, 0, 0,}, - - {"C2H_INTR_DYN_REQ", 0xBAC, 0, 0, 0, 0,}, - {"C2H_INTR_DYN_MSIX", 0xBB0, 0, 0, 0, 0,}, - {"C2H_DROP_LEN_MISMATCH", 0xBB4, 0, 0, 0, 0,}, - {"C2H_DROP_DESC_RSP_LEN", 0xBB8, 0, 0, 0, 0,}, - {"C2H_DROP_QID_FIFO_LEN", 0xBBC, 0, 0, 0, 0,}, - {"C2H_DROP_PAYLOAD_CNT", 0xBC0, 0, 0, 0, 0,}, - {"QDMA_C2H_CMPT_FORMAT", 0xBC4, 7, 0, 0, 0,}, - {"C2H_PFCH_CACHE_DEPTH", 0xBE0, 0, 0, 0, 0,}, - {"C2H_CMPT_COAL_BUF_DEPTH", 0xBE4, 0, 0, 0, 0,}, - {"C2H_PFCH_CRDT", 0xBE8, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_H2C(0x00E00) Register Space*/ - {"H2C_ERR_STAT", 0xE00, 0, 0, 0, 0,}, - {"H2C_ERR_MASK", 0xE04, 0, 0, 0, 0,}, - {"H2C_FIRST_ERR_QID", 0xE08, 0, 0, 0, 0,}, - {"H2C_DBG_REG", 0xE0C, 5, 0, 0, 0,}, - {"H2C_FATAL_ERR_EN", 0xE20, 0, 0, 0, 0,}, - {"H2C_REQ_THROT", 0xE24, 0, 0, 0, 0,}, - {"H2C_ALN_DBG_REG0", 0xE28, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_C2H_MM (0x1000) */ - {"C2H_MM_CONTROL", 0x1004, 3, 0, 0, 0,}, - {"C2H_MM_STATUS", 0x1040, 2, 0, 0, 0,}, - {"C2H_MM_CMPL_DSC_CNT", 0x1048, 0, 0, 0, 0,}, - {"C2H_MM_ERR_CODE_EN_MASK", 0x1054, 0, 0, 0, 0,}, - {"C2H_MM_ERR_CODE", 0x1058, 0, 0, 0, 0,}, - {"C2H_MM_ERR_INFO", 0x105C, 0, 0, 0, 0,}, - {"C2H_MM_PERF_MON_CTRL", 0x10C0, 0, 0, 0, 0,}, - {"C2H_MM_PERF_MON_CY_CNT", 0x10C4, 2, 0, 0, 0,}, - {"C2H_MM_PERF_MON_DATA_CNT", 0x10CC, 2, 0, 0, 0,}, - {"C2H_MM_DBG_INFO", 0x10E8, 2, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_H2C_MM (0x1200)*/ - {"H2C_MM_CONTROL", 0x1204, 3, 0, 0, 0,}, - {"H2C_MM_STATUS", 0x1240, 0, 0, 0, 0,}, - {"H2C_MM_CMPL_DSC_CNT", 0x1248, 0, 0, 0, 0,}, - {"H2C_MM_ERR_CODE_EN_MASK", 0x1254, 0, 0, 0, 0,}, - {"H2C_MM_ERR_CODE", 0x1258, 0, 0, 0, 0,}, - {"H2C_MM_ERR_INFO", 0x125C, 0, 0, 0, 0,}, - {"H2C_MM_PERF_MON_CTRL", 0x12C0, 0, 0, 0, 0,}, - {"H2C_MM_PERF_MON_CY_CNT", 0x12C4, 2, 0, 0, 0,}, - {"H2C_MM_PERF_MON_DATA_CNT", 0x12CC, 2, 0, 0, 0,}, - {"H2C_MM_DBG_INFO", 0x12E8, 0, 0, 0, 0,}, - {"H2C_MM_REQ_THROT", 0x12EC, 0, 0, 0, 0,}, - - /* QDMA_PF_MAILBOX (0x2400) */ - {"FUNC_STATUS", 0x2400, 0, 0, 0, 0,}, - {"FUNC_CMD", 0x2404, 0, 0, 0, 0,}, - {"FUNC_INTR_VEC", 0x2408, 0, 0, 0, 0,}, - {"TARGET_FUNC", 0x240C, 0, 0, 0, 0,}, - {"INTR_CTRL", 0x2410, 0, 0, 0, 0,}, - {"PF_ACK", 0x2420, 8, 0, 0, 0,}, - {"FLR_CTRL_STATUS", 0x2500, 0, 0, 0, 0,}, - {"MSG_IN", 0x2800, 32, 0, 0, 0,}, - {"MSG_OUT", 0x2C00, 32, 0, 0, 0,}, - - {"", 0, 0, 0 } -}; - -static struct xreg_info qdma_user_regs[] = { - {"ST_C2H_QID", 0x0, 0, 0, 0, 0,}, - {"ST_C2H_PKTLEN", 0x4, 0, 0, 0, 0,}, - {"ST_C2H_CONTROL", 0x8, 0, 0, 0, 0,}, - /* ST_C2H_CONTROL: - * [1] : start C2H - * [2] : immediate data - * [3] : every packet statrs with 00 instead of continuous data - * stream until # of packets is complete - * [31]: gen_user_reset_n - */ - {"ST_H2C_CONTROL", 0xC, 0, 0, 0, 0,}, - /* ST_H2C_CONTROL: - * [0] : clear match for H2C transfer - */ - {"ST_H2C_STATUS", 0x10, 0, 0, 0, 0,}, - {"ST_H2C_XFER_CNT", 0x14, 0, 0, 0, 0,}, - {"ST_C2H_PKT_CNT", 0x20, 0, 0, 0, 0,}, - {"ST_C2H_CMPT_DATA", 0x30, 8, 0, 0, 0,}, - {"ST_C2H_CMPT_SIZE", 0x50, 0, 0, 0, 0,}, - {"ST_SCRATCH_REG", 0x60, 2, 0, 0, 0,}, - {"ST_C2H_PKT_DROP", 0x88, 0, 0, 0, 0,}, - {"ST_C2H_PKT_ACCEPT", 0x8C, 0, 0, 0, 0,}, - {"DSC_BYPASS_LOOP", 0x90, 0, 0, 0, 0,}, - {"USER_INTERRUPT", 0x94, 0, 0, 0, 0,}, - {"USER_INTERRUPT_MASK", 0x98, 0, 0, 0, 0,}, - {"USER_INTERRUPT_VEC", 0x9C, 0, 0, 0, 0,}, - {"DMA_CONTROL", 0xA0, 0, 0, 0, 0,}, - {"VDM_MSG_READ", 0xA4, 0, 0, 0, 0,}, - - {"", 0, 0, 0 } -}; - -#endif diff --git a/QDMA/linux-kernel/bsd_license.txt b/QDMA/linux-kernel/bsd_license.txt deleted file mode 100755 index 20693b4..0000000 --- a/QDMA/linux-kernel/bsd_license.txt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is licensed under both the BSD-style license (found in the - * LICENSE file in the root directory of this source tree) and the GPLv2 (found - * in the COPYING file in the root directory of this source tree). - * You may select, at your option, one of the above-listed licenses. - */ - diff --git a/QDMA/linux-kernel/docs/README b/QDMA/linux-kernel/docs/README deleted file mode 100755 index bc04f89..0000000 --- a/QDMA/linux-kernel/docs/README +++ /dev/null @@ -1,323 +0,0 @@ -############################################################################### - - Xilinx QDMA Software README - -############################################################################### - - -_____________________________________________________________________________ -Contents - -1. Installation - 1.1 Compiling the QDMA Software - 1.2 Installing the compiled binaries - 1.3 Loading the Kernel module -2 Configuration - 2.1 Configuring Queues -3. Xilinx "dma-ctl" Command-line Utility - 3.1 Using dma-ctl for query the QDMA devices/functions - 3.2 Using dma-ctl for Queue control -4. QDMA test script - Sample scripts to run simple MM and ST transfers -_____________________________________________________________________________ - -1. Installation: - - 1.1 Compiling the QDMA Software: - -------------------------------- - - In order to compile the Xilinx QDMA software, a configured and compiled - Linux kernel source tree is required. The source tree may be only compiled - header files, or a complete tree. The source tree needs to be configured - and the header files need to be compiled. And, the Linux kernel must be - configured to use modules. - - Additionally, the /lib/modules must have been set up for this particular - kernel - (i.e. "make modules_install" has been run with the Linux kernel source tree). - - a. QDMA Linux Kernel Driver is available in Xilinx github at - https://github.com/Xilinx/dma_ip_drivers/QDMA/linux-kernel - - b. Compile the Xilinx QDMA Linux driver: - - [xilinx@]# make - - a sub-directory bin/ will be created as a result of running "make". - - By default, both PF driver (qdma-pf.ko) and VF driver (qdma-vf.ko) will - be compiled along with all the sample applications - - - If only PF driver needs to be compiled: - [xilinx@]# make driver MODULE=mod_pf - - If only VF driver needs to be compiled: - [xilinx@]# make driver MODULE=mod_vf - - Important Note for VF 4K queue support for CPM5 design only - ----------------------------------------------------------- - - To enable VF 4K queue driver support for CPM5 design, QDMA Linux driver need - to compile by enabling the EQDMA_CPM5_VF_GT_256Q_SUPPORTED macro - - [xilinx@]# make EQDMA_CPM5_VF_GT_256Q_SUPPORTED=1 - - 1.2 Installing the compiled binaries: - ------------------------------------- - - To install the QDMA software, the installer must be the root user, then - run "make install". - - Run "make install-mods" to install the drivers in /lib/modules/<kernel version>/qdma/ - - Run "make install-apps" to install the applications in "/user/local/sbin" - - Example application software to issue DMA requests: - dma-to-device for H2C queues and dma-from-device for C2H queues will be installed in /user/local/sbin. - - - 1.3 Loading the Kernel module: - -------------------------------- - - Kernel module cane be loaded in following different modes - 0 - Auto Mode, driver decides to process the request in poll or interrupt mode - 1 - Poll Mode - 2 - Direct Interrupt Mode - 3 - Interrupt Aggregation Mode or Indirect Interrupt Mode - 4 - Legacy Interrupt Mode - - Find the QDMA device bus number from lspci. Ex : 01:00.0 is the BDF of the device. - By default, all the functions are loaded in Auto Mode. - - In order to pass the module parameters while loading a driver, a config file "qdma.conf" needs to be placed in /etc/modprobe.d directory. Format of the qdma.conf is as below - - ------------------------------------------------------------------------------------------------------------------ - options <module_name> mode=<bus_num>:<pf_num>:<mode>,<bus_num>:<pf_num>:<mode>,<bus_num>:<pf_num>:<mode>,..... - options <module_name> config_bar=<bus_num>:<pf_num>:<config_bar>,<bus_num>:<pf_num>:<config_bar>,<bus_num>:<pf_num>:<config_bar>,..... - options <module_name> master_pf=<bus_num>:<master_pf>,<bus_num>:<master_pf> - ------------------------------------------------------------------------------------------------------------------ - - - module_name: Name of the mode. For PF: qdma-pf and for VF: qdma-vf - - bus_num : Bus number of the PCIe endpoint card - - func_num : Function number of the corressponding bus_num - - mode: Mode in which the driver needs to be loaded - - config_bar: Config bar number - - master_pf: Master PF - - num_threads: number of threads for monitoring the writeback of completions - - Sample qdma.conf can be found below: - - ------------------------------------------------------------------------------------------------------------------ - options qdma-pf mode=0x06:0:2,0x06:1:3,0x06:2:0,0x07:2:1 - options qdma-vf mode=0x06:0:2,0x06:1:3 - ------------------------------------------------------------------------------------------------------------------ - - An auxillary script, qdma_generate_conf_file.sh has been added to the scripts folder which helps create the qdma.conf - config file and copies it to the /etc/modprobe.d location. The script can be used as shown below - - ./scripts/qdma_generate_conf_file.sh <bus_num> <num_pfs> <mode> <config_bar> <master_pf> - - For loading the driver, execute the following command: - PF Driver: - modprobe qdma-pf - VF Driver: - modprobe qdma-vf - - Now the QDMA software is ready for use. - - Please note that having the qdma-pf.ko and qdma-vf.ko files in the /lib/modules/<kernel version>/qdma/ will cause - automatic loading of the driver modules at boot time. To avoid this, it is recommended to have the drivers - blacklisted. - This can be done by adding the below 2 lines in the /etc/modprobe.d/blacklist.conf file - - blacklist qdma-pf - blacklist qdma-vf - - -2. Configuration - - 2.1 Configuring Queues - ------------------------------------- - - To configure a QDMA queue, there are three minimum required parameters - (in the form of key value pairs) needed to be configured. - - idx <N>: The 0-based queue index on the function. - mode <mm | st>: queue mode, default to "mm" - dir <h2c | c2h>: queue direction, default to "h2c" - - - "idx" is a 0-based unique index on the function. - *QDMA3.1, the range can be - 0 ~ 2047 on a physical function and - 0 ~ 2047 on a virtual function - - *QDMA4.0, the range can be - 0 ~ 2047 on a physical function and - 0 ~ 256 on a virtual function - - - "mode" is the operation mode of the queue. - It is either memory mapped (mm) or streaming mode (st) - - - "dir" is the direction of the queue. - It is either host to card (h2c) or card to host (c2h). - - A h2c queue and a c2h queue can share the same index. In other word, a index - represents a pair of queues: one on h2c direction and the other on the c2h - direction. - - -3. Xilinx "dma-ctl" Command-line Configuration Utility: - - The Xilinx QDMA control tool, dma-ctl, is a Command Line utility - which is installed in /usr/local/sbin/ and allows administration of the - Xilinx QDMA queues. It can perform the following functions: - - - query the qdma functions/devices the driver has bind into. - - - list all of the queues on a device/function - - add/configure a new queues on a device/function - - start an already added/configured queue (i.e., bring the queue online) - - stop an started queue (i.e., bring the queue offline) - - delete an already added/configured queue - - register access: - - read a register - - write a register - - dump the qdma config bar and user bar registers - - debug helper - - display a queue's configuration parameters - - display a queue's descriptor ring entries - - display a ch2 queue's completion ring entries - - display the interrupt ring entries in indirect interrupt mode - - Apart from the above basic commands, there are various other commands - available in dma-ctl to add/start/stop/del list of queues at the same time - - For help run: - dma-ctl -h - (or) - man dma-ctl - - - 3.1 Using dma-ctl for query the QDMA devices/functions - ------------------------------------- - - Please refer dma-ctl man page to find all options and parameters - available. - - 1. Get the list of devices the driver has bind with - - [root@]# dma-ctl dev list - - qdma06000 0000:06:00.0 max QP: 32 - qdma06001 0000:06:00.1 max QP: 32 - - The above example output shows 2 QDMA functions/devices. - one is at pci BDF: 06:00.0 - the other is at pci BDF: 06:00.1 - - - 3.2 Using dma-ctl for Queue control - ------------------------------------- - - Please refer dma-ctl man page to find all options and parameters available. - - a. Add/Configure a queue - - To add a MM H2C queue on qdma06000 in the above example: - - [root@]# dma-ctl qdma06000 q add idx 0 mode mm dir h2c - - *A character device /dev/qdma06000-MM-0 would be created. - - To add a MM C2H queue on qdma06000: - - [root@]# dma-ctl qdma06000 q add idx 0 mode mm dir c2h - - *A character device /dev/qdma06000-MM-0 would be created. - - b. Start an added queue - - To start the MM H2C queue on qdma06000 added in the previous example: - - [root@]# dma-ctl qdma06000 q start idx 0 dir h2c - - *After the queue is started the normal read and write operation can be - performed on the character device /dev/qdma06000-MM-0. - - To start the MM C2H queue on qdma06000 added in the previous example: - - [root@]# dma-ctl qdma06000 q start idx 0 dir c2h - - *After the queue is started the normal read and write operation can be - performed on the character device /dev/qdma06000-MM-0. - - c. Stop a queue - - [root@]# dma-ctl qdma06000 q stop idx 0 dir h2c - [root@]# dma-ctl qdma06000 q stop idx 0 dir c2h - - - d. Delete a queue - - [root@]# dma-ctl qdma06000 q del idx 0 dir h2c - [root@]# dma-ctl qdma06000 q del idx 0 dir c2h - - -4. QDMA test script - - Test scripts are in scripts/ directory - - To use the scripts in this directory, "make" and "make install" must be run - install the dma-from-device and dma-to-device applications. - - qdma_run_test.sh - The script does the following dma operations: - - PF AXI-MM : H2C/C2H AXI-MM transfer and check for data correctness. - PF AXI-ST-H2C : H2C AXI-ST transfer and read data register on user side - to check if the data if correct. - PF AXI-ST-C2H : C2H AXI-St transfer and check data for correctness. - - All the above transfers are done for 4 [0 to 3] Queues. - - qdma_run_test_mm_vf.sh - VF AXI-MM : Script runs H2C/C2H AXI-MM transfer and check for data - correctness. - - All the above transfers are done for 4 [0 to 3] Queues. - - qdma_run_test_st_vf.sh - VF AXI-ST-H2C : H2C AXI-ST transfer and read data register on user side - to check if the data if correct. - VF AXI-ST-C2H : C2H AXI-St transfer and check data for correctness. - - All the above transfers are done for 4 [0 to 3] Queues. - - - - - - - /* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - - - - diff --git a/QDMA/linux-kernel/docs/dma-ctl.8.gz b/QDMA/linux-kernel/docs/dma-ctl.8.gz deleted file mode 100755 index afbdec93ccc2ecc2688830be6dd5b0a5b9bf2f60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2403 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 diff --git a/QDMA/linux-kernel/driver/Makefile b/QDMA/linux-kernel/driver/Makefile deleted file mode 100755 index 7d1377a..0000000 --- a/QDMA/linux-kernel/driver/Makefile +++ /dev/null @@ -1,272 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - -SHELL = /bin/bash - -# -# makefile parameters: -# - KDIR/KSRC/KOBJ=, optional -# - install_path=, override all install directories -# - kernel_install_path=, override install directory for kernel module -# - dev_install_path=, override install directory for development headers -# - apps_install_path=, override install directory for applications -# - docs_install_path=, override install directory for man pages -# -# - enable_cmpt_immediate_data=<0|1> enable immediate data in writeback desc. -# - disable_st_c2h_completion=<0|1> disable completion -# - CROSS_COMPILE=, gcc compiler prefix for architecture eg. aarch64-linux-gnu- - -# Define grep error output to NULL, since -s is not portable. -grep = grep 2>/dev/null - -# ALL subdirectories -ALLSUBDIRS := src -DRIVER_SRC_DIR := src - -# subdirectories to be build -SUBDIRS := $(ALLSUBDIRS) - -# Honor the -s (silent) make option. -verbose := $(if $(filter s,$(MAKEFLAGS)),,-v) - -# Define paths. -srcdir := $(shell pwd) -topdir := $(shell cd $(srcdir)/.. && pwd) -bin_dir := $(topdir)/bin - -kernel_check = 1 -distro_check = 1 - -ifeq ($(filter clean,$(MAKECMDGOALS)),clean) - kernel_check = 0 - distro_check = 0 -endif - -ifeq ($(filter uninstall,$(MAKECMDGOALS)),uninstall) - distro_check = 0 -endif - -ifeq ($(kernel_check),1) - include make_rules/kernel_check.mk - - ifeq ($(distro_check),1) - include make_rules/distro_check.mk - endif -endif - -ifneq ($(wildcard $(KINC)/linux/kconfig.h),) - FLAGS += -DKERNEL_HAS_KCONFIG_H -endif -ifneq ($(wildcard $(KINC)/linux/export.h),) - FLAGS += -DKERNEL_HAS_EXPORT_H -endif - -# Debug flags. -ifeq ($(DEBUG),1) - FLAGS += -g -DDEBUG -endif - -# Debugfs flags -ifneq ($(DEBUGFS),0) - FLAGS += -DDEBUGFS -endif - -# LOOPBACK flags. -ifeq ($(LOOPBACK),1) - FLAGS += -DLOOPBACK_TEST -endif - -ifeq ($(DEBUG_THREADS),1) - FLAGS += -DDEBUG -DDEBUG_THREADS -endif - -ifeq ($(enable_cmpt_immediate_data),1) - FLAGS += -DXNL_IMM_DATA_EN -endif - -ifeq ($(disable_st_c2h_completion),1) - FLAGS += -DXMP_DISABLE_ST_C2H_CMPL -endif - -# 64B Descriptor Bypass flags. -ifeq ($(TEST_64B_DESC_BYPASS),1) - FLAGS += -DTEST_64B_DESC_BYPASS_FEATURE -endif - -ifeq ($(ERR_DEBUG),1) - EXTRA_FLAGS += -DERR_DEBUG -# FLAGS += -DERR_DEBUG - export EXTRA_FLAGS -endif - -ifeq ($(TANDEM_BOOT_SUPPORTED),1) - EXTRA_FLAGS += -DTANDEM_BOOT_SUPPORTED - export EXTRA_FLAGS -endif - -ifeq ($(EQDMA_CPM5_VF_GT_256Q_SUPPORTED),1) - EXTRA_FLAGS += -DEQDMA_CPM5_VF_GT_256Q_SUPPORTED - export EXTRA_FLAGS -endif - -ifeq ($(EQDMA_CPM5_10BIT_TAG_ENABLE),1) - EXTRA_FLAGS += -DEQDMA_CPM5_10BIT_TAG_ENABLE - export EXTRA_FLAGS -endif - -# Don't allow ARCH to overwrite the modified variable when passed to -# the sub-makes. -MAKEOVERRIDES := $(filter-out ARCH=%,$(MAKEOVERRIDES)) -# Don't allow CFLAGS/EXTRA_CFLAGS to clobber definitions in sub-make. -MAKEOVERRIDES := $(filter-out CFLAGS=%,$(MAKEOVERRIDES)) -MAKEOVERRIDES := $(filter-out EXTRA_CFLAGS=%,$(MAKEOVERRIDES)) - -# Exports. -export grep -export srcdir -export topdir -export bin_dir -export KERNELRELEASE -export KSRC -export KOBJ -export KINC -# arm64 specific fix to include <ksrc>/arch/<karch> folder properly. -# This hack is motivated by the RHEL7.X/CentOS7.X release where the -# uname Architecture is indicated as "aarch64" but the real Architecture -# source directory is "arm64" -ifeq ($(ARCH),aarch64) - ifeq ($(wildcard $(KOBJ)/arch/$(ARCH)/Makefile),) - override MAKECMDGOALS = $(MAKECMDGOALS) "ARCH=arm64" - export ARCH - else - export ARCH - endif -else - export ARCH -endif -CFLAGS += -I$(srcdir)/src/libqdma/qdma_access -CFLAGS += -I$(srcdir)/src/libqdma -export FLAGS += $(CFLAGS) -#export FLAGS += $(CFLAGS) $(EXTRA_CFLAGS) $(CPPFLAGS) -export verbose -export utsrelease -export kversions -export kseries -export modulesymfile - -#export enable_xvc - -CROSS_COMPILE_FLAG = $(CROSS_COMPILE) -export CROSS_COMPILE_FLAG -$(info CROSS_COMPILE_FLAG = $(CROSS_COMPILE_FLAG).) -$(info ARCH = $(ARCH).) - -# evaluate install paths -ifeq ($(install_path),) - # defaults - kernel_install_path ?= $(PREFIX)/lib/modules/$(utsrelease)/updates/kernel/drivers/qdma - dev_install_path ?= /usr/local/include/qdma - docs_install_path ?= /usr/share/man/man8 -else # bundled install - kernel_install_path ?= $(install_path)/modules - dev_install_path ?= $(install_path)/include/qdma - docs_install_path ?= $(install_path)/doc -endif - -$(shell rm -f $(srcdir)/src/libqdma; ln -fs $(srcdir)/libqdma $(srcdir)/src;) - -.PHONY: eval.mak - -.PHONY: default -default: mod_pf mod_vf post - -.PHONY: pf -pf: mod_pf - -.PHONY: vf -vf: mod_vf - -.PHONY: mods -mod: mod_pf mod_vf - -.PHONY: mod_pf -mod_pf: - @if [ -n "$(verbose)" ]; then \ - echo "#######################";\ - printf "#### PF %-8s%5s####\n" $(DRIVER_SRC_DIR);\ - echo "#######################";\ - fi; - @srcdir=$(shell pwd)/$(DRIVER_SRC_DIR) $(MAKE) VF=0 -C $(DRIVER_SRC_DIR); - -.PHONY: mod_vf -mod_vf: - @if [ -n "$(verbose)" ]; then \ - echo "#######################";\ - printf "#### VF %-8s%5s####\n" $(DRIVER_SRC_DIR);\ - echo "#######################";\ - fi; - @srcdir=$(shell pwd)/$(DRIVER_SRC_DIR) $(MAKE) VF=1 -C $(DRIVER_SRC_DIR); - -.PHONY: post -post: - @if [ -n "$(post_msg)" ]; then \ - echo -e "\nWARNING:\n $(post_msg)";\ - fi; - -.PHONY: clean -clean: - @for dir in $(ALLSUBDIRS); do \ - echo "#######################";\ - printf "#### %-8s%5s####\n" $$dir;\ - echo "#######################";\ - srcdir=$(shell pwd)/$$dir $(MAKE) -C $$dir clean;\ - done; - @-/bin/rm -f *.symvers eval.mak 2>/dev/null; - @-/bin/rm -rf $(shell pwd)/libqdma/qdma_access/*.o $(shell pwd)/libqdma/qdma_access/.*.o.* $(shell pwd)/libqdma/qdma_access/.*.cmd $(shell pwd)/libqdma/qdma_access/.*.o.cmd - @-/bin/rm -rf $(shell pwd)/src/libqdma - -.PHONY: install-mods -install-mods: - @echo "installing kernel modules to $(kernel_install_path) ..." - @mkdir -p -m 755 $(kernel_install_path) - @install -v -m 644 $(bin_dir)/*.ko $(kernel_install_path) - @depmod -a || true - -.PHONY: uninstall-mods -uninstall-mods: - @echo "Un-installing $(kernel_install_path) ..." - @/bin/rm -rf $(kernel_install_path)/* - @depmod -a - -.PHONY: help -help: - @echo "Build Targets:";\ - echo " install-mods - Installs drivers.";\ - echo " uninstall-mods - Uninstalls drivers.";\ - echo;\ - echo "Build Options:";\ - echo " KOBJ=<path> - Kernel build (object) path.";\ - echo " KSRC=<path> - Kernel source path.";\ - echo " - Note: When using KSRC or KOBJ, both";\ - echo " variables must be specified.";\ - echo " KDIR=<path> - Kernel build and source path. Shortcut";\ - echo " for KOBJ=KSRC=<path>.";\ - echo " kernel_install_path=<path>";\ - echo " - kernel module install path.";\ - diff --git a/QDMA/linux-kernel/driver/include/qdma_nl.h b/QDMA/linux-kernel/driver/include/qdma_nl.h deleted file mode 100755 index e0801c9..0000000 --- a/QDMA/linux-kernel/driver/include/qdma_nl.h +++ /dev/null @@ -1,488 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef QDMA_NL_H__ -#define QDMA_NL_H__ -/** - * @file - * @brief This file contains the declarations for qdma netlink interfaces - * - */ -/** physical function name (no more than 15 characters) */ -#define XNL_NAME_PF "xnl_pf" -/** virtual function name */ -#define XNL_NAME_VF "xnl_vf" -/** qdma netlink interface version number */ -#define XNL_VERSION 0x1 - -/** qdma nl interface minimum response buffer length*/ -#define XNL_RESP_BUFLEN_MIN 256 -/** qdma nl interface maximum response buffer length*/ -#define XNL_RESP_BUFLEN_MAX (2048 * 10) -/** qdma nl interface error buffer length*/ -#define XNL_ERR_BUFLEN 64 -/** qdma nl command parameter length*/ -#define XNL_STR_LEN_MAX 20 - -/** Q parameter: value to indicate invalid qid*/ -#define XNL_QIDX_INVALID 0xFFFF -/** Q parameter: streaming mode*/ -#define XNL_F_QMODE_ST 0x00000001 -/** Q parameter: memory management mode*/ -#define XNL_F_QMODE_MM 0x00000002 -/** Q parameter: queue in h2c direction*/ -#define XNL_F_QDIR_H2C 0x00000004 -/** Q parameter: queue in c2h direction*/ -#define XNL_F_QDIR_C2H 0x00000008 -/** Q parameter: queue in both directions*/ -#define XNL_F_QDIR_BOTH (XNL_F_QDIR_H2C | XNL_F_QDIR_C2H) -/** Q parameter: queue in prefetch mode*/ -#define XNL_F_PFETCH_EN 0x00000010 -/** Q parameter: enable the bypass for the queue*/ -#define XNL_F_DESC_BYPASS_EN 0x00000020 -/** Q parameter: fetch credits*/ -#define XNL_F_FETCH_CREDIT 0x00000040 -/** Q parameter: enable writeback accumulation*/ -#define XNL_F_CMPL_STATUS_ACC_EN 0x00000080 -/** Q parameter: enable writeback*/ -#define XNL_F_CMPL_STATUS_EN 0x00000100 -/** Q parameter: enable writeback pending check*/ -#define XNL_F_CMPL_STATUS_PEND_CHK 0x00000200 -/** Q parameter: enable writeback status descriptor*/ -#define XNL_F_CMPL_STATUS_DESC_EN 0x00000400 -/** Q parameter: enable queue completion interrupt*/ -#define XNL_F_C2H_CMPL_INTR_EN 0x00000800 -/** Q parameter: enable user defined data*/ -#define XNL_F_CMPL_UDD_EN 0x00001000 -/** Q parameter: enable the pfetch bypass for the queue */ -#define XNL_F_PFETCH_BYPASS_EN 0x00002000 -/** Q parameter: disable CMPT overflow check */ -#define XNL_F_CMPT_OVF_CHK_DIS 0x00004000 -/** Q parameter: Completion Queue? */ -#define XNL_F_Q_CMPL 0x00008000 - -/** maximum number of queue flags to control queue configuration*/ -#define MAX_QFLAGS 17 - -/** maximum number of interrupt ring entries*/ -#define QDMA_MAX_INT_RING_ENTRIES 512 - -/** - * xnl_attr_t netlink attributes for qdma(variables): - * the index in this enum is used as a reference for the type, - * userspace application has to indicate the corresponding type - * the policy is used for security considerations - */ -enum xnl_attr_t { - XNL_ATTR_GENMSG, /**< generatl message */ - XNL_ATTR_DRV_INFO, /**< device info */ - - XNL_ATTR_DEV_IDX, /**< device index */ - XNL_ATTR_PCI_BUS, /**< pci bus number */ - XNL_ATTR_PCI_DEV, /**< pci device number */ - XNL_ATTR_PCI_FUNC, /**< pci function id */ - - XNL_ATTR_DEV_STAT_MMH2C_PKTS1, /**< number of MM H2C packets */ - XNL_ATTR_DEV_STAT_MMH2C_PKTS2, /**< number of MM H2C packets */ - XNL_ATTR_DEV_STAT_MMC2H_PKTS1, /**< number of MM C2H packets */ - XNL_ATTR_DEV_STAT_MMC2H_PKTS2, /**< number of MM C2H packets */ - XNL_ATTR_DEV_STAT_STH2C_PKTS1, /**< number of ST H2C packets */ - XNL_ATTR_DEV_STAT_STH2C_PKTS2, /**< number of ST H2C packets */ - XNL_ATTR_DEV_STAT_STC2H_PKTS1, /**< number of ST C2H packets */ - XNL_ATTR_DEV_STAT_STC2H_PKTS2, /**< number of ST C2H packets */ - - XNL_ATTR_DEV_CFG_BAR, /**< device config bar number */ - XNL_ATTR_DEV_USR_BAR, /**< device AXI Master Lite(user bar) number */ - XNL_ATTR_DEV_QSET_MAX, /**< max queue sets */ - XNL_ATTR_DEV_QSET_QBASE, /**< queue base start */ - - XNL_ATTR_VERSION_INFO, /**< version info */ - XNL_ATTR_DEVICE_TYPE, /**< device type */ - XNL_ATTR_IP_TYPE, /**< ip type */ - XNL_ATTR_DEV_NUMQS, /**< num of queues */ - XNL_ATTR_DEV_NUM_PFS, /**< num of PFs */ - XNL_ATTR_DEV_MM_CHANNEL_MAX, /**< mm channels */ - XNL_ATTR_DEV_MAILBOX_ENABLE, /**< mailbox enable */ - XNL_ATTR_DEV_FLR_PRESENT, /**< flr present */ - XNL_ATTR_DEV_ST_ENABLE, /**< device st capability */ - XNL_ATTR_DEV_MM_ENABLE, /**< device mm capability */ - XNL_ATTR_DEV_MM_CMPT_ENABLE, /**< device mm cmpt capability */ - - XNL_ATTR_REG_BAR_NUM, /**< register bar number */ - XNL_ATTR_REG_ADDR, /**< register address */ - XNL_ATTR_REG_VAL, /**< register value */ - - XNL_ATTR_CSR_INDEX, /**< csr index */ - XNL_ATTR_CSR_COUNT, /**< csr count */ - - XNL_ATTR_QIDX, /**< queue index */ - XNL_ATTR_NUM_Q, /**< number of queues */ - XNL_ATTR_QFLAG, /**< queue config flags */ - - XNL_ATTR_CMPT_DESC_SIZE, /**< completion descriptor size */ - XNL_ATTR_SW_DESC_SIZE, /**< software descriptor size */ - XNL_ATTR_QRNGSZ_IDX, /**< queue ring index */ - XNL_ATTR_C2H_BUFSZ_IDX, /**< c2h buffer idex */ - XNL_ATTR_CMPT_TIMER_IDX, /**< completion timer index */ - XNL_ATTR_CMPT_CNTR_IDX, /**< completion counter index */ - XNL_ATTR_CMPT_TRIG_MODE, /**< completion trigger mode */ - XNL_ATTR_MM_CHANNEL, /**< mm channel */ - XNL_ATTR_CMPT_ENTRIES_CNT, /**< completion entries count */ - - XNL_ATTR_RANGE_START, /**< range start */ - XNL_ATTR_RANGE_END, /**< range end */ - - XNL_ATTR_INTR_VECTOR_IDX, /**< interrupt vector index */ - XNL_ATTR_INTR_VECTOR_START_IDX, /**< interrupt vector start index */ - XNL_ATTR_INTR_VECTOR_END_IDX, /**< interrupt vector end index */ - XNL_ATTR_RSP_BUF_LEN, /**< response buffer length */ - XNL_ATTR_GLOBAL_CSR, /**< global csr data */ - XNL_ATTR_PIPE_GL_MAX, /**< max no. of gl for pipe */ - XNL_ATTR_PIPE_FLOW_ID, /**< pipe flow id */ - XNL_ATTR_PIPE_SLR_ID, /**< pipe slr id */ - XNL_ATTR_PIPE_TDEST, /**< pipe tdest */ - XNL_ATTR_DEV_STM_BAR, /**< device STM bar number */ - XNL_ATTR_Q_STATE, - XNL_ATTR_ERROR, - XNL_ATTR_PING_PONG_EN, - XNL_ATTR_APERTURE_SZ, - XNL_ATTR_DEV_STAT_PING_PONG_LATMIN1, - XNL_ATTR_DEV_STAT_PING_PONG_LATMIN2, - XNL_ATTR_DEV_STAT_PING_PONG_LATMAX1, - XNL_ATTR_DEV_STAT_PING_PONG_LATMAX2, - XNL_ATTR_DEV_STAT_PING_PONG_LATAVG1, - XNL_ATTR_DEV_STAT_PING_PONG_LATAVG2, - XNL_ATTR_DEV, - XNL_ATTR_DEBUG_EN, /** Debug Regs Capability*/ - XNL_ATTR_DESC_ENGINE_MODE, /** Descriptor Engine Capability */ -#ifdef ERR_DEBUG - XNL_ATTR_QPARAM_ERR_INFO, /**< queue param info */ -#endif - XNL_ATTR_NUM_REGS, /**< number of regs */ - XNL_ATTR_MAX, -}; - -/** - * xnl_st_c2h_cmpt_desc_size - * c2h writeback descriptor sizes - */ -enum xnl_st_c2h_cmpt_desc_size { - XNL_ST_C2H_CMPT_DESC_SIZE_8B, /**< 8B descriptor */ - XNL_ST_C2H_CMPT_DESC_SIZE_16B, /**< 16B descriptor */ - XNL_ST_C2H_CMPT_DESC_SIZE_32B, /**< 32B descriptor */ - XNL_ST_C2H_CMPT_DESC_SIZE_64B, /**< 64B descriptor */ - XNL_ST_C2H_NUM_CMPT_DESC_SIZES /**< Num of desc sizes */ -}; - -enum xnl_qdma_rngsz_idx { - XNL_QDMA_RNGSZ_2048_IDX, - XNL_QDMA_RNGSZ_64_IDX, - XNL_QDMA_RNGSZ_128_IDX, - XNL_QDMA_RNGSZ_192_IDX, - XNL_QDMA_RNGSZ_256_IDX, - XNL_QDMA_RNGSZ_384_IDX, - XNL_QDMA_RNGSZ_512_IDX, - XNL_QDMA_RNGSZ_768_IDX, - XNL_QDMA_RNGSZ_1024_IDX, - XNL_QDMA_RNGSZ_1536_IDX, - XNL_QDMA_RNGSZ_3072_IDX, - XNL_QDMA_RNGSZ_4096_IDX, - XNL_QDMA_RNGSZ_6144_IDX, - XNL_QDMA_RNGSZ_8192_IDX, - XNL_QDMA_RNGSZ_12288_IDX, - XNL_QDMA_RNGSZ_16384_IDX, - XNL_QDMA_RNGSZ_IDXS -}; - - -static const char *xnl_attr_str[XNL_ATTR_MAX + 1] = { - "GENMSG", /**< XNL_ATTR_GENMSG */ - "DRV_INFO", /**< XNL_ATTR_DRV_INFO */ - "DEV_IDX", /**< XNL_ATTR_DEV_IDX */ - "DEV_PCIBUS", /**< XNL_ATTR_PCI_BUS */ - "DEV_PCIDEV", /**< XNL_ATTR_PCI_DEV */ - "DEV_PCIFUNC", /**< XNL_ATTR_PCI_FUNC */ - "DEV_STAT_MMH2C_PKTS1", /**< number of MM H2C packkts */ - "DEV_STAT_MMH2C_PKTS2", /**< number of MM H2C packkts */ - "DEV_STAT_MMC2H_PKTS1", /**< number of MM C2H packkts */ - "DEV_STAT_MMC2H_PKTS2", /**< number of MM C2H packkts */ - "DEV_STAT_STH2C_PKTS1", /**< number of ST H2C packkts */ - "DEV_STAT_STH2C_PKTS2", /**< number of ST H2C packkts */ - "DEV_STAT_STC2H_PKTS1", /**< number of ST C2H packkts */ - "DEV_STAT_STC2H_PKTS2", /**< number of ST C2H packkts */ - "DEV_CFG_BAR", /**< XNL_ATTR_DEV_CFG_BAR */ - "DEV_USR_BAR", /**< XNL_ATTR_DEV_USER_BAR */ - "DEV_QSETMAX", /**< XNL_ATTR_DEV_QSET_MAX */ - "DEV_QBASE", /**< XNL_ATTR_DEV_QSET_QBASE */ - "VERSION_INFO", /**< XNL_ATTR_VERSION_INFO */ - "DEVICE_TYPE", /**< XNL_ATTR_DEVICE_TYPE */ - "IP_TYPE", /**< XNL_ATTR_IP_TYPE */ - "DEV_NUMQS", /**<XNL_ATTR_DEV_NUMQS */ - "DEV_NUM_PFS", /**<XNL_ATTR_DEV_NUM_PFS */ - "DEV_MM_CHANNEL_MAX", /**<XNL_ATTR_DEV_MM_CHANNEL_MAX */ - "DEV_MAILBOX_ENABLE", /**<XNL_ATTR_DEV_MAILBOX_ENABLE */ - "DEV_FLR_PRESENT", /**<XNL_ATTR_DEV_FLR_PRESENT */ - "DEV_ST_ENABLE", /**<XNL_ATTR_DEV_ST_ENABLE */ - "DEV_MM_ENABLE", /**<XNL_ATTR_DEV_MM_ENABLE */ - "DEV_MM_CMPT_ENABLE", /**<XNL_ATTR_DEV_MM_CMPT_ENABLE */ - "REG_BAR", /**< XNL_ATTR_REG_BAR_NUM */ - "REG_ADDR", /**< XNL_ATTR_REG_ADDR */ - "REG_VAL", /**< XNL_ATTR_REG_VAL */ - "CSR_INDEX", /**< XNL_ATTR_CSR_INDEX*/ - "CSR_COUNT", /**< XNL_ATTR_CSR_COUNT*/ - "QIDX", /**< XNL_ATTR_QIDX */ - "NUM_Q", /**< XNL_ATTR_NUM_Q */ - "QFLAG", /**< XNL_ATTR_QFLAG */ - "CMPT_DESC_SZ", /**< XNL_ATTR_CMPT_DESC_SIZE */ - "SW_DESC_SIZE", /**< XNL_ATTR_SW_DESC_SIZE */ - "QRINGSZ_IDX", /**< XNL_ATTR_QRNGSZ */ - "C2H_BUFSZ_IDX", /**< XNL_ATTR_QBUFSZ */ - "CMPT_TIMER_IDX", /**< XNL_ATTR_CMPT_TIMER_IDX */ - "CMPT_CNTR_IDX", /**< XNL_ATTR_CMPT_CNTR_IDX */ - "CMPT_TRIG_MODE", /**< XNL_ATTR_CMPT_TRIG_MODE */ - "RANGE_START", /**< XNL_ATTR_RANGE_START */ - "RANGE_END", /**< XNL_ATTR_RANGE_END */ - "INTR_VECTOR_IDX", /**< XNL_ATTR_INTR_VECTOR_IDX */ - "INTR_VECTOR_START_IDX", /**< XNL_ATTR_INTR_VECTOR_START_IDX */ - "INTR_VECTOR_END_IDX", /**< XNL_ATTR_INTR_VECTOR_END_IDX */ - "RSP_BUF_LEN", /**< XNL_ATTR_RSP_BUF_LEN */ - "GLOBAL_CSR", /**< global csr data */ - "PIPE_GL_MAX", /**< max no. of gl for pipe */ - "PIPE_FLOW_ID", /**< pipe flow id */ - "PIPE_SLR_ID", /**< pipe slr id */ - "PIPE_TDEST", /**< pipe tdest */ - "DEV_STM_BAR", /**< device STM bar number */ - "Q_STATE", /**< XNL_ATTR_Q_STATE*/ - "ERROR", /**< XNL_ATTR_ERROR */ - "PING_PONG_EN", /**< XNL_PING_PONG_EN */ - "DEV_ATTR", /**< XNL_ATTR_DEV */ - "XNL_ATTR_DEBUG_EN", /** XNL_ATTR_DEBUG_EN */ - "XNL_ATTR_DESC_ENGINE_MODE", /** XNL_ATTR_DESC_ENGINE_MODE */ -#ifdef ERR_DEBUG - "QPARAM_ERR_INFO", /**< queue param info */ -#endif - "ATTR_MAX", - -}; - - - -/* commands, 0 ~ 0x7F */ -/** - * xnl_op_t - XNL command types - */ -enum xnl_op_t { - XNL_CMD_DEV_LIST, /**< list all the qdma devices */ - XNL_CMD_DEV_INFO, /**< dump the device information */ - XNL_CMD_DEV_STAT, /**< dump the device statistics */ - XNL_CMD_DEV_STAT_CLEAR, /**< reset the device statistics */ - - XNL_CMD_REG_DUMP, /**< dump the register information */ - XNL_CMD_REG_RD, /**< read a register value */ - XNL_CMD_REG_WRT, /**< write value to a register */ - - XNL_CMD_Q_LIST, /**< list all the queue present in the system */ - XNL_CMD_Q_ADD, /**< add a queue */ - XNL_CMD_Q_START, /**< start a queue */ - XNL_CMD_Q_STOP, /**< stop a queue */ - XNL_CMD_Q_DEL, /**< delete a queue */ - XNL_CMD_Q_DUMP, /**< dump queue information*/ - XNL_CMD_Q_DESC, /**< dump descriptor information*/ - XNL_CMD_Q_CMPT, /**< dump writeback descriptor information*/ - XNL_CMD_Q_RX_PKT, /**< dump packet information*/ - XNL_CMD_Q_CMPT_READ, /**< read the cmpt data */ -#ifdef ERR_DEBUG - XNL_CMD_Q_ERR_INDUCE, /**< induce an error*/ -#endif - - XNL_CMD_INTR_RING_DUMP, /**< dump interrupt ring information*/ - XNL_CMD_Q_UDD, /**< dump the user defined data */ - XNL_CMD_GLOBAL_CSR, /**< get all global csr register values */ - XNL_CMD_DEV_CAP, /**< list h/w capabilities , hw and sw version */ - XNL_CMD_GET_Q_STATE, /**< get the queue state */ - XNL_CMD_REG_INFO_READ, /**< read register info */ -#ifdef TANDEM_BOOT_SUPPORTED - XNL_CMD_EN_ST, /**< Enable Streaming */ -#endif - XNL_CMD_MAX, /**< max number of XNL commands*/ -}; - -/** - * XNL command operation type - */ -static const char *xnl_op_str[XNL_CMD_MAX] = { - "DEV_LIST", /** XNL_CMD_DEV_LIST */ - "DEV_INFO", /** XNL_CMD_DEV_INFO */ - "DEV_STAT", /** XNL_CMD_DEV_STAT */ - "DEV_STAT_CLEAR", /** XNL_CMD_DEV_STAT_CLEAR */ - - "REG_DUMP", /** XNL_CMD_REG_DUMP */ - "REG_READ", /** XNL_CMD_REG_RD */ - "REG_WRITE", /** XNL_CMD_REG_WRT */ - - "Q_LIST", /** XNL_CMD_Q_LIST */ - "Q_ADD", /** XNL_CMD_Q_ADD */ - "Q_START", /** XNL_CMD_Q_START */ - "Q_STOP", /** XNL_CMD_Q_STOP */ - "Q_DEL", /** XNL_CMD_Q_DEL */ - "Q_DUMP", /** XNL_CMD_Q_DUMP */ - "Q_DESC", /** XNL_CMD_Q_DESC */ - "Q_CMPT", /** XNL_CMD_Q_CMPT */ - "Q_RX_PKT", /** XNL_CMD_Q_RX_PKT */ - "Q_CMPT_READ", /** XNL_CMD_Q_CMPT_READ */ -#ifdef ERR_DEBUG - "Q_ERR_INDUCE", /** XNL_CMD_Q_ERR_INDUCE */ -#endif - "INTR_RING_DUMP", /** XNL_CMD_INTR_RING_DUMP */ - "Q_UDD_DUMP", /** XNL_CMD_Q_UDD */ - "GLOBAL_CSR", /** XNL_CMD_GLOBAL_CSR*/ - "DEV_CAP", /** XNL_CMD_DEV_CAP */ - "GET_Q_STATE", /** XNL_CMD_GET_Q_STATE */ - "REG_INFO_READ", /** XNL_CMD_REG_INFO_READ */ -#ifdef TANDEM_BOOT_SUPPORTED - "EN_ST" /** XNL_CMD_EN_ST */ -#endif -}; - -enum qdma_queue_state { - QUEUE_DISABLED, - QUEUE_ENABLED, - QUEUE_ONLINE -}; - - -/** - * qdma_err_idx - Induce error - */ -enum qdma_err_idx { - err_ram_sbe, - err_ram_dbe, - err_dsc, - err_trq, - err_h2c_mm_0, - err_h2c_mm_1, - err_c2h_mm_0, - err_c2h_mm_1, - err_c2h_st, - ind_ctxt_cmd_err, - err_bdg, - err_h2c_st, - poison, - ur_ca, - param, - addr, - tag, - flr, - timeout, - dat_poison, - flr_cancel, - dma, - dsc, - rq_cancel, - dbe, - sbe, - unmapped, - qid_range, - vf_access_err, - tcp_timeout, - mty_mismatch, - len_mismatch, - qid_mismatch, - desc_rsp_err, - eng_wpl_data_par_err, - msi_int_fail, - err_desc_cnt, - portid_ctxt_mismatch, - portid_byp_in_mismatch, - cmpt_inv_q_err, - cmpt_qfull_err, - cmpt_cidx_err, - cmpt_prty_err, - fatal_mty_mismatch, - fatal_len_mismatch, - fatal_qid_mismatch, - timer_fifo_ram_rdbe, - fatal_eng_wpl_data_par_err, - pfch_II_ram_rdbe, - cmpt_ctxt_ram_rdbe, - pfch_ctxt_ram_rdbe, - desc_req_fifo_ram_rdbe, - int_ctxt_ram_rdbe, - cmpt_coal_data_ram_rdbe, - tuser_fifo_ram_rdbe, - qid_fifo_ram_rdbe, - payload_fifo_ram_rdbe, - wpl_data_par_err, - zero_len_desc_err, - csi_mop_err, - no_dma_dsc_err, - sb_mi_h2c0_dat, - sb_mi_c2h0_dat, - sb_h2c_rd_brg_dat, - sb_h2c_wr_brg_dat, - sb_c2h_rd_brg_dat, - sb_c2h_wr_brg_dat, - sb_func_map, - sb_dsc_hw_ctxt, - sb_dsc_crd_rcv, - sb_dsc_sw_ctxt, - sb_dsc_cpli, - sb_dsc_cpld, - sb_pasid_ctxt_ram, - sb_timer_fifo_ram, - sb_payload_fifo_ram, - sb_qid_fifo_ram, - sb_tuser_fifo_ram, - sb_wrb_coal_data_ram, - sb_int_qid2vec_ram, - sb_int_ctxt_ram, - sb_desc_req_fifo_ram, - sb_pfch_ctxt_ram, - sb_wrb_ctxt_ram, - sb_pfch_ll_ram, - sb_h2c_pend_fifo, - db_mi_h2c0_dat, - db_mi_c2h0_dat, - db_h2c_rd_brg_dat, - db_h2c_wr_brg_dat, - db_c2h_rd_brg_dat, - db_c2h_wr_brg_dat, - db_func_map, - db_dsc_hw_ctxt, - db_dsc_crd_rcv, - db_dsc_sw_ctxt, - db_dsc_cpli, - db_dsc_cpld, - db_pasid_ctxt_ram, - db_timer_fifo_ram, - db_payload_fifo_ram, - db_qid_fifo_ram, - db_tuser_fifo_ram, - db_wrb_coal_data_ram, - db_int_qid2vec_ram, - db_int_ctxt_ram, - db_desc_req_fifo_ram, - db_pfch_ctxt_ram, - db_wrb_ctxt_ram, - db_pfch_ll_ram, - db_h2c_pend_fifo, - qdma_errs -}; - -#endif /* ifndef QDMA_NL_H__ */ diff --git a/QDMA/linux-kernel/driver/include/qdma_user_reg_dump.h b/QDMA/linux-kernel/driver/include/qdma_user_reg_dump.h deleted file mode 100755 index 80906ce..0000000 --- a/QDMA/linux-kernel/driver/include/qdma_user_reg_dump.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "qdma_reg_dump.h" - -#ifndef __QDMA_USER_REG_DUMP_H__ -#define __QDMA_USER_REG_DUMP_H__ - - - -static struct xreg_info qdma_user_regs[] = { - {"ST_C2H_QID", 0x0, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKTLEN", 0x4, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CONTROL", 0x8, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - /* ST_C2H_CONTROL: - * [1] : start C2H - * [2] : immediate data - * [3] : every packet statrs with 00 instead of continuous data - * stream until # of packets is complete - * [31]: gen_user_reset_n - */ - {"ST_H2C_CONTROL", 0xC, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - /* ST_H2C_CONTROL: - * [0] : clear match for H2C transfer - */ - {"ST_H2C_STATUS", 0x10, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_H2C_XFER_CNT", 0x14, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_CNT", 0x20, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CMPT_DATA", 0x30, 8, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_CMPT_SIZE", 0x50, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_SCRATCH_REG", 0x60, 2, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_DROP", 0x88, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"ST_C2H_PKT_ACCEPT", 0x8C, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"DSC_BYPASS_LOOP", 0x90, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT", 0x94, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT_MASK", 0x98, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"USER_INTERRUPT_VEC", 0x9C, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"DMA_CONTROL", 0xA0, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - {"VDM_MSG_READ", 0xA4, 0, 0, 0, 0, QDMA_MM_ST_MODE}, - - {"", 0, 0, 0 } -}; - - -#endif diff --git a/QDMA/linux-kernel/driver/include/xdev_regs.h b/QDMA/linux-kernel/driver/include/xdev_regs.h deleted file mode 100755 index c1c198d..0000000 --- a/QDMA/linux-kernel/driver/include/xdev_regs.h +++ /dev/null @@ -1,246 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2018-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XDEV_REGS_H__ -#define __XDEV_REGS_H__ - -struct xreg_info { - const char name[32]; - uint32_t addr; - unsigned int repeat; - unsigned int step; - unsigned char shift; - unsigned char len; - unsigned char filler[2]; -}; - -static struct xreg_info qdma_config_regs[] = { - - /* QDMA_TRQ_SEL_GLBL1 (0x00000) */ - {"CFG_BLOCK_ID", 0x00, 0, 0, 0, 0,}, - {"CFG_BUSDEV", 0x04, 0, 0, 0, 0,}, - {"CFG_PCIE_MAX_PL_SZ", 0x08, 0, 0, 0, 0,}, - {"CFG_PCIE_MAX_RDRQ_SZ", 0x0C, 0, 0, 0, 0,}, - {"CFG_SYS_ID", 0x10, 0, 0, 0, 0,}, - {"CFG_MSI_EN", 0x14, 0, 0, 0, 0,}, - {"CFG_PCIE_DATA_WIDTH", 0x18, 0, 0, 0, 0,}, - {"CFG_PCIE_CTRL", 0x1C, 0, 0, 0, 0,}, - {"CFG_AXI_USR_MAX_PL_SZ", 0x40, 0, 0, 0, 0,}, - {"CFG_AXI_USR_MAX_RDRQ_SZ", 0x44, 0, 0, 0, 0,}, - {"CFG_MISC_CTRL", 0x4C, 0, 0, 0, 0,}, - {"CFG_SCRATCH_REG", 0x80, 8, 0, 0, 0,}, - {"QDMA_RAM_SBE_MSK_A", 0xF0, 0, 0, 0, 0,}, - {"QDMA_RAM_SBE_STS_A", 0xF4, 0, 0, 0, 0,}, - {"QDMA_RAM_DBE_MSK_A", 0xF8, 0, 0, 0, 0,}, - {"QDMA_RAM_DBE_STS_A", 0xFC, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_GLBL2 (0x00100) */ - {"GLBL2_ID", 0x100, 0, 0, 0, 0,}, - {"GLBL2_PF_BL_INT", 0x104, 0, 0, 0, 0,}, - {"GLBL2_PF_VF_BL_INT", 0x108, 0, 0, 0, 0,}, - {"GLBL2_PF_BL_EXT", 0x10C, 0, 0, 0, 0,}, - {"GLBL2_PF_VF_BL_EXT", 0x110, 0, 0, 0, 0,}, - {"GLBL2_CHNL_INST", 0x114, 0, 0, 0, 0,}, - {"GLBL2_CHNL_QDMA", 0x118, 0, 0, 0, 0,}, - {"GLBL2_CHNL_STRM", 0x11C, 0, 0, 0, 0,}, - {"GLBL2_QDMA_CAP", 0x120, 0, 0, 0, 0,}, - {"GLBL2_PASID_CAP", 0x128, 0, 0, 0, 0,}, - {"GLBL2_FUNC_RET", 0x12C, 0, 0, 0, 0,}, - {"GLBL2_SYS_ID", 0x130, 0, 0, 0, 0,}, - {"GLBL2_MISC_CAP", 0x134, 0, 0, 0, 0,}, - {"GLBL2_DBG_PCIE_RQ", 0x1B8, 2, 0, 0, 0,}, - {"GLBL2_DBG_AXIMM_WR", 0x1C0, 2, 0, 0, 0,}, - {"GLBL2_DBG_AXIMM_RD", 0x1C8, 2, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_GLBL (0x00200) */ - {"GLBL_RNGSZ", 0x204, 16, 0, 0, 0,}, - {"GLBL_ERR_STAT", 0x248, 0, 0, 0, 0,}, - {"GLBL_ERR_MASK", 0x24C, 0, 0, 0, 0,}, - {"GLBL_DSC_CFG", 0x250, 0, 0, 0, 0,}, - {"GLBL_DSC_ERR_STS", 0x254, 0, 0, 0, 0,}, - {"GLBL_DSC_ERR_MSK", 0x258, 0, 0, 0, 0,}, - {"GLBL_DSC_ERR_LOG", 0x25C, 2, 0, 0, 0,}, - {"GLBL_TRQ_ERR_STS", 0x264, 0, 0, 0, 0,}, - {"GLBL_TRQ_ERR_MSK", 0x268, 0, 0, 0, 0,}, - {"GLBL_TRQ_ERR_LOG", 0x26C, 0, 0, 0, 0,}, - {"GLBL_DSC_DBG_DAT", 0x270, 2, 0, 0, 0,}, - {"GLBL_DSC_ERR_LOG2", 0x27C, 0, 0, 0, 0,}, - {"GLBL_INTERRUPT_CFG", 0x288, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_FMAP (0x00400 - 0x7FC) */ - /* TODO: max 256, display 4 for now */ - {"TRQ_SEL_FMAP", 0x400, 4, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_IND (0x00800) */ - {"IND_CTXT_DATA", 0x804, 8, 0, 0, 0,}, - {"IND_CTXT_MASK", 0x824, 8, 0, 0, 0,}, - {"IND_CTXT_CMD", 0x844, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_C2H (0x00A00) */ - {"C2H_TIMER_CNT", 0xA00, 16, 0, 0, 0,}, - {"C2H_CNT_THRESH", 0xA40, 16, 0, 0, 0,}, - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xA88, 0, 0, 0, 0,}, - {"C2H_STAT_S_AXIS_CMPT_ACCEPTED", 0xA8C, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xA90, 0, 0, 0, 0,}, - {"C2H_STAT_AXIS_PKG_CMP", 0xA94, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_ACCEPTED", 0xA98, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_CMP", 0xA9C, 0, 0, 0, 0,}, - {"C2H_STAT_WRQ_OUT", 0xAA0, 0, 0, 0, 0,}, - {"C2H_STAT_WPL_REN_ACCEPTED", 0xAA4, 0, 0, 0, 0,}, - {"C2H_STAT_TOTAL_WRQ_LEN", 0xAA8, 0, 0, 0, 0,}, - {"C2H_STAT_TOTAL_WPL_LEN", 0xAAC, 0, 0, 0, 0,}, - {"C2H_BUF_SZ", 0xAB0, 16, 0, 0, 0,}, - {"C2H_ERR_STAT", 0xAF0, 0, 0, 0, 0,}, - {"C2H_ERR_MASK", 0xAF4, 0, 0, 0, 0,}, - {"C2H_FATAL_ERR_STAT", 0xAF8, 0, 0, 0, 0,}, - {"C2H_FATAL_ERR_MASK", 0xAFC, 0, 0, 0, 0,}, - {"C2H_FATAL_ERR_ENABLE", 0xB00, 0, 0, 0, 0,}, - {"GLBL_ERR_INT", 0xB04, 0, 0, 0, 0,}, - {"C2H_PFCH_CFG", 0xB08, 0, 0, 0, 0,}, - {"C2H_INT_TIMER_TICK", 0xB0C, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xB10, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xB14, 0, 0, 0, 0,}, - {"C2H_STAT_DESC_REQ", 0xB18, 0, 0, 0, 0,}, - {"C2H_STAT_DEBUG_DMA_ENG", 0xB1C, 4, 0, 0, 0,}, - {"C2H_DBG_PFCH_ERR_CTXT", 0xB2C, 0, 0, 0, 0,}, - {"C2H_FIRST_ERR_QID", 0xB30, 0, 0, 0, 0,}, - {"STAT_NUM_CMPT_IN", 0xB34, 0, 0, 0, 0,}, - {"STAT_NUM_CMPT_OUT", 0xB38, 0, 0, 0, 0,}, - {"STAT_NUM_CMPT_DRP", 0xB3C, 0, 0, 0, 0,}, - {"STAT_NUM_STAT_DESC_OUT", 0xB40, 0, 0, 0, 0,}, - {"STAT_NUM_DSC_CRDT_SENT", 0xB44, 0, 0, 0, 0,}, - {"STAT_NUM_FCH_DSC_RCVD", 0xB48, 0, 0, 0, 0,}, - {"STAT_NUM_BYP_DSC_RCVD", 0xB4C, 0, 0, 0, 0,}, - {"C2H_CMPT_COAL_CFG", 0xB50, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_REQ", 0xB54, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_MM_REQ", 0xB58, 0, 0, 0, 0,}, - {"C2H_INTR_ERR_INT_REQ", 0xB5C, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_REQ", 0xB60, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_ERR_MM_MSIX_ACK", 0xB64, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_ERR_MM_MSIX_FAIL", 0xB68, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_ERR_MM_NO_MSIX", 0xB6C, 0, 0, 0, 0,}, - {"C2H_INTR_H2C_ERR_MM_CTXT_INVAL", 0xB70, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_MSIX_ACK", 0xB74, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_MSIX_FAIL", 0xB78, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_NO_MSIX", 0xB7C, 0, 0, 0, 0,}, - {"C2H_INTR_C2H_ST_CTXT_INVAL", 0xB80, 0, 0, 0, 0,}, - {"C2H_STAT_WR_CMP", 0xB84, 0, 0, 0, 0,}, - {"C2H_STAT_DEBUG_DMA_ENG_4", 0xB88, 0, 0, 0, 0,}, - {"C2H_STAT_DEBUG_DMA_ENG_5", 0xB8C, 0, 0, 0, 0,}, - {"C2H_DBG_PFCH_QID", 0xB90, 0, 0, 0, 0,}, - {"C2H_DBG_PFCH", 0xB94, 0, 0, 0, 0,}, - {"C2H_INT_DEBUG", 0xB98, 0, 0, 0, 0,}, - {"C2H_STAT_IMM_ACCEPTED", 0xB9C, 0, 0, 0, 0,}, - {"C2H_STAT_MARKER_ACCEPTED", 0xBA0, 0, 0, 0, 0,}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xBA4, 0, 0, 0, 0,}, - {"C2H_C2H_PAYLOAD_FIFO_CRDT_CNT", 0xBA8, 0, 0, 0, 0,}, - - {"C2H_INTR_DYN_REQ", 0xBAC, 0, 0, 0, 0,}, - {"C2H_INTR_DYN_MSIX", 0xBB0, 0, 0, 0, 0,}, - {"C2H_DROP_LEN_MISMATCH", 0xBB4, 0, 0, 0, 0,}, - {"C2H_DROP_DESC_RSP_LEN", 0xBB8, 0, 0, 0, 0,}, - {"C2H_DROP_QID_FIFO_LEN", 0xBBC, 0, 0, 0, 0,}, - {"C2H_DROP_PAYLOAD_CNT", 0xBC0, 0, 0, 0, 0,}, - {"QDMA_C2H_CMPT_FORMAT", 0xBC4, 7, 0, 0, 0,}, - {"C2H_PFCH_CACHE_DEPTH", 0xBE0, 0, 0, 0, 0,}, - {"C2H_CMPT_COAL_BUF_DEPTH", 0xBE4, 0, 0, 0, 0,}, - {"C2H_PFCH_CRDT", 0xBE8, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_H2C(0x00E00) Register Space*/ - {"H2C_ERR_STAT", 0xE00, 0, 0, 0, 0,}, - {"H2C_ERR_MASK", 0xE04, 0, 0, 0, 0,}, - {"H2C_FIRST_ERR_QID", 0xE08, 0, 0, 0, 0,}, - {"H2C_DBG_REG", 0xE0C, 5, 0, 0, 0,}, - {"H2C_FATAL_ERR_EN", 0xE20, 0, 0, 0, 0,}, - {"H2C_REQ_THROT", 0xE24, 0, 0, 0, 0,}, - {"H2C_ALN_DBG_REG0", 0xE28, 0, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_C2H_MM (0x1000) */ - {"C2H_MM_CONTROL", 0x1004, 3, 0, 0, 0,}, - {"C2H_MM_STATUS", 0x1040, 2, 0, 0, 0,}, - {"C2H_MM_CMPL_DSC_CNT", 0x1048, 0, 0, 0, 0,}, - {"C2H_MM_ERR_CODE_EN_MASK", 0x1054, 0, 0, 0, 0,}, - {"C2H_MM_ERR_CODE", 0x1058, 0, 0, 0, 0,}, - {"C2H_MM_ERR_INFO", 0x105C, 0, 0, 0, 0,}, - {"C2H_MM_PERF_MON_CTRL", 0x10C0, 0, 0, 0, 0,}, - {"C2H_MM_PERF_MON_CY_CNT", 0x10C4, 2, 0, 0, 0,}, - {"C2H_MM_PERF_MON_DATA_CNT", 0x10CC, 2, 0, 0, 0,}, - {"C2H_MM_DBG_INFO", 0x10E8, 2, 0, 0, 0,}, - - /* QDMA_TRQ_SEL_H2C_MM (0x1200)*/ - {"H2C_MM_CONTROL", 0x1204, 3, 0, 0, 0,}, - {"H2C_MM_STATUS", 0x1240, 0, 0, 0, 0,}, - {"H2C_MM_CMPL_DSC_CNT", 0x1248, 0, 0, 0, 0,}, - {"H2C_MM_ERR_CODE_EN_MASK", 0x1254, 0, 0, 0, 0,}, - {"H2C_MM_ERR_CODE", 0x1258, 0, 0, 0, 0,}, - {"H2C_MM_ERR_INFO", 0x125C, 0, 0, 0, 0,}, - {"H2C_MM_PERF_MON_CTRL", 0x12C0, 0, 0, 0, 0,}, - {"H2C_MM_PERF_MON_CY_CNT", 0x12C4, 2, 0, 0, 0,}, - {"H2C_MM_PERF_MON_DATA_CNT", 0x12CC, 2, 0, 0, 0,}, - {"H2C_MM_DBG_INFO", 0x12E8, 0, 0, 0, 0,}, - {"H2C_MM_REQ_THROT", 0x12EC, 0, 0, 0, 0,}, - - /* QDMA_PF_MAILBOX (0x2400) */ - {"FUNC_STATUS", 0x2400, 0, 0, 0, 0,}, - {"FUNC_CMD", 0x2404, 0, 0, 0, 0,}, - {"FUNC_INTR_VEC", 0x2408, 0, 0, 0, 0,}, - {"TARGET_FUNC", 0x240C, 0, 0, 0, 0,}, - {"INTR_CTRL", 0x2410, 0, 0, 0, 0,}, - {"PF_ACK", 0x2420, 8, 0, 0, 0,}, - {"FLR_CTRL_STATUS", 0x2500, 0, 0, 0, 0,}, - {"MSG_IN", 0x2800, 32, 0, 0, 0,}, - {"MSG_OUT", 0x2C00, 32, 0, 0, 0,}, - - {"", 0, 0, 0 } -}; - -static struct xreg_info qdma_user_regs[] = { - {"ST_C2H_QID", 0x0, 0, 0, 0, 0,}, - {"ST_C2H_PKTLEN", 0x4, 0, 0, 0, 0,}, - {"ST_C2H_CONTROL", 0x8, 0, 0, 0, 0,}, - /* ST_C2H_CONTROL: - * [1] : start C2H - * [2] : immediate data - * [3] : every packet statrs with 00 instead of continuous data - * stream until # of packets is complete - * [31]: gen_user_reset_n - */ - {"ST_H2C_CONTROL", 0xC, 0, 0, 0, 0,}, - /* ST_H2C_CONTROL: - * [0] : clear match for H2C transfer - */ - {"ST_H2C_STATUS", 0x10, 0, 0, 0, 0,}, - {"ST_H2C_XFER_CNT", 0x14, 0, 0, 0, 0,}, - {"ST_C2H_PKT_CNT", 0x20, 0, 0, 0, 0,}, - {"ST_C2H_CMPT_DATA", 0x30, 8, 0, 0, 0,}, - {"ST_C2H_CMPT_SIZE", 0x50, 0, 0, 0, 0,}, - {"ST_SCRATCH_REG", 0x60, 2, 0, 0, 0,}, - {"ST_C2H_PKT_DROP", 0x88, 0, 0, 0, 0,}, - {"ST_C2H_PKT_ACCEPT", 0x8C, 0, 0, 0, 0,}, - {"DSC_BYPASS_LOOP", 0x90, 0, 0, 0, 0,}, - {"USER_INTERRUPT", 0x94, 0, 0, 0, 0,}, - {"USER_INTERRUPT_MASK", 0x98, 0, 0, 0, 0,}, - {"USER_INTERRUPT_VEC", 0x9C, 0, 0, 0, 0,}, - {"DMA_CONTROL", 0xA0, 0, 0, 0, 0,}, - {"VDM_MSG_READ", 0xA4, 0, 0, 0, 0,}, - - {"", 0, 0, 0 } -}; - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/Makefile b/QDMA/linux-kernel/driver/libqdma/Makefile deleted file mode 100755 index 3184572..0000000 --- a/QDMA/linux-kernel/driver/libqdma/Makefile +++ /dev/null @@ -1,66 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - -SHELL = /bin/bash - -# The top-level makefile defines required variables and flags. -ifneq ($(shell [[ $(MAKELEVEL) -ge 1 ]] && echo 1),1) - $(error Please use the top-level Makefile to build this driver) -endif - -ifneq ($(wildcard /etc/lsb-release),) - ifneq ($(shell $(grep) "Ubuntu" /etc/lsb-release),) - FLAGS += -DUBUNTU_VERSION_CODE - endif -endif - -include $(srcdir)/../make_rules/common_flags.mk - -$(info srcdir = $(srcdir).) -$(info KSRC = $(KSRC).) - -EXTRA_CFLAGS += -DLINUX -D__KERNEL__ -DMODULE -O2 -pipe -Wall -Werror -EXTRA_CFLAGS += $(FLAGS) $(CPPFLAGS) -EXTRA_CFLAGS += -I$(srcdir)/../include -EXTRA_CFLAGS += -I$(KSRC)/../include -EXTRA_CFLAGS += -I. - -#EXTRA_CFLAGS += -DDEBUG - -ifneq ($(modulesymfile),) - override symverfile = symverfile="$(topdir)/$(modulesymfile) \ - -o $(drvdir)/$(modulesymfile)" -else - override symverfile = -endif - -MOD_NAME := libqdma -ifneq ($(SUBDIRS),) - BASE_OBJS := $(patsubst $(SUBDIRS)/%.c,%.o,$(wildcard $(SUBDIRS)/*.c)) -endif -obj-m := $(MOD_NAME).o -$(MOD_NAME)-objs := $(BASE_OBJS) - -.PHONY: build -build: - @$(MAKE) symverfile=$(symverfile) KBUILD_EXTRA_SYMBOLS=$(extra_symb) -C $(KOBJ) SUBDIRS=$(shell pwd) modules - -.PHONY: clean -clean: - @-/bin/rm -rf *.ko* ?odule* .tmp_versions *.mod.* *.o .*.o.* .*.cmd diff --git a/QDMA/linux-kernel/driver/libqdma/libqdma_config.c b/QDMA/linux-kernel/driver/libqdma/libqdma_config.c deleted file mode 100755 index 69fbf63..0000000 --- a/QDMA/linux-kernel/driver/libqdma/libqdma_config.c +++ /dev/null @@ -1,639 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -/** - * @file - * @brief This file contains the definitions for qdma configuration apis - * - */ -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "libqdma_export.h" - -#include "qdma_descq.h" -#include "qdma_device.h" -#include "qdma_thread.h" -#include "qdma_regs.h" -#include "qdma_context.h" -#include "qdma_intr.h" -#include "thread.h" -#include "version.h" -#include "qdma_resource_mgmt.h" - -/*****************************************************************************/ -/** - * qdma_set_qmax() - Handler function to set the qmax configuration value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] qsets_max: qmax configuration value - * @param[in] forced: whether to force set the value - * - * - * @return 0 on success - * @return < 0 on failure - *****************************************************************************/ -int qdma_set_qmax(unsigned long dev_hndl, int qbase, u32 qsets_max) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = 0; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - - /* update the device with requested qmax and qbase */ - rv = qdma_dev_update(xdev->dma_device_index, xdev->func_id, - qsets_max, &qbase); - if (rv < 0) { - pr_err("Failed to update dev entry, err = %d", rv); - return -EINVAL; - } - qdma_device_cleanup(xdev); - - rv = qdma_dev_qinfo_get(xdev->dma_device_index, xdev->func_id, - &qbase, &qsets_max); - if (rv < 0) { - pr_err("Failed to get qinfo, err = %d", rv); - return -EINVAL; - } - xdev->conf.qsets_max = qsets_max; - xdev->conf.qsets_base = qbase; - rv = qdma_device_init(xdev); - if (rv < 0) { - pr_warn("qdma_init failed, err = %d", rv); - qdma_device_cleanup(xdev); - return -EINVAL; - } - - return 0; -} -/*****************************************************************************/ -/** - * qdma_get_qmax() - Handler function to get the qmax configuration value - * - * @param[in] dev_hndl: qdma device handle - * - * @return qmax value on success - * @return < 0 on failure - *****************************************************************************/ -unsigned int qdma_get_qmax(unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** - * If xdev is NULL return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - /** - * Return the current qsets_max value of the device - */ - return xdev->conf.qsets_max; -} - -/*****************************************************************************/ -/** - * qdma_set_intr_rngsz() - Handler function to set the intr_ring_size value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] intr_rngsz: interrupt aggregation ring size - * - * @return 0 on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_intr_rngsz(unsigned long dev_hndl, u32 intr_rngsz) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = -1; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - /** If the input intr_rngsz is same as the - * current xdev->conf.intr_rngsz, - * return, as there is nothing to be changed - */ - if (intr_rngsz == xdev->conf.intr_rngsz) { - pr_err("xdev 0x%p, Current intr_rngsz is same as [%d].Nothing to be done\n", - xdev, intr_rngsz); - return rv; - } - - /** If interrupt aggregation is not enabled, then no need to change the - * interrupt ring size. Retrun error in this case. - */ - if ((xdev->conf.qdma_drv_mode != INDIRECT_INTR_MODE) && - (xdev->conf.qdma_drv_mode != AUTO_MODE)) { - pr_err("xdev 0x%p, interrupt aggregation is disabled\n", xdev); - return rv; - } - - /** If qdma_get_active_queue_count() > 0, - * intr_rngsz is not allowed to change. - */ - if (qdma_get_active_queue_count(xdev->conf.pdev->bus->number)) { - pr_err("xdev 0x%p, FMAP prog done, cannot modify intr ring size [%d]\n", - xdev, - xdev->conf.intr_rngsz); - return rv; - } - - /** intr_rngsz > QDMA_INDIRECT_INTR_RING_SIZE_32KB, - * is invalid. - */ - if (intr_rngsz > QDMA_INDIRECT_INTR_RING_SIZE_32KB) { - pr_err("Invalid intr ring size\n"); - return rv; - } - - /** - * FMAP programming is not done yet, update the intr_rngsz - */ - qdma_device_interrupt_cleanup(xdev); - xdev->conf.intr_rngsz = intr_rngsz; - qdma_device_interrupt_setup(xdev); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_get_intr_rngsz() - Handler function to get the intr_ring_size value - * - * @param[in] dev_hndl: qdma device handle - * - * - * @return interrupt ring size on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_intr_rngsz(unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** - * If xdev is NULL return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - /** If interrupt aggregation is not enabled, then return 0 - * As the intr_rngsz value is irrelevant in this case - */ - if ((xdev->conf.qdma_drv_mode != INDIRECT_INTR_MODE) && - (xdev->conf.qdma_drv_mode != AUTO_MODE)) { - pr_info("xdev 0x%p, interrupt aggregation is disabled\n", xdev); - return 0; - } - - pr_info("xdev 0x%p, intr ring_size = %d\n", - xdev, - xdev->conf.intr_rngsz); - /** - * Return the current intr_rngsz value of the device - */ - return xdev->conf.intr_rngsz; -} -#ifndef __QDMA_VF__ -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_buf_sz() - Handler function to set the buf_sz value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] buf_sz: interrupt aggregation ring size - * - * @return 0 on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_buf_sz(unsigned long dev_hndl, u32 *buf_sz) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = -1; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - - /** If qdma_get_active_queue_count() > 0, - * buf_sz is not allowed to change. - */ - if (qdma_get_active_queue_count(xdev->conf.pdev->bus->number)) { - pr_err("xdev 0x%p, FMAP prog done, cannot modify buf size\n", - xdev); - return rv; - } - - /** - * Write the given buf sizes to the registers - */ - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - buf_sz, QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - pr_err("set global buffer size failed, err = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - qdma_csr_read(xdev, &xdev->csr_info); - - return rv; -} -#endif - -/*****************************************************************************/ -/** - * qdma_get_buf_sz() - Handler function to get the buf_sz value - * - * @param[in] dev_hndl: qdma device handle - * - * - * @return buffer size on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_buf_sz(unsigned long dev_hndl, u32 *buf_sz) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - if (xdev->hw.qdma_global_csr_conf(xdev, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - buf_sz, QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_READ)) - return -EINVAL; - - return 0; -} - -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_glbl_rng_sz() - Handler function to set the buf_sz value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] buf_sz: interrupt aggregation ring size - * - * @return 0 on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_glbl_rng_sz(unsigned long dev_hndl, u32 *glbl_rng_sz) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = -1; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - - /** If qdma_get_active_queue_count() > 0, - * glbl_rng_sz is not allowed to change. - */ - if (qdma_get_active_queue_count(xdev->conf.pdev->bus->number)) { - pr_err("xdev 0x%p, FMAP prog done, cannot modify glbl_rng_sz\n", - xdev); - return rv; - } - - /** - * Write the given ring sizes to the registers - */ - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - glbl_rng_sz, QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - pr_err("Failed to write glbl rng size, err = %d", rv); - return -EINVAL; - } - - rv = qdma_csr_read(xdev, &xdev->csr_info); - if (unlikely(rv < 0)) { - pr_err("Failed to read glbl csr, err = %d", rv); - return rv; - } - - return 0; -} -#endif - -/*****************************************************************************/ -/** - * qdma_get_glbl_rng_sz() - Handler function to get the glbl_rng_sz value - * - * @param[in] dev_hndl: qdma device handle - * - * - * @return glbl_rng_sz size on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_glbl_rng_sz(unsigned long dev_hndl, u32 *glbl_rng_sz) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - if (xdev->hw.qdma_global_csr_conf(xdev, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - glbl_rng_sz, QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ)) - return -EINVAL; - - return 0; -} - -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_timer_cnt() - Handler function to set the buf_sz value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] tmr_cnt: Array of 16 timer count values - * - * @return 0 on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_timer_cnt(unsigned long dev_hndl, u32 *tmr_cnt) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = -1; - - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - /** If qdma_get_active_queue_count() > 0, - * tmr_cnt is not allowed to change. - */ - if (qdma_get_active_queue_count(xdev->conf.pdev->bus->number)) { - pr_err("xdev 0x%p, FMAP prog done, can not modify timer count\n", - xdev); - return rv; - } - - - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - tmr_cnt, QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_WRITE); - if (unlikely(rv < 0)) { - pr_err("global timer set failed, err = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = qdma_csr_read(xdev, &xdev->csr_info); - if (unlikely(rv < 0)) - return rv; - - return 0; -} -#endif - -/*****************************************************************************/ -/** - * qdma_get_timer_cnt() - Handler function to get the timer_cnt value - * - * @param[in] dev_hndl: qdma device handle - * - * - * @return timer_cnt on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_timer_cnt(unsigned long dev_hndl, u32 *tmr_cnt) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = -1; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - tmr_cnt, QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_READ); - if (unlikely(rv < 0)) { - pr_err("get global timer failed, err = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - return 0; -} - -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_cnt_thresh() - Handler function to set the counter threshold value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] cnt_th: Array of 16 timer count values - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_cnt_thresh(unsigned long dev_hndl, unsigned int *cnt_th) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = -1; - - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - /** If qdma_get_active_queue_count() > 0, - * cnt_th is not allowed to change. - */ - if (qdma_get_active_queue_count(xdev->conf.pdev->bus->number)) { - pr_err("xdev 0x%p, FMAP prog done, can not modify threshold count\n", - xdev); - return rv; - } - - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, cnt_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_WRITE); - if (unlikely(rv < 0)) { - pr_err("set global counter failed, err = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = qdma_csr_read(xdev, &xdev->csr_info); - if (unlikely(rv < 0)) - return rv; - - return 0; -} -#endif - -/*****************************************************************************/ -/** - * qdma_get_cnt_thresh() - Handler function to get the counter thresh value - * - * @param[in] dev_hndl: qdma device handle - * - * - * @return counter threshold values on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_cnt_thresh(unsigned long dev_hndl, u32 *cnt_th) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = -1; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, cnt_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_READ); - if (unlikely(rv < 0)) { - pr_err("get global counter failed, err = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - return 0; -} - -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_cmpl_status_acc() - Handler function to set the cmpl_status_acc - * configuration value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] cmpl_status_acc: Writeback Accumulation value - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_cmpl_status_acc(unsigned long dev_hndl, u32 cmpl_status_acc) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = 0; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - /** If qdma_get_active_queue_count() > 0, - * cmpl_status_acc is not allowed to change. - */ - if (qdma_get_active_queue_count(xdev->conf.pdev->bus->number)) { - pr_err("xdev 0x%p, FMAP prog done, cannot modify cmpt acc\n", - xdev); - return -EINVAL; - } - /** - * Write the given cmpl_status_acc value to the register - */ - rv = xdev->hw.qdma_global_writeback_interval_conf(xdev, cmpl_status_acc, - QDMA_HW_ACCESS_WRITE); - if (unlikely(rv < 0)) { - pr_err("set global writeback intvl failed, err = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = qdma_csr_read(xdev, &xdev->csr_info); - if (unlikely(rv < 0)) - return rv; - - return 0; -} -#endif - -/*****************************************************************************/ -/** - * qdma_get_cmpl_status_acc() - Handler function to get the cmpl_status_acc - * configuration value - * - * @param[in] dev_hndl: qdma device handle - * - * Handler function to get the writeback accumulation value - * - * @return cmpl_status_acc on success - * @return <0 on failure - * - *****************************************************************************/ -unsigned int qdma_get_wb_intvl(unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - unsigned int wb_intvl; - int rv = -1; - - /** - * If xdev is NULL, return error as Invalid parameter - */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - /** - * Read the current cmpl_status_acc value from the register and return - */ - rv = xdev->hw.qdma_global_writeback_interval_conf(xdev, &wb_intvl, - QDMA_HW_ACCESS_READ); - if (unlikely(rv < 0)) { - pr_err("read global writeback intvl failed, err = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - return wb_intvl; -} -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/libqdma_config.h b/QDMA/linux-kernel/driver/libqdma/libqdma_config.h deleted file mode 100755 index 99ae261..0000000 --- a/QDMA/linux-kernel/driver/libqdma/libqdma_config.h +++ /dev/null @@ -1,264 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __LIBQDMA_CONFIG_H__ -#define __LIBQDMA_CONFIG_H__ -/** - * @file - * @brief This file contains the declarations for qdma configuration apis - * - */ -/***************************************************************************** - * GLOBAL CONSTANTS - *****************************************************************************/ -#include <linux/types.h> - -/** - * QDMA config bar number - */ -#define QDMA_CONFIG_BAR 0 - -/** - * STM bar - */ -#define STM_BAR 2 - -/** - * Maximum number of QDMA devices in the system - */ -#define MAX_DMA_DEV 32 - -/** - * Shift for bus 'B' in B:D:F - */ -#define PCI_SHIFT_BUS 12 - -/** - * Shift for device 'D' in B:D:F - */ -#define PCI_SHIFT_DEV 4 - -/** - * To shift the Bus number for getting BDF - */ -#define SHIFT_DEC_PCI_BUS 1000 - -/** - * To shift the device number for getting BDF - */ -#define SHIFT_DEC_PCI_DEV 10 - -/** - * Maximum number of MSI-X vector per function - */ -#define QDMA_DEV_MSIX_VEC_MAX 8 - -/** - * ring size is 4KB, i.e 512 entries - */ -#define QDMA_INTR_COAL_RING_SIZE INTR_RING_SZ_4KB - -/***************************************************************************** - * Function Declaration - *****************************************************************************/ - -/*****************************************************************************/ -/** - * qdma_set_qmax() - Handler function to set the qmax configuration value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] qsets_max: qmax configuration value - * @param[in] forced: flag to force qmax change - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_qmax(unsigned long dev_hndl, int qbase, u32 qsets_max); - -/*****************************************************************************/ -/** - * qdma_get_qmax() - Handler function to get the qmax configuration value - * - * @param[in] dev_hndl: qdma device handle - * - * @return qmax value on success - * @return < 0 on failure - *****************************************************************************/ -unsigned int qdma_get_qmax(unsigned long dev_hndl); - -/*****************************************************************************/ -/** - * qdma_set_intr_rngsz() - Handler function to set the intr_ring_size value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] intr_rngsz: interrupt aggregation ring size - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_intr_rngsz(unsigned long dev_hndl, u32 intr_rngsz); - -/*****************************************************************************/ -/** - * qdma_get_intr_rngsz() - Handler function to get the intr_ring_size value - * - * @param[in] dev_hndl: qdma device handle - * - * - * @return interrupt ring size on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_intr_rngsz(unsigned long dev_hndl); - -#ifndef __QDMA_VF__ -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_cmpl_status_acc() - Handler function to set the cmpl_status_acc - * configuration value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] cmpl_status_acc: Writeback Accumulation value - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_cmpl_status_acc(unsigned long dev_hndl, u32 cmpl_status_acc); -#endif - -/*****************************************************************************/ -/** - * qdma_get_cmpl_status_acc() - Handler function to get the cmpl_status_acc - * configuration value - * - * @param[in] dev_hndl: qdma device handle - * - * Handler function to get the writeback accumulation value - * - * @return cmpl_status_acc on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_wb_intvl(unsigned long dev_hndl); - -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_buf_sz() - Handler function to set the buf_sz value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] buf_sz: buf sizes - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_buf_sz(unsigned long dev_hndl, u32 *buf_sz); -#endif - -/*****************************************************************************/ -/** - * qdma_get_buf_sz() - Handler function to get the buf_sz value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] buf_sz: buf sizes - * - * @return buf sizes on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_buf_sz(unsigned long dev_hndl, u32 *buf_sz); - -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_glbl_rng_sz() - Handler function to set the glbl_rng_sz value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] glbl_rng_sz: glbl_rng_sizes - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_glbl_rng_sz(unsigned long dev_hndl, u32 *glbl_rng_sz); -#endif - -/*****************************************************************************/ -/** - * qdma_get_glbl_rng_sz() - Handler function to get the glbl_rng_sz value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] glbl_rng_sz: glbl_rng sizes - * - * @return glbl_rng_sz on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_glbl_rng_sz(unsigned long dev_hndl, u32 *glbl_rng_sz); - -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_timer_cnt() - Handler function to set the buf_sz value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] tmr_cnt: Array of 16 timer count values - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_timer_cnt(unsigned long dev_hndl, u32 *tmr_cnt); -#endif - -/*****************************************************************************/ -/** - * qdma_get_timer_cnt() - Handler function to get the timer_cnt value - * - * @param[in] dev_hndl: qdma device handle - * - * - * @return timer_cnt on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_timer_cnt(unsigned long dev_hndl, u32 *tmr_cnt); - -#ifdef QDMA_CSR_REG_UPDATE -/*****************************************************************************/ -/** - * qdma_set_cnt_thresh() - Handler function to set the counter threshold value - * - * @param[in] dev_hndl: qdma device handle - * @param[in] cnt_th: Array of 16 timer count values - * - * @return QDMA_OPERATION_SUCCESSFUL on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_cnt_thresh(unsigned long dev_hndl, unsigned int *cnt_th); -#endif - -/*****************************************************************************/ -/** - * qdma_get_cnt_thresh() - Handler function to get the counter thresh value - * - * @param[in] dev_hndl: qdma device handle - * - * - * @return counter threshold values on success - * @return <0 on failure - *****************************************************************************/ -unsigned int qdma_get_cnt_thresh(unsigned long dev_hndl, u32 *cnt_th); -#endif - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/libqdma_export.c b/QDMA/linux-kernel/driver/libqdma/libqdma_export.c deleted file mode 100755 index 30398b7..0000000 --- a/QDMA/linux-kernel/driver/libqdma/libqdma_export.c +++ /dev/null @@ -1,2818 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -/** - * @file - * @brief This file contains the definitions for libqdma interfaces - * - */ -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "libqdma_export.h" - -#include "qdma_descq.h" -#include "qdma_device.h" -#include "qdma_thread.h" -#include "qdma_regs.h" -#include "qdma_context.h" -#include "qdma_intr.h" -#include "qdma_st_c2h.h" -#include "thread.h" -#include "version.h" -#include "qdma_resource_mgmt.h" -#include "qdma_mbox.h" -#include "qdma_platform.h" - -#ifdef DEBUGFS -#include "qdma_debugfs_queue.h" - -/** debugfs root */ -struct dentry *qdma_debugfs_root; -static bool qdma_debufs_cleanup = true; -#endif - - -#define QDMA_Q_PEND_LIST_COMPLETION_TIMEOUT 1000 /* msec */ - -struct drv_mode_name mode_name_list[] = { - { AUTO_MODE, "auto"}, - { POLL_MODE, "poll"}, - { DIRECT_INTR_MODE, "direct interrupt"}, - { INDIRECT_INTR_MODE, "indirect interrupt"}, - { LEGACY_INTR_MODE, "legacy interrupt"} -}; - - -struct qdma_q_type q_type_list[] = { - {"H2C", Q_H2C}, - {"C2H", Q_C2H}, - {"CMPT", Q_CMPT}, - {"BI", Q_H2C_C2H}, -}; - -/* ********************* static function definitions ************************ */ -#ifdef __QDMA_VF__ -static int qdma_dev_notify_qadd(struct qdma_descq *descq, - enum queue_type_t q_type) -{ - struct mbox_msg *m; - int rv = 0; - struct xlnx_dma_dev *xdev = descq->xdev; - - m = qdma_mbox_msg_alloc(); - if (!m) { - pr_err("Failed to allocate mbox msg"); - return -ENOMEM; - } - - - qdma_mbox_compose_vf_notify_qadd(xdev->func_id, - descq->qidx_hw, (enum qdma_dev_q_type)q_type, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - pr_err("%s, mbox failed for queue add %d.\n", - xdev->conf.name, rv); - goto free_msg; - } - rv = qdma_mbox_vf_response_status(m->raw); - if (rv < 0) { - pr_err("mbox_vf_response_status failed, err = %d", rv); - rv = -EINVAL; - } - -free_msg: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_dev_notify_qdel(struct qdma_descq *descq, - enum queue_type_t q_type) -{ - struct mbox_msg *m; - int rv = 0; - struct xlnx_dma_dev *xdev = descq->xdev; - - m = qdma_mbox_msg_alloc(); - if (!m) { - pr_err("Failed to allocate mbox msg"); - return -ENOMEM; - } - - qdma_mbox_compose_vf_notify_qdel(xdev->func_id, descq->qidx_hw, - (enum qdma_dev_q_type)q_type, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - pr_err("%s, mbox failed for queue add %d.\n", - xdev->conf.name, rv); - goto free_msg; - } - rv = qdma_mbox_vf_response_status(m->raw); - if (rv < 0) { - pr_err("mbox_vf_response_status failed, err = %d", rv); - rv = -EINVAL; - } - -free_msg: - qdma_mbox_msg_free(m); - return rv; -} - -static int qdma_dev_get_active_qcnt(struct xlnx_dma_dev *xdev, - u32 *h2c_qs, u32 *c2h_qs, u32 *cmpt_qs) -{ - struct mbox_msg *m; - int rv = 0; - - m = qdma_mbox_msg_alloc(); - if (!m) { - pr_err("Failed to allocate mbox msg"); - return -ENOMEM; - } - - qdma_mbox_compose_vf_get_device_active_qcnt(xdev->func_id, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - pr_err("%s, mbox failed for queue add %d.\n", - xdev->conf.name, rv); - goto free_msg; - } - rv = qdma_mbox_vf_response_status(m->raw); - if (rv < 0) { - pr_err("mbox_vf_response_status failed, err = %d", rv); - rv = -EINVAL; - goto free_msg; - } - - *h2c_qs = (uint32_t)qdma_mbox_vf_active_queues_get(m->raw, - QDMA_DEV_Q_TYPE_H2C); - *c2h_qs = (uint32_t)qdma_mbox_vf_active_queues_get(m->raw, - QDMA_DEV_Q_TYPE_C2H); - *cmpt_qs = (uint32_t)qdma_mbox_vf_active_queues_get(m->raw, - QDMA_DEV_Q_TYPE_CMPT); - - return rv; - -free_msg: - qdma_mbox_msg_free(m); - return rv; -} - -#endif - -static int qdma_validate_qconfig(struct xlnx_dma_dev *xdev, - struct qdma_queue_conf *qconf, - char *buf, int buflen) -{ - - /** If xdev is NULL return error as Invalid parameter */ - if (!xdev || !qconf) { - pr_err("Invalid input received, xdev=%p, qconf =%p", - xdev, qconf); - return -EINVAL; - } - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - if (qconf->cmpl_trig_mode > TRIG_MODE_COMBO) { - pr_err("Invalid trigger mode :%d", - qconf->cmpl_trig_mode); - snprintf(buf, buflen, - "qdma%05x : Invalid trigger mode %d passed\n", - xdev->conf.bdf, qconf->cmpl_trig_mode); - return -EINVAL; - } - - if (xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP && - xdev->version_info.device_type == QDMA_DEVICE_VERSAL_CPM4) { - /* 64B desc size is not supported in 2018.2 release */ - if ((qconf->cmpl_desc_sz == CMPT_DESC_SZ_64B) || - (qconf->sw_desc_sz == DESC_SZ_64B)) { - pr_err("Invalid descriptor sw desc :%d, cmpl desc :%d", - qconf->sw_desc_sz, qconf->sw_desc_sz); - snprintf(buf, buflen, - "qdma%05x : 64B desc size is not supported\n", - xdev->conf.bdf); - return -EINVAL; - } - - if (qconf->cmpl_trig_mode == TRIG_MODE_COMBO) { - pr_err("Invalid trigger mode :%d", - qconf->cmpl_trig_mode); - snprintf(buf, buflen, - "qdma%05x : Trigger mode COMBO is not supported\n", - xdev->conf.bdf); - return -EINVAL; - } - } - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_request_wait_for_cmpl() - static function to monitor the - * wait completion - * - * @param[in] xdev: pointer to xlnx_dma_dev structure - * @param[in] descq: pointer to qdma_descq structure - * @param[in] req: qdma request - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int qdma_request_wait_for_cmpl(struct xlnx_dma_dev *xdev, - struct qdma_descq *descq, struct qdma_request *req) -{ - struct qdma_sgt_req_cb *cb = qdma_req_cb_get(req); - - /** if timeout is mentioned in the request, - * wait until the timeout occurs or wait until the - * call back is completed - */ - - if (req->timeout_ms) { -#ifdef __XRT__ - qdma_waitq_wait_event_timeout(cb->wq, cb->done && - (descq->pidx == descq->cidx), - msecs_to_jiffies(req->timeout_ms)); -#else - qdma_waitq_wait_event_timeout(cb->wq, cb->done, - msecs_to_jiffies(req->timeout_ms)); -#endif - } else { - qdma_waitq_wait_event(cb->wq, cb->done); - } - - lock_descq(descq); - /** if the call back is not done, request timed out - * delete the request list - */ - if (!cb->done) - list_del(&cb->list); - - /** if the call back is not done but the status is updated - * return i/o error - */ - if (!cb->done || cb->status) { - pr_err("%s: req 0x%p, %c,%u,%u/%u,0x%llx, done %d, err %d, tm %u.\n", - descq->conf.name, - req, req->write ? 'W' : 'R', - cb->offset, - cb->left, - req->count, - req->ep_addr, - cb->done, - cb->status, - req->timeout_ms); - qdma_descq_dump(descq, NULL, 0, 1); - unlock_descq(descq); - - return -EIO; - } - - unlock_descq(descq); - return 0; -} - -/*****************************************************************************/ -/** - * qdma_request_submit_st_c2h() - static function to handle the - * st c2h request - * - * @param[in] xdev: pointer to xlnx_dma_dev structure - * @param[in] descq: pointer to qdma_descq structure - * @param[in] req: qdma request - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static ssize_t qdma_request_submit_st_c2h(struct xlnx_dma_dev *xdev, - struct qdma_descq *descq, struct qdma_request *req) -{ - struct qdma_dev *qdev; - struct qdma_sgt_req_cb *cb = qdma_req_cb_get(req); - int wait = req->fp_done ? 0 : 1; - int rv = 0; - - /** If xdev is NULL return error as Invalid parameter */ - if (!xdev) { - pr_err("xdev is invalid"); - return -EINVAL; - } - - qdev = xdev_2_qdev(xdev); - /** make sure that qdev is not NULL, else return error */ - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return -EINVAL; - } - - pr_debug("%s: data len %u, sgl 0x%p, sgl cnt %u, tm %u ms.\n", - descq->conf.name, - req->count, req->sgl, req->sgcnt, req->timeout_ms); - - /** get the request count */ - cb->left = req->count; - - lock_descq(descq); - if (descq->q_stop_wait) { - unlock_descq(descq); - return 0; - } - if ((descq->q_state == Q_STATE_ONLINE) && - !descq->q_stop_wait) { - /* add to pend list even before cidx/pidx update as it could - * cause an interrupt and may miss processing of writeback - */ - list_add_tail(&cb->list, &descq->pend_list); - /* any rcv'ed packet not yet read ? */ - /** read the data from the device */ - descq_st_c2h_read(descq, req, 1, 1); - if (!cb->left) { - list_del(&cb->list); - unlock_descq(descq); - return req->count; - } - descq->pend_list_empty = 0; - unlock_descq(descq); - } else { - unlock_descq(descq); - pr_err("%s descq %s NOT online.\n", - xdev->conf.name, descq->conf.name); - return -EINVAL; - } - - /** if there is a completion thread associated, - * wake up the completion thread to process the - * completion status - */ - if (descq->cmplthp) - qdma_kthread_wakeup(descq->cmplthp); - - if (!wait) { - pr_debug("%s: cb 0x%p, data len 0x%x NO wait.\n", - descq->conf.name, cb, req->count); - return 0; - } - - /** wait for the request completion */ - rv = qdma_request_wait_for_cmpl(xdev, descq, req); - if (rv < 0) { - if (!req->dma_mapped) - sgl_unmap(xdev->conf.pdev, req->sgl, req->sgcnt, - DMA_FROM_DEVICE); - return rv; - } - - /** Once the request completion received, - * return with the number of processed requests - */ - return req->count - cb->left; -} - -/* ********************* public function definitions ************************ */ - -/*****************************************************************************/ -/** - * qdma_queue_get_config() - retrieve the configuration of a queue - * - * @param[in] dev_hndl: dev_hndl retured from qdma_device_open() - * @param[in] id: queue index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * @param[out] qconf: pointer to hold the qdma_queue_conf structure. - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_queue_get_config(unsigned long dev_hndl, unsigned long id, - struct qdma_queue_conf *qconf, - char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 0); - /** make sure that descq is not NULL, else return error */ - if (!descq) { - pr_err("Invalid qid(%lu)", id); - snprintf(buf, buflen, - "Invalid qid(%lu)\n", id); - return -EINVAL; - } - - memcpy(qconf, &descq->conf, sizeof(struct qdma_queue_conf)); - - snprintf(buf, buflen, - "Queue configuration for %s id %u is stored in qconf param", - descq->conf.name, - descq->conf.qidx); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_device_capabilities_info() - retrieve the capabilities of a device. - * - * @dev_hndl: handle returned from qdma_device_open() - * @dev_attr: pointer to hold all the device attributes - * - * Return: 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_capabilities_info(unsigned long dev_hndl, - struct qdma_dev_attributes *dev_attr) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (!dev_attr) { - pr_err("dev_attr is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - memcpy(dev_attr, &(xdev->dev_cap), sizeof(struct qdma_dev_attributes)); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_config_reg_info_dump() - dump the detailed field information of register - * - * @param[in] dev_hndl: handle returned from qdma_device_open() - * @param[in] reg_addr: register address info tobe dumped - * @param[in] num_regs: number of registers to be dumped - * @param[in] buf: buffer containing the o/p - * @param[in] buflen: length of the buffer - * - * @return: length of o/p buffer - * - *****************************************************************************/ -int qdma_config_reg_info_dump(unsigned long dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d\n", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed\n"); - return -EINVAL; - } - - if (xdev->hw.qdma_dump_reg_info == NULL) { - pr_err("Err: Feature not supported\n"); - snprintf(buf, buflen, "Err: Feature not supported\n"); - return -EPERM; - } - - rv = xdev->hw.qdma_dump_reg_info((void *)dev_hndl, reg_addr, - num_regs, buf, buflen); - return rv; - -} - -#ifndef __QDMA_VF__ -/*****************************************************************************/ -/** - * qdma_config_reg_dump() - display a config registers in a string buffer - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return success: if optional message buffer used then strlen of buf, - * otherwise 0 - * @return <0: error - *****************************************************************************/ - -int qdma_config_reg_dump(unsigned long dev_hndl, char *buf, - int buflen) -{ - - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - rv = xdev->hw.qdma_dump_config_regs((void *)dev_hndl, 0, - buf, buflen); - return rv; - -} - -#else - -static int qdma_config_read_reg_list(struct xlnx_dma_dev *xdev, - uint16_t group_num, - uint16_t *num_regs, struct qdma_reg_data *reg_list) -{ - struct mbox_msg *m = qdma_mbox_msg_alloc(); - int rv; - - if (!m) - return -ENOMEM; - - qdma_mbox_compose_reg_read(xdev->func_id, group_num, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - if (rv != -ENODEV) - pr_err("%s, reg read mbox failed %d.\n", - xdev->conf.name, rv); - goto err_out; - } - - rv = qdma_mbox_vf_reg_list_get(m->raw, num_regs, reg_list); - if (rv < 0) { - pr_err("qdma_mbox_vf_reg_list_get faled with error = %d", rv); - goto err_out; - } - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -/*****************************************************************************/ -/** - * qdma_config_reg_dump() - display a config registers in a string buffer - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return success: if optional message buffer used then strlen of buf, - * otherwise 0 - * @return <0: error - *****************************************************************************/ -int qdma_config_reg_dump(unsigned long dev_hndl, char *buf, int buflen) -{ - - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = 0; - struct qdma_reg_data *reg_list; - uint16_t num_regs = 0, group_num = 0; - int len = 0, rcv_len = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - reg_list = kzalloc((QDMA_MAX_REGISTER_DUMP * - sizeof(struct qdma_reg_data)), - GFP_KERNEL); - - if (!reg_list) { - pr_err("%s: reg_list OOM", xdev->conf.name); - snprintf(buf, buflen, "reg_list OOM"); - return -ENOMEM; - } - - for (group_num = 0; group_num < QDMA_REG_READ_GROUP_3; group_num++) { - /** Reset the reg_list with 0's */ - memset(reg_list, 0, (QDMA_MAX_REGISTER_DUMP * - sizeof(struct qdma_reg_data))); - rv = qdma_config_read_reg_list(xdev, - group_num, &num_regs, reg_list); - if (rv < 0) { - pr_err("Failed to read config registers, rv = %d", rv); - snprintf(buf, buflen, "Failed to read config regs"); - goto free_reg_list; - } - - rcv_len = xdev->hw.qdma_dump_config_reg_list((void *)dev_hndl, - num_regs, reg_list, buf + len, buflen - len); - if (len < 0) { - pr_err("%s: failed with error = %d", __func__, rv); - snprintf(buf, buflen, "Failed to dump config regs"); - goto free_reg_list; - } - len += rcv_len; - } - -free_reg_list: - kfree(reg_list); - return len; - -} -#endif -/*****************************************************************************/ -/** - * qdma_queue_dump() - display a queue's state in a string buffer - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] id: queue index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return success: if optional message buffer used then strlen of buf, - * otherwise 0 - * @return <0: error - *****************************************************************************/ -int qdma_queue_dump(unsigned long dev_hndl, unsigned long id, char *buf, - int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - int rv = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 0); - /** make sure that descq is not NULL, else return error */ - if (!descq) { - pr_err("Invalid qid(%lu)", id); - snprintf(buf, buflen, - "Invalid qid(%lu)\n", id); - return -EINVAL; - } - - /** read the descq context for the given qid */ - rv = qdma_descq_context_dump(descq, buf, buflen); - if (rv < 0) { - snprintf(buf, buflen, - "%s dump context failed %d.\n", - descq->conf.name, rv); - return rv; - } - - return buflen; -} - -/*****************************************************************************/ -/** - * qdma_queue_dump_desc() - display a queue's descriptor ring from index start - * ~ end in a string buffer - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] id: queue index - * @param[in] start: start index - * @param[in] end: end index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return success: if optional message buffer used then strlen of buf, - * otherwise 0 - * @return <0: error - *****************************************************************************/ -int qdma_queue_dump_desc(unsigned long dev_hndl, unsigned long id, - unsigned int start, unsigned int end, char *buf, - int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - int len = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - /** get the descq details based on the qid provided */ - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 1); - if (!descq) { - pr_err("Invalid qid(%lu)", id); - snprintf(buf, buflen, - "Invalid qid(%lu)\n", id); - return -EINVAL; - } - - /** make sure that intr ring entry indexes - * given are with in the range - */ - if (start > end) { - pr_err("start/end param passed is invalid ,<start> shall be less than <end>"); - snprintf(buf, buflen, - "start/end param passed is invalid, <start> shall be less than <end>"); - return -EINVAL; - } - - /** dump the queue state */ - len = qdma_descq_dump_state(descq, buf, buflen); - if (descq->q_state != Q_STATE_ONLINE) - return len; - - /** dump the queue descriptor state */ - len += qdma_descq_dump_desc(descq, start, end, buf + len, buflen - len); - return len; -} - -/*****************************************************************************/ -/** - * qdma_queue_dump_cmpt() - display a queue's descriptor ring from index start - * ~ end in a string buffer - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] id: queue index - * @param[in] start: start index - * @param[in] end: end index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return success: if optional message buffer used then strlen of buf, - * otherwise 0 - * @return <0: error - *****************************************************************************/ -int qdma_queue_dump_cmpt(unsigned long dev_hndl, unsigned long id, - unsigned int start, unsigned int end, char *buf, - int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - int len = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - /** get the descq details based on the qid provided */ - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 1); - if (!descq) { - pr_err("Invalid qid(%lu)", id); - snprintf(buf, buflen, - "Invalid qid(%lu)\n", id); - return -EINVAL; - } - - /** make sure that intr ring entry indexes - * given are with in the range - */ - if (start > end) { - pr_err("start/end param passed is invalid, <start> shall be less than <end>"); - snprintf(buf, buflen, - "start/end param passed is invalid, <start> shall be less than <end>"); - return -EINVAL; - } - - /** dump the descriptor state */ - len = qdma_descq_dump_state(descq, buf, buflen); - /** if the descriptor is in online state, - * then, dump the completion state - */ - if (descq->q_state == Q_STATE_ONLINE) - len += qdma_descq_dump_cmpt(descq, start, end, buf + len, - buflen - len); - - return len; -} - -/*****************************************************************************/ -/** - * qdma_queue_remove() - remove a queue (i.e., offline, NOT ready for dma) - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] id: queue index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_queue_remove(unsigned long dev_hndl, unsigned long id, char *buf, - int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; -#ifdef DEBUGFS - struct qdma_descq *pair_descq; -#endif - struct qdma_dev *qdev; - int rv = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 1); -#ifdef DEBUGFS - pair_descq = qdma_device_get_pair_descq_by_id(xdev, id, buf, buflen, 1); -#endif - - qdev = xdev_2_qdev(xdev); - /** make sure that qdev is not NULL, else return error */ - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return -EINVAL; - } - - /** make sure that descq is not NULL, else return error */ - if (!descq) { - pr_err("Invalid qid(%lu)", id); - snprintf(buf, buflen, - "Invalid qid(%lu)\n", id); - return -EINVAL; - } - - if (descq->q_state != Q_STATE_ENABLED) { - snprintf(buf, buflen, - "queue %s, id %u cannot be deleted. Invalid q state: %s\n", - descq->conf.name, - descq->conf.qidx, - q_state_list[descq->q_state].name); - - pr_err("queue %s, id %u cannot be deleted. Invalid q state: %s", - descq->conf.name, - descq->conf.qidx, - q_state_list[descq->q_state].name); - return -EINVAL; - } - -#ifdef DEBUGFS - if (pair_descq) - /** if pair_descq is not NULL, it means the queue - * is in ENABLED state - */ - dbgfs_queue_exit(&descq->conf, pair_descq); - else - dbgfs_queue_exit(&descq->conf, NULL); -#endif -#ifndef __QDMA_VF__ - rv = qdma_dev_decrement_active_queue(xdev->dma_device_index, - xdev->func_id, - (enum qdma_dev_q_type)descq->conf.q_type); - if (rv < 0) { - pr_err("Failed to decrement the active %s queue", - q_type_list[descq->conf.q_type].name); - return rv; - } - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - rv = qdma_dev_decrement_active_queue(xdev->dma_device_index, - xdev->func_id, QDMA_DEV_Q_TYPE_CMPT); - if (rv < 0) { - pr_err("Failed to decrement the active CMPT queue"); - qdma_dev_increment_active_queue(xdev->dma_device_index, - xdev->func_id, - (enum qdma_dev_q_type)descq->conf.q_type); - return rv; - } - } -#else - rv = qdma_dev_notify_qdel(descq, - (enum queue_type_t)descq->conf.q_type); - if (rv < 0) { - pr_err("Failed to decrement active %s queue count", - q_type_list[descq->conf.q_type].name); - return rv; - } - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - rv = qdma_dev_notify_qdel(descq, Q_CMPT); - if (rv < 0) { - pr_err("Failed to decrement active CMPT queue count"); - qdma_dev_notify_qadd(descq, - (enum queue_type_t)descq->conf.q_type); - return rv; - } - } -#endif - - lock_descq(descq); - descq->q_state = Q_STATE_DISABLED; - unlock_descq(descq); - -#ifndef __QDMA_VF__ - if (xdev->conf.qdma_drv_mode == LEGACY_INTR_MODE) - intr_legacy_clear(descq); -#endif - snprintf(buf, buflen, "queue %s, id %u deleted.\n", - descq->conf.name, descq->conf.qidx); - - pr_debug("queue %s, id %u deleted.\n", - descq->conf.name, descq->conf.qidx); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_queue_config() - configure the queue with qconf parameters - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] qid: queue id - * @param[in] qconf: queue configuration parameters - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_queue_config(unsigned long dev_hndl, unsigned long qid, - struct qdma_queue_conf *qconf, char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_dev *qdev; - struct qdma_descq *descq = NULL; - int rv = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - qdev = xdev_2_qdev(xdev); - /** make sure that qdev is not NULL, else return error */ - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - snprintf(buf, buflen, "Q not already added. Add Q first\n"); - return -EINVAL; - } - - /** get the descq for the given qid */ - descq = qdma_device_get_descq_by_id(xdev, qid, NULL, 0, 0); - if (!descq) { - pr_err("Invalid queue ID! qid=%lu, max=%u\n", qid, qdev->qmax); - snprintf(buf, buflen, - "Invalid queue ID qid=%lu, max=%u, base=%u\n", - qid, qdev->qmax, qdev->qbase); - return -EINVAL; - } - - lock_descq(descq); - /* if descq is not in enabled state, return error */ - if (descq->q_state != Q_STATE_ENABLED) { - pr_err("queue_%lu Invalid state! Q not in enabled state\n", - qid); - snprintf(buf, buflen, - "Error. Required Q state=%s, Current Q state=%s\n", - q_state_list[Q_STATE_ENABLED].name, - q_state_list[descq->q_state].name); - unlock_descq(descq); - return -EINVAL; - } - unlock_descq(descq); - - rv = qdma_validate_qconfig(xdev, qconf, buf, buflen); - if (rv != 0) - return rv; - - /** configure descriptor queue */ - lock_descq(descq); - qdma_descq_config(descq, qconf, 1); - unlock_descq(descq); - - snprintf(buf, buflen, - "Queue %s id %u is configured with the qconf passed ", - descq->conf.name, - descq->conf.qidx); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_queue_list() - display all configured queues in a string buffer - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] qidx: Queue index - * @param[in] num_q: Number of Queues to list - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return success: if optional message buffer used then strlen of buf, - * otherwise 0 - * @return <0: error - *****************************************************************************/ -int qdma_queue_list(unsigned long dev_hndl, int qidx, int num_q, char *buf, - int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_dev *qdev; - struct qdma_descq *descq = NULL; - char *cur = buf; - char * const end = buf + buflen; - uint32_t h2c_qcnt = 0, c2h_qcnt = 0, cmpt_qcnt = 0; - int i; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - qdev = xdev_2_qdev(xdev); - /** make sure that qdev is not NULL, else return error */ - if (!qdev) { - pr_err("dev %s, qdev null.\n", dev_name(&xdev->conf.pdev->dev)); - snprintf(buf, buflen, "Q not already added. Add Q first\n"); - return -EINVAL; - } -#ifndef __QDMA_VF__ - h2c_qcnt = qdma_get_device_active_queue_count( - xdev->dma_device_index, - xdev->func_id, - QDMA_DEV_Q_TYPE_H2C); - - c2h_qcnt = qdma_get_device_active_queue_count( - xdev->dma_device_index, - xdev->func_id, - QDMA_DEV_Q_TYPE_C2H); - - cmpt_qcnt = qdma_get_device_active_queue_count( - xdev->dma_device_index, - xdev->func_id, - QDMA_DEV_Q_TYPE_CMPT); -#else - qdma_dev_get_active_qcnt(xdev, &h2c_qcnt, &c2h_qcnt, &cmpt_qcnt); -#endif - cur += snprintf(cur, end - cur, "H2C Q: %u, C2H Q: %u, CMPT Q %u.\n", - h2c_qcnt, c2h_qcnt, cmpt_qcnt); - if (cur >= end) - goto handle_truncation; - - /** traverse through the h2c and c2h queue list - * and dump the descriptors - */ - if (h2c_qcnt) { - descq = qdev->h2c_descq; - descq = descq + qidx; - for (i = qidx; i < (qidx + num_q); i++, descq++) { - lock_descq(descq); - if (descq->q_state != Q_STATE_DISABLED) - cur += - qdma_descq_dump(descq, cur, end - cur, 0); - unlock_descq(descq); - - if (cur >= end) - goto handle_truncation; - } - } - - if (c2h_qcnt) { - descq = qdev->c2h_descq; - descq = descq + qidx; - for (i = qidx; i < (qidx + num_q); i++, descq++) { - lock_descq(descq); - if (descq->q_state != Q_STATE_DISABLED) - cur += - qdma_descq_dump(descq, cur, end - cur, 0); - unlock_descq(descq); - - if (cur >= end) - goto handle_truncation; - } - } - - if (cmpt_qcnt) { - descq = qdev->cmpt_descq; - descq = descq + qidx; - for (i = qidx; i < (qidx + num_q); i++, descq++) { - lock_descq(descq); - if (descq->q_state != Q_STATE_DISABLED) - cur += - qdma_descq_dump(descq, cur, end - cur, 0); - unlock_descq(descq); - - if (cur >= end) - goto handle_truncation; - } - } - - return cur - buf; - -handle_truncation: - *buf = '\0'; - return buf - cur; -} - -#define Q_PRESENT_H2C_MASK (1 << Q_H2C) -#define Q_PRESENT_C2H_MASK (1 << Q_C2H) -#define Q_PRESENT_CMPT_MASK (1 << Q_CMPT) -#define Q_MODE_SHIFT 3 -#define Q_MODE_MASK (1 << Q_MODE_SHIFT) - -static int is_usable_queue(struct xlnx_dma_dev *xdev, int qidx, - int q_type, int st) -{ - struct qdma_dev *qdev = xdev_2_qdev(xdev); - int refmask = 0x0; - int cmptq_chkmask = 0x0; - int h2cq_chkmask = 0x0; - int c2hq_chkmask = 0x0; - int reqmask = 0; - struct qdma_descq *h2c_descq = qdev->h2c_descq + qidx; - struct qdma_descq *c2h_descq = qdev->c2h_descq + qidx; - struct qdma_descq *cmpt_descq = qdev->cmpt_descq + qidx; - - lock_descq(h2c_descq); - if (h2c_descq->q_state != Q_STATE_DISABLED) { - refmask |= (1 << Q_H2C); - if (h2c_descq->conf.st) - refmask |= (1 << Q_MODE_SHIFT); - } - unlock_descq(h2c_descq); - - lock_descq(c2h_descq); - if (c2h_descq->q_state != Q_STATE_DISABLED) { - refmask |= (1 << Q_C2H); - if (c2h_descq->conf.st) - refmask |= (1 << Q_MODE_SHIFT); - } - unlock_descq(c2h_descq); - - lock_descq(cmpt_descq); - if (cmpt_descq->q_state != Q_STATE_DISABLED) - refmask |= (1 << Q_CMPT); - unlock_descq(cmpt_descq); - - reqmask = (1 << q_type); - if (st) - reqmask |= Q_MODE_MASK; - if (q_type == Q_CMPT) { - cmptq_chkmask |= (Q_PRESENT_CMPT_MASK | Q_MODE_MASK); - if (refmask & cmptq_chkmask) { - pr_err("Q_CMPT: refmask not valid"); - goto q_reject; - } - } else if (q_type == Q_H2C) { - c2hq_chkmask = (Q_PRESENT_C2H_MASK | Q_MODE_MASK); - if (st && (refmask & Q_PRESENT_CMPT_MASK)) { - pr_err("Q_H2C: CMPT q given to MM"); - goto q_reject; /* CMPT q given to MM */ - } - if (st && (refmask & Q_PRESENT_C2H_MASK) - && (refmask & c2hq_chkmask) - == Q_PRESENT_C2H_MASK) { - pr_err("Q_H2C: MM mode c2h q present"); - goto q_reject; /* MM mode c2h q present*/ - } - if (!st && (refmask & Q_PRESENT_C2H_MASK) - && (refmask & c2hq_chkmask) == c2hq_chkmask) { - pr_err("Q_H2C: ST mode c2h q present"); - goto q_reject; /* ST mode c2h q present*/ - } - if (refmask & Q_PRESENT_H2C_MASK) { - pr_err("Q_H2C: h2c q already present"); - goto q_reject; /* h2c q already present */ - } - } else { - h2cq_chkmask |= (Q_PRESENT_H2C_MASK | Q_MODE_MASK); - if (st && (refmask & Q_PRESENT_CMPT_MASK)) { - pr_err("!Q_H2C: CMPT q given to MM"); - goto q_reject; /* CMPT q given to MM */ - } - if (st && (refmask & Q_PRESENT_H2C_MASK) - && (refmask & h2cq_chkmask) - == Q_PRESENT_H2C_MASK) { - pr_err("!Q_H2C: MM mode h2c q present"); - goto q_reject; /* MM mode h2c q present*/ - } - if (!st && (refmask & Q_PRESENT_H2C_MASK) - && (refmask & h2cq_chkmask) == h2cq_chkmask) { - pr_err("!Q_H2C: ST mode h2c q present"); - goto q_reject; /* ST mode h2c q present*/ - } - if (refmask & Q_PRESENT_C2H_MASK) { - pr_err("!Q_H2C: c2h q already present"); - goto q_reject; /* c2h q already present */ - } - } - return 0; -q_reject: - pr_err("Q addition feasibility check failed"); - return -1; -} - -/*****************************************************************************/ -/** - * qdma_queue_add() - add a queue - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] qconf: queue configuration parameters - * @param[in] qhndl: list of unsigned long values that are the opaque qhndl - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_queue_add(unsigned long dev_hndl, struct qdma_queue_conf *qconf, - unsigned long *qhndl, char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - unsigned int qcnt; - struct qdma_descq *descq; - struct qdma_dev *qdev; -#ifdef DEBUGFS - struct qdma_descq *pairq; -#endif -#ifdef __QDMA_VF__ - uint32_t h2c_qcnt = 0, c2h_qcnt = 0, cmpt_qcnt = 0; -#endif - int rv = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - /** If qconf is NULL, return error*/ - if (!qconf) { - pr_err("Invalid qconf %p", qconf); - snprintf(buf, buflen, - "%s, add, qconf NULL.\n", - xdev->conf.name); - return -EINVAL; - } - - /** If qhndl is NULL, return error*/ - if (!qhndl) { - pr_warn("qhndl NULL.\n"); - snprintf(buf, buflen, - "%s, add, qhndl NULL.\n", - xdev->conf.name); - return -EINVAL; - } - - if (qconf->q_type > Q_CMPT) { - pr_err("Invalid queue type passed"); - snprintf(buf, buflen, "Invalid queue type passed"); - return -EINVAL; - } - - if (qconf->st && (qconf->q_type == Q_CMPT)) { - pr_err("Can not create independent completion ring for ST mode. It is supported along with C2H direction"); - snprintf(buf, buflen, - "Can not create independent completion ring for ST mode. It is supported along with C2H direction"); - return -EINVAL; - } - - if ((qconf->q_type == Q_CMPT) && !xdev->dev_cap.mm_cmpt_en) { - pr_err("MM Completions not enabled"); - snprintf(buf, buflen, "MM Completions not enabled"); - return -EINVAL; - } - - qdev = xdev_2_qdev(xdev); - - /** reset qhandle to an invalid value - * can't use 0 or NULL here because queue idx 0 has same value - */ - *qhndl = QDMA_QUEUE_IDX_INVALID; - - /** check if the requested mode is enabled? - * the request modes are read from the HW - * before serving any request, first check if the - * HW has the capability or not, else return error - */ - if ((qconf->st && !xdev->dev_cap.st_en) || - (!qconf->st && !xdev->dev_cap.mm_en)) { - pr_warn("%s, %s mode not enabled.\n", - xdev->conf.name, qconf->st ? "ST" : "MM"); - snprintf(buf, buflen, - "qdma%05x %s mode not enabled.\n", - xdev->conf.bdf, qconf->st ? "ST" : "MM"); - return -EINVAL; - } - - rv = qdma_validate_qconfig(xdev, qconf, buf, buflen); - if (rv < 0) - return rv; - - spin_lock(&qdev->lock); - /** if incase the qidx is not QDMA_QUEUE_IDX_INVALID - * then, make sure that the qidx range falls between - * 0 - qdev->qmax, else return error - */ - if ((qconf->qidx != QDMA_QUEUE_IDX_INVALID) && - (qconf->qidx >= qdev->qmax)) { - spin_unlock(&qdev->lock); - snprintf(buf, buflen, - "qdma%05x invalid idx %u >= %u.\n", - xdev->conf.bdf, qconf->qidx, qdev->qmax); - pr_err("Invalid queue index, qid = %d, qmax = %d", - qconf->qidx, qdev->qmax); - return -EINVAL; - } - - /** check if any free qidx available - * if qcnt is >= qdev->qmax, return error as - * no free queues found and descq is full - */ -#ifndef __QDMA_VF__ - qcnt = qdma_get_device_active_queue_count(xdev->dma_device_index, - xdev->func_id, qconf->q_type); -#else - spin_unlock(&qdev->lock); - qdma_dev_get_active_qcnt(xdev, &h2c_qcnt, &c2h_qcnt, &cmpt_qcnt); - spin_lock(&qdev->lock); - if (qconf->q_type == Q_H2C) - qcnt = h2c_qcnt; - else if (qconf->q_type == Q_C2H) - qcnt = c2h_qcnt; - else - qcnt = cmpt_qcnt; -#endif - if (qcnt >= qdev->qmax) { - spin_unlock(&qdev->lock); - pr_warn("No free queues %u/%u.\n", qcnt, qdev->qmax); - snprintf(buf, buflen, - "qdma%05x No free queues %u/%u.\n", - xdev->conf.bdf, qcnt, qdev->qmax); - return -EIO; - } - - - spin_unlock(&qdev->lock); - - if (qconf->q_type == Q_C2H) - descq = qdev->c2h_descq; - else if (qconf->q_type == Q_H2C) - descq = qdev->h2c_descq; - else - descq = qdev->cmpt_descq; - - /** need to allocate a free qidx if it has an invalid id - * ie. qidx is not specified in the add request - */ - if (qconf->qidx == QDMA_QUEUE_IDX_INVALID) { - int i; - - /** loop through the qlist till qmax and find an empty descq*/ - for (i = 0; i < qdev->qmax; i++, descq++) { - if (is_usable_queue(xdev, i, qconf->q_type, - qconf->st) < 0) - continue; - - descq += i; - lock_descq(descq); - - /** set the descq as enabled*/ - descq->q_state = Q_STATE_ENABLED; - /** assign the qidx */ - qconf->qidx = i; - unlock_descq(descq); - - break; - } - - /** we are reached here means no free descq found - * decrement the queue count and return error - */ - if (i == qdev->qmax) { - pr_warn("no free %s qp found, %u.\n", - qconf->st ? "ST" : "MM", qdev->qmax); - rv = -EPERM; - snprintf(buf, buflen, - "qdma%05x no %s QP, %u.\n", - xdev->conf.bdf, - qconf->st ? "ST" : "MM", qdev->qmax); - return rv; - } - } else { - if (is_usable_queue(xdev, qconf->qidx, qconf->q_type, - qconf->st) < 0) { - pr_err("Queue compatibility check failed against existing queues\n"); - snprintf(buf, buflen, - "Queue compatibility check failed against existing queues\n"); - return -EPERM; - } - - descq += qconf->qidx; - - lock_descq(descq); - - /** set the descq as enabled*/ - descq->q_state = Q_STATE_ENABLED; - - unlock_descq(descq); - } - - /** prepare the queue resources*/ - rv = qdma_device_prep_q_resource(xdev); - if (rv < 0) { -#ifdef __QDMA_VF__ - lock_descq(descq); - descq->q_state = Q_STATE_DISABLED; - unlock_descq(descq); -#endif - return rv; - } -#ifndef __QDMA_VF__ - if (xdev->conf.qdma_drv_mode == LEGACY_INTR_MODE) { - rv = intr_legacy_setup(descq); - if (rv > 0) { - /** support only 1 queue in legacy interrupt mode */ - intr_legacy_clear(descq); - lock_descq(descq); - descq->q_state = Q_STATE_DISABLED; - unlock_descq(descq); - pr_debug("qdma%05x - Q%u - No free queues %u/%u.\n", - xdev->conf.bdf, descq->conf.qidx, - rv, 1); - rv = -EINVAL; - snprintf(buf, buflen, - "qdma%05x No free queues %u/%d.\n", - xdev->conf.bdf, qcnt, 1); - return rv; - } else if (rv < 0) { - rv = -EINVAL; - lock_descq(descq); - descq->q_state = Q_STATE_DISABLED; - unlock_descq(descq); - pr_debug("qdma%05x Legacy interrupt setup failed.\n", - xdev->conf.bdf); - snprintf(buf, buflen, - "qdma%05x Legacy interrupt setup failed.\n", - xdev->conf.bdf); - return rv; - } - } -#endif - /** fill in config. info */ - qdma_descq_config(descq, qconf, 0); -#ifndef __QDMA_VF__ - rv = qdma_dev_increment_active_queue(xdev->dma_device_index, - xdev->func_id, (enum qdma_dev_q_type)qconf->q_type); - if (rv < 0) { - pr_err("Failed to increment active %s queue count", - q_type_list[qconf->q_type].name); - return rv; - } - if (qconf->st && (qconf->q_type == Q_C2H)) { - rv = qdma_dev_increment_active_queue(xdev->dma_device_index, - xdev->func_id, QDMA_DEV_Q_TYPE_CMPT); - if (rv < 0) { - pr_err("Failed to increment CMPT queue count"); - qdma_dev_decrement_active_queue(xdev->dma_device_index, - xdev->func_id, - (enum qdma_dev_q_type)qconf->q_type); - return rv; - } - } -#else - rv = qdma_dev_notify_qadd(descq, - (enum queue_type_t)qconf->q_type); - if (rv < 0) { - pr_err("Failed to increment active %s queue count", - q_type_list[qconf->q_type].name); - return rv; - } - if (qconf->st && (qconf->q_type == Q_C2H)) { - rv = qdma_dev_notify_qadd(descq, Q_CMPT); - if (rv < 0) { - pr_err("Failed to increment active CMPT queue count"); - qdma_dev_notify_qdel(descq, - (enum queue_type_t)qconf->q_type); - return rv; - } - } -#endif - - /** copy back the name in config*/ - memcpy(qconf->name, descq->conf.name, QDMA_QUEUE_NAME_MAXLEN); - *qhndl = (unsigned long)descq->conf.qidx; - if (qconf->q_type == Q_C2H) - *qhndl += qdev->qmax; - if (qconf->q_type == Q_CMPT) - *qhndl += (2 * qdev->qmax); - descq->q_hndl = *qhndl; - - -#ifdef DEBUGFS - if (qconf->q_type != Q_CMPT) { - if (qconf->q_type == Q_H2C) - pairq = qdev->c2h_descq + qconf->qidx; - else - pairq = qdev->h2c_descq + qconf->qidx; - - rv = dbgfs_queue_init(&descq->conf, pairq, - xdev->dbgfs_queues_root); - if (rv < 0) { - pr_err("failed to create queue debug files for the queueu %d\n", - descq->conf.qidx); - } - } -#endif - - pr_debug("added %s, %s, qidx %u.\n", - descq->conf.name, - q_type_list[qconf->q_type].name, - qconf->qidx); - - snprintf(buf, buflen, "%s %s added.\n", - descq->conf.name, - q_type_list[qconf->q_type].name); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_queue_start() - start a queue (i.e, online, ready for dma) - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] id: queue index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_queue_start(unsigned long dev_hndl, unsigned long id, - char *buf, int buflen) -{ - struct qdma_descq *descq; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 1); - /** make sure that descq is not NULL, else return error*/ - if (!descq) { - pr_err("Invalid qid(%lu)", id); - snprintf(buf, buflen, - "Invalid qid(%lu)\n", id); - return -EINVAL; - } - - lock_descq(descq); - /** if the descq is not enabled, - * it is in invalid state, return error - */ - if (descq->q_state != Q_STATE_ENABLED) { - pr_err("%s invalid state, q_status%d.\n", - descq->conf.name, descq->q_state); - snprintf(buf, buflen, - "%s invalid state, q_state %d.\n", - descq->conf.name, descq->q_state); - unlock_descq(descq); - return -EINVAL; - } - - if ((xdev->version_info.ip_type == EQDMA_SOFT_IP) && - (xdev->version_info.vivado_release >= QDMA_VIVADO_2020_2)) { - - if (xdev->dev_cap.desc_eng_mode - == QDMA_DESC_ENG_BYPASS_ONLY) { - pr_err("Err: Bypass Only Design is not supported\n"); - snprintf(buf, buflen, - "%s Bypass Only Design is not supported\n", - descq->conf.name); - unlock_descq(descq); - return -EINVAL; - } - - if (descq->conf.desc_bypass) { - if (xdev->dev_cap.desc_eng_mode - == QDMA_DESC_ENG_INTERNAL_ONLY) { - pr_err("Err: Bypass mode not supported in Internal Mode only design\n"); - snprintf(buf, buflen, - "%s Bypass mode not supported in Internal Mode only design\n", - descq->conf.name); - unlock_descq(descq); - return -EINVAL; - } - } - } - - - if ((descq->conf.aperture_size != 0) && - ((descq->conf.aperture_size & - (descq->conf.aperture_size - 1)))) { - pr_err("Err: %s Power of 2 aperture size supported\n", - descq->conf.name); - snprintf(buf, buflen, - "Err:%s Power of 2 aperture size supported\n", - descq->conf.name); - unlock_descq(descq); - return -ERANGE; - } - /** complete the queue configuration*/ - rv = qdma_descq_config_complete(descq); - if (rv < 0) { - pr_err("%s 0x%x setup failed.\n", - descq->conf.name, descq->qidx_hw); - snprintf(buf, buflen, - "%s config failed.\n", descq->conf.name); - unlock_descq(descq); - return -EIO; - } - unlock_descq(descq); - - /** allocate the queue resources*/ - rv = qdma_descq_alloc_resource(descq); - if (rv < 0) { - pr_err("%s alloc resource failed.\n", descq->conf.name); - snprintf(buf, buflen, - "%s alloc resource failed.\n", - descq->conf.name); - return rv; - } - - /** program the hw contexts*/ - rv = qdma_descq_prog_hw(descq); - if (rv < 0) { - pr_err("%s 0x%x setup failed.\n", - descq->conf.name, descq->qidx_hw); - snprintf(buf, buflen, - "%s prog. context failed.\n", - descq->conf.name); - goto clear_context; - } - - /** Interrupt mode */ - if (descq->xdev->num_vecs) { - unsigned long flags; - struct intr_info_t *dev_intr_info_list = - &descq->xdev->dev_intr_info_list[descq->intr_id]; - - spin_lock_irqsave(&dev_intr_info_list->vec_q_list, flags); - list_add_tail(&descq->intr_list, - &dev_intr_info_list->intr_list); - dev_intr_info_list->intr_list_cnt++; - spin_unlock_irqrestore(&dev_intr_info_list->vec_q_list, flags); - } - - qdma_thread_add_work(descq); - - snprintf(buf, buflen, "queue %s, idx %u started\n", - descq->conf.name, descq->conf.qidx); - - /** set the descq to online state*/ - lock_descq(descq); - descq->q_state = Q_STATE_ONLINE; - unlock_descq(descq); - - return 0; - -clear_context: - qdma_descq_context_clear(descq->xdev, descq->qidx_hw, - descq->conf.st, descq->conf.q_type, 1); - qdma_descq_free_resource(descq); - - return rv; -} - -int qdma_get_queue_state(unsigned long dev_hndl, unsigned long id, - struct qdma_q_state *q_state, char *buf, int buflen) -{ - struct qdma_descq *descq; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 1); - /** make sure that descq is not NULL, else return error */ - if (!descq) { - pr_err("Invalid qid(%lu)", id); - snprintf(buf, buflen, - "Invalid qid(%lu)\n", id); - return -EINVAL; - } - - if (!q_state) { - pr_err("Invalid q_state:%p", q_state); - return -EINVAL; - } - - lock_descq(descq); - /** mode */ - q_state->st = descq->conf.st; - /** type */ - q_state->q_type = (enum queue_type_t)descq->conf.q_type; - /** qidx */ - q_state->qidx = descq->conf.qidx; - /** q state */ - q_state->qstate = descq->q_state; - - snprintf(buf, buflen, - "queue state for %s id %u : %s\n", - descq->conf.name, - descq->conf.qidx, - q_state_list[descq->q_state].name); - - unlock_descq(descq); - - return 0; -} - - - -/*****************************************************************************/ -/** - * qdma_queue_stop() - stop a queue (i.e., offline, NOT ready for dma) - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] id: queue index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_queue_stop(unsigned long dev_hndl, unsigned long id, char *buf, - int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - struct qdma_sgt_req_cb *cb, *tmp; - struct qdma_request *req; - unsigned int pend_list_empty = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 1); - /** make sure that descq is not NULL, else return error */ - if (!descq) { - pr_err("Invalid qid(%ld)", id); - return -EINVAL; - } - - lock_descq(descq); - /** if the descq not online donot proceed */ - if (descq->q_state != Q_STATE_ONLINE) { - unlock_descq(descq); - pr_err("%s invalid state, q_state %d.\n", - descq->conf.name, descq->q_state); - snprintf(buf, buflen, - "queue %s, idx %u stop failed.\n", - descq->conf.name, descq->conf.qidx); - return -EINVAL; - } - pend_list_empty = descq->pend_list_empty; - - descq->q_stop_wait = 1; - unlock_descq(descq); - if (!pend_list_empty) { - qdma_waitq_wait_event_timeout(descq->pend_list_wq, - descq->pend_list_empty, - msecs_to_jiffies(QDMA_Q_PEND_LIST_COMPLETION_TIMEOUT)); - } - lock_descq(descq); - /** free the descq by updating the state */ - descq->q_state = Q_STATE_ENABLED; - descq->q_stop_wait = 0; - list_for_each_entry_safe(cb, tmp, &descq->pend_list, list) { - req = (struct qdma_request *)cb; - cb->done = 1; - cb->status = -ENXIO; - if (req->fp_done) { - list_del(&cb->list); - req->fp_done(req, 0, -ENXIO); - } else - qdma_waitq_wakeup(&cb->wq); - } - list_for_each_entry_safe(cb, tmp, &descq->work_list, list) { - req = (struct qdma_request *)cb; - cb->done = 1; - cb->status = -ENXIO; - if (req->fp_done) { - qdma_work_queue_del(descq, cb); - req->fp_done(req, 0, -ENXIO); - } else - qdma_waitq_wakeup(&cb->wq); - } - unlock_descq(descq); - - /** remove the work thread associated with the current queue */ - qdma_thread_remove_work(descq); - - /** clear the queue context */ - qdma_descq_context_clear(descq->xdev, descq->qidx_hw, - descq->conf.st, descq->conf.q_type, 0); - - /** if the device is in direct/indirect interrupt mode, - * delete the interrupt list for the queue - */ - if ((descq->xdev->conf.qdma_drv_mode != POLL_MODE) && - (descq->xdev->conf.qdma_drv_mode != LEGACY_INTR_MODE)) { - unsigned long flags; - struct intr_info_t *dev_intr_info_list = - &descq->xdev->dev_intr_info_list[descq->intr_id]; - - spin_lock_irqsave(&dev_intr_info_list->vec_q_list, flags); - list_del(&descq->intr_list); - dev_intr_info_list->intr_list_cnt--; - spin_unlock_irqrestore(&dev_intr_info_list->vec_q_list, flags); - } - - /** free the queue resources */ - qdma_descq_free_resource(descq); - /** free the descq by updating the state */ - descq->total_cmpl_descs = 0; - - /** fill the return buffer indicating that queue is stopped */ - snprintf(buf, buflen, "queue %s, idx %u stopped.\n", - descq->conf.name, descq->conf.qidx); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_get_queue_count() - Function to fetch the total number of queues - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[out] q_count: total q count - * @param[out] buf: message buffer - * @param[in] buflen: length of the input buffer - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_get_queue_count(unsigned long dev_hndl, - struct qdma_queue_count *q_count, - char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen || !q_count) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - -#ifndef __QDMA_VF__ - q_count->h2c_qcnt = qdma_get_device_active_queue_count( - xdev->dma_device_index, - xdev->func_id, - QDMA_DEV_Q_TYPE_H2C); - - q_count->c2h_qcnt = qdma_get_device_active_queue_count( - xdev->dma_device_index, - xdev->func_id, - QDMA_DEV_Q_TYPE_C2H); - - q_count->cmpt_qcnt = qdma_get_device_active_queue_count( - xdev->dma_device_index, - xdev->func_id, - QDMA_DEV_Q_TYPE_CMPT); -#else - qdma_dev_get_active_qcnt(xdev, &(q_count->h2c_qcnt), - &(q_count->c2h_qcnt), - &(q_count->cmpt_qcnt)); -#endif - - pr_debug("h2c_qcnt = %d, c2h_qcnt = %d, cmpt_qcnt = %d", - q_count->h2c_qcnt, - q_count->c2h_qcnt, - q_count->cmpt_qcnt); - return 0; -} -/*****************************************************************************/ -/** - * qdma_intr_ring_dump() - display the interrupt ring info of a vector - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] vector_idx: vector number - * @param[in] start_idx: interrupt ring start idx - * @param[in] end_idx: interrupt ring end idx - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_intr_ring_dump(unsigned long dev_hndl, unsigned int vector_idx, - int start_idx, int end_idx, char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - union qdma_intr_ring *ring_entry; - struct intr_coal_conf *coal_entry; - char *cur = buf; - char * const end = buf + buflen; - int counter = 0; - u32 data[2]; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - /** if, interrupt aggregation is not enabled, - * interrupt ring is not created, return error - */ - if ((xdev->conf.qdma_drv_mode != INDIRECT_INTR_MODE) && - (xdev->conf.qdma_drv_mode != AUTO_MODE)) { - pr_err("Interrupt aggregation not enabled in %s mode", - mode_name_list[xdev->conf.qdma_drv_mode].name); - snprintf(buf, buflen, - "Interrupt aggregation not enabled in %s mode", - mode_name_list[xdev->conf.qdma_drv_mode].name); - return -EINVAL; - } - - /** make sure that vector index is with in the - * start and end vector limit, else return error - */ - if ((vector_idx < xdev->dvec_start_idx) || - (vector_idx >= - (xdev->dvec_start_idx + QDMA_NUM_DATA_VEC_FOR_INTR_CXT))) { - pr_err("Vector idx %u is invalid. Shall be in range: %d - %d.\n", - vector_idx, - xdev->dvec_start_idx, - (xdev->dvec_start_idx + - QDMA_NUM_DATA_VEC_FOR_INTR_CXT - 1)); - snprintf(buf, buflen, - "Vector idx %u is invalid. Shall be in range: %d - %d.\n", - vector_idx, - xdev->dvec_start_idx, - (xdev->dvec_start_idx + - QDMA_NUM_DATA_VEC_FOR_INTR_CXT - 1)); - return -EINVAL; - } - - /** get the intr entry based on vector index */ - coal_entry = xdev->intr_coal_list + (vector_idx - xdev->dvec_start_idx); - - /** make sure that intr ring entry indexes - * given are with in the range - */ - if (start_idx > coal_entry->intr_rng_num_entries) { - pr_err("start_idx %d is invalid. Shall be less than: %d\n", - start_idx, - coal_entry->intr_rng_num_entries); - snprintf(buf, buflen, - "start_idx %d is invalid. Shall be less than: %d\n", - start_idx, - coal_entry->intr_rng_num_entries); - return -EINVAL; - } - - if (end_idx == -1 || end_idx >= coal_entry->intr_rng_num_entries) - end_idx = coal_entry->intr_rng_num_entries - 1; - - if (start_idx == -1) - start_idx = 0; - - if (start_idx > end_idx) { - pr_err("start_idx can't be greater than end_idx\n"); - snprintf(buf, buflen, - "start_idx can't be greater than end_idx\n"); - return -EINVAL; - } - - /** read the ring entries based on the range given and - * update the input buffer with details - */ - for (counter = start_idx; counter <= end_idx; counter++) { - ring_entry = coal_entry->intr_ring_base + counter; - memcpy(data, ring_entry, sizeof(u32) * 2); - cur += snprintf(cur, end - cur, - "intr_ring_entry = %d: 0x%08x 0x%08x\n", - counter, data[1], data[0]); - if (cur >= end) - goto handle_truncation; - } - - return 0; -handle_truncation: - *buf = '\0'; - return 0; -} - - /*****************************************************************************/ - /** - * qdma_software_version_info Provides the qdma software version - * - * @param[out] software_version: libqdma software version - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_software_version_info(char *software_version, int length) -{ - if (!software_version) { - pr_err("Invalid input software_version:%p", software_version); - return -EINVAL; - } - - snprintf(software_version, length, "%s", LIBQDMA_VERSION_STR); - - return 0; -} - - -#ifdef __QDMA_VF__ - /*****************************************************************************/ - /** - * qdma_vf_qconf call for VF to request qmax number of Qs - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] qmax: number of qs requested by vf - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_vf_qconf(unsigned long dev_hndl, int qmax) -{ - int err = 0; - int qbase = -1; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) { - pr_err("Invalid dev handle\n"); - return -EINVAL; - } - - err = device_set_qconf(xdev, &qmax, &qbase); - if (err < 0) { - pr_err("Setting qconf failed\n"); - return err; - } - qdma_device_cleanup(xdev); - xdev->conf.qsets_base = qbase; - xdev->conf.qsets_max = qmax; - err = qdma_device_init(xdev); - if (err < 0) { - pr_warn("qdma_init failed %d.\n", err); - qdma_device_cleanup(xdev); - } - - return err; -} -#endif - -/*****************************************************************************/ -/** - * sgl_unmap() - unmap the sg list from host pages - * - * @param[in] pdev: pointer to struct pci_dev - * @param[in] sg: qdma sg request list - * @param[in] sgcnt: number of sg lists - * @param[in] dir: direction of the dma transfer - * DMA_BIDIRECTIONAL = 0, DMA_TO_DEVICE = 1, - * DMA_FROM_DEVICE = 2, DMA_NONE = 3, - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -void sgl_unmap(struct pci_dev *pdev, struct qdma_sw_sg *sg, unsigned int sgcnt, - enum dma_data_direction dir) -{ - int i; - - /** unmap the sg list and set the dma_addr to 0 all sg entries */ - for (i = 0; i < sgcnt; i++, sg++) { - if (!sg->pg) - break; - if (sg->dma_addr) { - dma_unmap_page(&pdev->dev, sg->dma_addr - sg->offset, - PAGE_SIZE, dir); - sg->dma_addr = 0UL; - } - } -} - -/*****************************************************************************/ -/** - * sgl_map() - map sg list to host pages - * - * @param[in] pdev: pointer to struct pci_dev - * @param[in] sg: qdma sg request list - * @param[in] sgcnt: number of sg lists - * @param[in] dir: direction of the dma transfer - * DMA_BIDIRECTIONAL = 0, DMA_TO_DEVICE = 1, - * DMA_FROM_DEVICE = 2, DMA_NONE = 3, - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int sgl_map(struct pci_dev *pdev, struct qdma_sw_sg *sgl, unsigned int sgcnt, - enum dma_data_direction dir) -{ - int i; - struct qdma_sw_sg *sg = sgl; - - /** Map the sg list onto a dma pages where - * each page has max of PAGE_SIZE i.e 4K - */ - for (i = 0; i < sgcnt; i++, sg++) { - /* !! TODO page size !! */ - sg->dma_addr = dma_map_page(&pdev->dev, sg->pg, 0, PAGE_SIZE, - dir); - if (unlikely(dma_mapping_error(&pdev->dev, sg->dma_addr))) { - pr_err("map sgl failed, sg %d, %u.\n", i, sg->len); - if (i) - sgl_unmap(pdev, sgl, i, dir); - return -EIO; - } - sg->dma_addr += sg->offset; - } - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_request_submit() - submit a scatter-gather list of data for dma - * operation (for both read and write) - * This is a callback function called from upper layer(character device) - * to handle the read/write request on the queues - * - * @param[in] dev_hndl: hndl retured from qdma_device_open() - * @param[in] id: queue index - * @param[in] req: qdma request - * - * @return # of bytes transferred - * @return <0: error - *****************************************************************************/ -ssize_t qdma_request_submit(unsigned long dev_hndl, unsigned long id, - struct qdma_request *req) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - struct qdma_sgt_req_cb *cb; - enum dma_data_direction dir; - int wait = 0; - int rv = 0; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (!req) { - pr_err("req is NULL"); - return -EINVAL; - } - - wait = req->fp_done ? 0 : 1; - - descq = qdma_device_get_descq_by_id(xdev, id, NULL, 0, 1); - if (!descq) { - pr_err("Invalid qid(%ld)", id); - return -EINVAL; - } - - if (descq->conf.q_type == Q_CMPT) { - pr_err("Error : Transfer initiated on completion queue\n"); - return -EINVAL; - } - - cb = qdma_req_cb_get(req); - - pr_debug("%s %s-%s, data len %u, sg cnt %u. ping_pong_en=%d\n", - descq->conf.name, descq->conf.st ? "ST" : "MM", - (descq->conf.q_type == Q_C2H) ? "C2H" : "H2C", - req->count, req->sgcnt, descq->conf.ping_pong_en); - - /** Identify the direction of the transfer */ - dir = (descq->conf.q_type == Q_C2H) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; - - /** If write request is given on the C2H direction - * OR, a read request given on non C2H direction - * then, its an invalid request, return error in this case - */ - if ((req->write && (descq->conf.q_type != Q_H2C)) || - (!req->write && (descq->conf.q_type != Q_C2H))) { - pr_err("%s: bad direction, %c.\n", - descq->conf.name, req->write ? 'W' : 'R'); - return -EINVAL; - } - - /** Reset the local cb request with 0's */ - memset(cb, 0, QDMA_REQ_OPAQUE_SIZE); - /** Initialize the wait queue */ - qdma_waitq_init(&cb->wq); - - pr_debug("%s: data len %u, ep 0x%llx, sgl 0x%p, sgl cnt %u, tm %u ms.\n", - descq->conf.name, req->count, req->ep_addr, req->sgl, - req->sgcnt, req->timeout_ms); - - /** If the request is streaming mode C2H, invoke the - * handler to perform the read operation - */ - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) - return qdma_request_submit_st_c2h(xdev, descq, req); - - if (!req->dma_mapped) { - rv = sgl_map(xdev->conf.pdev, req->sgl, req->sgcnt, dir); - if (rv < 0) { - pr_err("%s map sgl %u failed, %u.\n", - descq->conf.name, req->sgcnt, req->count); - goto unmap_sgl; - } - cb->unmap_needed = 1; - } - - lock_descq(descq); - /** if the descq is already in online state*/ - if (descq->q_state != Q_STATE_ONLINE) { - unlock_descq(descq); - pr_err("%s descq %s NOT online.\n", - xdev->conf.name, descq->conf.name); - rv = -EINVAL; - goto unmap_sgl; - } - qdma_work_queue_add(descq, cb); - unlock_descq(descq); - - pr_debug("%s: cb 0x%p submitted.\n", descq->conf.name, cb); - - qdma_descq_proc_sgt_request(descq); - - if (!wait) - return 0; - - rv = qdma_request_wait_for_cmpl(xdev, descq, req); - if (rv < 0) - goto unmap_sgl; - - return cb->offset; - -unmap_sgl: - if (!req->dma_mapped) - sgl_unmap(xdev->conf.pdev, req->sgl, req->sgcnt, dir); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_batch_request_submit() - submit a batch of scatter-gather list of data - * for dma operation (for both read and write) - * This is a callback function called from upper layer(character device) - * to handle the read/write request on the queues - * - * @param[in] dev_hndl: hndl retured from qdma_device_open() - * @param[in] id: queue index - * @param[in] count: Number of qdma requests - * @param[in] reqv: qdma request vector - * - * @return # of bytes transferred - * @return <0: error - *****************************************************************************/ -ssize_t qdma_batch_request_submit(unsigned long dev_hndl, unsigned long id, - unsigned long count, struct qdma_request **reqv) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - struct qdma_sgt_req_cb *cb; - enum dma_data_direction dir; - int rv = 0; - unsigned long i; - struct qdma_request *req; - int st_c2h = 0; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (!reqv) { - pr_err("reqv is NULL"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, NULL, 0, 0); - if (!descq) { - pr_err("Invalid qid(%ld)", id); - return -EINVAL; - } - - if (descq->conf.q_type == Q_CMPT) { - pr_err("Error : Transfer initiated on completion queue\n"); - return -EINVAL; - } - - st_c2h = (descq->conf.st && (descq->conf.q_type == Q_C2H)) ? 1 : 0; - - /** Identify the direction of the transfer */ - dir = (descq->conf.q_type == Q_C2H) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; - - req = reqv[0]; - /** If write request is given on the C2H direction - * OR, a read request given on non C2H direction - * then, its an invalid request, return error in this case - */ - if ((req->write && (descq->conf.q_type != Q_H2C)) - || (!req->write && (descq->conf.q_type != Q_C2H))) { - pr_err("%s: bad direction, %c.\n", descq->conf.name, - req->write ? 'W' : 'R'); - return -EINVAL; - } - if (!req->fp_done) { - pr_err("%s: missing fp_done.\n", descq->conf.name); - return -EINVAL; - } - - if (st_c2h) { - for (i = 0; i < count; i++) { - req = reqv[i]; - cb = qdma_req_cb_get(req); - /** Reset the local cb request with 0's */ - memset(cb, 0, QDMA_REQ_OPAQUE_SIZE); - - rv = qdma_request_submit_st_c2h(xdev, descq, req); - if ((rv < 0) || (rv == req->count)) - req->fp_done(req, rv, rv); - } - - return 0; - - } else { - struct pci_dev *pdev = xdev->conf.pdev; - - for (i = 0; i < count; i++) { - req = reqv[i]; - cb = qdma_req_cb_get(req); - /** Reset the local cb request with 0's */ - memset(cb, 0, QDMA_REQ_OPAQUE_SIZE); - - if (!req->dma_mapped) { - rv = sgl_map(pdev, req->sgl, req->sgcnt, dir); - if (unlikely(rv < 0)) { - pr_err("%s map sgl %u failed, %u.\n", - descq->conf.name, - req->sgcnt, - req->count); - req->fp_done(req, 0, rv); - } - cb->unmap_needed = 1; - } - } - } - - lock_descq(descq); - /** if the descq is already in online state*/ - if (unlikely(descq->q_state != Q_STATE_ONLINE)) { - unlock_descq(descq); - pr_err("%s descq %s NOT online.\n", xdev->conf.name, - descq->conf.name); - return -EINVAL; - } - - for (i = 0; i < count; i++) { - req = reqv[i]; - cb = qdma_req_cb_get(req); - - list_add_tail(&cb->list, &descq->work_list); - } - unlock_descq(descq); - - qdma_descq_proc_sgt_request(descq); - - return 0; -} - -#ifdef TANDEM_BOOT_SUPPORTED -/*****************************************************************************/ -/** - * qdma_init_st_ctxt() initialize the QDMA ST context - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param buflen input buffer length - * @param buf error message buffer, can be NULL/0 (i.e., optional - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_init_st_ctxt(unsigned long dev_hndl, char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv = 0; - - /** make sure that input buffer is not empty, else return error */ - if (!buf || !buflen) { - pr_err("invalid argument: buf=%p, buflen=%d\n", buf, buflen); - return -EINVAL; - } - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - snprintf(buf, buflen, "Invalid dev_hndl passed\n"); - return -EINVAL; - } - - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - ((xdev->version_info.device_type == QDMA_DEVICE_VERSAL_CPM4) || - (xdev->version_info.device_type == QDMA_DEVICE_VERSAL_CPM5))) { - if (xdev->hw.qdma_init_st_ctxt == NULL) { - pr_err("Err: Feature not supported\n"); - snprintf(buf, buflen, "Err: Feature not supported\n"); - return -EPERM; - } - - rv = xdev->hw.qdma_init_st_ctxt((void *)dev_hndl); - - if (rv == QDMA_SUCCESS) { - snprintf(buf, buflen, - "qdma%05x : Steaming Enabled successfully\n", - xdev->conf.bdf); - pr_info("Steaming Enabled successfully\n"); - } else { - snprintf(buf, buflen, - "qdma%05x : Failed to Enable Steaming\n", - xdev->conf.bdf); - pr_info("Failed to Enable Steaming\n"); - return -EINVAL; - } - } else { - snprintf(buf, buflen, - "qdma%05x : Steaming Enabled during Initialization\n", - xdev->conf.bdf); - pr_info("Steaming Enabled during Initialization\n"); - } - - return rv; -} -#endif - -/*****************************************************************************/ -/** - * libqdma_init() initialize the QDMA core library - * - * @param[in] num_threads - number of threads to be created each for request - * processing and writeback processing - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int libqdma_init(unsigned int num_threads, void *debugfs_root) -{ - - int ret; - /** Make sure that the size of qdma scatter gather request size - * is less than the QDMA_REQ_OPAQUE_SIZE - * If not, return error - */ - if (sizeof(struct qdma_sgt_req_cb) > QDMA_REQ_OPAQUE_SIZE) { - pr_err("dma req. opaque data size too big %lu > %lu.\n", - sizeof(struct qdma_sgt_req_cb), QDMA_REQ_OPAQUE_SIZE); - return -1; - } - if (sizeof(struct qdma_flq) > QDMA_FLQ_SIZE) { - pr_err("qdma flq data size too big %lu > %d", - sizeof(struct qdma_flq), QDMA_FLQ_SIZE); - return -1; - } - - /** Create the qdma threads */ - ret = qdma_threads_create(num_threads); - if (ret < 0) { - pr_err("qdma_threads_create failed for num_thread=%d", - num_threads); - return ret; - } -#ifdef DEBUGFS - - if (debugfs_root) { - qdma_debugfs_root = debugfs_root; - qdma_debufs_cleanup = false; - return 0; - } - - ret = qdma_debugfs_init(&qdma_debugfs_root); - if (ret < 0) { - pr_err("qdma_debugfs_init failed for num_thread=%d", - num_threads); - return ret; - } -#endif - return 0; -} - -/*****************************************************************************/ -/** - * libqdma_exit() cleanup the QDMA core library before exiting - * - * @return none - *****************************************************************************/ -void libqdma_exit(void) -{ -#ifdef DEBUGFS - if (qdma_debufs_cleanup) - qdma_debugfs_exit(qdma_debugfs_root); -#endif - /** Destroy the qdma threads */ - qdma_threads_destroy(); -} - -#ifdef __LIBQDMA_MOD__ -/** for module support only */ -#include "version.h" - -static char version[] = - DRV_MODULE_DESC " " DRV_MODULE_NAME " v" DRV_MODULE_VERSION "\n"; - -MODULE_AUTHOR("Xilinx, Inc."); -MODULE_DESCRIPTION(DRV_MODULE_DESC); -MODULE_VERSION(DRV_MODULE_VERSION); -MODULE_LICENSE("Dual BSD/GPL"); - -/*****************************************************************************/ -/** - * libqdma_mod_init() libqdma module initialization routine - * - * Returns: none - *****************************************************************************/ -static int __init libqdma_mod_init(void) -{ - pr_info("%s", version); - - /** invoke libqdma_init to initialize the libqdma library */ - return libqdma_init(); -} - -/*****************************************************************************/ -/** - * libqdma_mod_exit() cleanup the QDMA core library before exiting - * - * Returns: none - *****************************************************************************/ -static void __exit libqdma_mod_exit(void) -{ - /** invoke libqdma_exit to cleanup the libqdma library resources */ - libqdma_exit(); -} - -module_init(libqdma_mod_init); -module_exit(libqdma_mod_exit); -#endif /* ifdef __LIBQDMA_MOD__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/libqdma_export.h b/QDMA/linux-kernel/driver/libqdma/libqdma_export.h deleted file mode 100755 index fd60446..0000000 --- a/QDMA/linux-kernel/driver/libqdma/libqdma_export.h +++ /dev/null @@ -1,1698 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __LIBQDMA_EXPORT_API_H__ -#define __LIBQDMA_EXPORT_API_H__ - - -/** - * @file libqdma_export.h - * - * Xilinx QDMA Library Interface Definitions - * - * Header file *libqdma_export.h* defines data structures and function - * signatures exported by Xilinx QDMA (libqdma) Library. - * libqdma is part of Xilinx QDMA Linux Driver. - * - * libqdma exports the configuration and control APIs for device and - * queue management and data processing APIs. Configuration APIs - * shall not be invoked in interrupt context by upper layers. - */ - -#include <linux/types.h> -#include <linux/interrupt.h> -#include "libqdma_config.h" -#include "qdma_access_export.h" -#include "qdma_compat.h" - - -/** @defgroup libqdma_enums Enumerations - */ -/** @defgroup libqdma_struct Data Structures - */ -/** - * @defgroup libqdma_defines Definitions - * @{ - */ - -/** - * Invalid QDMA function number - */ -#define QDMA_FUNC_ID_INVALID 0xFFFF - -/** - * QDMA_DEV_NAME_MAXLEN - Maxinum length of the QDMA device name - */ -#define QDMA_DEV_NAME_MAXLEN 32 - -/** - * DEVICE_VERSION_INFO_STR_LENGTH - QDMA HW version string array length, - * change this if QDMA_HW_VERSION_STRING_LEN is changed in access code - */ -#define DEVICE_VERSION_INFO_STR_LENGTH (34) - -/** - * QDMA_QUEUE_NAME_MAXLEN - Maximum queue name length - */ -#define QDMA_QUEUE_NAME_MAXLEN 32 - -/** - * QDMA_QUEUE_IDX_INVALID - Invalid queue index - */ -#define QDMA_QUEUE_IDX_INVALID 0xFFFF - -/** - * QDMA_QUEUE_VEC_INVALID - Invalid MSIx vector index - */ -#define QDMA_QUEUE_VEC_INVALID 0xFF - -/** - * QDMA_REQ_OPAQUE_SIZE - Maximum request length. - * QDMA_REQ_OPAQUE_SIZE varies according to kernel params. - * Size of spinlock_t varies when spinlock debug params are enabled. - */ -#define QDMA_REQ_OPAQUE_SIZE (56 + sizeof(qdma_wait_queue)) - -/** - * QDMA_UDD_MAXLEN - Maximum length of the user defined data - */ -#define QDMA_UDD_MAXLEN 32 - -/** @} */ - - -/** - * Per queue DMA AXI Interface option - * @ingroup libqdma_enums - */ -enum qdma_q_mode { - /** AXI Memory Mapped Mode */ - QDMA_Q_MODE_MM, - /** AXI Stream Mode */ - QDMA_Q_MODE_ST -}; - -/** - * Direction of the queue - * @ingroup libqdma_enums - */ -enum qdma_q_dir { - /** host to card */ - QDMA_Q_DIR_H2C, - /** card to host */ - QDMA_Q_DIR_C2H -}; - - -/** - * PF/VF qdma driver modes - * - * QDMA PF/VF drivers can be loaded in one of these modes. - * Mode options is exposed as a user configurable module parameter - * @ingroup libqdma_enums - * - */ -enum qdma_drv_mode { - /** - * @param AUTO_MODE Auto mode is mix of Poll and Interrupt Aggregation - * mode. Driver polls for the write back status updates. Interrupt - * aggregation is used for processing the completion ring - */ - AUTO_MODE, - /** - * @param POLL_MODE In Poll Mode, Software polls for the write back - * completions (Status Descriptor Write Back) - */ - POLL_MODE, - /** - * @param DIRECT_INTR_MODE Direct Interrupt mode, each queue is - * assigned to one of the available interrupt vectors in a round robin - * fashion to service the requests. Interrupt is raised by the HW upon - * receiving the completions and software reads the completion status. - */ - DIRECT_INTR_MODE, - /** - * @param INDIRECT_INTR_MODE In Indirect Interrupt mode or Interrupt - * Aggregation mode, each vector has an associated Interrupt - * Aggregation Ring. The QID and status of queues requiring service - * are written into the Interrupt Aggregation Ring. When a PCIe MSI-X - * interrupt is received by the Host, the software reads the Interrupt - * Aggregation Ring to determine which queue needs service. Mapping of - * queues to vectors is programmable - */ - INDIRECT_INTR_MODE, - /** - * @param LEGACY_INTR_MODE Driver is inserted in legacy interrupt mode - * Software serves status updates upon receiving the legacy interrupt - */ - LEGACY_INTR_MODE -}; - -/** - * Queue direction types - * @ingroup libqdma_enums - * - */ -enum queue_type_t { - /** host to card */ - Q_H2C, - /** card to host */ - Q_C2H, - /** cmpt queue*/ - Q_CMPT, - /** Both H2C and C2H directions*/ - Q_H2C_C2H, -}; - - -/** - * Qdma interrupt ring size selection - * - * Each interrupt vector can be associated with 1 or more interrupt rings. - * The software can choose 8 different interrupt ring sizes. The ring size - * for each vector is programmed during interrupt context programming - * @ingroup libqdma_enums - * - */ -enum intr_ring_size_sel { - /** accommodates 512 entries */ - INTR_RING_SZ_4KB = 0, - /** accommodates 1024 entries */ - INTR_RING_SZ_8KB, - /** accommodates 1536 entries */ - INTR_RING_SZ_12KB, - /** accommodates 2048 entries */ - INTR_RING_SZ_16KB, - /** accommodates 2560 entries */ - INTR_RING_SZ_20KB, - /** accommodates 3072 entries */ - INTR_RING_SZ_24KB, - /** accommodates 3584 entries */ - INTR_RING_SZ_28KB, - /** accommodates 4096 entries */ - INTR_RING_SZ_32KB, -}; - -/** - * Qdma function states - * - * Each PF/VF device can be configured with 0 or more number of queues. - * When the queue is not assigned to any function, function is in unfonfigured - * state. Sysfs interface enables the users to configure the number of - * queues to different functions. Upon adding the queues, function moves to - * user configured state. - * @ingroup libqdma_enums - * - */ -enum qdma_dev_qmax_state { - /** @param QMAX_CFG_UNCONFIGURED queue max not configured */ - QMAX_CFG_UNCONFIGURED, - /** - * @param QMAX_CFG_INITIAL queue max configured with - * initial default values - */ - QMAX_CFG_INITIAL, - /** - * @param QMAX_CFG_USER queue max configured from - * sysfs as per user choice - */ - QMAX_CFG_USER, -}; - -/** - * Descriptor sizes - * @ingroup libqdma_enums - * - */ -enum cmpt_desc_sz_t { - /** completion size 8B */ - CMPT_DESC_SZ_8B = 0, - /** completion size 16B */ - CMPT_DESC_SZ_16B, - /** completion size 32B */ - CMPT_DESC_SZ_32B, - /** completion size 64B */ - CMPT_DESC_SZ_64B -}; - -/** - * Descriptor sizes - * @ingroup libqdma_enums - * - */ -enum desc_sz_t { - /** descriptor size 8B */ - DESC_SZ_8B = 0, - /** descriptor size 16B */ - DESC_SZ_16B, - /** descriptor size 32B */ - DESC_SZ_32B, - /** descriptor size 64B */ - DESC_SZ_64B -}; - -/** - * Trigger modes - * @ingroup libqdma_enums - * - */ -enum tigger_mode_t { - /** disable trigger mode */ - TRIG_MODE_DISABLE, - /** any trigger mode */ - TRIG_MODE_ANY, - /** counter trigger mode */ - TRIG_MODE_COUNTER, - /** trigger mode of user choice */ - TRIG_MODE_USER, - /** timer trigger mode */ - TRIG_MODE_TIMER, - /** timer and counter combo trigger mode */ - TRIG_MODE_COMBO, -}; - -/** - * Queue can be in one of the following states - * @ingroup libqdma_enums - * - */ -enum q_state_t { - /** @param Q_STATE_DISABLED Queue is not taken */ - Q_STATE_DISABLED = 0, - /** @param Q_STATE_ENABLED Assigned/taken. Partial config is done */ - Q_STATE_ENABLED, - /** - * @param Q_STATE_ONLINE Resource/context is initialized for the queue - * and is available for data consumption - */ - Q_STATE_ONLINE, -}; - -/** - * Structure to hold the driver name and mode - * - * Mode can be set for each PF or VF group using module parameters - * Refer enum qdma_drv_mode for different mode options - * @ingroup libqdma_struct - * - */ -struct drv_mode_name { - /** Mode of the function */ - enum qdma_drv_mode drv_mode; - /** Driver Name */ - char name[20]; -}; - - -/** - * Queue type - * - * Look up table for name of the queue type and enum - * @ingroup libqdma_struct - * - */ -struct qdma_q_type { - /** Queue type name */ - const char *name; - /** Queue type */ - enum queue_type_t q_type; -}; - - -/** - * Completion entry format - * - * Completion Entry is user logic dependent - * Current SW supported the following completion entry format - * @ingroup libqdma_struct - * - */ -struct qdma_ul_cmpt_info { - union { - /** Flag bits */ - u8 fbits; - struct cmpl_flag { - /** Format of the entry */ - u8 format:1; - /** Indicates the validity of the entry */ - u8 color:1; - /** Indicates the error status */ - u8 err:1; - /** Indicates the descriptor used status */ - u8 desc_used:1; - /** Indicates the end of transfer */ - u8 eot:1; - /** Filler bits */ - u8 filler:3; - } f; - }; - /** Reserved filed added for structure alignment */ - u8 rsvd; - /** Length of the completion entry */ - u16 len; - /** Producer Index */ - unsigned int pidx; - /** Completion entry */ - __be64 *entry; -}; - -/** - * Externel structure definition mode_name_list - * - * @ingroup libqdma_struct - */ -extern struct drv_mode_name mode_name_list[]; - -/** - * Externel structure definition q_type_list - * - * @ingroup libqdma_struct - */ -extern struct qdma_q_type q_type_list[]; - -/** - * Forward declaration for struct pci_dev - * - * @ingroup libqdma_struct - */ -struct pci_dev; - -/** - * Defines the per-device qdma property. - * - * @note if any of the max requested is less than supported, the value will - * be updated - * @ingroup libqdma_struct - */ -struct qdma_dev_conf { - /** pointer to pci_dev */ - struct pci_dev *pdev; - /** Maximum number of queue pairs per device */ - u32 qsets_max; - /** Reserved */ - unsigned short rsvd2; - /** - * Indicates whether zero length DMA is allowed or not - */ - u8 zerolen_dma:1; - /** - * Indicates whether the current pf - * is master_pf or not - */ - u8 master_pf:1; - /** - * moderate interrupt generation - */ - u8 intr_moderation:1; - /** Reserved1 */ - u8 rsvd1:5; - /** - * Maximum number of virtual functions for - * current physical function - */ - u8 vf_max; - /** Interrupt ring size */ - u8 intr_rngsz; - /** - * interrupt: - * - MSI-X only - * max of QDMA_DEV_MSIX_VEC_MAX per function, 32 in Versal - * - 1 vector is reserved for user interrupt - * - 1 vector is reserved mailbox - * - 1 vector on pf0 is reserved for error interrupt - * - the remaining vectors will be used for queues - */ - - /** - * max. of vectors used for queues. - * libqdma update w/ actual # - */ - u16 msix_qvec_max; - /** Max user msix vectors */ - u16 user_msix_qvec_max; - /** Max data msix vectors */ - u16 data_msix_qvec_max; - /** upper layer data, i.e. callback data */ - unsigned long uld; - /** qdma driver mode */ - enum qdma_drv_mode qdma_drv_mode; - /** - * an unique string to identify the dev. - * current format: qdma[pf|vf][idx] filled in by libqdma - */ - char name[QDMA_DEV_NAME_MAXLEN]; - - /** dma config bar #, < 0 not present */ - char bar_num_config; - /** AXI Master Lite(user bar) */ - char bar_num_user; - /** AXI Bridge Master(bypass bar) */ - char bar_num_bypass; - /** queue base for this function */ - int qsets_base; - /** device index */ - u32 bdf; - /** index of device in device list */ - u32 idx; -#ifndef __XRT__ - /** - * @brief user interrupt, if null, default libqdma handler is used - * - * @param dev_hndl Device Handler - * @param uld upper layer data, i.e. callback data - */ - void (*fp_user_isr_handler)(unsigned long dev_hndl, unsigned long uld); -#else - /** - * @brief user interrupt, if null, default libqdma handler is used - * - * @param dev_hndl Device Handler - * @param irq_index Interrupt index - * @param uld upper layer data, i.e. callback data - */ - void (*fp_user_isr_handler)(unsigned long dev_hndl, int irq_index, - unsigned long uld); -#endif - /** - * @brief Q interrupt top, - * per-device addtional handling code - * - * @param dev_hndl Device Handler - * @param uld upper layer data, i.e. callback data - */ - void (*fp_q_isr_top_dev)(unsigned long dev_hndl, unsigned long uld); - - /** - * @brief for freeing any resources in FLR process - * - * @param dev_hndl Device Handler - */ - void (*fp_flr_free_resource)(unsigned long dev_hndl); - - /** - * root path for debugfs - */ - void *debugfs_dev_root; -}; - -/** - * defines the per-device version information - * @ingroup libqdma_struct - * - */ -struct qdma_version_info { - /** Version string */ - char rtl_version_str[DEVICE_VERSION_INFO_STR_LENGTH]; - /** Release string */ - char vivado_release_str[DEVICE_VERSION_INFO_STR_LENGTH]; - /** IP version string */ - char ip_str[DEVICE_VERSION_INFO_STR_LENGTH]; - /** Qdma device type string */ - char device_type_str[DEVICE_VERSION_INFO_STR_LENGTH]; -}; - -/** - * global CSR configuration - * @ingroup libqdma_struct - * - */ -struct global_csr_conf { - /** Descriptor ring size ie. queue depth */ - unsigned int ring_sz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** C2H timer count list */ - unsigned int c2h_timer_cnt[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** C2H counter threshold list*/ - unsigned int c2h_cnt_th[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** C2H buffer size list */ - unsigned int c2h_buf_sz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** Writeback interval */ - unsigned int wb_intvl; -}; - - -/** - * qdma scatter gather request - * @ingroup libqdma_struct - * - */ -struct qdma_sw_sg { - /** pointer to next page */ - struct qdma_sw_sg *next; - /** pointer to current page */ - struct page *pg; - /** offset in current page */ - unsigned int offset; - /** length of the page */ - unsigned int len; - /** dma address of the allocated page */ - dma_addr_t dma_addr; -}; - -/** struct qdma_request forward declaration - * @ingroup libqdma_struct - */ -struct qdma_request; - -/** - * qdma configuration parameters - * - * qdma_queue_conf defines the per-dma Q property. - * if any of the max requested is less than supported, the value will - * be updated - * @ingroup libqdma_struct - * - */ -struct qdma_queue_conf { - /** - * @param qidx 0xFFFF: libqdma choose the queue idx 0 ~ - * (qdma_dev_conf.qsets_max - 1) the calling function choose the - * queue idx - */ - u32 qidx:24; - /** @note config flags: byte #1 */ - /** Indicates the streaming mode */ - u32 st:1; - /** queue_type_t */ - u32 q_type:2; - /** SDx only: inter-kernel communication pipe */ - u32 pipe:1; - /** poll or interrupt */ - u32 irq_en:1; - - /** descriptor ring */ - /** global_csr_conf.ringsz[N] */ - u32 desc_rng_sz_idx:4; - - /** @note config flags: byte #2 */ - /** writeback enable, disabled for ST C2H */ - u8 wb_status_en:1; - /** sw context.cmpl_status_acc_en */ - u8 cmpl_status_acc_en:1; - /** sw context.cmpl_stauts_pend_chk */ - u8 cmpl_status_pend_chk:1; - /** send descriptor to bypass out */ - u8 desc_bypass:1; - /** descriptor prefetch enable control */ - u8 pfetch_en:1; - /** sw context.frcd_en[32] */ - u8 fetch_credit:1; - /** - * @param st_pkt_mode SDx only: ST packet mode - * (i.e., with TLAST to identify the packet boundary) - */ - u8 st_pkt_mode:1; - - /** @note config flags: byte #3 */ - /** global_csr_conf.c2h_buf_sz[N] */ - u8 c2h_buf_sz_idx:4; - - /** ST C2H Completion/Writeback ring */ - /** global_csr_conf.ringsz[N] */ - u8 cmpl_rng_sz_idx:4; - - /** @note config flags: byte #4 */ - /** C2H ST cmpt + immediate data, desc_sz_t */ - u8 cmpl_desc_sz:2; - /** enable status desc. for CMPT */ - u8 cmpl_stat_en:1; - /** C2H Completion entry user-defined data */ - u8 cmpl_udd_en:1; - /** global_csr_conf.c2h_timer_cnt[N] */ - u8 cmpl_timer_idx:4; - - /** @note config flags byte #5 */ - /** global_csr_conf.c2h_cnt_th[N] */ - u8 cmpl_cnt_th_idx:4; - /** tigger_mode_t */ - u8 cmpl_trig_mode:3; - /** enable interrupt for CMPT */ - u8 cmpl_en_intr:1; - - /** @note config flags byte #6 */ - /** SW Context desc size, desc_sz_t */ - u8 sw_desc_sz:2; - /** prefetch bypass en */ - u8 pfetch_bypass:1; - /** OVF_DIS C2H ST over flow disable */ - u8 cmpl_ovf_chk_dis:1; - /** Port ID */ - u8 port_id:3; - /** Address Translation */ - u8 at:1; - /** Adaptive rx counter threshold */ - u8 adaptive_rx:1; - /** optimize for latency */ - u8 latency_optimize:1; - /** Disable pidx initialiaztion for ST C2H */ - u8 init_pidx_dis:1; - - /** MM Channel */ - u8 mm_channel:1; - - /** user provided per-Q irq handler */ - unsigned long quld; /* set by user for per Q data */ - /** acummulate PIDX to batch packets */ - u32 pidx_acc:8; - /** - * @brief Q interrupt top, per-queue additional handling - * code for example, network rx napi_schedule(&Q->napi) - * - * @param qhndl Queue handle - * @param quld Queue ID - * - */ - void (*fp_descq_isr_top)(unsigned long qhndl, unsigned long quld); - - /** - * @brief optional rx packet handler: - * called from irq BH (i.e.qdma_queue_service_bh()) - * - * @param qhndl Queue handle - * @param quld Queue ID - * @param len Packet Length - * @param sgcnt scatter gathher list count - * @param sgl packet data in scatter-gather list - * @param udd user defined data in the completion entry - * - * @note - * a. do NOT modify any field of sgl - * b. if zero copy, do a get_page() to prevent page freeing - * c. do loop through the sgl with sg->next and stop - * at sgcnt. the last sg may not have sg->next = NULL - * - * @returns - * 0 to allow libqdma free/re-task the sgl - * < 0, libqdma will keep the packet for processing again - * - * @details - * A single packet could contain: - * in the case of c2h_udd_en = 1: - * - * udd only (udd valid, sgcnt = 0, sgl = NULL), or - * udd + packet data in the case of c2h_udd_en = 0: - * packet data (udd = NULL, sgcnt > 0 and sgl valid) - * - */ - int (*fp_descq_c2h_packet)(unsigned long qhndl, unsigned long quld, - unsigned int len, unsigned int sgcnt, - struct qdma_sw_sg *sgl, void *udd); - /** - * @brief fill the all the descriptors required for - * transfer - * @param q_hndl handle with which bypass module can request back - * info from libqdma - * - * @param q_mode mode in which q is initialized - * @param q_dir direction in which q is initialized - * @param sgcnt number of scatter gather entries for this request - * @param sgl list of scatter gather entries - * - * @returns On calling this API, bypass module can request for - * descriptor using qdma_q_desc_get and set up as many descriptors - * as required for each scatter gather entry. If descriptors required - * are not available, it can return the number of sgcnt addressed - * till now and return <0 in case of any failure - */ - int (*fp_bypass_desc_fill)(void *q_hndl, enum qdma_q_mode q_mode, - enum qdma_q_dir, struct qdma_request *req); - /** - * @brief parse cmpt entry in bypass mode - * - * @param cmpt_entry cmpt entry descriptor - * @param cmpt_info parsed bypass related info from cmpt_entry - * - * @returns 0 for success - */ - int (*fp_proc_ul_cmpt_entry)(void *cmpt_entry, - struct qdma_ul_cmpt_info *cmpt_info); - - /** @note Following fileds are filled by libqdma */ - /** name of the qdma device */ - char name[QDMA_QUEUE_NAME_MAXLEN]; - /** ring size of the queue */ - unsigned int rngsz; - /** completion ring size of the queue */ - unsigned int rngsz_cmpt; - /** C2H buffer size */ - unsigned int c2h_bufsz; - /** Ping Pong measurement */ - u8 ping_pong_en:1; - /** Keyhole Aperture Size */ - u32 aperture_size; -}; - -/** - * display queue state in a string buffer - * @ingroup libqdma_struct - * - */ -struct qdma_q_state { - /** current q state */ - enum q_state_t qstate; - /** - * 0xFFFF: libqdma choose the queue idx 0 ~ - * (qdma_dev_conf.qsets_max - 1) the calling function choose the - * queue idx - */ - u32 qidx:24; - /** Indicates the streaming mode */ - u32 st:1; - /** queue type */ - enum queue_type_t q_type; -}; - - -/** - * qdma request for read or write - * @ingroup libqdma_struct - * - */ -struct qdma_request { - /** private to the dma driver, do NOT touch */ - unsigned char opaque[QDMA_REQ_OPAQUE_SIZE]; - /** - * filled in by the calling function - * for the calling function - */ - unsigned long uld_data; - /** set fp_done for non-blocking mode */ - int (*fp_done)(struct qdma_request *req, unsigned int bytes_done, - int err); - /** timeout in mili-seconds, 0 - no timeout */ - unsigned int timeout_ms; - /** total data size */ - unsigned int count; - /** MM only, DDR/BRAM memory addr */ - u64 ep_addr; - /** flag to indicate if memcpy is required */ - u8 no_memcpy:1; - /** if write to the device */ - u8 write:1; - /** if sgt is already dma mapped */ - u8 dma_mapped:1; - /** indicates end of transfer towards user kernel */ - u8 h2c_eot:1; - /** state check disbaled in queue pkt API */ - u8 check_qstate_disabled:1; - u8 _pad:3; - /** user defined data present */ - u8 udd_len; - /** number of scatter-gather entries < 64K */ - unsigned int sgcnt; - /** scatter-gather list of data bufs */ - struct qdma_sw_sg *sgl; - /** udd data */ - u8 udd[QDMA_UDD_MAXLEN]; -}; - -/** - * Completion control - * @ingroup libqdma_struct - */ -struct qdma_cmpl_ctrl { - /** global_csr_conf.c2h_cnt_th[N] */ - u8 cnt_th_idx:4; - /** global_csr_conf.c2h_timer_cnt[N] */ - u8 timer_idx:4; - /** tigger_mode */ - u8 trigger_mode:3; - /** enable status desc. for CMPT */ - u8 en_stat_desc:1; - /** enable interrupt for CMPT */ - u8 cmpl_en_intr:1; -}; - - -/** - * QDMA queue count - * @ingroup libqdma_struct - */ -struct qdma_queue_count { - /** H2C queue count */ - u32 h2c_qcnt; - /** C2H queue count */ - u32 c2h_qcnt; - /** CMPT queue count */ - u32 cmpt_qcnt; -}; - - -/** - * Initializes the QDMA core library - * - * @param num_threads number of threads to be created each for request - * processing and writeback processing - * - * @param debugfs_root root path for debugfs - * - * @returns 0: success <0: error - * - */ -int libqdma_init(unsigned int num_threads, void *debugfs_root); - -/*****************************************************************************/ -/** - * cleanup the QDMA core library before exiting - * - * - *****************************************************************************/ -void libqdma_exit(void); - - -/*****************************************************************************/ -/** - * legacy interrupt init - * - *****************************************************************************/ -void intr_legacy_init(void); - -/*****************************************************************************/ -/** - * Read the pci bars and configure the fpga - * This API should be called from probe() - * - * User interrupt will not be enabled until qdma_user_isr_enable() is called - * - * @param mod_name the module name, used for request_irq - * @param conf device configuration - * @param dev_hndl an opaque handle for libqdma to identify the device - * - * @returns 0 in case of success and <0 in case of error - * - *****************************************************************************/ -int qdma_device_open(const char *mod_name, struct qdma_dev_conf *conf, - unsigned long *dev_hndl); - -/*****************************************************************************/ -/** - * Prepare fpga for removal: disable all interrupts (users - * and qdma) and release all resources.This API should be called from remove() - * - * @param pdev ptr to struct pci_dev - * @param dev_hndl dev_hndl retured from qdma_device_open() - * - * @returns 0 in case of success and <0 in case of error - * - *****************************************************************************/ -int qdma_device_close(struct pci_dev *pdev, unsigned long dev_hndl); - -/*****************************************************************************/ -/** - * Set the device in offline mode - * - * @param pdev ptr to struct pci_dev - * @param dev_hndl dev_hndl retured from qdma_device_open() - * @param reset 0/1 function level reset active or not - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_offline(struct pci_dev *pdev, unsigned long dev_hndl, - int reset); - -/*****************************************************************************/ -/** - * Set the device in online mode and re-initialze it - * - * @param pdev ptr to struct pci_dev - * @param dev_hndl dev_hndl retured from qdma_device_open() - * @param reset 0/1 function level reset active or not - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_online(struct pci_dev *pdev, unsigned long dev_hndl, - int reset); - -/*****************************************************************************/ -/** - * Start pre-flr processing - * - * @param pdev ptr to struct pci_dev - * @param dev_hndl dev_hndl returned from qdma_device_open() - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_flr_quirk_set(struct pci_dev *pdev, unsigned long dev_hndl); - -/*****************************************************************************/ -/** - * Check if pre-flr processing completed - * - * @param pdev ptr to struct pci_dev - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * - * @returns 0 for success <0 for error - * - *****************************************************************************/ -int qdma_device_flr_quirk_check(struct pci_dev *pdev, unsigned long dev_hndl); - -/*****************************************************************************/ -/** - * Retrieve the current device configuration - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param conf device configuration - * @param buflen input buffer length - * @param buf error message buffer, can be NULL/0 (i.e., optional) - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_get_config(unsigned long dev_hndl, struct qdma_dev_conf *conf, - char *buf, int buflen); - -/*****************************************************************************/ -/** - * Clear device statistics - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_clear_stats(unsigned long dev_hndl); - -/*****************************************************************************/ -/** - * Get mm h2c packets processed - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param mmh2c_pkts number of mm h2c packets processed - * - *@returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_get_mmh2c_pkts(unsigned long dev_hndl, - unsigned long long *mmh2c_pkts); - -/*****************************************************************************/ -/** - * Get mm c2h packets processed - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param mmc2h_pkts number of mm c2h packets processed - * - *@returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_get_mmc2h_pkts(unsigned long dev_hndl, - unsigned long long *mmc2h_pkts); - -/*****************************************************************************/ -/** - * Get st h2c packets processed - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param sth2c_pkts number of st h2c packets processed - * - *@returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_get_sth2c_pkts(unsigned long dev_hndl, - unsigned long long *sth2c_pkts); - -/*****************************************************************************/ -/** - * Get st c2h packets processed - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param stc2h_pkts number of st c2h packets processed - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_get_stc2h_pkts(unsigned long dev_hndl, - unsigned long long *stc2h_pkts); - -/*****************************************************************************/ -/** - * - * Min latency (in CPU ticks) observed for - * all packets to do H2C-C2H loopback. - * Packet is transmitted in ST H2C direction, the - * user-logic ST Traffic generator is configured to - * loop back the packet in C2H direction. Timestamp - * (in CPU ticks) of the H2C transmission - * is embedded in H2C packet at time of PIDX - * update, then timestamp of the loopback packet - * is taken at time when data interrupt is hit, - * diff is used to measure roundtrip latency. - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param min_lat Minimum ping pong latency in CPU ticks. Divide with - * the nominal CPU freqeuncy to get latency in NS. - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_get_ping_pong_min_lat(unsigned long dev_hndl, - unsigned long long *min_lat); - -/*****************************************************************************/ -/** - * Max latency (in CPU ticks) observed for - * all packets to do H2C-C2H loopback. - * Packet is transmitted in ST H2C direction, the - * user-logic ST Traffic generator is configured to - * loop back the packet in C2H direction. Timestamp - * (in CPU ticks) of the H2C transmission - * is embedded in H2C packet at time of PIDX - * update, then timestamp of the loopback packet - * is taken at time when data interrupt is hit, - * diff is used to measure roundtrip latency. - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param max_lat Max ping pong latency in CPU ticks. Divide with the - * nominal CPU freqeuncy to get latency in NS. - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_get_ping_pong_max_lat(unsigned long dev_hndl, - unsigned long long *max_lat); - -/*****************************************************************************/ -/** - * Total latency (in CPU ticks) observed for - * all packets to do H2C-C2H loopback. - * Packet is transmitted in ST H2C direction, the - * user-logic ST Traffic generator is configured to - * loop back the packet in C2H direction. Timestamp - * (in CPU ticks) of the H2C transmission - * is embedded in H2C packet at time of PIDX - * update, then timestamp of the loopback packet - * is taken at time when data interrupt is hit, - * diff is used to measure roundtrip latency. - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param lat_total Total Ping Pong latency. Divide with total loopback - * C2H packets to get average ping pong latency. Divide further - * with the nominal CPU frequency to get the avg latency in NS. - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_get_ping_pong_tot_lat(unsigned long dev_hndl, - unsigned long long *lat_total); - -/*****************************************************************************/ -/** - * Set the current device configuration - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param conf device configuration to set - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_set_config(unsigned long dev_hndl, struct qdma_dev_conf *conf); - -/*****************************************************************************/ -/** - * Configure sriov - * - * @param pdev ptr to struct pci_dev - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param num_vfs # of VFs to be instantiated - * - * @returns 0 for success and <0 for error - * - * configures sriov - *****************************************************************************/ -int qdma_device_sriov_config(struct pci_dev *pdev, unsigned long dev_hndl, - int num_vfs); - -/*****************************************************************************/ -/** - * Read dma config register - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param reg_addr register address - * @param value pointer to hold the read value - * - * @returns 0 for success and <0 for error - * - * reads dma config register - * - *****************************************************************************/ -int qdma_device_read_config_register(unsigned long dev_hndl, - unsigned int reg_addr, - unsigned int *value); - -/*****************************************************************************/ -/** - * Write dma config register - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param reg_addr register address - * @param val register value to be writen - * - * @returns 0 for success and <0 for error - * writes dma config register - * - *****************************************************************************/ -int qdma_device_write_config_register(unsigned long dev_hndl, - unsigned int reg_addr, - unsigned int val); - -/*****************************************************************************/ -/** - * retrieve the capabilities of a device. - * - * @param dev_hndl: handle returned from qdma_device_open() - * @param dev_attr: pointer to hold all the device attributes - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_device_capabilities_info(unsigned long dev_hndl, - struct qdma_dev_attributes *dev_attr); - -/*****************************************************************************/ -/** - * Retrieve the RTL version , Vivado Release ID and Versal IP info - * - * @param dev_hndl handle returned from qdma_device_open() - * @param version_info pointer to hold all the version details - * - * @returns 0 for success and <0 for error - * - * retrieves the RTL version , Vivado Release ID and Versal IP info - * - *****************************************************************************/ -int qdma_device_version_info(unsigned long dev_hndl, - struct qdma_version_info *version_info); - -/*****************************************************************************/ -/** - * Retrieve the software version - * - * @param software_version A pointer to a null-terminated string - * @param length Length of the version name string - * - * @returns 0 for success and <0 for error - * - * retrieves the software version - * - *****************************************************************************/ -int qdma_software_version_info(char *software_version, int length); - -/*****************************************************************************/ -/** - * Retrieve the global csr settings - * - * @param dev_hndl handle returned from qdma_device_open() - * @param index Index from where the values needs to read - * @param count number of entries to be read - * @param csr data structures to hold the csr values - * - * @returns 0 for success and <0 for error - * - * retrieves the global csr settings - * - *****************************************************************************/ -int qdma_global_csr_get(unsigned long dev_hndl, u8 index, u8 count, - struct global_csr_conf *csr); - -/*****************************************************************************/ -/** - * Add a queue - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param qconf queue configuration parameters - * @param qhndl list of unsigned long values that are the opaque qhndl - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_queue_add(unsigned long dev_hndl, struct qdma_queue_conf *qconf, - unsigned long *qhndl, char *buf, int buflen); - -/*****************************************************************************/ -/** - * Configure the queue with qcong parameters - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param qid queue id - * @param qconf queue configuration parameters - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns 0: success <0: error - *****************************************************************************/ -int qdma_queue_config(unsigned long dev_hndl, unsigned long qid, - struct qdma_queue_conf *qconf, char *buf, int buflen); -/*****************************************************************************/ -/** - * start a queue (i.e, online, ready for dma) - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id the opaque qhndl - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_queue_start(unsigned long dev_hndl, unsigned long id, - char *buf, int buflen); - -/*****************************************************************************/ -/** - * Stop a queue (i.e., offline, NOT ready for dma) - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id the opaque qhndl - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_queue_stop(unsigned long dev_hndl, unsigned long id, char *buf, - int buflen); - -/*****************************************************************************/ -/** - * Get the state of the queue - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id the opaque qhndl - * @param q_state state of the queue - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_get_queue_state(unsigned long dev_hndl, unsigned long id, - struct qdma_q_state *q_state, char *buf, int buflen); - -/*****************************************************************************/ -/** - * remove a queue - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id the opaque qhndl - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns 0 for success and <0 for error - * - *****************************************************************************/ -int qdma_queue_remove(unsigned long dev_hndl, unsigned long id, char *buf, - int buflen); - -/*****************************************************************************/ -/** - * retrieve the configuration of a queue - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id: an opaque queue handle of type unsigned long - * @param qconf pointer to hold the qdma_queue_conf structure. - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns 0: success <0: error - * - *****************************************************************************/ -int qdma_queue_get_config(unsigned long dev_hndl, unsigned long id, - struct qdma_queue_conf *qconf, - char *buf, int buflen); - -/*****************************************************************************/ -/** - * Display all configured queues in a string buffer - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param qidx Queue index - * @param num_q Number of Queues to list - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns if optional message buffer used then strlen of buf, - * otherwise QDMA_OPERATION_SUCCESSFUL and <0 for error - * - *****************************************************************************/ -int qdma_queue_list(unsigned long dev_hndl, int qidx, int num_q, char *buf, - int buflen); - -/*****************************************************************************/ -/** - * Display a config registers in a string buffer - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns success: if optional message buffer used - * then strlen of buf, otherwise 0 and <0: error - * - *****************************************************************************/ -int qdma_config_reg_dump(unsigned long dev_hndl, char *buf, - int buflen); - -/*****************************************************************************/ -/** - * display a queue's state in a string buffer - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id an opaque queue handle of type unsigned long - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns if optional message buffer used then strlen of buf, - * otherwise QDMA_OPERATION_SUCCESSFUL and <0 for error - * - *****************************************************************************/ -int qdma_queue_dump(unsigned long dev_hndl, unsigned long id, char *buf, - int buflen); - -/*****************************************************************************/ -/** - * Display a queue's descriptor ring from index start - * ~ end in a string buffer - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id an opaque queue handle of type unsigned long - * @param start start index - * @param end end index - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns if optional message buffer used then strlen of buf, - * otherwise QDMA_OPERATION_SUCCESSFUL and <0 for error - * - *****************************************************************************/ -int qdma_queue_dump_desc(unsigned long dev_hndl, unsigned long id, - unsigned int start, unsigned int end, char *buf, - int buflen); - -/*****************************************************************************/ -/** - * display a queue's descriptor ring from index start - * ~ end in a string buffer - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id an opaque queue handle of type unsigned long - * @param start start index - * @param end end index - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns if optional message buffer used then strlen of buf, - * otherwise QDMA_OPERATION_SUCCESSFUL and <0 for error - * - *****************************************************************************/ -int qdma_queue_dump_cmpt(unsigned long dev_hndl, unsigned long id, - unsigned int start, unsigned int end, char *buf, - int buflen); - -#ifdef ERR_DEBUG -/*****************************************************************************/ -/** - * Induce the error - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id error id - * @param err error info - * @param buflen length of the input buffer - * @param buf message buffer - * - * @returns if optional message buffer used then strlen of buf, - * otherwise QDMA_OPERATION_SUCCESSFUL and <0 for error - * - *****************************************************************************/ -int qdma_queue_set_err_induction(unsigned long dev_hndl, unsigned long id, - u32 err, char *buf, int buflen); -#endif - -/*****************************************************************************/ -/** - * Submit a scatter-gather list of data for dma - * operation (for both read and write) - * - * @param dev_hndl hndl returned from qdma_device_open() - * @param id queue index - * @param req qdma request - * - * @returns # of bytes transferred for success and <0 for error - * - *****************************************************************************/ -ssize_t qdma_request_submit(unsigned long dev_hndl, unsigned long id, - struct qdma_request *req); - -/*****************************************************************************/ -/** - * Submit a scatter-gather list of data for dma - * operation (for both read and write) - * - * @param dev_hndl hndl returned from qdma_device_open() - * @param id queue index - * @param count number of requests - * @param reqv qdma request - * - * @returns # of bytes transferred for success and <0 for error - * - *****************************************************************************/ -ssize_t qdma_batch_request_submit(unsigned long dev_hndl, unsigned long id, - unsigned long count, struct qdma_request **reqv); - -/*****************************************************************************/ -/** - * Peek a receive (c2h) queue - * - * @param dev_hndl hndl returned from qdma_device_open() - * @param id queue hndl returned from qdma_queue_add() - * - * filled in by libqdma: - * @param udd_cnt # of udd received - * @param pkt_cnt # of packets received - * @param data_len # of bytes of packet data received - * - * @returns # of packets received in the Q or <0 for error - *****************************************************************************/ -int qdma_queue_c2h_peek(unsigned long dev_hndl, unsigned long id, - unsigned int *udd_cnt, unsigned int *pkt_cnt, - unsigned int *data_len); - - -/*****************************************************************************/ -/** - * Query of # of free descriptor - * - * @param dev_hndl hndl returned from qdma_device_open() - * @param id queue hndl returned from qdma_queue_add() - * - * @returns # of available desc in the queue or <0 for error - *****************************************************************************/ -int qdma_queue_avail_desc(unsigned long dev_hndl, unsigned long id); - -/** packet/streaming interfaces */ - -/*****************************************************************************/ -/** - * Read/set the c2h Q's completion control - * - * @param dev_hndl hndl returned from qdma_device_open() - * @param id hndl returned from qdma_queue_add() - * @param cctrl completion control - * @param set read or set - * - * @returns 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_queue_cmpl_ctrl(unsigned long dev_hndl, unsigned long id, - struct qdma_cmpl_ctrl *cctrl, bool set); - -/*****************************************************************************/ -/** - * Read rcv'ed data (ST C2H dma operation) - * - * @param dev_hndl hndl returned from qdma_device_open() - * @param id queue hndl returned from qdma_queue_add() - * @param req pointer to the request data - * @param cctrl completion control, if no change is desired, - * set it to NULL - * - * @returns # of bytes transferred for success and <0 for error - * - *****************************************************************************/ -int qdma_queue_packet_read(unsigned long dev_hndl, unsigned long id, - struct qdma_request *req, struct qdma_cmpl_ctrl *cctrl); - -/*****************************************************************************/ -/** - * Submit data for ST H2C dma operation - * - * @param dev_hndl hndl returned from qdma_device_open() - * @param id queue hndl returned from qdma_queue_add() - * @param req pointer to the list of packet data - * - * @returns # of bytes transferred for success and <0 for error - * - *****************************************************************************/ -int qdma_queue_packet_write(unsigned long dev_hndl, unsigned long id, - struct qdma_request *req); - -/*****************************************************************************/ -/** - * Service the queue in the case of irq handler is registered by the user, - * the user should call qdma_queue_service() in its interrupt handler to - * service the queue - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id queue hndl returned from qdma_queue_add() - * @param budget ST C2H only, max number of completions to be processed. - * @param c2h_upd_cmpl flag to update the completion - * - * Return: 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_queue_service(unsigned long dev_hndl, unsigned long id, - int budget, bool c2h_upd_cmpl); - -/*****************************************************************************/ -/** - * Update queue pointers - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param qhndl hndl returned from qdma_queue_add() - * - * Return: 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_queue_update_pointers(unsigned long dev_hndl, unsigned long qhndl); - -/*****************************************************************************/ -/** - * Display the interrupt ring info of a vector - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param vector_idx vector number - * @param start_idx interrupt ring start idx - * @param end_idx interrupt ring end idx - * @param buflen length of the input buffer - * @param buf message bufferuffer - * - * @returns 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_intr_ring_dump(unsigned long dev_hndl, unsigned int vector_idx, - int start_idx, int end_idx, char *buf, int buflen); - -/*****************************************************************************/ -/** - * Function to receive the user defined data - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id queue handle - * @param buflen length of the input buffer - * @param buf message bufferuffer - * - * @returns 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_descq_get_cmpt_udd(unsigned long dev_hndl, unsigned long id, - char *buf, int buflen); - -/*****************************************************************************/ -/** - * Function to receive the completion data - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param id queue handle - * @param num_entries I/O number of entries - * @param cmpt_entries List of completion entries - * @param buflen length of the input buffer - * @param buf message bufferuffer - * - * @returns 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_descq_read_cmpt_data(unsigned long dev_hndl, unsigned long id, - u32 *num_entries, u8 **cmpt_entries, - char *buf, int buflen); - -/*****************************************************************************/ -/** - * Function to receive the queue count - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param q_count queue count - * @param buflen length of the input buffer - * @param buf message bufferuffer - * - * @returns 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_get_queue_count(unsigned long dev_hndl, - struct qdma_queue_count *q_count, - char *buf, int buflen); - -/*****************************************************************************/ -/** - * Function to print out detailed information for register value - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param reg_addr register address - * @param num_regs num of registerse to be dumped - * @param buf message bufferuffer - * @param buflen length of the input buffer - * - * @returns 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_config_reg_info_dump(unsigned long dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, int buflen); - -#ifdef __QDMA_VF__ -/*****************************************************************************/ -/** - * Call for VF to request qmax number of Qs - * - * @param dev_hndl dev_hndl returned from qdma_device_open() - * @param qmax number of qs requested by vf - * - * @returns 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_vf_qconf(unsigned long dev_hndl, int qmax); -#endif - -#ifdef TANDEM_BOOT_SUPPORTED -/*****************************************************************************/ -/** - * Clear ST context for tandem boot designs - * - * @param dev_hndl dev_hndl retunred from qdma_device_open() - * @param buflen input buffer length - * @param buf error message buffer, can be NULL/0 (i.e., optional - * - * @returns 0 for success or <0 for error - * - *****************************************************************************/ -int qdma_init_st_ctxt(unsigned long dev_hndl, char *buf, int buflen); -#endif - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c deleted file mode 100755 index 9bb152f..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.c +++ /dev/null @@ -1,6863 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "eqdma_cpm5_access.h" -#include "eqdma_cpm5_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_cpm5_access.tmh" -#endif - -#define UNUSED(x) (void)(x) - -/** EQDMA Context array size */ -#define EQDMA_CPM5_FMAP_NUM_WORDS 2 -#define EQDMA_CPM5_SW_CONTEXT_NUM_WORDS 8 -#define EQDMA_CPM5_HW_CONTEXT_NUM_WORDS 2 -#define EQDMA_CPM5_PFETCH_CONTEXT_NUM_WORDS 2 -#define EQDMA_CPM5_CR_CONTEXT_NUM_WORDS 1 -#define EQDMA_CPM5_CMPT_CONTEXT_NUM_WORDS 6 -#define EQDMA_CPM5_IND_INTR_CONTEXT_NUM_WORDS 4 - -#define EQDMA_CPM5_VF_USER_BAR_ID 2 - -#define EQDMA_CPM5_REG_GROUP_1_START_ADDR 0x000 -#define EQDMA_CPM5_REG_GROUP_2_START_ADDR 0x804 -#define EQDMA_CPM5_REG_GROUP_3_START_ADDR 0xB00 -#define EQDMA_CPM5_REG_GROUP_4_START_ADDR 0x5014 - -#define EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS 11 -#define EQDMA_CPM5_GLBL_TRQ_ERR_ALL_MASK 0XB3 -#define EQDMA_CPM5_GLBL_DSC_ERR_ALL_MASK 0X1F9037E -#define EQDMA_CPM5_C2H_ERR_ALL_MASK 0X3F6DF -#define EQDMA_CPM5_C2H_FATAL_ERR_ALL_MASK 0X1FDF1B -#define EQDMA_CPM5_H2C_ERR_ALL_MASK 0X3F -#define EQDMA_CPM5_SBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_CPM5_DBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_CPM5_MM_C2H_ERR_ALL_MASK 0X70000003 -#define EQDMA_CPM5_MM_H2C0_ERR_ALL_MASK 0X3041013E - -/* H2C Throttle settings */ -#define EQDMA_CPM5_H2C_THROT_DATA_THRESH 0x5000 -#define EQDMA_CPM5_THROT_EN_DATA 1 -#define EQDMA_CPM5_THROT_EN_REQ 0 -#define EQDMA_CPM5_H2C_THROT_REQ_THRESH 0xC0 - - -/** Auxillary Bitmasks for fields spanning multiple words */ -#define EQDMA_CPM5_SW_CTXT_PASID_GET_H_MASK GENMASK(21, 12) -#define EQDMA_CPM5_SW_CTXT_PASID_GET_L_MASK GENMASK(11, 0) -#define EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK GENMASK_ULL(63, 53) -#define EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK GENMASK_ULL(52, 21) -#define EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK GENMASK_ULL(20, 0) -#define EQDMA_CPM5_CMPL_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_CPM5_CMPL_CTXT_PASID_GET_L_MASK GENMASK(8, 0) -#define EQDMA_CPM5_INTR_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_CPM5_INTR_CTXT_PASID_GET_L_MASK GENMASK(8, 0) - -#define EQDMA_CPM5_OFFSET_GLBL2_PF_BARLITE_EXT 0x10C - -#define QDMA_OFFSET_GLBL2_PF_BARLITE_INT 0x104 -#define QDMA_GLBL2_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define QDMA_GLBL2_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define QDMA_GLBL2_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define QDMA_GLBL2_PF0_BAR_MAP_MASK GENMASK(5, 0) - -#define EQDMA_CPM5_GLBL2_DBG_MODE_EN_MASK BIT(4) -#define EQDMA_CPM5_GLBL2_DESC_ENG_MODE_MASK GENMASK(3, 2) -#define EQDMA_CPM5_GLBL2_FLR_PRESENT_MASK BIT(1) -#define EQDMA_CPM5_GLBL2_MAILBOX_EN_MASK BIT(0) - -#define EQDMA_CPM5_DEFAULT_C2H_INTR_TIMER_TICK 50 -#define PREFETCH_QUEUE_COUNT_STEP 4 -#define EQDMA_CPM5_DEFAULT_CMPT_COAL_MAX_BUF_SZ 0x3F - -/* TODO: This is work around and this needs to be auto generated from ODS */ -/** EQDMA_CPM5_IND_REG_SEL_FMAP */ -#define EQDMA_CPM5_FMAP_CTXT_W1_QID_MAX_MASK GENMASK(12, 0) -#define EQDMA_CPM5_FMAP_CTXT_W0_QID_MASK GENMASK(11, 0) - -static void eqdma_cpm5_hw_st_h2c_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_st_c2h_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_desc_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_trq_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_ram_sbe_err_process(void *dev_hndl); -static void eqdma_cpm5_hw_ram_dbe_err_process(void *dev_hndl); -static void eqdma_cpm5_mm_h2c0_err_process(void *dev_hndl); -static void eqdma_cpm5_mm_c2h0_err_process(void *dev_hndl); - -static struct eqdma_cpm5_hw_err_info - eqdma_cpm5_err_info[EQDMA_CPM5_ERRS_ALL] = { - /* Descriptor errors */ - { - EQDMA_CPM5_DSC_ERR_POISON, - "Poison error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_UR_CA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_BCNT, - "Unexpected Byte count in completion error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_BCNT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_PARAM, - "Parameter mismatch error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PARAM_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_ADDR, - "Address mismatch error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_ADDR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_TAG, - "Unexpected tag error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TAG_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_FLR, - "FLR error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_TIMEOUT, - "Timed out error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_DAT_POISON, - "Poison data error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DAT_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_DMA, - "DMA engine error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DMA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_DSC, - "Invalid PIDX update error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DSC_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_SBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_PORT_ID, - "Port ID Error", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PORT_ID_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - { - EQDMA_CPM5_DSC_ERR_ALL, - "All Descriptor errors", - EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - - /* TRQ errors */ - { - EQDMA_CPM5_TRQ_ERR_CSR_UNMAPPED, - "Access targeted unmapped register space via CSR pathway error", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_VF_ACCESS, - "VF attempted to access Global register space or Function map", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_TCP_CSR_TIMEOUT, - "Timeout on request to dma internal csr register", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_QSPC_UNMAPPED, - "Access targeted unmapped register via queue space pathway", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_QID_RANGE, - "Qid range error", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QID_RANGE_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_TCP_QSPC_TIMEOUT, - "Timeout on request to dma internal queue space register", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - { - EQDMA_CPM5_TRQ_ERR_ALL, - "All TRQ errors", - EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_cpm5_hw_trq_err_process - }, - - /* C2H Errors*/ - { - EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_SH_CMPT_DSC, - "A Shared CMPT queue has encountered a descriptor error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_DESC_RSP_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MSI_INT_FAIL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ERR_DESC_CNT_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_CMPT_INV_Q_ERR, - "Writeback on invalid queue error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_CMPT_QFULL_ERR, - "Completion queue gets full error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_QFULL_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_CMPT_CIDX_ERR, - "Bad CIDX update by the software error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_CIDX_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_CMPT_PRTY_ERR, - "C2H completion Parity error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PRTY_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_AVL_RING_DSC, - "Available ring fetch returns descriptor with error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_HDR_ECC_UNC, - "multi-bit ecc error on c2h packet header", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_HDR_ECC_COR, - "single-bit ecc error on c2h packet header", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_WRB_PORT_ID_ERR, - "Port ID error", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_C2H_ERR_ALL, - "All C2h errors", - EQDMA_CPM5_C2H_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - EQDMA_CPM5_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - EQDMA_CPM5_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_WPL_DATA_PAR, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_HDR_ECC_UNC, - "RAM double bit fatal error", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - { - EQDMA_CPM5_ST_FATAL_ERR_ALL, - "All fatal errors", - EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_cpm5_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - EQDMA_CPM5_ST_H2C_ERR_ZERO_LEN_DESC, - "Zero length descriptor error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_ZERO_LEN_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - "A non-EOP descriptor received", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_NO_DMA_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_DBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_PAR, - "Internal data parity error", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - { - EQDMA_CPM5_ST_H2C_ERR_ALL, - "All H2C errors", - EQDMA_CPM5_H2C_ERR_MASK_ADDR, - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - EQDMA_CPM5_H2C_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_cpm5_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - EQDMA_CPM5_SBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Even RAM single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM 1 single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_1_ERR_ALL, - "All SBE Errors.", - EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, - EQDMA_CPM5_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, -{ - EQDMA_CPM5_SBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slavle FIFO RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM single bit ECC error", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM single bit ECC error.", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - { - EQDMA_CPM5_SBE_ERR_ALL, - "All SBE errors", - EQDMA_CPM5_RAM_SBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, - EQDMA_CPM5_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_cpm5_hw_ram_sbe_err_process - }, - - - /* DBE errors */ - { - EQDMA_CPM5_DBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_1_ERR_ALL, - "All DBE errors", - EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, - EQDMA_CPM5_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_FUNC_MAP, - "Function map RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slave FIFO RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM double bit ECC error", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - { - EQDMA_CPM5_DBE_ERR_ALL, - "All DBE errors", - EQDMA_CPM5_RAM_DBE_MSK_A_ADDR, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, - EQDMA_CPM5_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_cpm5_hw_ram_dbe_err_process - }, - - /* MM C2H Engine 0 errors */ - { - EQDMA_CPM5_MM_C2H_WR_SLR_ERR, - "MM C2H0 WR SLV Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_RD_SLR_ERR, - "MM C2H0 RD SLV Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_WR_FLR_ERR, - "MM C2H0 WR FLR Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_UR_ERR, - "MM C2H0 Unsupported Request Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_WR_UC_RAM_ERR, - "MM C2H0 Write Uncorrectable RAM Error", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_mm_c2h0_err_process - }, - { - EQDMA_CPM5_MM_C2H_ERR_ALL, - "All MM C2H Errors", - EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - EQDMA_CPM5_MM_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_cpm5_hw_desc_err_process - }, - /* MM H2C Engine 0 Errors */ - { - EQDMA_CPM5_MM_H2C0_RD_HDR_POISON_ERR, - "MM H2C0 Read cmpt header pison Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_UR_CA_ERR, - "MM H2C0 Read cmpt unsupported request Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_HDR_BYTE_ERR, - "MM H2C0 Read cmpt hdr byte cnt Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_HDR_PARAM_ERR, - "MM H2C0 Read cmpt hdr param mismatch Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_HDR_ADR_ERR, - "MM H2C0 Read cmpt hdr address mismatch Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_FLR_ERR, - "MM H2C0 Read flr Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_DAT_POISON_ERR, - "MM H2C0 Read data poison Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_RD_RQ_DIS_ERR, - "MM H2C0 Read request disable Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_WR_DEC_ERR, - "MM H2C0 Write desc Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_WR_SLV_ERR, - "MM H2C0 Write slv Error", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_mm_h2c0_err_process - }, - { - EQDMA_CPM5_MM_H2C0_ERR_ALL, - "All MM H2C Errors", - EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - EQDMA_CPM5_MM_H2C0_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_cpm5_hw_desc_err_process - }, -}; - - -static int32_t -all_eqdma_cpm5_hw_errs[EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS] = { - - EQDMA_CPM5_DSC_ERR_ALL, - EQDMA_CPM5_TRQ_ERR_ALL, - EQDMA_CPM5_ST_C2H_ERR_ALL, - EQDMA_CPM5_ST_FATAL_ERR_ALL, - EQDMA_CPM5_ST_H2C_ERR_ALL, - EQDMA_CPM5_SBE_1_ERR_ALL, - EQDMA_CPM5_SBE_ERR_ALL, - EQDMA_CPM5_DBE_1_ERR_ALL, - EQDMA_CPM5_DBE_ERR_ALL, - EQDMA_CPM5_MM_C2H_ERR_ALL, - EQDMA_CPM5_MM_H2C0_ERR_ALL -}; - -static struct qctx_entry eqdma_cpm5_sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Function Id", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Address Translation", 0}, - {"Fetch Max", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Interrupt with VF", 0}, - {"Pack descriptor output interface", 0}, - {"Irq Bypass", 0}, -}; - -static struct qctx_entry eqdma_cpm5_hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry eqdma_cpm5_credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry eqdma_cpm5_cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Addr High (L)[37:6]", 0}, - {"Base Addr High(H)[63:38]", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, - {"Over Flow Check Disable", 0}, - {"Address Translation", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Insterrupt with VF", 0}, - {"c2h Direction", 0}, - {"Base Addr Low[5:2]", 0}, - {"Shared Completion Queue", 0}, -}; - -static struct qctx_entry eqdma_cpm5_c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Variable Descriptor", 0}, - {"Number of descriptors prefetched", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry eqdma_cpm5_ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, - {"at", 0}, - {"Function Id", 0}, -}; - -static struct qctx_entry eqdma_cpm5_fmap_ctxt_entries[] = { - {"Queue Base", 0}, - {"Queue Max", 0}, -}; - -static int eqdma_cpm5_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_cpm5_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_cpm5_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int eqdma_cpm5_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - -uint32_t eqdma_cpm5_get_config_num_regs(void) -{ - return eqdma_cpm5_config_num_regs_get(); -} - -struct xreg_info *eqdma_cpm5_get_config_regs(void) -{ - return eqdma_cpm5_config_regs_get(); -} - -uint32_t eqdma_cpm5_reg_dump_buf_len(void) -{ - uint32_t length = (eqdma_cpm5_config_num_regs_get() + 1) - * REG_DUMP_SIZE_PER_LINE; - return length; -} - -int eqdma_cpm5_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - int len = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(eqdma_cpm5_cmpt_ctxt_entries) / - sizeof(eqdma_cpm5_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(eqdma_cpm5_sw_ctxt_entries) / - sizeof(eqdma_cpm5_sw_ctxt_entries[0])) + 1) - * REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_cpm5_hw_ctxt_entries) / - sizeof(eqdma_cpm5_hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_cpm5_credit_ctxt_entries) / - sizeof(eqdma_cpm5_credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_cpm5_fmap_ctxt_entries) / - sizeof(eqdma_cpm5_fmap_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(eqdma_cpm5_cmpt_ctxt_entries) / - sizeof(eqdma_cpm5_cmpt_ctxt_entries[0])) + - 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_cpm5_c2h_pftch_ctxt_entries) - / - sizeof(eqdma_cpm5_c2h_pftch_ctxt_entries[0] - )) + 1) * REG_DUMP_SIZE_PER_LINE); - } - } - - *buflen = len; - return 0; -} - -static uint32_t eqdma_cpm5_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(eqdma_cpm5_ind_intr_ctxt_entries) / - sizeof(eqdma_cpm5_ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * eqdma_cpm5_set_perf_opt() - Helper function to set the - * cpm5 perf optimizations. - * - */ -static void eqdma_cpm5_set_perf_opt(void *dev_hndl) -{ - uint32_t reg_val = 0; - uint32_t pftch_cache_depth = 0; - uint32_t pftch_qcnt = 0; - uint32_t pftch_evnt_qcnt_th = 0; - uint32_t crdt_coal_fifo_th = 0; - uint32_t crdt_coal_crdt_th = 0; - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_INT_TIMER_TICK_ADDR, - EQDMA_CPM5_DEFAULT_C2H_INTR_TIMER_TICK); - -/* - * #define EQDMA_CPM5_C2H_PFCH_CACHE_DEPTH_ADDR 0xBE0 - * #define C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK GENMASK(23, 16) - * #define C2H_PFCH_CACHE_DEPTH_MASK GENMASK(7, 0) - */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_PFCH_CACHE_DEPTH_ADDR); - pftch_cache_depth = FIELD_GET(C2H_PFCH_CACHE_DEPTH_MASK, reg_val); - -/* - * #define EQDMA_CPM5_GLBL_DSC_CFG_ADDR 0x250 - * #define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 10) - * #define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) - * #define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) - * #define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) - * #define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) - * #define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) - */ -#define GLBL_DSC_CFG_RSVD_1_DFLT 0 -#define GLBL_DSC_CFG_UNC_OVR_COR_DFLT 0 -#define GLBL_DSC_CFG_CTXT_FER_DIS_DFLT 0 -#define GLBL_DSC_CFG_RSVD_2_DFLT 0 -/* =IF(Internal mode, 2,5) */ -#define GLBL_DSC_CFG_MAXFETCH 2 -#define GLBL_DSC_CFG_WB_ACC_INT 5 - reg_val = - FIELD_SET(GLBL_DSC_CFG_RSVD_1_MASK, GLBL_DSC_CFG_RSVD_1_DFLT) | - FIELD_SET(GLBL_DSC_CFG_UNC_OVR_COR_MASK, - GLBL_DSC_CFG_UNC_OVR_COR_DFLT) | - FIELD_SET(GLBL_DSC_CFG_CTXT_FER_DIS_MASK, - GLBL_DSC_CFG_CTXT_FER_DIS_DFLT) | - FIELD_SET(GLBL_DSC_CFG_RSVD_2_MASK, GLBL_DSC_CFG_RSVD_2_DFLT) | - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - GLBL_DSC_CFG_MAXFETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - GLBL_DSC_CFG_WB_ACC_INT); - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_DSC_CFG_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_GLBL_DSC_CFG_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_GLBL_DSC_CFG_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR 0x4C - * #define CFG_BLK_MISC_CTL_RSVD_1_MASK GENMASK(31, 24) - * #define CFG_BLK_MISC_CTL_10B_TAG_EN_MASK BIT(23) - * #define CFG_BLK_MISC_CTL_RSVD_2_MASK BIT(22) - * #define CFG_BLK_MISC_CTL_AXI_WBK_MASK BIT(21) - * #define CFG_BLK_MISC_CTL_AXI_DSC_MASK BIT(20) - * #define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) - * #define CFG_BLK_MISC_CTL_RSVD_3_MASK GENMASK(7, 5) - * #define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) - */ -#define CFG_BLK_MISC_CTL_RSVD_1_DFLT 0 -#define CFG_BLK_MISC_CTL_RSVD_2_DFLT 0 -#define CFG_BLK_MISC_CTL_AXI_WBK_DFLT 0 -#define CFG_BLK_MISC_CTL_AXI_DSC_DFLT 0 -/* IF(10bit tag enabled, 512,256) */ -#ifdef EQDMA_CPM5_10BIT_TAG_ENABLE -#define CFG_BLK_MISC_CTL_10B_TAG_DFLT 1 -#define CFG_BLK_MISC_CTL_NUM_TAG_DFLT 512 -#else -#define CFG_BLK_MISC_CTL_10B_TAG_DFLT 0 -#define CFG_BLK_MISC_CTL_NUM_TAG_DFLT 256 -#endif -#define CFG_BLK_MISC_CTL_RSVD_3_DFLT 0 -#define EQDMA_CFG_BLK_MISC_CTL_RQ_METERING_MUL 31 - reg_val = - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_1_MASK, - CFG_BLK_MISC_CTL_RSVD_1_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_10B_TAG_EN_MASK, - CFG_BLK_MISC_CTL_10B_TAG_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_2_MASK, - CFG_BLK_MISC_CTL_RSVD_2_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_AXI_WBK_MASK, - CFG_BLK_MISC_CTL_AXI_WBK_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_AXI_DSC_MASK, - CFG_BLK_MISC_CTL_AXI_DSC_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_NUM_TAG_MASK, - CFG_BLK_MISC_CTL_NUM_TAG_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_3_MASK, - CFG_BLK_MISC_CTL_RSVD_3_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK, - EQDMA_CFG_BLK_MISC_CTL_RQ_METERING_MUL); - qdma_reg_write(dev_hndl, EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_C2H_PFCH_CFG_ADDR 0xB08 - * #define C2H_PFCH_CFG_EVTFL_TH_MASK GENMASK(31, 16) - * #define C2H_PFCH_CFG_FL_TH_MASK GENMASK(15, 0) - */ -#define EQDMA_PFTCH_CFG_EVT_PFTH_FL_TH 256 -#define C2H_PFCH_CFG_FL_TH_DFLT 256 - reg_val = - FIELD_SET(C2H_PFCH_CFG_EVTFL_TH_MASK, - EQDMA_PFTCH_CFG_EVT_PFTH_FL_TH) | - FIELD_SET(C2H_PFCH_CFG_FL_TH_MASK, - C2H_PFCH_CFG_FL_TH_DFLT); - - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_PFCH_CFG_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR 0xA80 - * #define C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK GENMASK(31, 16) - * #define C2H_PFCH_CFG_1_QCNT_MASK GENMASK(15, 0) - */ - pftch_qcnt = pftch_cache_depth - PREFETCH_QUEUE_COUNT_STEP; - pftch_evnt_qcnt_th = pftch_qcnt - PREFETCH_QUEUE_COUNT_STEP; - reg_val = - FIELD_SET(C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK, pftch_evnt_qcnt_th) | - FIELD_SET(C2H_PFCH_CFG_1_QCNT_MASK, pftch_qcnt); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR 0xA84 - * #define C2H_PFCH_CFG_2_FENCE_MASK BIT(31) - * #define C2H_PFCH_CFG_2_RSVD_MASK GENMASK(30, 29) - * #define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK BIT(28) - * #define C2H_PFCH_CFG_2_LL_SZ_TH_MASK GENMASK(27, 12) - * #define C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK GENMASK(11, 6) - * #define C2H_PFCH_CFG_2_NUM_MASK GENMASK(5, 0) - */ -#define C2H_PFCH_CFG_2_FENCE_EN 1 -#define C2H_PFCH_CFG_2_RSVD_DFLT 0 -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_DFLT 0 -#define C2H_PFCH_CFG_2_LL_SZ_TH_DFLT 1024 -#define C2H_PFCH_CFG_2_VAR_DESC_NUM 15 -#define C2H_PFCH_CFG_2_NUM_PFCH_DFLT 16 - reg_val = - FIELD_SET(C2H_PFCH_CFG_2_FENCE_MASK, - C2H_PFCH_CFG_2_FENCE_EN) | - FIELD_SET(C2H_PFCH_CFG_2_RSVD_MASK, - C2H_PFCH_CFG_2_RSVD_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK, - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_LL_SZ_TH_MASK, - C2H_PFCH_CFG_2_LL_SZ_TH_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK, - C2H_PFCH_CFG_2_VAR_DESC_NUM) | - FIELD_SET(C2H_PFCH_CFG_2_NUM_MASK, - C2H_PFCH_CFG_2_NUM_PFCH_DFLT); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR, reg_val); - -/* Registers Not Applicable for CPM5 - * #define EQDMA_PFCH_CFG_3_ADDR 0x147C - * #define EQDMA_PFCH_CFG_4_ADDR 0x1484 - */ - -/* - * #define EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR 0x1400 - * #define C2H_CRDT_COAL_CFG_1_RSVD_1_MASK GENMASK(31, 18) - * #define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK GENMASK(17, 10) - * #define C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK GENMASK(9, 0)4 - */ -#define C2H_CRDT_COAL_CFG_1_RSVD_1_DFLT 0 -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_DFLT 16 -#define C2H_CRDT_COAL_CFG_1_TIMER_TH 16 - reg_val = - FIELD_SET(C2H_CRDT_COAL_CFG_1_RSVD_1_MASK, - C2H_CRDT_COAL_CFG_1_RSVD_1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK, - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK, - C2H_CRDT_COAL_CFG_1_TIMER_TH); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR 0x1404 - * #define C2H_CRDT_COAL_CFG_2_RSVD_1_MASK GENMASK(31, 24) - * #define C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK GENMASK(23, 16) - * #define C2H_CRDT_COAL_CFG_2_RESERVED1_MASK GENMASK(15, 11) - * #define C2H_CRDT_COAL_CFG_2_NT_TH_MASK GENMASK(10, 0) - */ -#define C2H_CRDT_COAL_CFG_2_RSVD_1_DFLT 0 -#define C2H_CRDT_COAL_CFG_2_RESERVED1_DFLT 0 -#define C2H_CRDT_COAL_CFG_2_CRDT_CNT_TH_DFLT 156 - crdt_coal_fifo_th = pftch_cache_depth - 8; - crdt_coal_crdt_th = C2H_CRDT_COAL_CFG_2_CRDT_CNT_TH_DFLT; - reg_val = - FIELD_SET(C2H_CRDT_COAL_CFG_2_RSVD_1_MASK, - C2H_CRDT_COAL_CFG_2_RSVD_1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK, - crdt_coal_fifo_th) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_RESERVED1_MASK, - C2H_CRDT_COAL_CFG_2_RESERVED1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_NT_TH_MASK, - crdt_coal_crdt_th); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR 0xE24 - * #define H2C_REQ_THROT_PCIE_EN_REQ_MASK BIT(31) - * #define H2C_REQ_THROT_PCIE_MASK GENMASK(30, 19) - * #define H2C_REQ_THROT_PCIE_EN_DATA_MASK BIT(18) - * #define H2C_REQ_THROT_PCIE_DATA_THRESH_MASK GENMASK(17, 0) - */ -#define H2C_REQ_THROT_PCIE_EN_REQ 1 -/* IF(10bit tag enabled, 512-64, 192) */ -#ifdef EQDMA_CPM5_10BIT_TAG_ENABLE -#define H2C_REQ_THROT_PCIE_REQ_TH 448 -#else -#define H2C_REQ_THROT_PCIE_REQ_TH 192 -#endif -#define H2C_REQ_THROT_PCIE_EN_DATA 1 -#define H2C_REQ_THROT_PCIE_DATA_TH 57344 - reg_val = - FIELD_SET(H2C_REQ_THROT_PCIE_EN_REQ_MASK, - H2C_REQ_THROT_PCIE_EN_REQ) | - FIELD_SET(H2C_REQ_THROT_PCIE_MASK, - H2C_REQ_THROT_PCIE_REQ_TH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_DATA_MASK, - H2C_REQ_THROT_PCIE_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_PCIE_DATA_THRESH_MASK, - H2C_REQ_THROT_PCIE_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR, reg_val); - -/* - * #define EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR 0xE2C - * #define H2C_REQ_THROT_AXIMM_EN_REQ_MASK BIT(31) - * #define H2C_REQ_THROT_AXIMM_MASK GENMASK(30, 19) - * #define H2C_REQ_THROT_AXIMM_EN_DATA_MASK BIT(18) - * #define H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK GENMASK(17, 0) - */ -#define H2C_REQ_THROT_AXIMM_EN_REQ 0 -/* IF(10bit tag en=1, 512-64, 192) */ -#ifdef EQDMA_CPM5_10BIT_TAG_ENABLE -#define H2C_REQ_THROT_AXIMM_REQ_TH 448 -#else -#define H2C_REQ_THROT_AXIMM_REQ_TH 192 -#endif -#define H2C_REQ_THROT_AXIMM_EN_DATA 0 -#define H2C_REQ_THROT_AXIMM_DATA_TH 65536 - reg_val = - FIELD_SET(H2C_REQ_THROT_AXIMM_EN_REQ_MASK, - H2C_REQ_THROT_AXIMM_EN_REQ) | - FIELD_SET(H2C_REQ_THROT_AXIMM_MASK, - H2C_REQ_THROT_AXIMM_REQ_TH) | - FIELD_SET(H2C_REQ_THROT_AXIMM_EN_DATA_MASK, - H2C_REQ_THROT_AXIMM_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK, - H2C_REQ_THROT_AXIMM_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR, reg_val); - -#define EQDMA_CPM5_H2C_MM_DATA_THROTTLE_ADDR 0x12EC -#define H2C_MM_DATA_THROTTLE_RSVD_1_MASK GENMASK(31, 17) -#define H2C_MM_DATA_THROTTLE_DAT_EN_MASK BIT(16) -#define H2C_MM_DATA_THROTTLE_DAT_MASK GENMASK(15, 0) -#define H2C_MM_DATA_THROTTLE_RSVD_1_DFLT 0 -#define H2C_MM_DATA_TH_EN 1 -#define H2C_MM_DATA_TH 57344 - reg_val = - FIELD_SET(H2C_MM_DATA_THROTTLE_RSVD_1_MASK, - H2C_MM_DATA_THROTTLE_RSVD_1_DFLT) | - FIELD_SET(H2C_MM_DATA_THROTTLE_DAT_EN_MASK, H2C_MM_DATA_TH_EN) | - FIELD_SET(H2C_MM_DATA_THROTTLE_DAT_MASK, H2C_MM_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_CPM5_H2C_MM_DATA_THROTTLE_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_H2C_MM_DATA_THROTTLE_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CPM5_H2C_MM_DATA_THROTTLE_ADDR, reg_val); -} - -/* - * eqdma_cpm5_indirect_reg_invalidate() - helper function to invalidate - * indirect context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_cpm5_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_cpm5_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_cpm5_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_cpm5_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_cpm5_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = EQDMA_CPM5_IND_CTXT_DATA_ADDR; - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - - qdma_reg_write(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_cpm5_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_cpm5_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_IND_CTXT_DATA_NUM_REGS; index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = EQDMA_CPM5_IND_CTXT_DATA_ADDR; - - for (index = 0; index < ((2 * QDMA_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_CPM5_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_cpm5_fill_sw_ctxt() - Helper function to fill sw context into - * structure - * - */ -static void eqdma_cpm5_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - int i = 0; - - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->pidx; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_arm; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->fnc_id; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->qen; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->frcd_en; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->wbi_chk; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->wbi_intvl_en; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->at; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->fetch_max; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->rngsz_idx; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->desc_sz; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->bypass; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->mm_chn; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->wbk_en; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_en; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->port_id; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_no_last; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->err; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->err_wb_sent; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_req; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->mrkr_dis; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->is_mm; - eqdma_cpm5_sw_ctxt_entries[i++].value = - sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - eqdma_cpm5_sw_ctxt_entries[i++].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->vec; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->intr_aggr; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->dis_intr_on_vf; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->pack_byp_out; - eqdma_cpm5_sw_ctxt_entries[i++].value = sw_ctxt->irq_byp; - -} - -/* - * eqdma_cpm5_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void eqdma_cpm5_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt - *cmpt_ctxt) -{ - int i = 0; - - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_stat_desc; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_int; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->trig_mode; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->fnc_id; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->counter_idx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_idx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->in_st; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->color; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ringsz_idx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_L_MASK, - cmpt_ctxt->bs_addr); - eqdma_cpm5_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_H_MASK, - cmpt_ctxt->bs_addr); - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->desc_sz; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->pidx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->cidx; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->valid; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->err; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->user_trig_pend; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_running; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->full_upd; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ovf_chk_dis; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->at; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->vec; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->int_aggr; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dis_intr_on_vf; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dir_c2h; - eqdma_cpm5_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_CPM5_COMPL_CTXT_BADDR_LOW_MASK, - cmpt_ctxt->bs_addr); - eqdma_cpm5_cmpt_ctxt_entries[i++].value = cmpt_ctxt->sh_cmpt; -} - -/* - * eqdma_cpm5_fill_hw_ctxt() - Helper function to fill HW context into - * structure - * - */ -static void eqdma_cpm5_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - int i = 0; - - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->cidx; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->crd_use; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->dsc_pend; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->idl_stp_b; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->evt_pnd; - eqdma_cpm5_hw_ctxt_entries[i++].value = hw_ctxt->fetch_pnd; -} - -/* - * eqdma_cpm5_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void eqdma_cpm5_fill_credit_ctxt(struct qdma_descq_credit_ctxt - *cr_ctxt) -{ - eqdma_cpm5_credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * eqdma_cpm5_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void eqdma_cpm5_fill_pfetch_ctxt(struct qdma_descq_prefetch_ctxt - *pfetch_ctxt) -{ - int i = 0; - - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->bypass; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = - pfetch_ctxt->bufsz_idx; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->port_id; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = - pfetch_ctxt->var_desc; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = - pfetch_ctxt->num_pftch; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->err; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch_en; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->sw_crdt; - eqdma_cpm5_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->valid; -} - -/* - * eqdma_cpm5_fill_fmap_ctxt() - Helper function to fill fmap context - * into structure - * - */ -static void eqdma_cpm5_fill_fmap_ctxt(struct qdma_fmap_cfg *fmap_ctxt) -{ - eqdma_cpm5_fmap_ctxt_entries[0].value = fmap_ctxt->qbase; - eqdma_cpm5_fmap_ctxt_entries[1].value = fmap_ctxt->qmax; -} - -/* - * eqdma_cpm5_fill_intr_ctxt() - Helper function to fill interrupt context - * into structure - * - */ -static void eqdma_cpm5_fill_intr_ctxt(struct qdma_indirect_intr_ctxt - *intr_ctxt) -{ - int i = 0; - - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->valid; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->vec; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->int_st; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->color; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->page_size; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->pidx; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->at; - eqdma_cpm5_ind_intr_ctxt_entries[i++].value = intr_ctxt->func_id; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_set_default_global_csr() - function to set the global CSR - * register to default values. The value can be modified later by using the - * set/get csr functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, 385, - 513, 769, 1025, 1537, 3073, 4097, 6145, 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, 32, 48, 64, - 80, 96, 112, 128, 144, 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 8192, - 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_GLBL_RNG_SZ_1_ADDR, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_C2H_CNT_TH_ADDR, - 0, QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, - EQDMA_CPM5_C2H_TIMER_CNT_ADDR, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_DSC_CFG_ADDR, - reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_C2H_BUF_SZ_ADDR, - 0, QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* C2h Completion Coalesce Configuration */ - reg_val = - FIELD_SET(C2H_WRB_COAL_CFG_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(C2H_WRB_COAL_CFG_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK, - EQDMA_CPM5_DEFAULT_CMPT_COAL_MAX_BUF_SZ); - qdma_reg_write(dev_hndl, EQDMA_CPM5_C2H_WRB_COAL_CFG_ADDR, - reg_val); - } - - eqdma_cpm5_set_perf_opt(dev_hndl); - return QDMA_SUCCESS; -} - -/* - * dump_eqdma_cpm5_context() - Helper function to dump queue context into - * string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_cpm5_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - eqdma_cpm5_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_H2C) { - eqdma_cpm5_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_cpm5_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_cpm5_fill_credit_ctxt(&queue_context->cr_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_C2H) { - eqdma_cpm5_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_cpm5_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_cpm5_fill_credit_ctxt(&queue_context->cr_ctxt); - if (st) { - eqdma_cpm5_fill_pfetch_ctxt( - &queue_context->pfetch_ctxt); - eqdma_cpm5_fill_cmpt_ctxt( - &queue_context->cmpt_ctxt); - } - } - - eqdma_cpm5_fill_fmap_ctxt(&queue_context->fmap); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, rv); - goto INSUF_BUF_EXIT; - } - } - - /* SW context dump */ - n = sizeof(eqdma_cpm5_sw_ctxt_entries) / - sizeof((eqdma_cpm5_sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[i].name, - eqdma_cpm5_sw_ctxt_entries[i].value, - eqdma_cpm5_sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(eqdma_cpm5_hw_ctxt_entries) / - sizeof((eqdma_cpm5_hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_hw_ctxt_entries[i].name, - eqdma_cpm5_hw_ctxt_entries[i].value, - eqdma_cpm5_hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(eqdma_cpm5_credit_ctxt_entries) / - sizeof((eqdma_cpm5_credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_credit_ctxt_entries[i].name, - eqdma_cpm5_credit_ctxt_entries[i].value, - eqdma_cpm5_credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(eqdma_cpm5_cmpt_ctxt_entries) / - sizeof((eqdma_cpm5_cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[i].name, - eqdma_cpm5_cmpt_ctxt_entries[i].value, - eqdma_cpm5_cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(eqdma_cpm5_c2h_pftch_ctxt_entries) / - sizeof(eqdma_cpm5_c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_c2h_pftch_ctxt_entries[i].name, - eqdma_cpm5_c2h_pftch_ctxt_entries[i].value, - eqdma_cpm5_c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* Fmap context dump */ - n = sizeof(eqdma_cpm5_fmap_ctxt_entries) / - sizeof(eqdma_cpm5_fmap_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Fmap Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_fmap_ctxt_entries[i].name, - eqdma_cpm5_fmap_ctxt_entries[i].value, - eqdma_cpm5_fmap_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * dump_eqdma_cpm5_intr_context() - Helper function to dump interrupt - * context into string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_cpm5_intr_context(struct qdma_indirect_intr_ctxt - *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - eqdma_cpm5_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(eqdma_cpm5_ind_intr_ctxt_entries) / - sizeof((eqdma_cpm5_ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cpm5_ind_intr_ctxt_entries[i].name, - eqdma_cpm5_ind_intr_ctxt_entries[i].value, - eqdma_cpm5_ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_get_version() - Function to get the eqdma version - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @version_info: pointer to hold the version info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_CPM5_OFFSET_VF_VERSION : - EQDMA_CPM5_GLBL2_MISC_CAP_ADDR; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - qdma_fetch_version_details(dev_hndl, is_vf, reg_val, version_info); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[EQDMA_CPM5_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - pasid_l = - FIELD_GET(EQDMA_CPM5_SW_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CPM5_SW_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - virtio_desc_base_l = (uint32_t)FIELD_GET( - EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_m = (uint32_t)FIELD_GET( - EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_h = (uint32_t)FIELD_GET( - EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - ctxt->virtio_dsc_base); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W0_PIDX_MASK, ctxt->pidx) | - FIELD_SET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, ctxt->irq_arm) | - FIELD_SET(SW_IND_CTXT_DATA_W0_FNC_MASK, ctxt->fnc_id); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x\n", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - ctxt->wbi_intvl_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_AT_MASK, ctxt->at) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, ctxt->fetch_max) | - FIELD_SET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - ctxt->irq_no_last) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_MASK, ctxt->err) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - ctxt->err_wb_sent) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, ctxt->is_mm); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,err=%x", - __func__, ctxt->port_id, ctxt->irq_no_last, ctxt->err); - qdma_log_debug(", err_wb_sent=%x\n", ctxt->err_wb_sent); - - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->intr_aggr) | - FIELD_SET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - ctxt->virtio_en) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - ctxt->pack_byp_out) | - FIELD_SET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, ctxt->irq_byp) | - FIELD_SET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - virtio_desc_base_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - virtio_desc_base_m); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - virtio_desc_base_h); - - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t sw_ctxt[EQDMA_CPM5_SW_CONTEXT_NUM_WORDS] = {0}; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(SW_IND_CTXT_DATA_W0_PIDX_MASK, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, - sw_ctxt[0])); - ctxt->fnc_id = FIELD_GET(SW_IND_CTXT_DATA_W0_FNC_MASK, sw_ctxt[0]); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - ctxt->qen = FIELD_GET(SW_IND_CTXT_DATA_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, sw_ctxt[1]); - ctxt->at = FIELD_GET(SW_IND_CTXT_DATA_W1_AT_MASK, sw_ctxt[1]); - ctxt->fetch_max = - (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, - sw_ctxt[1]); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, - sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, - sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, - sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, - sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, - sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, - sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, - sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, - sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, - sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, - sw_ctxt[1])); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,", - __func__, ctxt->port_id, ctxt->irq_no_last); - qdma_log_debug(" err=%x, err_wb_sent=%x\n", - ctxt->err, ctxt->err_wb_sent); - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - ctxt->vec = FIELD_GET(SW_IND_CTXT_DATA_W4_VEC_MASK, sw_ctxt[4]); - ctxt->intr_aggr = (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, - sw_ctxt[4])); - ctxt->dis_intr_on_vf = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - sw_ctxt[4])); - ctxt->virtio_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - sw_ctxt[4])); - ctxt->pack_byp_out = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - sw_ctxt[4])); - ctxt->irq_byp = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, - sw_ctxt[4])); - ctxt->host_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, - sw_ctxt[4])); - pasid_l = FIELD_GET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, sw_ctxt[4]); - - pasid_h = FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, sw_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, - sw_ctxt[5]); - virtio_desc_base_l = - FIELD_GET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - sw_ctxt[5]); - virtio_desc_base_m = - FIELD_GET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - sw_ctxt[6]); - - virtio_desc_base_h = - FIELD_GET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - sw_ctxt[6]); - - ctxt->pasid = - FIELD_SET(EQDMA_CPM5_SW_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CPM5_SW_CTXT_PASID_GET_H_MASK, pasid_h); - - ctxt->virtio_dsc_base = - FIELD_SET(EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - (uint64_t)virtio_desc_base_l) | - FIELD_SET(EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - (uint64_t)virtio_desc_base_m) | - FIELD_SET(EQDMA_CPM5_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - (uint64_t)virtio_desc_base_h); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_sw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_sw_context_write(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_sw_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_context_write() - create prefetch context and program - * it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[EQDMA_CPM5_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, - ctxt->num_pftch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - ctxt->var_desc) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_ERR_MASK, ctxt->err) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, ctxt->pfch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, sw_crdt_l); - - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(PREFETCH_CTXT_DATA_W1_VALID_MASK, ctxt->valid); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t pfetch_ctxt[EQDMA_CPM5_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, pfetch_ctxt[0]); - ctxt->bufsz_idx = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - pfetch_ctxt[0]); - ctxt->num_pftch = (uint16_t) FIELD_GET( - PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, pfetch_ctxt[0]); - ctxt->port_id = - FIELD_GET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, pfetch_ctxt[0]); - ctxt->var_desc = (uint8_t) - FIELD_GET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - pfetch_ctxt[0]); - ctxt->err = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - FIELD_GET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, pfetch_ctxt[0]); - - sw_crdt_h = - FIELD_GET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_pfetch_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_pfetch_context_read(dev_hndl, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_pfetch_context_write(dev_hndl, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_pfetch_context_invalidate(dev_hndl, - hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_context_write() - create completion context and program - * it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[EQDMA_CPM5_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr4_high_l, baddr4_high_h, - baddr4_low, pidx_l, pidx_h, pasid_l, pasid_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR) { - qdma_log_error("%s: trig_mode(%d) > (%d) is invalid, err:%d\n", - __func__, - ctxt->trig_mode, - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr4_high_l = - (uint32_t)FIELD_GET(EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_L_MASK, - ctxt->bs_addr); - baddr4_high_h = - (uint32_t)FIELD_GET(EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_H_MASK, - ctxt->bs_addr); - baddr4_low = - (uint32_t)FIELD_GET(EQDMA_CPM5_COMPL_CTXT_BADDR_LOW_MASK, - ctxt->bs_addr); - - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, ctxt->pidx); - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, ctxt->pidx); - - pasid_l = - FIELD_GET(EQDMA_CPM5_CMPL_CTXT_PASID_GET_L_MASK, - ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CPM5_CMPL_CTXT_PASID_GET_H_MASK, - ctxt->pasid); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(CMPL_CTXT_DATA_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - ctxt->counter_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, ctxt->timer_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_INT_ST_MASK, ctxt->in_st) | - FIELD_SET(CMPL_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, ctxt->ringsz_idx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, baddr4_high_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, baddr4_high_h) | - FIELD_SET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, ctxt->desc_sz) | - FIELD_SET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, pidx_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, pidx_h) | - FIELD_SET(CMPL_CTXT_DATA_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(CMPL_CTXT_DATA_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(CMPL_CTXT_DATA_W3_ERR_MASK, ctxt->err) | - FIELD_SET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - ctxt->user_trig_pend); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, - ctxt->timer_running) | - FIELD_SET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, ctxt->full_upd) | - FIELD_SET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, - ctxt->ovf_chk_dis) | - FIELD_SET(CMPL_CTXT_DATA_W4_AT_MASK, ctxt->at) | - FIELD_SET(CMPL_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->int_aggr) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(CMPL_CTXT_DATA_W4_VIO_MASK, ctxt->vio) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, ctxt->dir_c2h) | - FIELD_SET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(CMPL_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - ctxt->pasid_en) | - FIELD_SET(CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, - baddr4_low) | - FIELD_SET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, ctxt->vio_eop) | - FIELD_SET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, ctxt->sh_cmpt); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cmpt_ctxt[EQDMA_CPM5_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr4_high_l, baddr4_high_h, baddr4_low, - pidx_l, pidx_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(CMPL_CTXT_DATA_W0_EN_INT_MASK, cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = FIELD_GET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, cmpt_ctxt[0]); - ctxt->counter_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, - cmpt_ctxt[0])); - - baddr4_high_l = FIELD_GET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, - cmpt_ctxt[1]); - - baddr4_high_h = FIELD_GET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, - cmpt_ctxt[2]); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, cmpt_ctxt[2]); - - pidx_h = FIELD_GET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(CMPL_CTXT_DATA_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_ERR_MASK, - cmpt_ctxt[3])); - ctxt->user_trig_pend = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - cmpt_ctxt[3])); - - ctxt->timer_running = - FIELD_GET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, cmpt_ctxt[4]); - ctxt->full_upd = - FIELD_GET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, cmpt_ctxt[4]); - ctxt->ovf_chk_dis = - FIELD_GET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, cmpt_ctxt[4]); - ctxt->at = FIELD_GET(CMPL_CTXT_DATA_W4_AT_MASK, cmpt_ctxt[4]); - ctxt->vec = FIELD_GET(CMPL_CTXT_DATA_W4_VEC_MASK, cmpt_ctxt[4]); - ctxt->int_aggr = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, cmpt_ctxt[4])); - ctxt->dis_intr_on_vf = (uint8_t) - FIELD_GET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - cmpt_ctxt[4]); - ctxt->vio = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_VIO_MASK, - cmpt_ctxt[4]); - ctxt->dir_c2h = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, - cmpt_ctxt[4]); - ctxt->host_id = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, - cmpt_ctxt[4]); - pasid_l = FIELD_GET(CMPL_CTXT_DATA_W4_PASID_L_MASK, cmpt_ctxt[4]); - - pasid_h = (uint32_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_H_MASK, - cmpt_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - cmpt_ctxt[5]); - baddr4_low = (uint8_t)FIELD_GET( - CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, cmpt_ctxt[5]); - ctxt->vio_eop = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, - cmpt_ctxt[5]); - ctxt->sh_cmpt = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, - cmpt_ctxt[5]); - - ctxt->bs_addr = - FIELD_SET(EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_L_MASK, - (uint64_t)baddr4_high_l) | - FIELD_SET(EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_H_MASK, - (uint64_t)baddr4_high_h) | - FIELD_SET(EQDMA_CPM5_COMPL_CTXT_BADDR_LOW_MASK, - (uint64_t)baddr4_low); - - ctxt->pasid = - FIELD_SET(EQDMA_CPM5_CMPL_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CPM5_CMPL_CTXT_PASID_GET_H_MASK, - (uint64_t)pasid_h); - - ctxt->pidx = - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, pidx_l) | - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, pidx_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_cmpt_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_cmpt_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_cmpt_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_cmpt_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t hw_ctxt[EQDMA_CPM5_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or hw_ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(HW_IND_CTXT_DATA_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(HW_IND_CTXT_DATA_W0_CRD_USE_MASK, - hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, - hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->evt_pnd = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_EVT_PND_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = (uint8_t) - (FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, hw_ctxt[1])); - - qdma_log_debug("%s: cidx=%hu, crd_use=%hu, dsc_pend=%x\n", - __func__, ctxt->cidx, ctxt->crd_use, ctxt->dsc_pend); - qdma_log_debug("%s: idl_stp_b=%x, evt_pnd=%x, fetch_pnd=%x\n", - __func__, ctxt->idl_stp_b, ctxt->evt_pnd, - ctxt->fetch_pnd); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_hw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_hw_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[EQDMA_CPM5_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CPM5_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(CRED_CTXT_DATA_W0_CREDT_MASK, cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_credit_ctx_conf() - configure credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_credit_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_credit_context_clear(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_credit_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_fmap_context_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_fmap_context_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap[EQDMA_CPM5_FMAP_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - fmap[num_words_count++] = - FIELD_SET(EQDMA_CPM5_FMAP_CTXT_W0_QID_MASK, config->qbase); - fmap[num_words_count++] = - FIELD_SET(EQDMA_CPM5_FMAP_CTXT_W1_QID_MAX_MASK, - config->qmax); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, func_id, - fmap, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_fmap_context_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_fmap_context_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - int rv = QDMA_SUCCESS; - uint32_t fmap[EQDMA_CPM5_FMAP_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, func_id, - EQDMA_CPM5_FMAP_NUM_WORDS, fmap); - if (rv < 0) - return rv; - - config->qbase = FIELD_GET(EQDMA_CPM5_FMAP_CTXT_W0_QID_MASK, - fmap[0]); - config->qmax = FIELD_GET(EQDMA_CPM5_FMAP_CTXT_W1_QID_MAX_MASK, - fmap[1]); - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_fmap_context_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_fmap_context_clear(void *dev_hndl, uint16_t func_id) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu\n", __func__, func_id); - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, func_id); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_fmap_context_read(dev_hndl, - func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_fmap_context_write(dev_hndl, - func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_fmap_context_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_context_write() - create indirect interrupt - * context and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_indirect_intr_context_write(void *dev_hndl, - uint16_t ring_index, const struct qdma_indirect_intr_ctxt - *ctxt) -{ - uint32_t intr_ctxt[EQDMA_CPM5_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint32_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_m = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, - ctxt->baddr_4k); - baddr_h = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - pasid_l = - FIELD_GET(EQDMA_CPM5_INTR_CTXT_PASID_GET_L_MASK, - ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CPM5_INTR_CTXT_PASID_GET_H_MASK, - ctxt->pasid); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(INTR_CTXT_DATA_W0_VEC_MASK, ctxt->vec) | - FIELD_SET(INTR_CTXT_DATA_W0_INT_ST_MASK, ctxt->int_st) | - FIELD_SET(INTR_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, baddr_m); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, baddr_h) | - FIELD_SET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, ctxt->page_size) | - FIELD_SET(INTR_CTXT_DATA_W2_PIDX_MASK, ctxt->pidx) | - FIELD_SET(INTR_CTXT_DATA_W2_AT_MASK, ctxt->at) | - FIELD_SET(INTR_CTXT_DATA_W2_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(INTR_CTXT_DATA_W2_PASID_L_MASK, pasid_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W3_PASID_H_MASK, pasid_h) | - FIELD_SET(INTR_CTXT_DATA_W3_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(INTR_CTXT_DATA_W3_FUNC_MASK, ctxt->func_id); - - return eqdma_cpm5_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_context_read() - read indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_indirect_intr_context_read(void *dev_hndl, - uint16_t ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t intr_ctxt[EQDMA_CPM5_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_indirect_reg_read(dev_hndl, sel, ring_index, - EQDMA_CPM5_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(INTR_CTXT_DATA_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(INTR_CTXT_DATA_W0_VEC_MASK, intr_ctxt[0]); - ctxt->int_st = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_INT_ST_MASK, - intr_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_COLOR_MASK, - intr_ctxt[0])); - baddr_l = FIELD_GET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, intr_ctxt[0]); - - baddr_m = FIELD_GET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, intr_ctxt[1]); - - baddr_h = FIELD_GET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, intr_ctxt[2]); - ctxt->page_size = - FIELD_GET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, intr_ctxt[2]); - ctxt->pidx = - (uint16_t)(FIELD_GET(INTR_CTXT_DATA_W2_PIDX_MASK, - intr_ctxt[2])); - ctxt->at = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_AT_MASK, intr_ctxt[2])); - ctxt->host_id = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_HOST_ID_MASK, - intr_ctxt[2])); - pasid_l = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_PASID_L_MASK, - intr_ctxt[2])); - - pasid_h = FIELD_GET(INTR_CTXT_DATA_W3_PASID_H_MASK, intr_ctxt[3]); - ctxt->pasid_en = (uint8_t)FIELD_GET(INTR_CTXT_DATA_W3_PASID_EN_MASK, - intr_ctxt[3]); - - ctxt->func_id = (uint16_t)FIELD_GET(INTR_CTXT_DATA_W3_FUNC_MASK, - intr_ctxt[3]); - - ctxt->baddr_4k = - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, baddr_m) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - ctxt->pasid = - FIELD_SET(EQDMA_CPM5_INTR_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CPM5_INTR_CTXT_PASID_GET_H_MASK, pasid_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_context_clear() - clear indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_indirect_intr_context_clear(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_context_invalidate() - invalidate indirect - * interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_cpm5_indirect_reg_invalidate(dev_hndl, sel, - ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_indirect_intr_ctx_conf() - configure indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_indirect_intr_context_read(dev_hndl, - ring_index, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_indirect_intr_context_write(dev_hndl, - ring_index, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cpm5_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cpm5_indirect_intr_context_invalidate(dev_hndl, - ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_dump_config_regs() - Function to get qdma config register - * dump in a buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_cpm5_config_num_regs_get(); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < eqdma_cpm5_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = eqdma_cpm5_config_regs_get(); - - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s", reg_info[i].name); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm_queue_context() - Function to get qdma queue context dump - * in a buffer - * - * @dev_hndl: device handle - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @context: Queue Context - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_cpm5_context(ctxt_data, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_dump_intr_context() - Function to get qdma interrupt context - * dump in a buffer - * - * @dev_hndl: device handle - * @intr_ctx: Interrupt Context - * @ring_index: Ring index - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - req_buflen = eqdma_cpm5_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_cpm5_intr_context(intr_ctx, ring_index, buf, - buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_dump_queue_context() - Function to read and dump the - * queue context in a buffer - * - * @dev_hndl: device handle - * @func_id: function id - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_cpm5_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = eqdma_cpm5_sw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.sw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read sw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_cpm5_hw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.hw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read hw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_cpm5_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read credit context, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = eqdma_cpm5_pfetch_ctx_conf(dev_hndl, - qid_hw, - &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read pftech context, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = eqdma_cpm5_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read cmpt context, err = %d", - __func__, rv); - return rv; - } - } - - rv = eqdma_cpm5_fmap_conf(dev_hndl, func_id, - &(context.fmap), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read fmap context, err = %d", - __func__, rv); - return rv; - } - - rv = dump_eqdma_cpm5_context(&context, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_get_user_bar() - Function to get the AXI Master - * Lite(user bar) number - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite bar number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar) -{ - /* TODO: In future, user bar is identified using RR */ - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - UNUSED(func_id); - UNUSED(is_vf); - - *user_bar = 2; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_ram_sbe_err_process() - Function to dump SBE error - * debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_ram_sbe_err_process(void *dev_hndl) -{ - eqdma_cpm5_dump_reg_info(dev_hndl, - EQDMA_CPM5_RAM_SBE_STS_A_ADDR, 1, NULL, 0); - eqdma_cpm5_dump_reg_info(dev_hndl, - EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR, 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_ram_dbe_err_process() - Function to dump DBE error - * debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_ram_dbe_err_process(void *dev_hndl) -{ - eqdma_cpm5_dump_reg_info(dev_hndl, - EQDMA_CPM5_RAM_DBE_STS_A_ADDR, 1, NULL, 0); - eqdma_cpm5_dump_reg_info(dev_hndl, - EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR, 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_desc_err_process() - Function to dump Descriptor - * Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_LOG0_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_LOG1_ADDR, - EQDMA_CPM5_GLBL_DSC_DBG_DAT0_ADDR, - EQDMA_CPM5_GLBL_DSC_DBG_DAT1_ADDR, - EQDMA_CPM5_GLBL_DSC_ERR_LOG2_ADDR - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_trq_err_process() - Function to dump Target Access - * Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_CPM5_GLBL_TRQ_ERR_LOG_ADDR - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_err_dump_ctxt_info() - Dump the imp ctxt fields on HW error - * - * @dev_hndl: device handle - * @first_err_qid: First Error QID - * @en_st: ST Mode or MM Mode enabled - * @c2h: C2H or H2C Mode - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_err_dump_ctxt_info(void *dev_hndl, - uint32_t first_err_qid_reg, - uint8_t en_st, uint8_t c2h) -{ - uint16_t first_err_qid = 0; - struct qdma_descq_sw_ctxt sw_ctxt; - struct qdma_descq_hw_ctxt hw_ctxt; - struct qdma_descq_cmpt_ctxt cmpt_ctxt; - - first_err_qid = qdma_reg_read(dev_hndl, first_err_qid_reg); - - eqdma_cpm5_sw_context_read(dev_hndl, c2h, first_err_qid, &sw_ctxt); - eqdma_cpm5_hw_context_read(dev_hndl, c2h, first_err_qid, &hw_ctxt); - eqdma_cpm5_fill_sw_ctxt(&sw_ctxt); - eqdma_cpm5_fill_hw_ctxt(&hw_ctxt); - - if (sw_ctxt.pidx != hw_ctxt.cidx) { - qdma_log_info("\n%40s\n", "SW Context:"); - /** SW Context: PIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[0].name, - eqdma_cpm5_sw_ctxt_entries[0].value, - eqdma_cpm5_sw_ctxt_entries[0].value); - qdma_log_info("\n%40s\n", "HW Context:"); - /*** HW Context: CIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_hw_ctxt_entries[0].name, - eqdma_cpm5_hw_ctxt_entries[0].value, - eqdma_cpm5_hw_ctxt_entries[0].value); - } - - if (sw_ctxt.err != 0) { - /*** SW Context: ERR ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[17].name, - eqdma_cpm5_sw_ctxt_entries[17].value, - eqdma_cpm5_sw_ctxt_entries[17].value); - } - - /*** SW Context: ERR WB SENT***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[18].name, - eqdma_cpm5_sw_ctxt_entries[18].value, - eqdma_cpm5_sw_ctxt_entries[18].value); - - /*** SW Context: IRQ REQ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_sw_ctxt_entries[19].name, - eqdma_cpm5_sw_ctxt_entries[19].value, - eqdma_cpm5_sw_ctxt_entries[19].value); - - if (en_st && c2h) { - eqdma_cpm5_cmpt_context_read(dev_hndl, - first_err_qid, &cmpt_ctxt); - eqdma_cpm5_fill_cmpt_ctxt(&cmpt_ctxt); - - qdma_log_info("\n%40s\n", "CMPT Context:"); - - /*** CMPT Context: int_st ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[6].name, - eqdma_cpm5_cmpt_ctxt_entries[6].value, - eqdma_cpm5_cmpt_ctxt_entries[6].value); - - /** CMPT Context: PIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[12].name, - eqdma_cpm5_cmpt_ctxt_entries[12].value, - eqdma_cpm5_cmpt_ctxt_entries[12].value); - /*** CMPT Context: CIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[13].name, - eqdma_cpm5_cmpt_ctxt_entries[13].value, - eqdma_cpm5_cmpt_ctxt_entries[13].value); - - if (cmpt_ctxt.err != 0) { - /*** CMPT Context: ERR ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cpm5_cmpt_ctxt_entries[15].name, - eqdma_cpm5_cmpt_ctxt_entries[15].value, - eqdma_cpm5_cmpt_ctxt_entries[15].value); - } - } -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_st_h2c_err_process() - Function to dump MM H2C Error - * information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - EQDMA_CPM5_H2C_ERR_STAT_ADDR, - EQDMA_CPM5_H2C_FIRST_ERR_QID_ADDR, - EQDMA_CPM5_H2C_DBG_REG0_ADDR, - EQDMA_CPM5_H2C_DBG_REG1_ADDR, - EQDMA_CPM5_H2C_DBG_REG2_ADDR, - EQDMA_CPM5_H2C_DBG_REG3_ADDR, - EQDMA_CPM5_H2C_DBG_REG4_ADDR - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, st_h2c_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_cpm5_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_CPM5_H2C_FIRST_ERR_QID_ADDR, 1, 1); -} - - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_st_c2h_err_process() - Function to dump MM H2C - * Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - EQDMA_CPM5_C2H_ERR_STAT_ADDR, - EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_CPM5_C2H_FIRST_ERR_QID_ADDR, - EQDMA_CPM5_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR, - EQDMA_CPM5_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR, - EQDMA_CPM5_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR, - EQDMA_CPM5_C2H_STAT_AXIS_PKG_CMP_ADDR, - EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_0_ADDR, - EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_1_ADDR, - EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_2_ADDR, - EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_3_ADDR, - EQDMA_CPM5_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR, - EQDMA_CPM5_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, st_c2h_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_cpm5_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_CPM5_C2H_FIRST_ERR_QID_ADDR, 1, 1); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_mm_c2h0_err_process() - Function to dump MM C2H - * Error information - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_mm_c2h0_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t mm_c2h_err_reg_list[] = { - EQDMA_CPM5_C2H_MM_STATUS_ADDR, - EQDMA_CPM5_C2H_MM_CMPL_DESC_CNT_ADDR, - EQDMA_CPM5_C2H_MM_ERR_CODE_ADDR, - EQDMA_CPM5_C2H_MM_ERR_INFO_ADDR, - EQDMA_CPM5_C2H_MM_DBG_ADDR - }; - int mm_c2h_err_num_regs = sizeof(mm_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < mm_c2h_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, mm_c2h_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_cpm5_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_CPM5_C2H_MM_ERR_INFO_ADDR, 0, 1); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_mm_h2c0_err_process() - Function to dump MM H2C - * Error information - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -static void eqdma_cpm5_mm_h2c0_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t mm_h2c_err_reg_list[] = { - EQDMA_CPM5_H2C_MM_STATUS_ADDR, - EQDMA_CPM5_H2C_MM_CMPL_DESC_CNT_ADDR, - EQDMA_CPM5_H2C_MM_ERR_CODE_ADDR, - EQDMA_CPM5_H2C_MM_ERR_INFO_ADDR, - EQDMA_CPM5_H2C_MM_DBG_ADDR - }; - int mm_h2c_err_num_regs = sizeof(mm_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < mm_h2c_err_num_regs; i++) { - eqdma_cpm5_dump_reg_info(dev_hndl, mm_h2c_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_cpm5_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_CPM5_H2C_MM_ERR_INFO_ADDR, 0, 1); -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_get_error_name() - Function to get the error in string - * format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *eqdma_cpm5_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= EQDMA_CPM5_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, - (enum eqdma_cpm5_error_idx)err_idx); - return NULL; - } - - return eqdma_cpm5_err_info[(enum - eqdma_cpm5_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t bit = 0, i = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[ - EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS] = { - EQDMA_CPM5_DSC_ERR_POISON, - EQDMA_CPM5_TRQ_ERR_CSR_UNMAPPED, - EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_CPM5_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_CPM5_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_CPM5_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_CPM5_SBE_ERR_MI_H2C0_DAT, - EQDMA_CPM5_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_CPM5_DBE_ERR_MI_H2C0_DAT, - EQDMA_CPM5_MM_C2H_WR_SLR_ERR, - EQDMA_CPM5_MM_H2C0_RD_HDR_POISON_ERR - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_ERR_STAT_ADDR); - - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - - qdma_log_info("%s: Global Err Reg(0x%x) = 0x%x\n", - __func__, EQDMA_CPM5_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - for (i = 0; i < EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - bit = hw_err_position[i]; - - if ((!dev_cap.st_en) && - (bit == EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH || - bit == EQDMA_CPM5_ST_FATAL_ERR_MTY_MISMATCH || - bit == EQDMA_CPM5_ST_H2C_ERR_ZERO_LEN_DESC)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - eqdma_cpm5_err_info[bit].stat_reg_addr); - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - eqdma_cpm5_err_info[bit].stat_reg_addr, - err_stat); - - eqdma_cpm5_err_info[ - bit].eqdma_cpm5_hw_err_process(dev_hndl); - for (idx = bit; idx < all_eqdma_cpm5_hw_errs[i]; - idx++) { - /* call the platform specific handler */ - if (err_stat & - eqdma_cpm5_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s\n", - __func__, - eqdma_cpm5_hw_get_error_name(idx)); - } - qdma_reg_write(dev_hndl, - eqdma_cpm5_err_info[bit].stat_reg_addr, - err_stat); - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > EQDMA_CPM5_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, - (enum eqdma_cpm5_error_idx)err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == EQDMA_CPM5_ERRS_ALL) { - for (i = 0; i < EQDMA_CPM5_TOTAL_LEAF_ERROR_AGGREGATORS; - i++) { - - idx = all_eqdma_cpm5_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == EQDMA_CPM5_ST_C2H_ERR_ALL || - idx == EQDMA_CPM5_ST_FATAL_ERR_ALL - || idx == EQDMA_CPM5_ST_H2C_ERR_ALL) - continue; - } - - reg_val = eqdma_cpm5_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - eqdma_cpm5_err_info[idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_ERR_MASK_ADDR); - reg_val |= FIELD_SET( - eqdma_cpm5_err_info[idx].global_err_mask, - 1); - qdma_reg_write(dev_hndl, - EQDMA_CPM5_GLBL_ERR_MASK_ADDR, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH - && err_idx <= - EQDMA_CPM5_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - eqdma_cpm5_err_info[err_idx].mask_reg_addr); - reg_val |= - FIELD_SET( - eqdma_cpm5_err_info[err_idx].leaf_err_mask, - 1); - qdma_reg_write(dev_hndl, - eqdma_cpm5_err_info[err_idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_ERR_MASK_ADDR); - reg_val |= - FIELD_SET - (eqdma_cpm5_err_info[err_idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_ERR_MASK_ADDR, - reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_get_device_attributes() - Function to get the qdma device - * attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_PF_BARLITE_INT); - dev_info->num_pfs = FIELD_GET(QDMA_GLBL2_PF0_BAR_MAP_MASK, reg_val); - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL2_CHANNEL_CAP_ADDR); - dev_info->num_qs = - FIELD_GET(GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK, reg_val); - - /* There are 12 bits assigned in EQDMA_CPM5_GLBL2_CHANNEL_CAP_ADDR - * to represent the num_qs. For CPM5, max queues can be 4096 which needs - * 13 bits(0x1000). Adding a hack in driver to represent 4096 queues - * when HW sets the num_qs to 0xFFF - */ - if (dev_info->num_qs == 0xFFF) - dev_info->num_qs++; - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_CPM5_GLBL2_MISC_CAP_ADDR); - dev_info->mailbox_en = FIELD_GET(EQDMA_CPM5_GLBL2_MAILBOX_EN_MASK, - reg_val); - dev_info->flr_present = FIELD_GET(EQDMA_CPM5_GLBL2_FLR_PRESENT_MASK, - reg_val); - dev_info->mm_cmpt_en = 0; - dev_info->debug_mode = FIELD_GET(EQDMA_CPM5_GLBL2_DBG_MODE_EN_MASK, - reg_val); - dev_info->desc_eng_mode = - FIELD_GET(EQDMA_CPM5_GLBL2_DESC_ENG_MODE_MASK, - reg_val); - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL2_CHANNEL_MDMA_ADDR); - dev_info->st_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ST_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ST_MASK, reg_val)) ? 1 : 0; - dev_info->mm_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ENG_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ENG_MASK, reg_val)) ? 1 : 0; - - /* num of mm channels */ - /* TODO : Register not yet defined for this. - * Hard coding it to 2 for CPM5 - */ - dev_info->mm_channel_max = 2; - - dev_info->qid2vec_ctx = 0; - dev_info->cmpt_ovf_chk_dis = 1; - dev_info->mailbox_intr = 1; - dev_info->sw_desc_64b = 1; - dev_info->cmpt_desc_64b = 1; - dev_info->dynamic_bar = 1; - dev_info->legacy_intr = 1; - dev_info->cmpt_trig_count_timer = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_init_ctxt_memory() - function to initialize the context - * memory - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_cpm5_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - -#ifdef TANDEM_BOOT_SUPPORTED - for (; sel <= QDMA_CTXT_SEL_CR_H2C; sel++) { - rv = eqdma_cpm5_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } -#else - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** TODO: Check for Tandem boot **/ - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = eqdma_cpm5_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } -#endif - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - eqdma_cpm5_indirect_reg_clear(dev_hndl, - QDMA_CTXT_SEL_FMAP, i); - -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return QDMA_SUCCESS; - -} - -#ifdef TANDEM_BOOT_SUPPORTED -/*****************************************************************************/ -/** - * eqdma_cpm5_init_st_ctxt() - Initialize the ST context - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_cpm5_init_st_ctxt(void *dev_hndl) -{ - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_CMPT; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = eqdma_cpm5_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - return QDMA_SUCCESS; - -} -#endif - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_cpm5_config_num_regs_get(); - - reg_info = eqdma_cpm5_config_regs_get(); - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_cpm5_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = eqdma_cpm5_config_regs_get(); - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - for (reg_count = 0; - (reg_count < total_regs);) { - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[reg_count].is_debug_reg == 1) - continue; - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; - -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_cpm5_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_cpm5_config_num_regs_get(); - struct xreg_info *eqdma_cpm5_config_regs = - eqdma_cpm5_config_regs_get(); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_group) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = EQDMA_CPM5_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = EQDMA_CPM5_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = EQDMA_CPM5_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = EQDMA_CPM5_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid slot received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - reg_info = &eqdma_cpm5_config_regs[reg_index]; - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_write_global_ring_sizes() - function to set the global ring - * size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_GLBL_RNG_SZ_1_ADDR, - index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_global_ring_sizes() - function to get the global rng_sz - * array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, EQDMA_CPM5_GLBL_RNG_SZ_1_ADDR, - index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_write_global_timer_count(void *dev_hndl, uint8_t - index, uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, - EQDMA_CPM5_C2H_TIMER_CNT_ADDR, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_read_global_timer_count(void *dev_hndl, - uint8_t index, uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - EQDMA_CPM5_C2H_TIMER_CNT_ADDR, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_write_global_counter_threshold() - function to set the - * counter threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_write_global_counter_threshold(void *dev_hndl, - uint8_t index, uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_C2H_CNT_TH_ADDR, - index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_global_counter_threshold() - function to get the counter - * threshold - * values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_read_global_counter_threshold(void *dev_hndl, uint8_t - index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, EQDMA_CPM5_C2H_CNT_TH_ADDR, - index, count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_write_global_buffer_sizes() - function to set the buffer - * sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_write_global_buffer_sizes(void *dev_hndl, uint8_t - index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, EQDMA_CPM5_C2H_BUF_SZ_ADDR, - index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_read_global_buffer_sizes(void *dev_hndl, uint8_t - index, uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, EQDMA_CPM5_C2H_BUF_SZ_ADDR, - index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_global_csr_conf(void *dev_hndl, uint8_t index, - uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_cpm5_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_cpm5_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_cpm5_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_cpm5_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_global_writeback_interval_write() - function to set - * the writeback interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_DSC_CFG_ADDR); - reg_val |= FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - qdma_reg_write(dev_hndl, EQDMA_CPM5_GLBL_DSC_CFG_ADDR, - reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_global_writeback_interval_read() - function to get the - * writeback - * interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cpm5_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - EQDMA_CPM5_GLBL_DSC_CFG_ADDR); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cpm5_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cpm5_global_writeback_interval_read(dev_hndl, - wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cpm5_global_writeback_interval_write(dev_hndl, - *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * eqdma_cpm5_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cpm5_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? EQDMA_CPM5_C2H_MM_CTL_ADDR : - EQDMA_CPM5_H2C_MM_CTL_ADDR; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - - - return QDMA_SUCCESS; -} - -int eqdma_cpm5_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = eqdma_cpm5_config_num_regs_get(); - struct xreg_info *config_regs = eqdma_cpm5_config_regs_get(); - struct qdma_dev_attributes dev_cap; - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_cpm5_get_device_attributes(dev_hndl, &dev_cap); - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - config_regs[j].is_debug_reg == 1) - continue; - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; -} - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.h deleted file mode 100755 index 93662d2..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.h +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __EQDMA_CPM5_SOFT_ACCESS_H_ -#define __EQDMA_CPM5_SOFT_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -/** - * enum eqdma_cpm5_error_idx - qdma errors - */ -enum eqdma_cpm5_error_idx { - /* Descriptor errors */ - EQDMA_CPM5_DSC_ERR_POISON, - EQDMA_CPM5_DSC_ERR_UR_CA, - EQDMA_CPM5_DSC_ERR_BCNT, - EQDMA_CPM5_DSC_ERR_PARAM, - EQDMA_CPM5_DSC_ERR_ADDR, - EQDMA_CPM5_DSC_ERR_TAG, - EQDMA_CPM5_DSC_ERR_FLR, - EQDMA_CPM5_DSC_ERR_TIMEOUT, - EQDMA_CPM5_DSC_ERR_DAT_POISON, - EQDMA_CPM5_DSC_ERR_FLR_CANCEL, - EQDMA_CPM5_DSC_ERR_DMA, - EQDMA_CPM5_DSC_ERR_DSC, - EQDMA_CPM5_DSC_ERR_RQ_CANCEL, - EQDMA_CPM5_DSC_ERR_DBE, - EQDMA_CPM5_DSC_ERR_SBE, - EQDMA_CPM5_DSC_ERR_PORT_ID, - EQDMA_CPM5_DSC_ERR_ALL, - - /* TRQ Errors */ - EQDMA_CPM5_TRQ_ERR_CSR_UNMAPPED, - EQDMA_CPM5_TRQ_ERR_VF_ACCESS, - EQDMA_CPM5_TRQ_ERR_TCP_CSR_TIMEOUT, - EQDMA_CPM5_TRQ_ERR_QSPC_UNMAPPED, - EQDMA_CPM5_TRQ_ERR_QID_RANGE, - EQDMA_CPM5_TRQ_ERR_TCP_QSPC_TIMEOUT, - EQDMA_CPM5_TRQ_ERR_ALL, - - /* ST C2H Errors */ - EQDMA_CPM5_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_CPM5_ST_C2H_ERR_LEN_MISMATCH, - EQDMA_CPM5_ST_C2H_ERR_SH_CMPT_DSC, - EQDMA_CPM5_ST_C2H_ERR_QID_MISMATCH, - EQDMA_CPM5_ST_C2H_ERR_DESC_RSP_ERR, - EQDMA_CPM5_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - EQDMA_CPM5_ST_C2H_ERR_MSI_INT_FAIL, - EQDMA_CPM5_ST_C2H_ERR_ERR_DESC_CNT, - EQDMA_CPM5_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - EQDMA_CPM5_ST_C2H_ERR_CMPT_INV_Q_ERR, - EQDMA_CPM5_ST_C2H_ERR_CMPT_QFULL_ERR, - EQDMA_CPM5_ST_C2H_ERR_CMPT_CIDX_ERR, - EQDMA_CPM5_ST_C2H_ERR_CMPT_PRTY_ERR, - EQDMA_CPM5_ST_C2H_ERR_AVL_RING_DSC, - EQDMA_CPM5_ST_C2H_ERR_HDR_ECC_UNC, - EQDMA_CPM5_ST_C2H_ERR_HDR_ECC_COR, - EQDMA_CPM5_ST_C2H_ERR_WRB_PORT_ID_ERR, - EQDMA_CPM5_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - EQDMA_CPM5_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_CPM5_ST_FATAL_ERR_LEN_MISMATCH, - EQDMA_CPM5_ST_FATAL_ERR_QID_MISMATCH, - EQDMA_CPM5_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_WPL_DATA_PAR, - EQDMA_CPM5_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - EQDMA_CPM5_ST_FATAL_ERR_HDR_ECC_UNC, - EQDMA_CPM5_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - EQDMA_CPM5_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_CPM5_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - EQDMA_CPM5_ST_H2C_ERR_NO_DMA_DSC, - EQDMA_CPM5_ST_H2C_ERR_SBE, - EQDMA_CPM5_ST_H2C_ERR_DBE, - EQDMA_CPM5_ST_H2C_ERR_PAR, - EQDMA_CPM5_ST_H2C_ERR_ALL, - - /* Single bit errors */ - EQDMA_CPM5_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_CPM5_SBE_1_ERR_TAG_ODD_RAM, - EQDMA_CPM5_SBE_1_ERR_TAG_EVEN_RAM, - EQDMA_CPM5_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_CPM5_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_CPM5_SBE_1_ERR_ALL, - - /* Single bit errors */ - EQDMA_CPM5_SBE_ERR_MI_H2C0_DAT, - EQDMA_CPM5_SBE_ERR_MI_H2C1_DAT, - EQDMA_CPM5_SBE_ERR_MI_H2C2_DAT, - EQDMA_CPM5_SBE_ERR_MI_H2C3_DAT, - EQDMA_CPM5_SBE_ERR_MI_C2H0_DAT, - EQDMA_CPM5_SBE_ERR_MI_C2H1_DAT, - EQDMA_CPM5_SBE_ERR_MI_C2H2_DAT, - EQDMA_CPM5_SBE_ERR_MI_C2H3_DAT, - EQDMA_CPM5_SBE_ERR_H2C_RD_BRG_DAT, - EQDMA_CPM5_SBE_ERR_H2C_WR_BRG_DAT, - EQDMA_CPM5_SBE_ERR_C2H_RD_BRG_DAT, - EQDMA_CPM5_SBE_ERR_C2H_WR_BRG_DAT, - EQDMA_CPM5_SBE_ERR_FUNC_MAP, - EQDMA_CPM5_SBE_ERR_DSC_HW_CTXT, - EQDMA_CPM5_SBE_ERR_DSC_CRD_RCV, - EQDMA_CPM5_SBE_ERR_DSC_SW_CTXT, - EQDMA_CPM5_SBE_ERR_DSC_CPLI, - EQDMA_CPM5_SBE_ERR_DSC_CPLD, - EQDMA_CPM5_SBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_TIMER_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_QID_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_CPM5_SBE_ERR_INT_CTXT_RAM, - EQDMA_CPM5_SBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_PFCH_CTXT_RAM, - EQDMA_CPM5_SBE_ERR_WRB_CTXT_RAM, - EQDMA_CPM5_SBE_ERR_PFCH_LL_RAM, - EQDMA_CPM5_SBE_ERR_PEND_FIFO_RAM, - EQDMA_CPM5_SBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_CPM5_SBE_ERR_ALL, - - /* Double bit Errors */ - EQDMA_CPM5_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_CPM5_DBE_1_ERR_TAG_ODD_RAM, - EQDMA_CPM5_DBE_1_ERR_TAG_EVEN_RAM, - EQDMA_CPM5_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_CPM5_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_CPM5_DBE_1_ERR_ALL, - - /* Double bit Errors */ - EQDMA_CPM5_DBE_ERR_MI_H2C0_DAT, - EQDMA_CPM5_DBE_ERR_MI_H2C1_DAT, - EQDMA_CPM5_DBE_ERR_MI_H2C2_DAT, - EQDMA_CPM5_DBE_ERR_MI_H2C3_DAT, - EQDMA_CPM5_DBE_ERR_MI_C2H0_DAT, - EQDMA_CPM5_DBE_ERR_MI_C2H1_DAT, - EQDMA_CPM5_DBE_ERR_MI_C2H2_DAT, - EQDMA_CPM5_DBE_ERR_MI_C2H3_DAT, - EQDMA_CPM5_DBE_ERR_H2C_RD_BRG_DAT, - EQDMA_CPM5_DBE_ERR_H2C_WR_BRG_DAT, - EQDMA_CPM5_DBE_ERR_C2H_RD_BRG_DAT, - EQDMA_CPM5_DBE_ERR_C2H_WR_BRG_DAT, - EQDMA_CPM5_DBE_ERR_FUNC_MAP, - EQDMA_CPM5_DBE_ERR_DSC_HW_CTXT, - EQDMA_CPM5_DBE_ERR_DSC_CRD_RCV, - EQDMA_CPM5_DBE_ERR_DSC_SW_CTXT, - EQDMA_CPM5_DBE_ERR_DSC_CPLI, - EQDMA_CPM5_DBE_ERR_DSC_CPLD, - EQDMA_CPM5_DBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_TIMER_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_QID_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_CPM5_DBE_ERR_INT_CTXT_RAM, - EQDMA_CPM5_DBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_PFCH_CTXT_RAM, - EQDMA_CPM5_DBE_ERR_WRB_CTXT_RAM, - EQDMA_CPM5_DBE_ERR_PFCH_LL_RAM, - EQDMA_CPM5_DBE_ERR_PEND_FIFO_RAM, - EQDMA_CPM5_DBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_CPM5_DBE_ERR_ALL, - - /* MM C2H Errors */ - EQDMA_CPM5_MM_C2H_WR_SLR_ERR, - EQDMA_CPM5_MM_C2H_RD_SLR_ERR, - EQDMA_CPM5_MM_C2H_WR_FLR_ERR, - EQDMA_CPM5_MM_C2H_UR_ERR, - EQDMA_CPM5_MM_C2H_WR_UC_RAM_ERR, - EQDMA_CPM5_MM_C2H_ERR_ALL, - - /* MM H2C Engine0 Errors */ - EQDMA_CPM5_MM_H2C0_RD_HDR_POISON_ERR, - EQDMA_CPM5_MM_H2C0_RD_UR_CA_ERR, - EQDMA_CPM5_MM_H2C0_RD_HDR_BYTE_ERR, - EQDMA_CPM5_MM_H2C0_RD_HDR_PARAM_ERR, - EQDMA_CPM5_MM_H2C0_RD_HDR_ADR_ERR, - EQDMA_CPM5_MM_H2C0_RD_FLR_ERR, - EQDMA_CPM5_MM_H2C0_RD_DAT_POISON_ERR, - EQDMA_CPM5_MM_H2C0_RD_RQ_DIS_ERR, - EQDMA_CPM5_MM_H2C0_WR_DEC_ERR, - EQDMA_CPM5_MM_H2C0_WR_SLV_ERR, - EQDMA_CPM5_MM_H2C0_ERR_ALL, - - EQDMA_CPM5_ERRS_ALL -}; - -struct eqdma_cpm5_hw_err_info { - enum eqdma_cpm5_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*eqdma_cpm5_hw_err_process)(void *dev_hndl); -}; - -#ifdef EQDMA_CPM5_VF_GT_256Q_SUPPORTED -#define EQDMA_CPM5_OFFSET_VF_VERSION 0x21014 -#define EQDMA_CPM5_OFFSET_MBOX_BASE_VF 0x21000 -#else -#define EQDMA_CPM5_OFFSET_VF_VERSION 0x5014 -#define EQDMA_CPM5_OFFSET_MBOX_BASE_VF 0x5000 -#endif - -#define EQDMA_CPM5_OFFSET_MBOX_BASE_PF 0x42400 -#define EQDMA_CPM5_OFFSET_VF_USER_BAR 0x5018 - -#define EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_H_MASK GENMASK_ULL(63, 38) -#define EQDMA_CPM5_COMPL_CTXT_BADDR_HIGH_L_MASK GENMASK_ULL(37, 6) -#define EQDMA_CPM5_COMPL_CTXT_BADDR_LOW_MASK GENMASK_ULL(5, 2) - -int eqdma_cpm5_init_ctxt_memory(void *dev_hndl); - -#ifdef TANDEM_BOOT_SUPPORTED -int eqdma_cpm5_init_st_ctxt(void *dev_hndl); -#endif - -int eqdma_cpm5_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - -int eqdma_cpm5_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int eqdma_cpm5_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -int eqdma_cpm5_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -uint32_t eqdma_cpm5_reg_dump_buf_len(void); - -int eqdma_cpm5_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int eqdma_cpm5_hw_error_process(void *dev_hndl); -const char *eqdma_cpm5_hw_get_error_name(uint32_t err_idx); -int eqdma_cpm5_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int eqdma_cpm5_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int eqdma_cpm5_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -int eqdma_cpm5_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - -int eqdma_cpm5_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int eqdma_cpm5_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int eqdma_cpm5_set_default_global_csr(void *dev_hndl); - -int eqdma_cpm5_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int eqdma_cpm5_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, uint8_t enable); - -int eqdma_cpm5_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -uint32_t eqdma_cpm5_get_config_num_regs(void); - -struct xreg_info *eqdma_cpm5_get_config_regs(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __EQDMA_CPM5_SOFT_ACCESS_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg.h deleted file mode 100755 index 4027484..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg.h +++ /dev/null @@ -1,1284 +0,0 @@ -/* - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __EQDMA_CPM5_REG_H -#define __EQDMA_CPM5_REG_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - -#define DEBGFS_LINE_SZ (81) - -#ifdef ARRAY_SIZE -#undef ARRAY_SIZE -#endif -#define ARRAY_SIZE(arr) (sizeof(arr) / \ - sizeof(arr[0])) - - -uint32_t eqdma_cpm5_config_num_regs_get(void); -struct xreg_info *eqdma_cpm5_config_regs_get(void); -#define EQDMA_CPM5_CFG_BLK_IDENTIFIER_ADDR 0x00 -#define CFG_BLK_IDENTIFIER_MASK GENMASK(31, 20) -#define CFG_BLK_IDENTIFIER_1_MASK GENMASK(19, 16) -#define CFG_BLK_IDENTIFIER_RSVD_1_MASK GENMASK(15, 8) -#define CFG_BLK_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_CPM5_CFG_BLK_PCIE_MAX_PLD_SIZE_ADDR 0x08 -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ADDR 0x0C -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_BLK_SYSTEM_ID_ADDR 0x10 -#define CFG_BLK_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 17) -#define CFG_BLK_SYSTEM_ID_INST_TYPE_MASK BIT(16) -#define CFG_BLK_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_CPM5_CFG_BLK_MSIX_ENABLE_ADDR 0x014 -#define CFG_BLK_MSIX_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CPM5_CFG_PCIE_DATA_WIDTH_ADDR 0x18 -#define CFG_PCIE_DATA_WIDTH_RSVD_1_MASK GENMASK(31, 3) -#define CFG_PCIE_DATA_WIDTH_DATAPATH_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_PCIE_CTL_ADDR 0x1C -#define CFG_PCIE_CTL_RSVD_1_MASK GENMASK(31, 18) -#define CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK GENMASK(17, 16) -#define CFG_PCIE_CTL_RSVD_2_MASK GENMASK(15, 2) -#define CFG_PCIE_CTL_RRQ_DISABLE_MASK BIT(1) -#define CFG_PCIE_CTL_RELAXED_ORDERING_MASK BIT(0) -#define EQDMA_CPM5_CFG_BLK_MSI_ENABLE_ADDR 0x20 -#define CFG_BLK_MSI_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CPM5_CFG_AXI_USER_MAX_PLD_SIZE_ADDR 0x40 -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_AXI_USER_MAX_READ_REQ_SIZE_ADDR 0x44 -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK GENMASK(2, 0) -#define EQDMA_CPM5_CFG_BLK_MISC_CTL_ADDR 0x4C -#define CFG_BLK_MISC_CTL_RSVD_1_MASK GENMASK(31, 24) -#define CFG_BLK_MISC_CTL_10B_TAG_EN_MASK BIT(23) -#define CFG_BLK_MISC_CTL_RSVD_2_MASK BIT(22) -#define CFG_BLK_MISC_CTL_AXI_WBK_MASK BIT(21) -#define CFG_BLK_MISC_CTL_AXI_DSC_MASK BIT(20) -#define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) -#define CFG_BLK_MISC_CTL_RSVD_3_MASK GENMASK(7, 5) -#define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) -#define EQDMA_CPM5_CFG_PL_CRED_CTL_ADDR 0x68 -#define CFG_PL_CRED_CTL_RSVD_1_MASK GENMASK(31, 5) -#define CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK BIT(4) -#define CFG_PL_CRED_CTL_RSVD_2_MASK GENMASK(3, 1) -#define CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK BIT(0) -#define EQDMA_CPM5_CFG_BLK_SCRATCH_ADDR 0x80 -#define CFG_BLK_SCRATCH_MASK GENMASK(31, 0) -#define EQDMA_CPM5_CFG_GIC_ADDR 0xA0 -#define CFG_GIC_RSVD_1_MASK GENMASK(31, 1) -#define CFG_GIC_GIC_IRQ_MASK BIT(0) -#define EQDMA_CPM5_RAM_SBE_MSK_1_A_ADDR 0xE0 -#define RAM_SBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_CPM5_RAM_SBE_STS_1_A_ADDR 0xE4 -#define RAM_SBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_CPM5_RAM_DBE_MSK_1_A_ADDR 0xE8 -#define RAM_DBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_CPM5_RAM_DBE_STS_1_A_ADDR 0xEC -#define RAM_DBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_CPM5_RAM_SBE_MSK_A_ADDR 0xF0 -#define RAM_SBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_CPM5_RAM_SBE_STS_A_ADDR 0xF4 -#define RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_SBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_SBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_SBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_SBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_SBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_SBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_SBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_SBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_SBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_SBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_SBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_SBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_SBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_SBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_SBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_SBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_SBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_SBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_SBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_CPM5_RAM_DBE_MSK_A_ADDR 0xF8 -#define RAM_DBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_CPM5_RAM_DBE_STS_A_ADDR 0xFC -#define RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_DBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_DBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_DBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_DBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_DBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_DBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_DBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_DBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_DBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_DBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_DBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_DBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_DBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_DBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_DBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_DBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_DBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_DBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_DBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_IDENTIFIER_ADDR 0x100 -#define GLBL2_IDENTIFIER_MASK GENMASK(31, 8) -#define GLBL2_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_INST_ADDR 0x114 -#define GLBL2_CHANNEL_INST_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_INST_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_INST_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_INST_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_INST_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_INST_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_INST_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_MDMA_ADDR 0x118 -#define GLBL2_CHANNEL_MDMA_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_MDMA_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_MDMA_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_MDMA_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_MDMA_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_MDMA_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_MDMA_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_STRM_ADDR 0x11C -#define GLBL2_CHANNEL_STRM_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_STRM_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_STRM_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_STRM_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_STRM_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_STRM_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_STRM_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_CAP_ADDR 0x120 -#define GLBL2_CHANNEL_CAP_RSVD_1_MASK GENMASK(31, 12) -#define GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK GENMASK(11, 0) -#define EQDMA_CPM5_GLBL2_CHANNEL_PASID_CAP_ADDR 0x128 -#define GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK GENMASK(31, 2) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK BIT(1) -#define GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_SYSTEM_ID_ADDR 0x130 -#define GLBL2_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL2_MISC_CAP_ADDR 0x134 -#define GLBL2_MISC_CAP_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL2_DBG_PCIE_RQ0_ADDR 0x1B8 -#define GLBL2_PCIE_RQ0_NPH_AVL_MASK GENMASK(31, 20) -#define GLBL2_PCIE_RQ0_RCB_AVL_MASK GENMASK(19, 9) -#define GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK GENMASK(8, 2) -#define GLBL2_PCIE_RQ0_TAG_EP_MASK GENMASK(1, 0) -#define EQDMA_CPM5_GLBL2_DBG_PCIE_RQ1_ADDR 0x1BC -#define GLBL2_PCIE_RQ1_RSVD_1_MASK GENMASK(31, 21) -#define GLBL2_PCIE_RQ1_TAG_FL_MASK GENMASK(20, 19) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK BIT(18) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK BIT(17) -#define GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK BIT(16) -#define GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK BIT(15) -#define GLBL2_PCIE_RQ1_TLPSM_MASK GENMASK(14, 12) -#define GLBL2_PCIE_RQ1_TLPSM512_MASK GENMASK(11, 9) -#define GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK BIT(8) -#define GLBL2_PCIE_RQ1_RREQ0_SLV_MASK BIT(7) -#define GLBL2_PCIE_RQ1_RREQ0_VLD_MASK BIT(6) -#define GLBL2_PCIE_RQ1_RREQ0_RDY_MASK BIT(5) -#define GLBL2_PCIE_RQ1_RREQ1_SLV_MASK BIT(4) -#define GLBL2_PCIE_RQ1_RREQ1_VLD_MASK BIT(3) -#define GLBL2_PCIE_RQ1_RREQ1_RDY_MASK BIT(2) -#define GLBL2_PCIE_RQ1_WTLP_REQ_MASK BIT(1) -#define GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_AXIMM_WR0_ADDR 0x1C0 -#define GLBL2_AXIMM_WR0_RSVD_1_MASK GENMASK(31, 27) -#define GLBL2_AXIMM_WR0_WR_REQ_MASK BIT(26) -#define GLBL2_AXIMM_WR0_WR_CHN_MASK GENMASK(25, 23) -#define GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK BIT(22) -#define GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK BIT(21) -#define GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK GENMASK(20, 18) -#define GLBL2_AXIMM_WR0_WRREQ_CNT_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR0_BID_MASK GENMASK(11, 9) -#define GLBL2_AXIMM_WR0_BVALID_MASK BIT(8) -#define GLBL2_AXIMM_WR0_BREADY_MASK BIT(7) -#define GLBL2_AXIMM_WR0_WVALID_MASK BIT(6) -#define GLBL2_AXIMM_WR0_WREADY_MASK BIT(5) -#define GLBL2_AXIMM_WR0_AWID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_WR0_AWVALID_MASK BIT(1) -#define GLBL2_AXIMM_WR0_AWREADY_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_AXIMM_WR1_ADDR 0x1C4 -#define GLBL2_AXIMM_WR1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_WR1_BRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_WR1_BRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_WR1_BRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR1_BRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_WR1_BRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_CPM5_GLBL2_DBG_AXIMM_RD0_ADDR 0x1C8 -#define GLBL2_AXIMM_RD0_RSVD_1_MASK GENMASK(31, 23) -#define GLBL2_AXIMM_RD0_PND_CNT_MASK GENMASK(22, 17) -#define GLBL2_AXIMM_RD0_RD_REQ_MASK BIT(16) -#define GLBL2_AXIMM_RD0_RD_CHNL_MASK GENMASK(15, 13) -#define GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK GENMASK(12, 10) -#define GLBL2_AXIMM_RD0_RID_MASK GENMASK(9, 7) -#define GLBL2_AXIMM_RD0_RVALID_MASK BIT(6) -#define GLBL2_AXIMM_RD0_RREADY_MASK BIT(5) -#define GLBL2_AXIMM_RD0_ARID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_RD0_ARVALID_MASK BIT(1) -#define GLBL2_AXIMM_RD0_ARREADY_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_AXIMM_RD1_ADDR 0x1CC -#define GLBL2_AXIMM_RD1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_RD1_RRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_RD1_RRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_RD1_RRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_RD1_RRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_RD1_RRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_CPM5_GLBL2_DBG_FAB0_ADDR 0x1D0 -#define GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK BIT(31) -#define GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK BIT(30) -#define GLBL2_FAB0_H2C_SEG_IN_VLD_MASK BIT(29) -#define GLBL2_FAB0_H2C_SEG_IN_RDY_MASK BIT(28) -#define GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK GENMASK(27, 24) -#define GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK BIT(23) -#define GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK GENMASK(22, 16) -#define GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK BIT(15) -#define GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK BIT(14) -#define GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK GENMASK(13, 10) -#define GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK BIT(9) -#define GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK BIT(8) -#define GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK BIT(7) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK BIT(6) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK BIT(5) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK BIT(3) -#define GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK BIT(2) -#define GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK BIT(1) -#define GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_FAB1_ADDR 0x1D4 -#define GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK GENMASK(31, 25) -#define GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK GENMASK(24, 18) -#define GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK BIT(17) -#define GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK BIT(16) -#define GLBL2_FAB1_RSVD_1_MASK GENMASK(15, 13) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK BIT(12) -#define GLBL2_FAB1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK BIT(8) -#define GLBL2_FAB1_RSVD_3_MASK GENMASK(7, 5) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB1_RSVD_4_MASK GENMASK(3, 1) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_CPM5_GLBL2_DBG_MATCH_SEL_ADDR 0x1F4 -#define GLBL2_MATCH_SEL_RSV_MASK GENMASK(31, 18) -#define GLBL2_MATCH_SEL_CSR_SEL_MASK GENMASK(17, 13) -#define GLBL2_MATCH_SEL_CSR_EN_MASK BIT(12) -#define GLBL2_MATCH_SEL_ROTATE1_MASK GENMASK(11, 10) -#define GLBL2_MATCH_SEL_ROTATE0_MASK GENMASK(9, 8) -#define GLBL2_MATCH_SEL_SEL_MASK GENMASK(7, 0) -#define EQDMA_CPM5_GLBL2_DBG_MATCH_MSK_ADDR 0x1F8 -#define GLBL2_MATCH_MSK_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL2_DBG_MATCH_PAT_ADDR 0x1FC -#define GLBL2_MATCH_PAT_PATTERN_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_1_ADDR 0x204 -#define GLBL_RNG_SZ_1_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_1_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_2_ADDR 0x208 -#define GLBL_RNG_SZ_2_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_2_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_3_ADDR 0x20C -#define GLBL_RNG_SZ_3_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_3_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_4_ADDR 0x210 -#define GLBL_RNG_SZ_4_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_4_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_5_ADDR 0x214 -#define GLBL_RNG_SZ_5_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_5_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_6_ADDR 0x218 -#define GLBL_RNG_SZ_6_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_6_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_7_ADDR 0x21C -#define GLBL_RNG_SZ_7_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_7_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_8_ADDR 0x220 -#define GLBL_RNG_SZ_8_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_8_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_9_ADDR 0x224 -#define GLBL_RNG_SZ_9_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_9_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_A_ADDR 0x228 -#define GLBL_RNG_SZ_A_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_A_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_B_ADDR 0x22C -#define GLBL_RNG_SZ_B_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_B_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_C_ADDR 0x230 -#define GLBL_RNG_SZ_C_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_C_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_D_ADDR 0x234 -#define GLBL_RNG_SZ_D_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_D_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_E_ADDR 0x238 -#define GLBL_RNG_SZ_E_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_E_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_F_ADDR 0x23C -#define GLBL_RNG_SZ_F_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_F_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_RNG_SZ_10_ADDR 0x240 -#define GLBL_RNG_SZ_10_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_10_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_ERR_STAT_ADDR 0x248 -#define GLBL_ERR_STAT_RSVD_1_MASK GENMASK(31, 18) -#define GLBL_ERR_STAT_ERR_FAB_MASK BIT(17) -#define GLBL_ERR_STAT_ERR_H2C_ST_MASK BIT(16) -#define GLBL_ERR_STAT_ERR_BDG_MASK BIT(15) -#define GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK GENMASK(14, 9) -#define GLBL_ERR_STAT_ERR_C2H_ST_MASK BIT(8) -#define GLBL_ERR_STAT_ERR_C2H_MM_1_MASK BIT(7) -#define GLBL_ERR_STAT_ERR_C2H_MM_0_MASK BIT(6) -#define GLBL_ERR_STAT_ERR_H2C_MM_1_MASK BIT(5) -#define GLBL_ERR_STAT_ERR_H2C_MM_0_MASK BIT(4) -#define GLBL_ERR_STAT_ERR_TRQ_MASK BIT(3) -#define GLBL_ERR_STAT_ERR_DSC_MASK BIT(2) -#define GLBL_ERR_STAT_ERR_RAM_DBE_MASK BIT(1) -#define GLBL_ERR_STAT_ERR_RAM_SBE_MASK BIT(0) -#define EQDMA_CPM5_GLBL_ERR_MASK_ADDR 0x24C -#define GLBL_ERR_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL_DSC_CFG_ADDR 0x250 -#define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 10) -#define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) -#define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) -#define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) -#define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) -#define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define EQDMA_CPM5_GLBL_DSC_ERR_STS_ADDR 0x254 -#define GLBL_DSC_ERR_STS_RSVD_1_MASK GENMASK(31, 26) -#define GLBL_DSC_ERR_STS_PORT_ID_MASK BIT(25) -#define GLBL_DSC_ERR_STS_SBE_MASK BIT(24) -#define GLBL_DSC_ERR_STS_DBE_MASK BIT(23) -#define GLBL_DSC_ERR_STS_RQ_CANCEL_MASK BIT(22) -#define GLBL_DSC_ERR_STS_DSC_MASK BIT(21) -#define GLBL_DSC_ERR_STS_DMA_MASK BIT(20) -#define GLBL_DSC_ERR_STS_FLR_CANCEL_MASK BIT(19) -#define GLBL_DSC_ERR_STS_RSVD_2_MASK GENMASK(18, 17) -#define GLBL_DSC_ERR_STS_DAT_POISON_MASK BIT(16) -#define GLBL_DSC_ERR_STS_TIMEOUT_MASK BIT(9) -#define GLBL_DSC_ERR_STS_FLR_MASK BIT(8) -#define GLBL_DSC_ERR_STS_TAG_MASK BIT(6) -#define GLBL_DSC_ERR_STS_ADDR_MASK BIT(5) -#define GLBL_DSC_ERR_STS_PARAM_MASK BIT(4) -#define GLBL_DSC_ERR_STS_BCNT_MASK BIT(3) -#define GLBL_DSC_ERR_STS_UR_CA_MASK BIT(2) -#define GLBL_DSC_ERR_STS_POISON_MASK BIT(1) -#define EQDMA_CPM5_GLBL_DSC_ERR_MSK_ADDR 0x258 -#define GLBL_DSC_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL_DSC_ERR_LOG0_ADDR 0x25C -#define GLBL_DSC_ERR_LOG0_VALID_MASK BIT(31) -#define GLBL_DSC_ERR_LOG0_SEL_MASK BIT(30) -#define GLBL_DSC_ERR_LOG0_RSVD_1_MASK GENMASK(29, 13) -#define GLBL_DSC_ERR_LOG0_QID_MASK GENMASK(12, 0) -#define EQDMA_CPM5_GLBL_DSC_ERR_LOG1_ADDR 0x260 -#define GLBL_DSC_ERR_LOG1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_ERR_LOG1_CIDX_MASK GENMASK(27, 12) -#define GLBL_DSC_ERR_LOG1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK GENMASK(8, 5) -#define GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK GENMASK(4, 0) -#define EQDMA_CPM5_GLBL_TRQ_ERR_STS_ADDR 0x264 -#define GLBL_TRQ_ERR_STS_RSVD_1_MASK GENMASK(31, 8) -#define GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK BIT(7) -#define GLBL_TRQ_ERR_STS_RSVD_2_MASK BIT(6) -#define GLBL_TRQ_ERR_STS_QID_RANGE_MASK BIT(5) -#define GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK BIT(4) -#define GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK BIT(3) -#define GLBL_TRQ_ERR_STS_RSVD_3_MASK BIT(2) -#define GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK BIT(1) -#define GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK BIT(0) -#define EQDMA_CPM5_GLBL_TRQ_ERR_MSK_ADDR 0x268 -#define GLBL_TRQ_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_CPM5_GLBL_TRQ_ERR_LOG_ADDR 0x26C -#define GLBL_TRQ_ERR_LOG_SRC_MASK BIT(31) -#define GLBL_TRQ_ERR_LOG_TARGET_MASK GENMASK(30, 27) -#define GLBL_TRQ_ERR_LOG_FUNC_MASK GENMASK(26, 17) -#define GLBL_TRQ_ERR_LOG_ADDRESS_MASK GENMASK(16, 0) -#define EQDMA_CPM5_GLBL_DSC_DBG_DAT0_ADDR 0x270 -#define GLBL_DSC_DAT0_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK BIT(29) -#define GLBL_DSC_DAT0_CTXT_ARB_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK GENMASK(16, 12) -#define GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK BIT(11) -#define GLBL_DSC_DAT0_TMSTALL_MASK BIT(10) -#define GLBL_DSC_DAT0_RRQ_STALL_MASK GENMASK(9, 8) -#define GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK GENMASK(7, 6) -#define GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK GENMASK(5, 4) -#define GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK GENMASK(3, 2) -#define GLBL_DSC_DAT0_DSC_OUT_STALL_MASK GENMASK(1, 0) -#define EQDMA_CPM5_GLBL_DSC_DBG_DAT1_ADDR 0x274 -#define GLBL_DSC_DAT1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_DAT1_EVT_SPC_C2H_MASK GENMASK(27, 22) -#define GLBL_DSC_DAT1_EVT_SP_H2C_MASK GENMASK(21, 16) -#define GLBL_DSC_DAT1_DSC_SPC_C2H_MASK GENMASK(15, 8) -#define GLBL_DSC_DAT1_DSC_SPC_H2C_MASK GENMASK(7, 0) -#define EQDMA_CPM5_GLBL_DSC_DBG_CTL_ADDR 0x278 -#define GLBL_DSC_CTL_RSVD_1_MASK GENMASK(31, 3) -#define GLBL_DSC_CTL_SELECT_MASK GENMASK(2, 0) -#define EQDMA_CPM5_GLBL_DSC_ERR_LOG2_ADDR 0x27c -#define GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK GENMASK(31, 16) -#define GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK GENMASK(15, 0) -#define EQDMA_CPM5_GLBL_GLBL_INTERRUPT_CFG_ADDR 0x2c4 -#define GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK GENMASK(31, 2) -#define GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK BIT(1) -#define GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK BIT(0) -#define EQDMA_CPM5_GLBL_VCH_HOST_PROFILE_ADDR 0x2c8 -#define GLBL_VCH_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_VCH_HOST_PROFILE_2C_MM_MASK GENMASK(27, 24) -#define GLBL_VCH_HOST_PROFILE_2C_ST_MASK GENMASK(23, 20) -#define GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK GENMASK(19, 16) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK GENMASK(15, 12) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK GENMASK(7, 4) -#define GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK GENMASK(3, 0) -#define EQDMA_CPM5_GLBL_BRIDGE_HOST_PROFILE_ADDR 0x308 -#define GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 4) -#define GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK GENMASK(3, 0) -#define EQDMA_CPM5_AXIMM_IRQ_DEST_ADDR_ADDR 0x30c -#define AXIMM_IRQ_DEST_ADDR_ADDR_MASK GENMASK(31, 0) -#define EQDMA_CPM5_FAB_ERR_LOG_ADDR 0x314 -#define FAB_ERR_LOG_RSVD_1_MASK GENMASK(31, 7) -#define FAB_ERR_LOG_SRC_MASK GENMASK(6, 0) -#define EQDMA_CPM5_IND_CTXT_DATA_ADDR 0x804 -#define IND_CTXT_DATA_DATA_MASK GENMASK(31, 0) -#define EQDMA_CPM5_IND_CTXT_MASK_ADDR 0x824 -#define IND_CTXT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_IND_CTXT_CMD_ADDR 0x844 -#define IND_CTXT_CMD_RSVD_1_MASK GENMASK(31, 20) -#define IND_CTXT_CMD_QID_MASK GENMASK(19, 7) -#define IND_CTXT_CMD_OP_MASK GENMASK(6, 5) -#define IND_CTXT_CMD_SEL_MASK GENMASK(4, 1) -#define IND_CTXT_CMD_BUSY_MASK BIT(0) -#define EQDMA_CPM5_C2H_TIMER_CNT_ADDR 0xA00 -#define C2H_TIMER_CNT_RSVD_1_MASK GENMASK(31, 16) -#define C2H_TIMER_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CNT_TH_ADDR 0xA40 -#define C2H_CNT_TH_RSVD_1_MASK GENMASK(31, 16) -#define C2H_CNT_TH_THESHOLD_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR 0xA88 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR 0xA8C -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR 0xA90 -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_AXIS_PKG_CMP_ADDR 0xA94 -#define C2H_STAT_AXIS_PKG_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_AXIS_PKG_CMP_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_ACCEPTED_ADDR 0xA98 -#define C2H_STAT_DESC_RSP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_ACCEPTED_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_CMP_ADDR 0xA9C -#define C2H_STAT_DESC_RSP_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_CMP_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_WRQ_OUT_ADDR 0xAA0 -#define C2H_STAT_WRQ_OUT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WRQ_OUT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_WPL_REN_ACCEPTED_ADDR 0xAA4 -#define C2H_STAT_WPL_REN_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WPL_REN_ACCEPTED_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_TOTAL_WRQ_LEN_ADDR 0xAA8 -#define C2H_STAT_TOTAL_WRQ_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_TOTAL_WRQ_LEN_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_TOTAL_WPL_LEN_ADDR 0xAAC -#define C2H_STAT_TOTAL_WPL_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_TOTAL_WPL_LEN_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_BUF_SZ_ADDR 0xAB0 -#define C2H_BUF_SZ_IZE_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_ERR_STAT_ADDR 0xAF0 -#define C2H_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK BIT(20) -#define C2H_ERR_STAT_HDR_PAR_ERR_MASK BIT(19) -#define C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK BIT(18) -#define C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(17) -#define C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK BIT(16) -#define C2H_ERR_STAT_WRB_PRTY_ERR_MASK BIT(15) -#define C2H_ERR_STAT_WRB_CIDX_ERR_MASK BIT(14) -#define C2H_ERR_STAT_WRB_QFULL_ERR_MASK BIT(13) -#define C2H_ERR_STAT_WRB_INV_Q_ERR_MASK BIT(12) -#define C2H_ERR_STAT_RSVD_2_MASK BIT(11) -#define C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK BIT(10) -#define C2H_ERR_STAT_ERR_DESC_CNT_MASK BIT(9) -#define C2H_ERR_STAT_RSVD_3_MASK BIT(8) -#define C2H_ERR_STAT_MSI_INT_FAIL_MASK BIT(7) -#define C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define C2H_ERR_STAT_RSVD_4_MASK BIT(5) -#define C2H_ERR_STAT_DESC_RSP_ERR_MASK BIT(4) -#define C2H_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK BIT(2) -#define C2H_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_CPM5_C2H_ERR_MASK_ADDR 0xAF4 -#define C2H_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_FATAL_ERR_STAT_ADDR 0xAF8 -#define C2H_FATAL_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(20) -#define C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK BIT(19) -#define C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK BIT(18) -#define C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK BIT(17) -#define C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK BIT(15) -#define C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define C2H_FATAL_ERR_STAT_RESERVED2_MASK BIT(13) -#define C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK BIT(9) -#define C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK BIT(8) -#define C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK GENMASK(7, 4) -#define C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_FATAL_ERR_STAT_RESERVED1_MASK BIT(2) -#define C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_CPM5_C2H_FATAL_ERR_MASK_ADDR 0xAFC -#define C2H_FATAL_ERR_C2HEN_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_FATAL_ERR_ENABLE_ADDR 0xB00 -#define C2H_FATAL_ERR_ENABLE_RSVD_1_MASK GENMASK(31, 2) -#define C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK BIT(1) -#define C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK BIT(0) -#define EQDMA_CPM5_GLBL_ERR_INT_ADDR 0xB04 -#define GLBL_ERR_INT_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_ERR_INT_HOST_ID_MASK GENMASK(29, 26) -#define GLBL_ERR_INT_DIS_INTR_ON_VF_MASK BIT(25) -#define GLBL_ERR_INT_ARM_MASK BIT(24) -#define GLBL_ERR_INT_EN_COAL_MASK BIT(23) -#define GLBL_ERR_INT_VEC_MASK GENMASK(22, 12) -#define GLBL_ERR_INT_FUNC_MASK GENMASK(11, 0) -#define EQDMA_CPM5_C2H_PFCH_CFG_ADDR 0xB08 -#define C2H_PFCH_CFG_EVTFL_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_FL_TH_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_PFCH_CFG_1_ADDR 0xA80 -#define C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_1_QCNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_PFCH_CFG_2_ADDR 0xA84 -#define C2H_PFCH_CFG_2_FENCE_MASK BIT(31) -#define C2H_PFCH_CFG_2_RSVD_MASK GENMASK(30, 29) -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK BIT(28) -#define C2H_PFCH_CFG_2_LL_SZ_TH_MASK GENMASK(27, 12) -#define C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK GENMASK(11, 6) -#define C2H_PFCH_CFG_2_NUM_MASK GENMASK(5, 0) -#define EQDMA_CPM5_C2H_INT_TIMER_TICK_ADDR 0xB0C -#define C2H_INT_TIMER_TICK_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR 0xB10 -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR 0xB14 -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_REQ_ADDR 0xB18 -#define C2H_STAT_DESC_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DESC_REQ_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_0_ADDR 0xB1C -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK BIT(31) -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK BIT(30) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK GENMASK(29, 27) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK GENMASK(26, 24) -#define C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK BIT(23) -#define C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK BIT(22) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK BIT(21) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK GENMASK(20, 9) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK BIT(8) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK GENMASK(7, 5) -#define C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK BIT(4) -#define C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK GENMASK(3, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_1_ADDR 0xB20 -#define C2H_STAT_DMA_ENG_1_RSVD_1_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK GENMASK(6, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_2_ADDR 0xB24 -#define C2H_STAT_DMA_ENG_2_RSVD_1_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_MASK GENMASK(6, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_3_ADDR 0xB28 -#define C2H_STAT_DMA_ENG_3_RSVD_1_MASK GENMASK(31, 24) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT_MASK GENMASK(23, 19) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK BIT(18) -#define C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK BIT(17) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK BIT(16) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK BIT(15) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK BIT(14) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK BIT(13) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK BIT(12) -#define C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK BIT(11) -#define C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK BIT(10) -#define C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0_MASK BIT(9) -#define C2H_STAT_DMA_ENG_3_WRQ_VLD_MASK BIT(8) -#define C2H_STAT_DMA_ENG_3_WRQ_RDY_MASK BIT(7) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY_MASK BIT(6) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP_MASK BIT(5) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR_MASK BIT(4) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER_MASK BIT(3) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR_MASK BIT(2) -#define C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK BIT(1) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK BIT(0) -#define EQDMA_CPM5_C2H_DBG_PFCH_ERR_CTXT_ADDR 0xB2C -#define C2H_PFCH_ERR_CTXT_RSVD_1_MASK GENMASK(31, 14) -#define C2H_PFCH_ERR_CTXT_ERR_STAT_MASK BIT(13) -#define C2H_PFCH_ERR_CTXT_CMD_WR_MASK BIT(12) -#define C2H_PFCH_ERR_CTXT_QID_MASK GENMASK(11, 1) -#define C2H_PFCH_ERR_CTXT_DONE_MASK BIT(0) -#define EQDMA_CPM5_C2H_FIRST_ERR_QID_ADDR 0xB30 -#define C2H_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(20, 16) -#define C2H_FIRST_ERR_QID_RSVD_MASK GENMASK(15, 13) -#define C2H_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_CPM5_STAT_NUM_WRB_IN_ADDR 0xB34 -#define STAT_NUM_WRB_IN_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_IN_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_WRB_OUT_ADDR 0xB38 -#define STAT_NUM_WRB_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_OUT_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_WRB_DRP_ADDR 0xB3C -#define STAT_NUM_WRB_DRP_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_DRP_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_STAT_DESC_OUT_ADDR 0xB40 -#define STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_STAT_DESC_OUT_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_DSC_CRDT_SENT_ADDR 0xB44 -#define STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_DSC_CRDT_SENT_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_FCH_DSC_RCVD_ADDR 0xB48 -#define STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_STAT_NUM_BYP_DSC_RCVD_ADDR 0xB4C -#define STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK GENMASK(31, 11) -#define STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK GENMASK(10, 0) -#define EQDMA_CPM5_C2H_WRB_COAL_CFG_ADDR 0xB50 -#define C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define C2H_WRB_COAL_CFG_TICK_VAL_MASK GENMASK(25, 14) -#define C2H_WRB_COAL_CFG_TICK_CNT_MASK GENMASK(13, 2) -#define C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK BIT(1) -#define C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK BIT(0) -#define EQDMA_CPM5_C2H_INTR_H2C_REQ_ADDR 0xB54 -#define C2H_INTR_H2C_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_MM_REQ_ADDR 0xB58 -#define C2H_INTR_C2H_MM_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_MM_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_ERR_INT_REQ_ADDR 0xB5C -#define C2H_INTR_ERR_INT_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_ERR_INT_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_REQ_ADDR 0xB60 -#define C2H_INTR_C2H_ST_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_ADDR 0xB64 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_ADDR 0xB68 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_ADDR 0xB6C -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_ADDR 0xB70 -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_MSIX_ACK_ADDR 0xB74 -#define C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_MSIX_FAIL_ADDR 0xB78 -#define C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_NO_MSIX_ADDR 0xB7C -#define C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_C2H_ST_CTXT_INVAL_ADDR 0xB80 -#define C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_WR_CMP_ADDR 0xB84 -#define C2H_STAT_WR_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WR_CMP_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_4_ADDR 0xB88 -#define C2H_STAT_DMA_ENG_4_RSVD_1_MASK GENMASK(31, 24) -#define C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT_MASK GENMASK(23, 19) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_MASK BIT(18) -#define C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_MASK BIT(17) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_MASK BIT(16) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_MASK BIT(15) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK BIT(14) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_MASK BIT(13) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_MASK BIT(12) -#define C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_MASK BIT(11) -#define C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_MASK BIT(10) -#define C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0_MASK BIT(9) -#define C2H_STAT_DMA_ENG_4_WRQ_VLD_MASK BIT(8) -#define C2H_STAT_DMA_ENG_4_WRQ_RDY_MASK BIT(7) -#define C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY_MASK BIT(6) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP_MASK BIT(5) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR_MASK BIT(4) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER_MASK BIT(3) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR_MASK BIT(2) -#define C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_MASK BIT(1) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_MASK BIT(0) -#define EQDMA_CPM5_C2H_STAT_DBG_DMA_ENG_5_ADDR 0xB8C -#define C2H_STAT_DMA_ENG_5_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK BIT(29) -#define C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK GENMASK(28, 24) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK GENMASK(23, 22) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK GENMASK(21, 6) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK BIT(5) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK BIT(4) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK BIT(3) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK BIT(2) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK BIT(1) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK BIT(0) -#define EQDMA_CPM5_C2H_DBG_PFCH_QID_ADDR 0xB90 -#define C2H_PFCH_QID_RSVD_1_MASK GENMASK(31, 16) -#define C2H_PFCH_QID_ERR_CTXT_MASK BIT(15) -#define C2H_PFCH_QID_TARGET_MASK GENMASK(14, 12) -#define C2H_PFCH_QID_QID_OR_TAG_MASK GENMASK(11, 0) -#define EQDMA_CPM5_C2H_DBG_PFCH_ADDR 0xB94 -#define C2H_PFCH_DATA_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_INT_DBG_ADDR 0xB98 -#define C2H_INT_RSVD_1_MASK GENMASK(31, 8) -#define C2H_INT_INT_COAL_SM_MASK GENMASK(7, 4) -#define C2H_INT_INT_SM_MASK GENMASK(3, 0) -#define EQDMA_CPM5_C2H_STAT_IMM_ACCEPTED_ADDR 0xB9C -#define C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_IMM_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_MARKER_ACCEPTED_ADDR 0xBA0 -#define C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_MARKER_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_DISABLE_CMP_ACCEPTED_ADDR 0xBA4 -#define C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_PLD_FIFO_CRDT_CNT_ADDR 0xBA8 -#define C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_PLD_FIFO_CRDT_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_DYN_REQ_ADDR 0xBAC -#define C2H_INTR_DYN_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_INTR_DYN_MISC_ADDR 0xBB0 -#define C2H_INTR_DYN_MISC_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_MISC_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_DROP_LEN_MISMATCH_ADDR 0xBB4 -#define C2H_DROP_LEN_MISMATCH_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_LEN_MISMATCH_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_DROP_DESC_RSP_LEN_ADDR 0xBB8 -#define C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_DESC_RSP_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_DROP_QID_FIFO_LEN_ADDR 0xBBC -#define C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_QID_FIFO_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_DROP_PLD_CNT_ADDR 0xBC0 -#define C2H_DROP_PLD_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_0_ADDR 0xBC4 -#define C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_0_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_1_ADDR 0xBC8 -#define C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_1_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_2_ADDR 0xBCC -#define C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_2_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_3_ADDR 0xBD0 -#define C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_3_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_4_ADDR 0xBD4 -#define C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_4_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_5_ADDR 0xBD8 -#define C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_5_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_CMPT_FORMAT_6_ADDR 0xBDC -#define C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_6_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_PFCH_CACHE_DEPTH_ADDR 0xBE0 -#define C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK GENMASK(23, 16) -#define C2H_PFCH_CACHE_DEPTH_MASK GENMASK(7, 0) -#define EQDMA_CPM5_C2H_WRB_COAL_BUF_DEPTH_ADDR 0xBE4 -#define C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK GENMASK(31, 8) -#define C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK GENMASK(7, 0) -#define EQDMA_CPM5_C2H_PFCH_CRDT_ADDR 0xBE8 -#define C2H_PFCH_CRDT_RSVD_1_MASK GENMASK(31, 1) -#define C2H_PFCH_CRDT_RSVD_2_MASK BIT(0) -#define EQDMA_CPM5_C2H_STAT_HAS_CMPT_ACCEPTED_ADDR 0xBEC -#define C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_STAT_HAS_PLD_ACCEPTED_ADDR 0xBF0 -#define C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_PLD_PKT_ID_ADDR 0xBF4 -#define C2H_PLD_PKT_ID_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_DATA_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_PLD_PKT_ID_1_ADDR 0xBF8 -#define C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_1_DATA_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_DROP_PLD_CNT_1_ADDR 0xBFC -#define C2H_DROP_PLD_CNT_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_1_CNT_MASK GENMASK(17, 0) -#define EQDMA_CPM5_H2C_ERR_STAT_ADDR 0xE00 -#define H2C_ERR_STAT_RSVD_1_MASK GENMASK(31, 6) -#define H2C_ERR_STAT_PAR_ERR_MASK BIT(5) -#define H2C_ERR_STAT_SBE_MASK BIT(4) -#define H2C_ERR_STAT_DBE_MASK BIT(3) -#define H2C_ERR_STAT_NO_DMA_DS_MASK BIT(2) -#define H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK BIT(1) -#define H2C_ERR_STAT_ZERO_LEN_DS_MASK BIT(0) -#define EQDMA_CPM5_H2C_ERR_MASK_ADDR 0xE04 -#define H2C_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_FIRST_ERR_QID_ADDR 0xE08 -#define H2C_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 20) -#define H2C_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(19, 16) -#define H2C_FIRST_ERR_QID_RSVD_2_MASK GENMASK(15, 13) -#define H2C_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_CPM5_H2C_DBG_REG0_ADDR 0xE0C -#define H2C_REG0_NUM_DSC_RCVD_MASK GENMASK(31, 16) -#define H2C_REG0_NUM_WRB_SENT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_H2C_DBG_REG1_ADDR 0xE10 -#define H2C_REG1_NUM_REQ_SENT_MASK GENMASK(31, 16) -#define H2C_REG1_NUM_CMP_SENT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_H2C_DBG_REG2_ADDR 0xE14 -#define H2C_REG2_RSVD_1_MASK GENMASK(31, 16) -#define H2C_REG2_NUM_ERR_DSC_RCVD_MASK GENMASK(15, 0) -#define EQDMA_CPM5_H2C_DBG_REG3_ADDR 0xE18 -#define H2C_REG3_RSVD_1_MASK BIT(31) -#define H2C_REG3_DSCO_FIFO_EMPTY_MASK BIT(30) -#define H2C_REG3_DSCO_FIFO_FULL_MASK BIT(29) -#define H2C_REG3_CUR_RC_STATE_MASK GENMASK(28, 26) -#define H2C_REG3_RDREQ_LINES_MASK GENMASK(25, 16) -#define H2C_REG3_RDATA_LINES_AVAIL_MASK GENMASK(15, 6) -#define H2C_REG3_PEND_FIFO_EMPTY_MASK BIT(5) -#define H2C_REG3_PEND_FIFO_FULL_MASK BIT(4) -#define H2C_REG3_CUR_RQ_STATE_MASK GENMASK(3, 2) -#define H2C_REG3_DSCI_FIFO_FULL_MASK BIT(1) -#define H2C_REG3_DSCI_FIFO_EMPTY_MASK BIT(0) -#define EQDMA_CPM5_H2C_DBG_REG4_ADDR 0xE1C -#define H2C_REG4_RDREQ_ADDR_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_FATAL_ERR_EN_ADDR 0xE20 -#define H2C_FATAL_ERR_EN_RSVD_1_MASK GENMASK(31, 1) -#define H2C_FATAL_ERR_EN_H2C_MASK BIT(0) -#define EQDMA_CPM5_H2C_REQ_THROT_PCIE_ADDR 0xE24 -#define H2C_REQ_THROT_PCIE_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_PCIE_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_PCIE_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_PCIE_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_CPM5_H2C_ALN_DBG_REG0_ADDR 0xE28 -#define H2C_ALN_REG0_NUM_PKT_SENT_MASK GENMASK(15, 0) -#define EQDMA_CPM5_H2C_REQ_THROT_AXIMM_ADDR 0xE2C -#define H2C_REQ_THROT_AXIMM_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_AXIMM_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_AXIMM_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_CPM5_C2H_MM_CTL_ADDR 0x1004 -#define C2H_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define C2H_MM_CTL_ERRC_EN_MASK BIT(8) -#define C2H_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define C2H_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_CPM5_C2H_MM_STATUS_ADDR 0x1040 -#define C2H_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define C2H_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_CPM5_C2H_MM_CMPL_DESC_CNT_ADDR 0x1048 -#define C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1054 -#define C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK BIT(31) -#define C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK BIT(30) -#define C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK BIT(29) -#define C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK BIT(28) -#define C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK GENMASK(27, 2) -#define C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK BIT(1) -#define C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(0) -#define EQDMA_CPM5_C2H_MM_ERR_CODE_ADDR 0x1058 -#define C2H_MM_ERR_CODE_RESERVED1_MASK GENMASK(31, 28) -#define C2H_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define C2H_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define C2H_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define C2H_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_CPM5_C2H_MM_ERR_INFO_ADDR 0x105C -#define C2H_MM_ERR_INFO_VALID_MASK BIT(31) -#define C2H_MM_ERR_INFO_SEL_MASK BIT(30) -#define C2H_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define C2H_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_CTL_ADDR 0x10C0 -#define C2H_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define C2H_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define C2H_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_CYCLE_CNT0_ADDR 0x10C4 -#define C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_CYCLE_CNT1_ADDR 0x10C8 -#define C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_DATA_CNT0_ADDR 0x10CC -#define C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_MM_PERF_MON_DATA_CNT1_ADDR 0x10D0 -#define C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_CPM5_C2H_MM_DBG_ADDR 0x10E8 -#define C2H_MM_RSVD_1_MASK GENMASK(31, 24) -#define C2H_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define C2H_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define C2H_MM_RD_STALL_MASK BIT(6) -#define C2H_MM_RRQ_FIFO_FI_MASK BIT(5) -#define C2H_MM_WR_STALL_MASK BIT(4) -#define C2H_MM_WRQ_FIFO_FI_MASK BIT(3) -#define C2H_MM_WBK_STALL_MASK BIT(2) -#define C2H_MM_DSC_FIFO_EP_MASK BIT(1) -#define C2H_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_CTL_ADDR 0x1204 -#define H2C_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define H2C_MM_CTL_ERRC_EN_MASK BIT(8) -#define H2C_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define H2C_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_STATUS_ADDR 0x1240 -#define H2C_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define H2C_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_CMPL_DESC_CNT_ADDR 0x1248 -#define H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1254 -#define H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK GENMASK(31, 30) -#define H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(29) -#define H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK BIT(28) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK GENMASK(27, 23) -#define H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK BIT(22) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK GENMASK(21, 17) -#define H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK BIT(16) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK GENMASK(15, 9) -#define H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK BIT(8) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK GENMASK(7, 6) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK BIT(5) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK BIT(4) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK BIT(3) -#define H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK BIT(2) -#define H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK BIT(1) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_ERR_CODE_ADDR 0x1258 -#define H2C_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 28) -#define H2C_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define H2C_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define H2C_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define H2C_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_CPM5_H2C_MM_ERR_INFO_ADDR 0x125C -#define H2C_MM_ERR_INFO_VALID_MASK BIT(31) -#define H2C_MM_ERR_INFO_SEL_MASK BIT(30) -#define H2C_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define H2C_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_CTL_ADDR 0x12C0 -#define H2C_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define H2C_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define H2C_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_CYCLE_CNT0_ADDR 0x12C4 -#define H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_CYCLE_CNT1_ADDR 0x12C8 -#define H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_DATA_CNT0_ADDR 0x12CC -#define H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_CPM5_H2C_MM_PERF_MON_DATA_CNT1_ADDR 0x12D0 -#define H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_CPM5_H2C_MM_DBG_ADDR 0x12E8 -#define H2C_MM_RSVD_1_MASK GENMASK(31, 24) -#define H2C_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define H2C_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define H2C_MM_RD_STALL_MASK BIT(6) -#define H2C_MM_RRQ_FIFO_FI_MASK BIT(5) -#define H2C_MM_WR_STALL_MASK BIT(4) -#define H2C_MM_WRQ_FIFO_FI_MASK BIT(3) -#define H2C_MM_WBK_STALL_MASK BIT(2) -#define H2C_MM_DSC_FIFO_EP_MASK BIT(1) -#define H2C_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_CPM5_C2H_CRDT_COAL_CFG_1_ADDR 0x1400 -#define C2H_CRDT_COAL_CFG_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK GENMASK(17, 10) -#define C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK GENMASK(9, 0) -#define EQDMA_CPM5_C2H_CRDT_COAL_CFG_2_ADDR 0x1404 -#define C2H_CRDT_COAL_CFG_2_RSVD_1_MASK GENMASK(31, 24) -#define C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK GENMASK(23, 16) -#define C2H_CRDT_COAL_CFG_2_RESERVED1_MASK GENMASK(15, 11) -#define C2H_CRDT_COAL_CFG_2_NT_TH_MASK GENMASK(10, 0) -#define EQDMA_CPM5_C2H_PFCH_BYP_QID_ADDR 0x1408 -#define C2H_PFCH_BYP_QID_RSVD_1_MASK GENMASK(31, 12) -#define C2H_PFCH_BYP_QID_MASK GENMASK(11, 0) -#define EQDMA_CPM5_C2H_PFCH_BYP_TAG_ADDR 0x140C -#define C2H_PFCH_BYP_TAG_RSVD_1_MASK GENMASK(31, 20) -#define C2H_PFCH_BYP_TAG_BYP_QID_MASK GENMASK(19, 8) -#define C2H_PFCH_BYP_TAG_RSVD_2_MASK BIT(7) -#define C2H_PFCH_BYP_TAG_MASK GENMASK(6, 0) -#define EQDMA_CPM5_C2H_WATER_MARK_ADDR 0x1500 -#define C2H_WATER_MARK_HIGH_WM_MASK GENMASK(31, 16) -#define C2H_WATER_MARK_LOW_WM_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_NOTIFY_EMPTY_ADDR 0x1800 -#define C2H_NOTIFY_EMPTY_RSVD_1_MASK GENMASK(31, 16) -#define C2H_NOTIFY_EMPTY_NOE_MASK GENMASK(15, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_C2H_ACCEPTED_1_ADDR 0x1804 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_1_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_WRB_ACCEPTED_1_ADDR 0x1808 -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_1_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_ADDR 0x180C -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_AXIS_PKG_CMP_1_ADDR 0x1810 -#define C2H_STAT_AXIS_PKG_CMP_1_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_STAT_S_AXIS_WRB_ACCEPTED_2_ADDR 0x1814 -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_2_MASK GENMASK(31, 0) -#define EQDMA_CPM5_C2H_ST_PLD_FIFO_DEPTH_ADDR 0x1818 -#define C2H_ST_PLD_FIFO_DEPTH_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK GENMASK(31, 11) -#define SW_IND_CTXT_DATA_W5_PASID_EN_MASK BIT(10) -#define SW_IND_CTXT_DATA_W5_PASID_H_MASK GENMASK(9, 0) -#define SW_IND_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 20) -#define SW_IND_CTXT_DATA_W4_HOST_ID_MASK GENMASK(19, 16) -#define SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK BIT(15) -#define SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK BIT(14) -#define SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK BIT(13) -#define SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(12) -#define SW_IND_CTXT_DATA_W4_INT_AGGR_MASK BIT(11) -#define SW_IND_CTXT_DATA_W4_VEC_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W3_DSC_BASE_H_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W2_DSC_BASE_L_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W1_IS_MM_MASK BIT(31) -#define SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK BIT(30) -#define SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK BIT(29) -#define SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK BIT(28) -#define SW_IND_CTXT_DATA_W1_ERR_MASK GENMASK(27, 26) -#define SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK BIT(25) -#define SW_IND_CTXT_DATA_W1_PORT_ID_MASK GENMASK(24, 22) -#define SW_IND_CTXT_DATA_W1_IRQ_EN_MASK BIT(21) -#define SW_IND_CTXT_DATA_W1_WBK_EN_MASK BIT(20) -#define SW_IND_CTXT_DATA_W1_MM_CHN_MASK BIT(19) -#define SW_IND_CTXT_DATA_W1_BYPASS_MASK BIT(18) -#define SW_IND_CTXT_DATA_W1_DSC_SZ_MASK GENMASK(17, 16) -#define SW_IND_CTXT_DATA_W1_RNG_SZ_MASK GENMASK(15, 12) -#define SW_IND_CTXT_DATA_W1_RSVD_1_MASK GENMASK(11, 9) -#define SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK GENMASK(8, 5) -#define SW_IND_CTXT_DATA_W1_AT_MASK BIT(4) -#define SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK BIT(3) -#define SW_IND_CTXT_DATA_W1_WBI_CHK_MASK BIT(2) -#define SW_IND_CTXT_DATA_W1_FCRD_EN_MASK BIT(1) -#define SW_IND_CTXT_DATA_W1_QEN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W0_RSV_MASK GENMASK(31, 29) -#define SW_IND_CTXT_DATA_W0_FNC_MASK GENMASK(28, 17) -#define SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK BIT(16) -#define SW_IND_CTXT_DATA_W0_PIDX_MASK GENMASK(15, 0) -#define HW_IND_CTXT_DATA_W1_RSVD_1_MASK BIT(15) -#define HW_IND_CTXT_DATA_W1_FETCH_PND_MASK GENMASK(14, 11) -#define HW_IND_CTXT_DATA_W1_EVT_PND_MASK BIT(10) -#define HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK BIT(9) -#define HW_IND_CTXT_DATA_W1_DSC_PND_MASK BIT(8) -#define HW_IND_CTXT_DATA_W1_RSVD_2_MASK GENMASK(7, 0) -#define HW_IND_CTXT_DATA_W0_CRD_USE_MASK GENMASK(31, 16) -#define HW_IND_CTXT_DATA_W0_CIDX_MASK GENMASK(15, 0) -#define CRED_CTXT_DATA_W0_RSVD_1_MASK GENMASK(31, 16) -#define CRED_CTXT_DATA_W0_CREDT_MASK GENMASK(15, 0) -#define PREFETCH_CTXT_DATA_W1_VALID_MASK BIT(13) -#define PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define PREFETCH_CTXT_DATA_W0_PFCH_MASK BIT(28) -#define PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK BIT(27) -#define PREFETCH_CTXT_DATA_W0_ERR_MASK BIT(26) -#define PREFETCH_CTXT_DATA_W0_RSVD_MASK GENMASK(25, 22) -#define PREFETCH_CTXT_DATA_W0_PFCH_NEED_MASK GENMASK(21, 16) -#define PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK GENMASK(15, 10) -#define PREFETCH_CTXT_DATA_W0_VIRTIO_MASK BIT(9) -#define PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK BIT(8) -#define PREFETCH_CTXT_DATA_W0_PORT_ID_MASK GENMASK(7, 5) -#define PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK GENMASK(4, 1) -#define PREFETCH_CTXT_DATA_W0_BYPASS_MASK BIT(0) -#define CMPL_CTXT_DATA_W6_RSVD_1_H_MASK GENMASK(7, 0) -#define CMPL_CTXT_DATA_W5_RSVD_1_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W5_PORT_ID_MASK GENMASK(22, 20) -#define CMPL_CTXT_DATA_W5_SH_CMPT_MASK BIT(19) -#define CMPL_CTXT_DATA_W5_VIO_EOP_MASK BIT(18) -#define CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK GENMASK(17, 14) -#define CMPL_CTXT_DATA_W5_PASID_EN_MASK BIT(13) -#define CMPL_CTXT_DATA_W5_PASID_H_MASK GENMASK(12, 0) -#define CMPL_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W4_HOST_ID_MASK GENMASK(22, 19) -#define CMPL_CTXT_DATA_W4_DIR_C2H_MASK BIT(18) -#define CMPL_CTXT_DATA_W4_VIO_MASK BIT(17) -#define CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(16) -#define CMPL_CTXT_DATA_W4_INT_AGGR_MASK BIT(15) -#define CMPL_CTXT_DATA_W4_VEC_MASK GENMASK(14, 4) -#define CMPL_CTXT_DATA_W4_AT_MASK BIT(3) -#define CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK BIT(2) -#define CMPL_CTXT_DATA_W4_FULL_UPD_MASK BIT(1) -#define CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK BIT(0) -#define CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK BIT(31) -#define CMPL_CTXT_DATA_W3_ERR_MASK GENMASK(30, 29) -#define CMPL_CTXT_DATA_W3_VALID_MASK BIT(28) -#define CMPL_CTXT_DATA_W3_CIDX_MASK GENMASK(27, 12) -#define CMPL_CTXT_DATA_W3_PIDX_H_MASK GENMASK(11, 0) -#define CMPL_CTXT_DATA_W2_PIDX_L_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W2_DESC_SIZE_MASK GENMASK(27, 26) -#define CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK GENMASK(25, 0) -#define CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK GENMASK(31, 0) -#define CMPL_CTXT_DATA_W0_QSIZE_IX_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W0_COLOR_MASK BIT(27) -#define CMPL_CTXT_DATA_W0_INT_ST_MASK GENMASK(26, 25) -#define CMPL_CTXT_DATA_W0_TIMER_IX_MASK GENMASK(24, 21) -#define CMPL_CTXT_DATA_W0_CNTER_IX_MASK GENMASK(20, 17) -#define CMPL_CTXT_DATA_W0_FNC_ID_MASK GENMASK(16, 5) -#define CMPL_CTXT_DATA_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define CMPL_CTXT_DATA_W0_EN_INT_MASK BIT(1) -#define CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK BIT(0) -#define INTR_CTXT_DATA_W3_FUNC_MASK GENMASK(29, 18) -#define INTR_CTXT_DATA_W3_RSVD_MASK GENMASK(17, 14) -#define INTR_CTXT_DATA_W3_PASID_EN_MASK BIT(13) -#define INTR_CTXT_DATA_W3_PASID_H_MASK GENMASK(12, 0) -#define INTR_CTXT_DATA_W2_PASID_L_MASK GENMASK(31, 23) -#define INTR_CTXT_DATA_W2_HOST_ID_MASK GENMASK(22, 19) -#define INTR_CTXT_DATA_W2_AT_MASK BIT(18) -#define INTR_CTXT_DATA_W2_PIDX_MASK GENMASK(17, 6) -#define INTR_CTXT_DATA_W2_PAGE_SIZE_MASK GENMASK(5, 3) -#define INTR_CTXT_DATA_W2_BADDR_4K_H_MASK GENMASK(2, 0) -#define INTR_CTXT_DATA_W1_BADDR_4K_M_MASK GENMASK(31, 0) -#define INTR_CTXT_DATA_W0_BADDR_4K_L_MASK GENMASK(31, 15) -#define INTR_CTXT_DATA_W0_COLOR_MASK BIT(14) -#define INTR_CTXT_DATA_W0_INT_ST_MASK BIT(13) -#define INTR_CTXT_DATA_W0_RSVD1_MASK BIT(12) -#define INTR_CTXT_DATA_W0_VEC_MASK GENMASK(11, 1) -#define INTR_CTXT_DATA_W0_VALID_MASK BIT(0) -#define HOSTID_TABLE_W6_SMID_MASK GENMASK(9, 0) -#define HOSTID_TABLE_W5_H2C_MM_AWPROT_MASK GENMASK(27, 26) -#define HOSTID_TABLE_W5_H2C_MM_AWCACHE_MASK GENMASK(25, 22) -#define HOSTID_TABLE_W5_H2C_MM_AWSTEERING_MASK GENMASK(20, 18) -#define HOSTID_TABLE_W5_DSC_AWPROT_MASK GENMASK(17, 16) -#define HOSTID_TABLE_W5_DSC_AWCACHE_MASK GENMASK(15, 12) -#define HOSTID_TABLE_W5_DSC_AWSTEERING_MASK GENMASK(11, 8) -#define HOSTID_TABLE_W5_INT_MSG_AWPROT_MASK GENMASK(7, 6) -#define HOSTID_TABLE_W5_INT_MSG_AWCACHE_MASK GENMASK(5, 2) -#define HOSTID_TABLE_W5_INT_MSG_AWSTEERING_H_MASK GENMASK(0, 0) -#define HOSTID_TABLE_W4_INT_MSG_AWSTEERING_L_MASK GENMASK(31, 30) -#define HOSTID_TABLE_W4_INT_AGGR_AWPROT_MASK GENMASK(29, 28) -#define HOSTID_TABLE_W4_INT_AGGR_AWCACHE_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W4_INT_AGGR_AWSTEERING_MASK GENMASK(22, 20) -#define HOSTID_TABLE_W4_CMPT_AWPROT_MASK GENMASK(19, 18) -#define HOSTID_TABLE_W4_CMPT_AWCACHE_MASK GENMASK(17, 14) -#define HOSTID_TABLE_W4_CMPT_AWSTEERING_MASK GENMASK(12, 10) -#define HOSTID_TABLE_W4_C2H_PLD_AWPROT_MASK GENMASK(9, 8) -#define HOSTID_TABLE_W4_C2H_PLD_AWCACHE_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W4_C2H_PLD_AWSTEERING_MASK GENMASK(2, 0) -#define HOSTID_TABLE_W3_C2H_MM_ARPROT_MASK GENMASK(7, 6) -#define HOSTID_TABLE_W3_C2H_MM_ARCACHE_MASK GENMASK(5, 2) -#define HOSTID_TABLE_W3_C2H_MM_ARSTEERING_H_MASK GENMASK(0, 0) -#define HOSTID_TABLE_W2_C2H_MM_ARSTEERING_L_MASK GENMASK(31, 30) -#define HOSTID_TABLE_W2_H2C_MM_ARPROT_MASK GENMASK(29, 28) -#define HOSTID_TABLE_W2_H2C_MM_ARCACHE_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W2_H2C_MM_ARSTEERING_MASK GENMASK(22, 20) -#define HOSTID_TABLE_W2_H2C_ST_ARPROT_MASK GENMASK(19, 18) -#define HOSTID_TABLE_W2_H2C_ST_ARCACHE_MASK GENMASK(17, 14) -#define HOSTID_TABLE_W2_H2C_ST_ARSTEERING_MASK GENMASK(12, 10) -#define HOSTID_TABLE_W2_DSC_ARPOT_MASK GENMASK(9, 8) -#define HOSTID_TABLE_W2_DSC_ARCACHE_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W2_DSC_ARSTEERING_MASK GENMASK(2, 0) -#define HOSTID_TABLE_W0_VCH_H2C_MM_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W0_VCH_H2C_ST_MASK GENMASK(23, 20) -#define HOSTID_TABLE_W0_VCH_DSC_MASK GENMASK(19, 16) -#define HOSTID_TABLE_W0_VCH_INT_MSG_MASK GENMASK(15, 12) -#define HOSTID_TABLE_W0_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define HOSTID_TABLE_W0_VCH_CMPT_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W0_VCH_H2C_PLD_MASK GENMASK(3, 0) -#define CTXT_SELC_FNC_STS_W0_MSIX_MASK GENMASK(3, 3) -#define CTXT_SELC_FNC_STS_W0_MSIX_ENABLE_MASK GENMASK(2, 2) -#define CTXT_SELC_FNC_STS_W0_MEM_SPACE_ENABLE_MASK GENMASK(1, 1) -#define CTXT_SELC_FNC_STS_W0_BUS_MASTER_ENABLE_MASK GENMASK(0, 0) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c deleted file mode 100755 index 2c71d01..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.c +++ /dev/null @@ -1,4009 +0,0 @@ -/* - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "eqdma_cpm5_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_cpm5_reg_dump.tmh" -#endif - - -static struct regfield_info - cfg_blk_identifier_field_info[] = { - {"CFG_BLK_IDENTIFIER", - CFG_BLK_IDENTIFIER_MASK}, - {"CFG_BLK_IDENTIFIER_1", - CFG_BLK_IDENTIFIER_1_MASK}, - {"CFG_BLK_IDENTIFIER_RSVD_1", - CFG_BLK_IDENTIFIER_RSVD_1_MASK}, - {"CFG_BLK_IDENTIFIER_VERSION", - CFG_BLK_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_pld_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_PROG", - CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_read_req_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_system_id_field_info[] = { - {"CFG_BLK_SYSTEM_ID_RSVD_1", - CFG_BLK_SYSTEM_ID_RSVD_1_MASK}, - {"CFG_BLK_SYSTEM_ID_INST_TYPE", - CFG_BLK_SYSTEM_ID_INST_TYPE_MASK}, - {"CFG_BLK_SYSTEM_ID", - CFG_BLK_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - cfg_blk_msix_enable_field_info[] = { - {"CFG_BLK_MSIX_ENABLE", - CFG_BLK_MSIX_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_pcie_data_width_field_info[] = { - {"CFG_PCIE_DATA_WIDTH_RSVD_1", - CFG_PCIE_DATA_WIDTH_RSVD_1_MASK}, - {"CFG_PCIE_DATA_WIDTH_DATAPATH", - CFG_PCIE_DATA_WIDTH_DATAPATH_MASK}, -}; - - -static struct regfield_info - cfg_pcie_ctl_field_info[] = { - {"CFG_PCIE_CTL_RSVD_1", - CFG_PCIE_CTL_RSVD_1_MASK}, - {"CFG_PCIE_CTL_MGMT_AXIL_CTRL", - CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK}, - {"CFG_PCIE_CTL_RSVD_2", - CFG_PCIE_CTL_RSVD_2_MASK}, - {"CFG_PCIE_CTL_RRQ_DISABLE", - CFG_PCIE_CTL_RRQ_DISABLE_MASK}, - {"CFG_PCIE_CTL_RELAXED_ORDERING", - CFG_PCIE_CTL_RELAXED_ORDERING_MASK}, -}; - - -static struct regfield_info - cfg_blk_msi_enable_field_info[] = { - {"CFG_BLK_MSI_ENABLE", - CFG_BLK_MSI_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_pld_size_field_info[] = { - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_ISSUED", - CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_PROG", - CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_read_req_size_field_info[] = { - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK}, -}; - - -static struct regfield_info - cfg_blk_misc_ctl_field_info[] = { - {"CFG_BLK_MISC_CTL_RSVD_1", - CFG_BLK_MISC_CTL_RSVD_1_MASK}, - {"CFG_BLK_MISC_CTL_10B_TAG_EN", - CFG_BLK_MISC_CTL_10B_TAG_EN_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_2", - CFG_BLK_MISC_CTL_RSVD_2_MASK}, - {"CFG_BLK_MISC_CTL_AXI_WBK", - CFG_BLK_MISC_CTL_AXI_WBK_MASK}, - {"CFG_BLK_MISC_CTL_AXI_DSC", - CFG_BLK_MISC_CTL_AXI_DSC_MASK}, - {"CFG_BLK_MISC_CTL_NUM_TAG", - CFG_BLK_MISC_CTL_NUM_TAG_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_3", - CFG_BLK_MISC_CTL_RSVD_3_MASK}, - {"CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER", - CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK}, -}; - - -static struct regfield_info - cfg_pl_cred_ctl_field_info[] = { - {"CFG_PL_CRED_CTL_RSVD_1", - CFG_PL_CRED_CTL_RSVD_1_MASK}, - {"CFG_PL_CRED_CTL_SLAVE_CRD_RLS", - CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK}, - {"CFG_PL_CRED_CTL_RSVD_2", - CFG_PL_CRED_CTL_RSVD_2_MASK}, - {"CFG_PL_CRED_CTL_MASTER_CRD_RST", - CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_field_info[] = { - {"CFG_BLK_SCRATCH", - CFG_BLK_SCRATCH_MASK}, -}; - - -static struct regfield_info - cfg_gic_field_info[] = { - {"CFG_GIC_RSVD_1", - CFG_GIC_RSVD_1_MASK}, - {"CFG_GIC_GIC_IRQ", - CFG_GIC_GIC_IRQ_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_1_a_field_info[] = { - {"RAM_SBE_MSK_1_A", - RAM_SBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_1_a_field_info[] = { - {"RAM_SBE_STS_1_A_RSVD", - RAM_SBE_STS_1_A_RSVD_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_SBE_STS_1_A_TAG_EVEN_RAM", - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_SBE_STS_1_A_TAG_ODD_RAM", - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_1_a_field_info[] = { - {"RAM_DBE_MSK_1_A", - RAM_DBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_1_a_field_info[] = { - {"RAM_DBE_STS_1_A_RSVD", - RAM_DBE_STS_1_A_RSVD_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_DBE_STS_1_A_TAG_EVEN_RAM", - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_DBE_STS_1_A_TAG_ODD_RAM", - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_a_field_info[] = { - {"RAM_SBE_MSK_A", - RAM_SBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_a_field_info[] = { - {"RAM_SBE_STS_A_RC_RRQ_ODD_RAM", - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_SBE_STS_A_PEND_FIFO_RAM", - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_LL_RAM", - RAM_SBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_CTXT_RAM", - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_CTXT_RAM", - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_INT_CTXT_RAM", - RAM_SBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_COAL_DATA_RAM", - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_SBE_STS_A_QID_FIFO_RAM", - RAM_SBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_TIMER_FIFO_RAM", - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_DSC_CPLD", - RAM_SBE_STS_A_DSC_CPLD_MASK}, - {"RAM_SBE_STS_A_DSC_CPLI", - RAM_SBE_STS_A_DSC_CPLI_MASK}, - {"RAM_SBE_STS_A_DSC_SW_CTXT", - RAM_SBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_SBE_STS_A_DSC_CRD_RCV", - RAM_SBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_SBE_STS_A_DSC_HW_CTXT", - RAM_SBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_SBE_STS_A_FUNC_MAP", - RAM_SBE_STS_A_FUNC_MAP_MASK}, - {"RAM_SBE_STS_A_C2H_WR_BRG_DAT", - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_C2H_RD_BRG_DAT", - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_WR_BRG_DAT", - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_RD_BRG_DAT", - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H3_DAT", - RAM_SBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H2_DAT", - RAM_SBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H1_DAT", - RAM_SBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H0_DAT", - RAM_SBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C3_DAT", - RAM_SBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C2_DAT", - RAM_SBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C1_DAT", - RAM_SBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C0_DAT", - RAM_SBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_a_field_info[] = { - {"RAM_DBE_MSK_A", - RAM_DBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_a_field_info[] = { - {"RAM_DBE_STS_A_RC_RRQ_ODD_RAM", - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_DBE_STS_A_PEND_FIFO_RAM", - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_LL_RAM", - RAM_DBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_CTXT_RAM", - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_CTXT_RAM", - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_INT_CTXT_RAM", - RAM_DBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_COAL_DATA_RAM", - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_DBE_STS_A_QID_FIFO_RAM", - RAM_DBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_TIMER_FIFO_RAM", - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_DSC_CPLD", - RAM_DBE_STS_A_DSC_CPLD_MASK}, - {"RAM_DBE_STS_A_DSC_CPLI", - RAM_DBE_STS_A_DSC_CPLI_MASK}, - {"RAM_DBE_STS_A_DSC_SW_CTXT", - RAM_DBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_DBE_STS_A_DSC_CRD_RCV", - RAM_DBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_DBE_STS_A_DSC_HW_CTXT", - RAM_DBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_DBE_STS_A_FUNC_MAP", - RAM_DBE_STS_A_FUNC_MAP_MASK}, - {"RAM_DBE_STS_A_C2H_WR_BRG_DAT", - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_C2H_RD_BRG_DAT", - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_WR_BRG_DAT", - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_RD_BRG_DAT", - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H3_DAT", - RAM_DBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H2_DAT", - RAM_DBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H1_DAT", - RAM_DBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H0_DAT", - RAM_DBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C3_DAT", - RAM_DBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C2_DAT", - RAM_DBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C1_DAT", - RAM_DBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C0_DAT", - RAM_DBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_identifier_field_info[] = { - {"GLBL2_IDENTIFIER", - GLBL2_IDENTIFIER_MASK}, - {"GLBL2_IDENTIFIER_VERSION", - GLBL2_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - glbl2_channel_inst_field_info[] = { - {"GLBL2_CHANNEL_INST_RSVD_1", - GLBL2_CHANNEL_INST_RSVD_1_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ST", - GLBL2_CHANNEL_INST_C2H_ST_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ST", - GLBL2_CHANNEL_INST_H2C_ST_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_2", - GLBL2_CHANNEL_INST_RSVD_2_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ENG", - GLBL2_CHANNEL_INST_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_3", - GLBL2_CHANNEL_INST_RSVD_3_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ENG", - GLBL2_CHANNEL_INST_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_mdma_field_info[] = { - {"GLBL2_CHANNEL_MDMA_RSVD_1", - GLBL2_CHANNEL_MDMA_RSVD_1_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ST", - GLBL2_CHANNEL_MDMA_C2H_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ST", - GLBL2_CHANNEL_MDMA_H2C_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_2", - GLBL2_CHANNEL_MDMA_RSVD_2_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ENG", - GLBL2_CHANNEL_MDMA_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_3", - GLBL2_CHANNEL_MDMA_RSVD_3_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ENG", - GLBL2_CHANNEL_MDMA_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_strm_field_info[] = { - {"GLBL2_CHANNEL_STRM_RSVD_1", - GLBL2_CHANNEL_STRM_RSVD_1_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ST", - GLBL2_CHANNEL_STRM_C2H_ST_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ST", - GLBL2_CHANNEL_STRM_H2C_ST_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_2", - GLBL2_CHANNEL_STRM_RSVD_2_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ENG", - GLBL2_CHANNEL_STRM_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_3", - GLBL2_CHANNEL_STRM_RSVD_3_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ENG", - GLBL2_CHANNEL_STRM_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_cap_field_info[] = { - {"GLBL2_CHANNEL_CAP_RSVD_1", - GLBL2_CHANNEL_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_CAP_MULTIQ_MAX", - GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK}, -}; - - -static struct regfield_info - glbl2_channel_pasid_cap_field_info[] = { - {"GLBL2_CHANNEL_PASID_CAP_RSVD_1", - GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEEN", - GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_DMAEN", - GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK}, -}; - - -static struct regfield_info - glbl2_system_id_field_info[] = { - {"GLBL2_SYSTEM_ID_RSVD_1", - GLBL2_SYSTEM_ID_RSVD_1_MASK}, - {"GLBL2_SYSTEM_ID", - GLBL2_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - glbl2_misc_cap_field_info[] = { - {"GLBL2_MISC_CAP", - GLBL2_MISC_CAP_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq0_field_info[] = { - {"GLBL2_PCIE_RQ0_NPH_AVL", - GLBL2_PCIE_RQ0_NPH_AVL_MASK}, - {"GLBL2_PCIE_RQ0_RCB_AVL", - GLBL2_PCIE_RQ0_RCB_AVL_MASK}, - {"GLBL2_PCIE_RQ0_SLV_RD_CREDS", - GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK}, - {"GLBL2_PCIE_RQ0_TAG_EP", - GLBL2_PCIE_RQ0_TAG_EP_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq1_field_info[] = { - {"GLBL2_PCIE_RQ1_RSVD_1", - GLBL2_PCIE_RQ1_RSVD_1_MASK}, - {"GLBL2_PCIE_RQ1_TAG_FL", - GLBL2_PCIE_RQ1_TAG_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_EP", - GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_FL", - GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM", - GLBL2_PCIE_RQ1_TLPSM_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM512", - GLBL2_PCIE_RQ1_TLPSM512_MASK}, - {"GLBL2_PCIE_RQ1_RREQ_RCB_OK", - GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_SLV", - GLBL2_PCIE_RQ1_RREQ0_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_VLD", - GLBL2_PCIE_RQ1_RREQ0_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_RDY", - GLBL2_PCIE_RQ1_RREQ0_RDY_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_SLV", - GLBL2_PCIE_RQ1_RREQ1_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_VLD", - GLBL2_PCIE_RQ1_RREQ1_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_RDY", - GLBL2_PCIE_RQ1_RREQ1_RDY_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_REQ", - GLBL2_PCIE_RQ1_WTLP_REQ_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_STRADDLE", - GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr0_field_info[] = { - {"GLBL2_AXIMM_WR0_RSVD_1", - GLBL2_AXIMM_WR0_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR0_WR_REQ", - GLBL2_AXIMM_WR0_WR_REQ_MASK}, - {"GLBL2_AXIMM_WR0_WR_CHN", - GLBL2_AXIMM_WR0_WR_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP", - GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_WPL_FIFO_EP", - GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN", - GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WRREQ_CNT", - GLBL2_AXIMM_WR0_WRREQ_CNT_MASK}, - {"GLBL2_AXIMM_WR0_BID", - GLBL2_AXIMM_WR0_BID_MASK}, - {"GLBL2_AXIMM_WR0_BVALID", - GLBL2_AXIMM_WR0_BVALID_MASK}, - {"GLBL2_AXIMM_WR0_BREADY", - GLBL2_AXIMM_WR0_BREADY_MASK}, - {"GLBL2_AXIMM_WR0_WVALID", - GLBL2_AXIMM_WR0_WVALID_MASK}, - {"GLBL2_AXIMM_WR0_WREADY", - GLBL2_AXIMM_WR0_WREADY_MASK}, - {"GLBL2_AXIMM_WR0_AWID", - GLBL2_AXIMM_WR0_AWID_MASK}, - {"GLBL2_AXIMM_WR0_AWVALID", - GLBL2_AXIMM_WR0_AWVALID_MASK}, - {"GLBL2_AXIMM_WR0_AWREADY", - GLBL2_AXIMM_WR0_AWREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr1_field_info[] = { - {"GLBL2_AXIMM_WR1_RSVD_1", - GLBL2_AXIMM_WR1_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT4", - GLBL2_AXIMM_WR1_BRSP_CNT4_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT3", - GLBL2_AXIMM_WR1_BRSP_CNT3_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT2", - GLBL2_AXIMM_WR1_BRSP_CNT2_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT1", - GLBL2_AXIMM_WR1_BRSP_CNT1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT0", - GLBL2_AXIMM_WR1_BRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd0_field_info[] = { - {"GLBL2_AXIMM_RD0_RSVD_1", - GLBL2_AXIMM_RD0_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD0_PND_CNT", - GLBL2_AXIMM_RD0_PND_CNT_MASK}, - {"GLBL2_AXIMM_RD0_RD_REQ", - GLBL2_AXIMM_RD0_RD_REQ_MASK}, - {"GLBL2_AXIMM_RD0_RD_CHNL", - GLBL2_AXIMM_RD0_RD_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL", - GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RID", - GLBL2_AXIMM_RD0_RID_MASK}, - {"GLBL2_AXIMM_RD0_RVALID", - GLBL2_AXIMM_RD0_RVALID_MASK}, - {"GLBL2_AXIMM_RD0_RREADY", - GLBL2_AXIMM_RD0_RREADY_MASK}, - {"GLBL2_AXIMM_RD0_ARID", - GLBL2_AXIMM_RD0_ARID_MASK}, - {"GLBL2_AXIMM_RD0_ARVALID", - GLBL2_AXIMM_RD0_ARVALID_MASK}, - {"GLBL2_AXIMM_RD0_ARREADY", - GLBL2_AXIMM_RD0_ARREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd1_field_info[] = { - {"GLBL2_AXIMM_RD1_RSVD_1", - GLBL2_AXIMM_RD1_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT4", - GLBL2_AXIMM_RD1_RRSP_CNT4_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT3", - GLBL2_AXIMM_RD1_RRSP_CNT3_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT2", - GLBL2_AXIMM_RD1_RRSP_CNT2_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT1", - GLBL2_AXIMM_RD1_RRSP_CNT1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT0", - GLBL2_AXIMM_RD1_RRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab0_field_info[] = { - {"GLBL2_FAB0_H2C_INB_CONV_IN_VLD", - GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_INB_CONV_IN_RDY", - GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_VLD", - GLBL2_FAB0_H2C_SEG_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_RDY", - GLBL2_FAB0_H2C_SEG_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_VLD", - GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_RDY", - GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_H2C_MST_CRDT_STAT", - GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_FULL", - GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY", - GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_VLD", - GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_RDY", - GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_VLD", - GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_RDY", - GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD", - GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY", - GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_FULL", - GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY", - GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY", - GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab1_field_info[] = { - {"GLBL2_FAB1_BYP_OUT_CRDT_STAT", - GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK}, - {"GLBL2_FAB1_TM_DSC_STS_CRDT_STAT", - GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_FULL", - GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_1", - GLBL2_FAB1_RSVD_1_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_2", - GLBL2_FAB1_RSVD_2_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_3", - GLBL2_FAB1_RSVD_3_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_4", - GLBL2_FAB1_RSVD_4_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_sel_field_info[] = { - {"GLBL2_MATCH_SEL_RSV", - GLBL2_MATCH_SEL_RSV_MASK}, - {"GLBL2_MATCH_SEL_CSR_SEL", - GLBL2_MATCH_SEL_CSR_SEL_MASK}, - {"GLBL2_MATCH_SEL_CSR_EN", - GLBL2_MATCH_SEL_CSR_EN_MASK}, - {"GLBL2_MATCH_SEL_ROTATE1", - GLBL2_MATCH_SEL_ROTATE1_MASK}, - {"GLBL2_MATCH_SEL_ROTATE0", - GLBL2_MATCH_SEL_ROTATE0_MASK}, - {"GLBL2_MATCH_SEL_SEL", - GLBL2_MATCH_SEL_SEL_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_msk_field_info[] = { - {"GLBL2_MATCH_MSK", - GLBL2_MATCH_MSK_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_pat_field_info[] = { - {"GLBL2_MATCH_PAT_PATTERN", - GLBL2_MATCH_PAT_PATTERN_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_1_field_info[] = { - {"GLBL_RNG_SZ_1_RSVD_1", - GLBL_RNG_SZ_1_RSVD_1_MASK}, - {"GLBL_RNG_SZ_1_RING_SIZE", - GLBL_RNG_SZ_1_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_2_field_info[] = { - {"GLBL_RNG_SZ_2_RSVD_1", - GLBL_RNG_SZ_2_RSVD_1_MASK}, - {"GLBL_RNG_SZ_2_RING_SIZE", - GLBL_RNG_SZ_2_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_3_field_info[] = { - {"GLBL_RNG_SZ_3_RSVD_1", - GLBL_RNG_SZ_3_RSVD_1_MASK}, - {"GLBL_RNG_SZ_3_RING_SIZE", - GLBL_RNG_SZ_3_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_4_field_info[] = { - {"GLBL_RNG_SZ_4_RSVD_1", - GLBL_RNG_SZ_4_RSVD_1_MASK}, - {"GLBL_RNG_SZ_4_RING_SIZE", - GLBL_RNG_SZ_4_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_5_field_info[] = { - {"GLBL_RNG_SZ_5_RSVD_1", - GLBL_RNG_SZ_5_RSVD_1_MASK}, - {"GLBL_RNG_SZ_5_RING_SIZE", - GLBL_RNG_SZ_5_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_6_field_info[] = { - {"GLBL_RNG_SZ_6_RSVD_1", - GLBL_RNG_SZ_6_RSVD_1_MASK}, - {"GLBL_RNG_SZ_6_RING_SIZE", - GLBL_RNG_SZ_6_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_7_field_info[] = { - {"GLBL_RNG_SZ_7_RSVD_1", - GLBL_RNG_SZ_7_RSVD_1_MASK}, - {"GLBL_RNG_SZ_7_RING_SIZE", - GLBL_RNG_SZ_7_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_8_field_info[] = { - {"GLBL_RNG_SZ_8_RSVD_1", - GLBL_RNG_SZ_8_RSVD_1_MASK}, - {"GLBL_RNG_SZ_8_RING_SIZE", - GLBL_RNG_SZ_8_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_9_field_info[] = { - {"GLBL_RNG_SZ_9_RSVD_1", - GLBL_RNG_SZ_9_RSVD_1_MASK}, - {"GLBL_RNG_SZ_9_RING_SIZE", - GLBL_RNG_SZ_9_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_a_field_info[] = { - {"GLBL_RNG_SZ_A_RSVD_1", - GLBL_RNG_SZ_A_RSVD_1_MASK}, - {"GLBL_RNG_SZ_A_RING_SIZE", - GLBL_RNG_SZ_A_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_b_field_info[] = { - {"GLBL_RNG_SZ_B_RSVD_1", - GLBL_RNG_SZ_B_RSVD_1_MASK}, - {"GLBL_RNG_SZ_B_RING_SIZE", - GLBL_RNG_SZ_B_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_c_field_info[] = { - {"GLBL_RNG_SZ_C_RSVD_1", - GLBL_RNG_SZ_C_RSVD_1_MASK}, - {"GLBL_RNG_SZ_C_RING_SIZE", - GLBL_RNG_SZ_C_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_d_field_info[] = { - {"GLBL_RNG_SZ_D_RSVD_1", - GLBL_RNG_SZ_D_RSVD_1_MASK}, - {"GLBL_RNG_SZ_D_RING_SIZE", - GLBL_RNG_SZ_D_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_e_field_info[] = { - {"GLBL_RNG_SZ_E_RSVD_1", - GLBL_RNG_SZ_E_RSVD_1_MASK}, - {"GLBL_RNG_SZ_E_RING_SIZE", - GLBL_RNG_SZ_E_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_f_field_info[] = { - {"GLBL_RNG_SZ_F_RSVD_1", - GLBL_RNG_SZ_F_RSVD_1_MASK}, - {"GLBL_RNG_SZ_F_RING_SIZE", - GLBL_RNG_SZ_F_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_10_field_info[] = { - {"GLBL_RNG_SZ_10_RSVD_1", - GLBL_RNG_SZ_10_RSVD_1_MASK}, - {"GLBL_RNG_SZ_10_RING_SIZE", - GLBL_RNG_SZ_10_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_err_stat_field_info[] = { - {"GLBL_ERR_STAT_RSVD_1", - GLBL_ERR_STAT_RSVD_1_MASK}, - {"GLBL_ERR_STAT_ERR_FAB", - GLBL_ERR_STAT_ERR_FAB_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_ST", - GLBL_ERR_STAT_ERR_H2C_ST_MASK}, - {"GLBL_ERR_STAT_ERR_BDG", - GLBL_ERR_STAT_ERR_BDG_MASK}, - {"GLBL_ERR_STAT_IND_CTXT_CMD_ERR", - GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_ST", - GLBL_ERR_STAT_ERR_C2H_ST_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_1", - GLBL_ERR_STAT_ERR_C2H_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_0", - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_1", - GLBL_ERR_STAT_ERR_H2C_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_0", - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_TRQ", - GLBL_ERR_STAT_ERR_TRQ_MASK}, - {"GLBL_ERR_STAT_ERR_DSC", - GLBL_ERR_STAT_ERR_DSC_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_DBE", - GLBL_ERR_STAT_ERR_RAM_DBE_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_SBE", - GLBL_ERR_STAT_ERR_RAM_SBE_MASK}, -}; - - -static struct regfield_info - glbl_err_mask_field_info[] = { - {"GLBL_ERR", - GLBL_ERR_MASK}, -}; - - -static struct regfield_info - glbl_dsc_cfg_field_info[] = { - {"GLBL_DSC_CFG_RSVD_1", - GLBL_DSC_CFG_RSVD_1_MASK}, - {"GLBL_DSC_CFG_UNC_OVR_COR", - GLBL_DSC_CFG_UNC_OVR_COR_MASK}, - {"GLBL_DSC_CFG_CTXT_FER_DIS", - GLBL_DSC_CFG_CTXT_FER_DIS_MASK}, - {"GLBL_DSC_CFG_RSVD_2", - GLBL_DSC_CFG_RSVD_2_MASK}, - {"GLBL_DSC_CFG_MAXFETCH", - GLBL_DSC_CFG_MAXFETCH_MASK}, - {"GLBL_DSC_CFG_WB_ACC_INT", - GLBL_DSC_CFG_WB_ACC_INT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_sts_field_info[] = { - {"GLBL_DSC_ERR_STS_RSVD_1", - GLBL_DSC_ERR_STS_RSVD_1_MASK}, - {"GLBL_DSC_ERR_STS_PORT_ID", - GLBL_DSC_ERR_STS_PORT_ID_MASK}, - {"GLBL_DSC_ERR_STS_SBE", - GLBL_DSC_ERR_STS_SBE_MASK}, - {"GLBL_DSC_ERR_STS_DBE", - GLBL_DSC_ERR_STS_DBE_MASK}, - {"GLBL_DSC_ERR_STS_RQ_CANCEL", - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_DSC", - GLBL_DSC_ERR_STS_DSC_MASK}, - {"GLBL_DSC_ERR_STS_DMA", - GLBL_DSC_ERR_STS_DMA_MASK}, - {"GLBL_DSC_ERR_STS_FLR_CANCEL", - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_RSVD_2", - GLBL_DSC_ERR_STS_RSVD_2_MASK}, - {"GLBL_DSC_ERR_STS_DAT_POISON", - GLBL_DSC_ERR_STS_DAT_POISON_MASK}, - {"GLBL_DSC_ERR_STS_TIMEOUT", - GLBL_DSC_ERR_STS_TIMEOUT_MASK}, - {"GLBL_DSC_ERR_STS_FLR", - GLBL_DSC_ERR_STS_FLR_MASK}, - {"GLBL_DSC_ERR_STS_TAG", - GLBL_DSC_ERR_STS_TAG_MASK}, - {"GLBL_DSC_ERR_STS_ADDR", - GLBL_DSC_ERR_STS_ADDR_MASK}, - {"GLBL_DSC_ERR_STS_PARAM", - GLBL_DSC_ERR_STS_PARAM_MASK}, - {"GLBL_DSC_ERR_STS_BCNT", - GLBL_DSC_ERR_STS_BCNT_MASK}, - {"GLBL_DSC_ERR_STS_UR_CA", - GLBL_DSC_ERR_STS_UR_CA_MASK}, - {"GLBL_DSC_ERR_STS_POISON", - GLBL_DSC_ERR_STS_POISON_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_msk_field_info[] = { - {"GLBL_DSC_ERR_MSK", - GLBL_DSC_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log0_field_info[] = { - {"GLBL_DSC_ERR_LOG0_VALID", - GLBL_DSC_ERR_LOG0_VALID_MASK}, - {"GLBL_DSC_ERR_LOG0_SEL", - GLBL_DSC_ERR_LOG0_SEL_MASK}, - {"GLBL_DSC_ERR_LOG0_RSVD_1", - GLBL_DSC_ERR_LOG0_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG0_QID", - GLBL_DSC_ERR_LOG0_QID_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log1_field_info[] = { - {"GLBL_DSC_ERR_LOG1_RSVD_1", - GLBL_DSC_ERR_LOG1_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG1_CIDX", - GLBL_DSC_ERR_LOG1_CIDX_MASK}, - {"GLBL_DSC_ERR_LOG1_RSVD_2", - GLBL_DSC_ERR_LOG1_RSVD_2_MASK}, - {"GLBL_DSC_ERR_LOG1_SUB_TYPE", - GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK}, - {"GLBL_DSC_ERR_LOG1_ERR_TYPE", - GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_sts_field_info[] = { - {"GLBL_TRQ_ERR_STS_RSVD_1", - GLBL_TRQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_2", - GLBL_TRQ_ERR_STS_RSVD_2_MASK}, - {"GLBL_TRQ_ERR_STS_QID_RANGE", - GLBL_TRQ_ERR_STS_QID_RANGE_MASK}, - {"GLBL_TRQ_ERR_STS_QSPC_UNMAPPED", - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_3", - GLBL_TRQ_ERR_STS_RSVD_3_MASK}, - {"GLBL_TRQ_ERR_STS_VF_ACCESS_ERR", - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK}, - {"GLBL_TRQ_ERR_STS_CSR_UNMAPPED", - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_msk_field_info[] = { - {"GLBL_TRQ_ERR_MSK", - GLBL_TRQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_log_field_info[] = { - {"GLBL_TRQ_ERR_LOG_SRC", - GLBL_TRQ_ERR_LOG_SRC_MASK}, - {"GLBL_TRQ_ERR_LOG_TARGET", - GLBL_TRQ_ERR_LOG_TARGET_MASK}, - {"GLBL_TRQ_ERR_LOG_FUNC", - GLBL_TRQ_ERR_LOG_FUNC_MASK}, - {"GLBL_TRQ_ERR_LOG_ADDRESS", - GLBL_TRQ_ERR_LOG_ADDRESS_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat0_field_info[] = { - {"GLBL_DSC_DAT0_RSVD_1", - GLBL_DSC_DAT0_RSVD_1_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_DIR", - GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_QID", - GLBL_DSC_DAT0_CTXT_ARB_QID_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_REQ", - GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK}, - {"GLBL_DSC_DAT0_IRQ_FIFO_FL", - GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK}, - {"GLBL_DSC_DAT0_TMSTALL", - GLBL_DSC_DAT0_TMSTALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_STALL", - GLBL_DSC_DAT0_RRQ_STALL_MASK}, - {"GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL", - GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK}, - {"GLBL_DSC_DAT0_DSC_OUT_STALL", - GLBL_DSC_DAT0_DSC_OUT_STALL_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat1_field_info[] = { - {"GLBL_DSC_DAT1_RSVD_1", - GLBL_DSC_DAT1_RSVD_1_MASK}, - {"GLBL_DSC_DAT1_EVT_SPC_C2H", - GLBL_DSC_DAT1_EVT_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_EVT_SP_H2C", - GLBL_DSC_DAT1_EVT_SP_H2C_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_C2H", - GLBL_DSC_DAT1_DSC_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_H2C", - GLBL_DSC_DAT1_DSC_SPC_H2C_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_ctl_field_info[] = { - {"GLBL_DSC_CTL_RSVD_1", - GLBL_DSC_CTL_RSVD_1_MASK}, - {"GLBL_DSC_CTL_SELECT", - GLBL_DSC_CTL_SELECT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log2_field_info[] = { - {"GLBL_DSC_ERR_LOG2_OLD_PIDX", - GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK}, - {"GLBL_DSC_ERR_LOG2_NEW_PIDX", - GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK}, -}; - - -static struct regfield_info - glbl_glbl_interrupt_cfg_field_info[] = { - {"GLBL_GLBL_INTERRUPT_CFG_RSVD_1", - GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING", - GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR", - GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK}, -}; - - -static struct regfield_info - glbl_vch_host_profile_field_info[] = { - {"GLBL_VCH_HOST_PROFILE_RSVD_1", - GLBL_VCH_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_MM", - GLBL_VCH_HOST_PROFILE_2C_MM_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_ST", - GLBL_VCH_HOST_PROFILE_2C_ST_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_DSC", - GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_MSG", - GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR", - GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_CMPT", - GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD", - GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK}, -}; - - -static struct regfield_info - glbl_bridge_host_profile_field_info[] = { - {"GLBL_BRIDGE_HOST_PROFILE_RSVD_1", - GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_BRIDGE_HOST_PROFILE_BDGID", - GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK}, -}; - - -static struct regfield_info - aximm_irq_dest_addr_field_info[] = { - {"AXIMM_IRQ_DEST_ADDR_ADDR", - AXIMM_IRQ_DEST_ADDR_ADDR_MASK}, -}; - - -static struct regfield_info - fab_err_log_field_info[] = { - {"FAB_ERR_LOG_RSVD_1", - FAB_ERR_LOG_RSVD_1_MASK}, - {"FAB_ERR_LOG_SRC", - FAB_ERR_LOG_SRC_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_field_info[] = { - {"IND_CTXT_DATA_DATA", - IND_CTXT_DATA_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_mask_field_info[] = { - {"IND_CTXT", - IND_CTXT_MASK}, -}; - - -static struct regfield_info - ind_ctxt_cmd_field_info[] = { - {"IND_CTXT_CMD_RSVD_1", - IND_CTXT_CMD_RSVD_1_MASK}, - {"IND_CTXT_CMD_QID", - IND_CTXT_CMD_QID_MASK}, - {"IND_CTXT_CMD_OP", - IND_CTXT_CMD_OP_MASK}, - {"IND_CTXT_CMD_SEL", - IND_CTXT_CMD_SEL_MASK}, - {"IND_CTXT_CMD_BUSY", - IND_CTXT_CMD_BUSY_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_field_info[] = { - {"C2H_TIMER_CNT_RSVD_1", - C2H_TIMER_CNT_RSVD_1_MASK}, - {"C2H_TIMER_CNT", - C2H_TIMER_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_field_info[] = { - {"C2H_CNT_TH_RSVD_1", - C2H_CNT_TH_RSVD_1_MASK}, - {"C2H_CNT_TH_THESHOLD_CNT", - C2H_CNT_TH_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED_RSVD_1", - C2H_STAT_S_AXIS_C2H_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_RSVD_1", - C2H_STAT_S_AXIS_WRB_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_S_AXIS_WRB_ACCEPTED", - C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_RSVD_1", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP_RSVD_1", - C2H_STAT_AXIS_PKG_CMP_RSVD_1_MASK}, - {"C2H_STAT_AXIS_PKG_CMP", - C2H_STAT_AXIS_PKG_CMP_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ACCEPTED_RSVD_1", - C2H_STAT_DESC_RSP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_ACCEPTED_D", - C2H_STAT_DESC_RSP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_cmp_field_info[] = { - {"C2H_STAT_DESC_RSP_CMP_RSVD_1", - C2H_STAT_DESC_RSP_CMP_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_CMP_D", - C2H_STAT_DESC_RSP_CMP_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_wrq_out_field_info[] = { - {"C2H_STAT_WRQ_OUT_RSVD_1", - C2H_STAT_WRQ_OUT_RSVD_1_MASK}, - {"C2H_STAT_WRQ_OUT", - C2H_STAT_WRQ_OUT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wpl_ren_accepted_field_info[] = { - {"C2H_STAT_WPL_REN_ACCEPTED_RSVD_1", - C2H_STAT_WPL_REN_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_WPL_REN_ACCEPTED", - C2H_STAT_WPL_REN_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wrq_len_field_info[] = { - {"C2H_STAT_TOTAL_WRQ_LEN_RSVD_1", - C2H_STAT_TOTAL_WRQ_LEN_RSVD_1_MASK}, - {"C2H_STAT_TOTAL_WRQ_LEN", - C2H_STAT_TOTAL_WRQ_LEN_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wpl_len_field_info[] = { - {"C2H_STAT_TOTAL_WPL_LEN_RSVD_1", - C2H_STAT_TOTAL_WPL_LEN_RSVD_1_MASK}, - {"C2H_STAT_TOTAL_WPL_LEN", - C2H_STAT_TOTAL_WPL_LEN_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_field_info[] = { - {"C2H_BUF_SZ_IZE", - C2H_BUF_SZ_IZE_MASK}, -}; - - -static struct regfield_info - c2h_err_stat_field_info[] = { - {"C2H_ERR_STAT_RSVD_1", - C2H_ERR_STAT_RSVD_1_MASK}, - {"C2H_ERR_STAT_WRB_PORT_ID_ERR", - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK}, - {"C2H_ERR_STAT_HDR_PAR_ERR", - C2H_ERR_STAT_HDR_PAR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_COR_ERR", - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_ERR_STAT_AVL_RING_DSC_ERR", - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK}, - {"C2H_ERR_STAT_WRB_PRTY_ERR", - C2H_ERR_STAT_WRB_PRTY_ERR_MASK}, - {"C2H_ERR_STAT_WRB_CIDX_ERR", - C2H_ERR_STAT_WRB_CIDX_ERR_MASK}, - {"C2H_ERR_STAT_WRB_QFULL_ERR", - C2H_ERR_STAT_WRB_QFULL_ERR_MASK}, - {"C2H_ERR_STAT_WRB_INV_Q_ERR", - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_2", - C2H_ERR_STAT_RSVD_2_MASK}, - {"C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH", - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK}, - {"C2H_ERR_STAT_ERR_DESC_CNT", - C2H_ERR_STAT_ERR_DESC_CNT_MASK}, - {"C2H_ERR_STAT_RSVD_3", - C2H_ERR_STAT_RSVD_3_MASK}, - {"C2H_ERR_STAT_MSI_INT_FAIL", - C2H_ERR_STAT_MSI_INT_FAIL_MASK}, - {"C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR", - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_4", - C2H_ERR_STAT_RSVD_4_MASK}, - {"C2H_ERR_STAT_DESC_RSP_ERR", - C2H_ERR_STAT_DESC_RSP_ERR_MASK}, - {"C2H_ERR_STAT_QID_MISMATCH", - C2H_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_ERR_STAT_SH_CMPT_DSC_ERR", - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK}, - {"C2H_ERR_STAT_LEN_MISMATCH", - C2H_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_ERR_STAT_MTY_MISMATCH", - C2H_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_err_mask_field_info[] = { - {"C2H_ERR_EN", - C2H_ERR_EN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_stat_field_info[] = { - {"C2H_FATAL_ERR_STAT_RSVD_1", - C2H_FATAL_ERR_STAT_RSVD_1_MASK}, - {"C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR", - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED2", - C2H_FATAL_ERR_STAT_RESERVED2_MASK}, - {"C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_MISMATCH", - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED1", - C2H_FATAL_ERR_STAT_RESERVED1_MASK}, - {"C2H_FATAL_ERR_STAT_LEN_MISMATCH", - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_MTY_MISMATCH", - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_mask_field_info[] = { - {"C2H_FATAL_ERR_C2HEN", - C2H_FATAL_ERR_C2HEN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_enable_field_info[] = { - {"C2H_FATAL_ERR_ENABLE_RSVD_1", - C2H_FATAL_ERR_ENABLE_RSVD_1_MASK}, - {"C2H_FATAL_ERR_ENABLE_WPL_PAR_INV", - C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK}, - {"C2H_FATAL_ERR_ENABLE_WRQ_DIS", - C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK}, -}; - - -static struct regfield_info - glbl_err_int_field_info[] = { - {"GLBL_ERR_INT_RSVD_1", - GLBL_ERR_INT_RSVD_1_MASK}, - {"GLBL_ERR_INT_HOST_ID", - GLBL_ERR_INT_HOST_ID_MASK}, - {"GLBL_ERR_INT_DIS_INTR_ON_VF", - GLBL_ERR_INT_DIS_INTR_ON_VF_MASK}, - {"GLBL_ERR_INT_ARM", - GLBL_ERR_INT_ARM_MASK}, - {"GLBL_ERR_INT_EN_COAL", - GLBL_ERR_INT_EN_COAL_MASK}, - {"GLBL_ERR_INT_VEC", - GLBL_ERR_INT_VEC_MASK}, - {"GLBL_ERR_INT_FUNC", - GLBL_ERR_INT_FUNC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_field_info[] = { - {"C2H_PFCH_CFG_EVTFL_TH", - C2H_PFCH_CFG_EVTFL_TH_MASK}, - {"C2H_PFCH_CFG_FL_TH", - C2H_PFCH_CFG_FL_TH_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_1_field_info[] = { - {"C2H_PFCH_CFG_1_EVT_QCNT_TH", - C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK}, - {"C2H_PFCH_CFG_1_QCNT", - C2H_PFCH_CFG_1_QCNT_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_2_field_info[] = { - {"C2H_PFCH_CFG_2_FENCE", - C2H_PFCH_CFG_2_FENCE_MASK}, - {"C2H_PFCH_CFG_2_RSVD", - C2H_PFCH_CFG_2_RSVD_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NO_DROP", - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK}, - {"C2H_PFCH_CFG_2_LL_SZ_TH", - C2H_PFCH_CFG_2_LL_SZ_TH_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NUM", - C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK}, - {"C2H_PFCH_CFG_2_NUM", - C2H_PFCH_CFG_2_NUM_MASK}, -}; - - -static struct regfield_info - c2h_int_timer_tick_field_info[] = { - {"C2H_INT_TIMER_TICK", - C2H_INT_TIMER_TICK_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_drop_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_RSVD_1", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_D", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_err_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_RSVD_1", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_D", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_req_field_info[] = { - {"C2H_STAT_DESC_REQ_RSVD_1", - C2H_STAT_DESC_REQ_RSVD_1_MASK}, - {"C2H_STAT_DESC_REQ", - C2H_STAT_DESC_REQ_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_0_field_info[] = { - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_SM_CS", - C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK}, - {"C2H_STAT_DMA_ENG_0_MAIN_SM_CS", - C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_1_field_info[] = { - {"C2H_STAT_DMA_ENG_1_RSVD_1", - C2H_STAT_DMA_ENG_1_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT", - C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_2_field_info[] = { - {"C2H_STAT_DMA_ENG_2_RSVD_1", - C2H_STAT_DMA_ENG_2_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT", - C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_3_field_info[] = { - {"C2H_STAT_DMA_ENG_3_RSVD_1", - C2H_STAT_DMA_ENG_3_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0", - C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_VLD", - C2H_STAT_DMA_ENG_3_WRQ_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_RDY", - C2H_STAT_DMA_ENG_3_WRQ_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR_MASK}, - {"C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_err_ctxt_field_info[] = { - {"C2H_PFCH_ERR_CTXT_RSVD_1", - C2H_PFCH_ERR_CTXT_RSVD_1_MASK}, - {"C2H_PFCH_ERR_CTXT_ERR_STAT", - C2H_PFCH_ERR_CTXT_ERR_STAT_MASK}, - {"C2H_PFCH_ERR_CTXT_CMD_WR", - C2H_PFCH_ERR_CTXT_CMD_WR_MASK}, - {"C2H_PFCH_ERR_CTXT_QID", - C2H_PFCH_ERR_CTXT_QID_MASK}, - {"C2H_PFCH_ERR_CTXT_DONE", - C2H_PFCH_ERR_CTXT_DONE_MASK}, -}; - - -static struct regfield_info - c2h_first_err_qid_field_info[] = { - {"C2H_FIRST_ERR_QID_RSVD_1", - C2H_FIRST_ERR_QID_RSVD_1_MASK}, - {"C2H_FIRST_ERR_QID_ERR_TYPE", - C2H_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"C2H_FIRST_ERR_QID_RSVD", - C2H_FIRST_ERR_QID_RSVD_MASK}, - {"C2H_FIRST_ERR_QID_QID", - C2H_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_in_field_info[] = { - {"STAT_NUM_WRB_IN_RSVD_1", - STAT_NUM_WRB_IN_RSVD_1_MASK}, - {"STAT_NUM_WRB_IN_WRB_CNT", - STAT_NUM_WRB_IN_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_out_field_info[] = { - {"STAT_NUM_WRB_OUT_RSVD_1", - STAT_NUM_WRB_OUT_RSVD_1_MASK}, - {"STAT_NUM_WRB_OUT_WRB_CNT", - STAT_NUM_WRB_OUT_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_drp_field_info[] = { - {"STAT_NUM_WRB_DRP_RSVD_1", - STAT_NUM_WRB_DRP_RSVD_1_MASK}, - {"STAT_NUM_WRB_DRP_WRB_CNT", - STAT_NUM_WRB_DRP_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_stat_desc_out_field_info[] = { - {"STAT_NUM_STAT_DESC_OUT_RSVD_1", - STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK}, - {"STAT_NUM_STAT_DESC_OUT_CNT", - STAT_NUM_STAT_DESC_OUT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_dsc_crdt_sent_field_info[] = { - {"STAT_NUM_DSC_CRDT_SENT_RSVD_1", - STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK}, - {"STAT_NUM_DSC_CRDT_SENT_CNT", - STAT_NUM_DSC_CRDT_SENT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_fch_dsc_rcvd_field_info[] = { - {"STAT_NUM_FCH_DSC_RCVD_RSVD_1", - STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_FCH_DSC_RCVD_DSC_CNT", - STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_byp_dsc_rcvd_field_info[] = { - {"STAT_NUM_BYP_DSC_RCVD_RSVD_1", - STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_BYP_DSC_RCVD_DSC_CNT", - STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_cfg_field_info[] = { - {"C2H_WRB_COAL_CFG_MAX_BUF_SZ", - C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK}, - {"C2H_WRB_COAL_CFG_TICK_VAL", - C2H_WRB_COAL_CFG_TICK_VAL_MASK}, - {"C2H_WRB_COAL_CFG_TICK_CNT", - C2H_WRB_COAL_CFG_TICK_CNT_MASK}, - {"C2H_WRB_COAL_CFG_SET_GLB_FLUSH", - C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK}, - {"C2H_WRB_COAL_CFG_DONE_GLB_FLUSH", - C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_req_field_info[] = { - {"C2H_INTR_H2C_REQ_RSVD_1", - C2H_INTR_H2C_REQ_RSVD_1_MASK}, - {"C2H_INTR_H2C_REQ_CNT", - C2H_INTR_H2C_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_mm_req_field_info[] = { - {"C2H_INTR_C2H_MM_REQ_RSVD_1", - C2H_INTR_C2H_MM_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_MM_REQ_CNT", - C2H_INTR_C2H_MM_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_err_int_req_field_info[] = { - {"C2H_INTR_ERR_INT_REQ_RSVD_1", - C2H_INTR_ERR_INT_REQ_RSVD_1_MASK}, - {"C2H_INTR_ERR_INT_REQ_CNT", - C2H_INTR_ERR_INT_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_req_field_info[] = { - {"C2H_INTR_C2H_ST_REQ_RSVD_1", - C2H_INTR_C2H_ST_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_REQ_CNT", - C2H_INTR_C2H_ST_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_ack_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1", - C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_ACK_CNT", - C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_fail_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1", - C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_FAIL_CNT", - C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_no_msix_field_info[] = { - {"C2H_INTR_C2H_ST_NO_MSIX_RSVD_1", - C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_NO_MSIX_CNT", - C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_ctxt_inval_field_info[] = { - {"C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1", - C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_CTXT_INVAL_CNT", - C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wr_cmp_field_info[] = { - {"C2H_STAT_WR_CMP_RSVD_1", - C2H_STAT_WR_CMP_RSVD_1_MASK}, - {"C2H_STAT_WR_CMP_CNT", - C2H_STAT_WR_CMP_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_4_field_info[] = { - {"C2H_STAT_DMA_ENG_4_RSVD_1", - C2H_STAT_DMA_ENG_4_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0", - C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_VLD", - C2H_STAT_DMA_ENG_4_WRQ_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_RDY", - C2H_STAT_DMA_ENG_4_WRQ_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY", - C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR_MASK}, - {"C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_5_field_info[] = { - {"C2H_STAT_DMA_ENG_5_RSVD_1", - C2H_STAT_DMA_ENG_5_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH", - C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ", - C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_qid_field_info[] = { - {"C2H_PFCH_QID_RSVD_1", - C2H_PFCH_QID_RSVD_1_MASK}, - {"C2H_PFCH_QID_ERR_CTXT", - C2H_PFCH_QID_ERR_CTXT_MASK}, - {"C2H_PFCH_QID_TARGET", - C2H_PFCH_QID_TARGET_MASK}, - {"C2H_PFCH_QID_QID_OR_TAG", - C2H_PFCH_QID_QID_OR_TAG_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_field_info[] = { - {"C2H_PFCH_DATA", - C2H_PFCH_DATA_MASK}, -}; - - -static struct regfield_info - c2h_int_dbg_field_info[] = { - {"C2H_INT_RSVD_1", - C2H_INT_RSVD_1_MASK}, - {"C2H_INT_INT_COAL_SM", - C2H_INT_INT_COAL_SM_MASK}, - {"C2H_INT_INT_SM", - C2H_INT_INT_SM_MASK}, -}; - - -static struct regfield_info - c2h_stat_imm_accepted_field_info[] = { - {"C2H_STAT_IMM_ACCEPTED_RSVD_1", - C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_IMM_ACCEPTED_CNT", - C2H_STAT_IMM_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_marker_accepted_field_info[] = { - {"C2H_STAT_MARKER_ACCEPTED_RSVD_1", - C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_MARKER_ACCEPTED_CNT", - C2H_STAT_MARKER_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_disable_cmp_accepted_field_info[] = { - {"C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1", - C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED_CNT", - C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_crdt_cnt_field_info[] = { - {"C2H_PLD_FIFO_CRDT_CNT_RSVD_1", - C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK}, - {"C2H_PLD_FIFO_CRDT_CNT_CNT", - C2H_PLD_FIFO_CRDT_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_req_field_info[] = { - {"C2H_INTR_DYN_REQ_RSVD_1", - C2H_INTR_DYN_REQ_RSVD_1_MASK}, - {"C2H_INTR_DYN_REQ_CNT", - C2H_INTR_DYN_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_misc_field_info[] = { - {"C2H_INTR_DYN_MISC_RSVD_1", - C2H_INTR_DYN_MISC_RSVD_1_MASK}, - {"C2H_INTR_DYN_MISC_CNT", - C2H_INTR_DYN_MISC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_len_mismatch_field_info[] = { - {"C2H_DROP_LEN_MISMATCH_RSVD_1", - C2H_DROP_LEN_MISMATCH_RSVD_1_MASK}, - {"C2H_DROP_LEN_MISMATCH_CNT", - C2H_DROP_LEN_MISMATCH_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_desc_rsp_len_field_info[] = { - {"C2H_DROP_DESC_RSP_LEN_RSVD_1", - C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK}, - {"C2H_DROP_DESC_RSP_LEN_CNT", - C2H_DROP_DESC_RSP_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_qid_fifo_len_field_info[] = { - {"C2H_DROP_QID_FIFO_LEN_RSVD_1", - C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK}, - {"C2H_DROP_QID_FIFO_LEN_CNT", - C2H_DROP_QID_FIFO_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_field_info[] = { - {"C2H_DROP_PLD_CNT_RSVD_1", - C2H_DROP_PLD_CNT_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_CNT", - C2H_DROP_PLD_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_0_field_info[] = { - {"C2H_CMPT_FORMAT_0_DESC_ERR_LOC", - C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_0_COLOR_LOC", - C2H_CMPT_FORMAT_0_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_1_field_info[] = { - {"C2H_CMPT_FORMAT_1_DESC_ERR_LOC", - C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_1_COLOR_LOC", - C2H_CMPT_FORMAT_1_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_2_field_info[] = { - {"C2H_CMPT_FORMAT_2_DESC_ERR_LOC", - C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_2_COLOR_LOC", - C2H_CMPT_FORMAT_2_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_3_field_info[] = { - {"C2H_CMPT_FORMAT_3_DESC_ERR_LOC", - C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_3_COLOR_LOC", - C2H_CMPT_FORMAT_3_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_4_field_info[] = { - {"C2H_CMPT_FORMAT_4_DESC_ERR_LOC", - C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_4_COLOR_LOC", - C2H_CMPT_FORMAT_4_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_5_field_info[] = { - {"C2H_CMPT_FORMAT_5_DESC_ERR_LOC", - C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_5_COLOR_LOC", - C2H_CMPT_FORMAT_5_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_6_field_info[] = { - {"C2H_CMPT_FORMAT_6_DESC_ERR_LOC", - C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_6_COLOR_LOC", - C2H_CMPT_FORMAT_6_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cache_depth_field_info[] = { - {"C2H_PFCH_CACHE_DEPTH_MAX_STBUF", - C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK}, - {"C2H_PFCH_CACHE_DEPTH", - C2H_PFCH_CACHE_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_buf_depth_field_info[] = { - {"C2H_WRB_COAL_BUF_DEPTH_RSVD_1", - C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK}, - {"C2H_WRB_COAL_BUF_DEPTH_BUFFER", - C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK}, -}; - - -static struct regfield_info - c2h_pfch_crdt_field_info[] = { - {"C2H_PFCH_CRDT_RSVD_1", - C2H_PFCH_CRDT_RSVD_1_MASK}, - {"C2H_PFCH_CRDT_RSVD_2", - C2H_PFCH_CRDT_RSVD_2_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_cmpt_accepted_field_info[] = { - {"C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1", - C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_CMPT_ACCEPTED_CNT", - C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_pld_accepted_field_info[] = { - {"C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1", - C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_PLD_ACCEPTED_CNT", - C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_field_info[] = { - {"C2H_PLD_PKT_ID_CMPT_WAIT", - C2H_PLD_PKT_ID_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_DATA", - C2H_PLD_PKT_ID_DATA_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_1_field_info[] = { - {"C2H_PLD_PKT_ID_1_CMPT_WAIT", - C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_1_DATA", - C2H_PLD_PKT_ID_1_DATA_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_1_field_info[] = { - {"C2H_DROP_PLD_CNT_1_RSVD_1", - C2H_DROP_PLD_CNT_1_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_1_CNT", - C2H_DROP_PLD_CNT_1_CNT_MASK}, -}; - - -static struct regfield_info - h2c_err_stat_field_info[] = { - {"H2C_ERR_STAT_RSVD_1", - H2C_ERR_STAT_RSVD_1_MASK}, - {"H2C_ERR_STAT_PAR_ERR", - H2C_ERR_STAT_PAR_ERR_MASK}, - {"H2C_ERR_STAT_SBE", - H2C_ERR_STAT_SBE_MASK}, - {"H2C_ERR_STAT_DBE", - H2C_ERR_STAT_DBE_MASK}, - {"H2C_ERR_STAT_NO_DMA_DS", - H2C_ERR_STAT_NO_DMA_DS_MASK}, - {"H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR", - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK}, - {"H2C_ERR_STAT_ZERO_LEN_DS", - H2C_ERR_STAT_ZERO_LEN_DS_MASK}, -}; - - -static struct regfield_info - h2c_err_mask_field_info[] = { - {"H2C_ERR_EN", - H2C_ERR_EN_MASK}, -}; - - -static struct regfield_info - h2c_first_err_qid_field_info[] = { - {"H2C_FIRST_ERR_QID_RSVD_1", - H2C_FIRST_ERR_QID_RSVD_1_MASK}, - {"H2C_FIRST_ERR_QID_ERR_TYPE", - H2C_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"H2C_FIRST_ERR_QID_RSVD_2", - H2C_FIRST_ERR_QID_RSVD_2_MASK}, - {"H2C_FIRST_ERR_QID_QID", - H2C_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg0_field_info[] = { - {"H2C_REG0_NUM_DSC_RCVD", - H2C_REG0_NUM_DSC_RCVD_MASK}, - {"H2C_REG0_NUM_WRB_SENT", - H2C_REG0_NUM_WRB_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg1_field_info[] = { - {"H2C_REG1_NUM_REQ_SENT", - H2C_REG1_NUM_REQ_SENT_MASK}, - {"H2C_REG1_NUM_CMP_SENT", - H2C_REG1_NUM_CMP_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg2_field_info[] = { - {"H2C_REG2_RSVD_1", - H2C_REG2_RSVD_1_MASK}, - {"H2C_REG2_NUM_ERR_DSC_RCVD", - H2C_REG2_NUM_ERR_DSC_RCVD_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg3_field_info[] = { - {"H2C_REG3_RSVD_1", - H2C_REG3_RSVD_1_MASK}, - {"H2C_REG3_DSCO_FIFO_EMPTY", - H2C_REG3_DSCO_FIFO_EMPTY_MASK}, - {"H2C_REG3_DSCO_FIFO_FULL", - H2C_REG3_DSCO_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RC_STATE", - H2C_REG3_CUR_RC_STATE_MASK}, - {"H2C_REG3_RDREQ_LINES", - H2C_REG3_RDREQ_LINES_MASK}, - {"H2C_REG3_RDATA_LINES_AVAIL", - H2C_REG3_RDATA_LINES_AVAIL_MASK}, - {"H2C_REG3_PEND_FIFO_EMPTY", - H2C_REG3_PEND_FIFO_EMPTY_MASK}, - {"H2C_REG3_PEND_FIFO_FULL", - H2C_REG3_PEND_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RQ_STATE", - H2C_REG3_CUR_RQ_STATE_MASK}, - {"H2C_REG3_DSCI_FIFO_FULL", - H2C_REG3_DSCI_FIFO_FULL_MASK}, - {"H2C_REG3_DSCI_FIFO_EMPTY", - H2C_REG3_DSCI_FIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg4_field_info[] = { - {"H2C_REG4_RDREQ_ADDR", - H2C_REG4_RDREQ_ADDR_MASK}, -}; - - -static struct regfield_info - h2c_fatal_err_en_field_info[] = { - {"H2C_FATAL_ERR_EN_RSVD_1", - H2C_FATAL_ERR_EN_RSVD_1_MASK}, - {"H2C_FATAL_ERR_EN_H2C", - H2C_FATAL_ERR_EN_H2C_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_pcie_field_info[] = { - {"H2C_REQ_THROT_PCIE_EN_REQ", - H2C_REQ_THROT_PCIE_EN_REQ_MASK}, - {"H2C_REQ_THROT_PCIE", - H2C_REQ_THROT_PCIE_MASK}, - {"H2C_REQ_THROT_PCIE_EN_DATA", - H2C_REQ_THROT_PCIE_EN_DATA_MASK}, - {"H2C_REQ_THROT_PCIE_DATA_THRESH", - H2C_REQ_THROT_PCIE_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - h2c_aln_dbg_reg0_field_info[] = { - {"H2C_ALN_REG0_NUM_PKT_SENT", - H2C_ALN_REG0_NUM_PKT_SENT_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_aximm_field_info[] = { - {"H2C_REQ_THROT_AXIMM_EN_REQ", - H2C_REQ_THROT_AXIMM_EN_REQ_MASK}, - {"H2C_REQ_THROT_AXIMM", - H2C_REQ_THROT_AXIMM_MASK}, - {"H2C_REQ_THROT_AXIMM_EN_DATA", - H2C_REQ_THROT_AXIMM_EN_DATA_MASK}, - {"H2C_REQ_THROT_AXIMM_DATA_THRESH", - H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - c2h_mm_ctl_field_info[] = { - {"C2H_MM_CTL_RESERVED1", - C2H_MM_CTL_RESERVED1_MASK}, - {"C2H_MM_CTL_ERRC_EN", - C2H_MM_CTL_ERRC_EN_MASK}, - {"C2H_MM_CTL_RESERVED0", - C2H_MM_CTL_RESERVED0_MASK}, - {"C2H_MM_CTL_RUN", - C2H_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_status_field_info[] = { - {"C2H_MM_STATUS_RSVD_1", - C2H_MM_STATUS_RSVD_1_MASK}, - {"C2H_MM_STATUS_RUN", - C2H_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_cmpl_desc_cnt_field_info[] = { - {"C2H_MM_CMPL_DESC_CNT_C2H_CO", - C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_enable_mask_field_info[] = { - {"C2H_MM_ERR_CODE_ENABLE_RESERVED1", - C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM", - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UR", - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_FLR", - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RESERVED0", - C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_field_info[] = { - {"C2H_MM_ERR_CODE_RESERVED1", - C2H_MM_ERR_CODE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_CIDX", - C2H_MM_ERR_CODE_CIDX_MASK}, - {"C2H_MM_ERR_CODE_RESERVED0", - C2H_MM_ERR_CODE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_SUB_TYPE", - C2H_MM_ERR_CODE_SUB_TYPE_MASK}, - {"C2H_MM_ERR_CODE", - C2H_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_info_field_info[] = { - {"C2H_MM_ERR_INFO_VALID", - C2H_MM_ERR_INFO_VALID_MASK}, - {"C2H_MM_ERR_INFO_SEL", - C2H_MM_ERR_INFO_SEL_MASK}, - {"C2H_MM_ERR_INFO_RSVD_1", - C2H_MM_ERR_INFO_RSVD_1_MASK}, - {"C2H_MM_ERR_INFO_QID", - C2H_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_ctl_field_info[] = { - {"C2H_MM_PERF_MON_CTL_RSVD_1", - C2H_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_START", - C2H_MM_PERF_MON_CTL_IMM_START_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_START", - C2H_MM_PERF_MON_CTL_RUN_START_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_CLEAR", - C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_CLEAR", - C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT0_DCNT", - C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT1_RSVD_1", - C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_DATA_CNT1_DCNT", - C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_dbg_field_info[] = { - {"C2H_MM_RSVD_1", - C2H_MM_RSVD_1_MASK}, - {"C2H_MM_RRQ_ENTRIES", - C2H_MM_RRQ_ENTRIES_MASK}, - {"C2H_MM_DAT_FIFO_SPC", - C2H_MM_DAT_FIFO_SPC_MASK}, - {"C2H_MM_RD_STALL", - C2H_MM_RD_STALL_MASK}, - {"C2H_MM_RRQ_FIFO_FI", - C2H_MM_RRQ_FIFO_FI_MASK}, - {"C2H_MM_WR_STALL", - C2H_MM_WR_STALL_MASK}, - {"C2H_MM_WRQ_FIFO_FI", - C2H_MM_WRQ_FIFO_FI_MASK}, - {"C2H_MM_WBK_STALL", - C2H_MM_WBK_STALL_MASK}, - {"C2H_MM_DSC_FIFO_EP", - C2H_MM_DSC_FIFO_EP_MASK}, - {"C2H_MM_DSC_FIFO_FL", - C2H_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_mm_ctl_field_info[] = { - {"H2C_MM_CTL_RESERVED1", - H2C_MM_CTL_RESERVED1_MASK}, - {"H2C_MM_CTL_ERRC_EN", - H2C_MM_CTL_ERRC_EN_MASK}, - {"H2C_MM_CTL_RESERVED0", - H2C_MM_CTL_RESERVED0_MASK}, - {"H2C_MM_CTL_RUN", - H2C_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_status_field_info[] = { - {"H2C_MM_STATUS_RSVD_1", - H2C_MM_STATUS_RSVD_1_MASK}, - {"H2C_MM_STATUS_RUN", - H2C_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_cmpl_desc_cnt_field_info[] = { - {"H2C_MM_CMPL_DESC_CNT_H2C_CO", - H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_enable_mask_field_info[] = { - {"H2C_MM_ERR_CODE_ENABLE_RESERVED5", - H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED4", - H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED3", - H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED2", - H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED1", - H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_UR_CA", - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED0", - H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_field_info[] = { - {"H2C_MM_ERR_CODE_RSVD_1", - H2C_MM_ERR_CODE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_CIDX", - H2C_MM_ERR_CODE_CIDX_MASK}, - {"H2C_MM_ERR_CODE_RESERVED0", - H2C_MM_ERR_CODE_RESERVED0_MASK}, - {"H2C_MM_ERR_CODE_SUB_TYPE", - H2C_MM_ERR_CODE_SUB_TYPE_MASK}, - {"H2C_MM_ERR_CODE", - H2C_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_info_field_info[] = { - {"H2C_MM_ERR_INFO_VALID", - H2C_MM_ERR_INFO_VALID_MASK}, - {"H2C_MM_ERR_INFO_SEL", - H2C_MM_ERR_INFO_SEL_MASK}, - {"H2C_MM_ERR_INFO_RSVD_1", - H2C_MM_ERR_INFO_RSVD_1_MASK}, - {"H2C_MM_ERR_INFO_QID", - H2C_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_ctl_field_info[] = { - {"H2C_MM_PERF_MON_CTL_RSVD_1", - H2C_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_START", - H2C_MM_PERF_MON_CTL_IMM_START_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_START", - H2C_MM_PERF_MON_CTL_RUN_START_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_CLEAR", - H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_CLEAR", - H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT0_DCNT", - H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT1_RSVD_1", - H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_DATA_CNT1_DCNT", - H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_dbg_field_info[] = { - {"H2C_MM_RSVD_1", - H2C_MM_RSVD_1_MASK}, - {"H2C_MM_RRQ_ENTRIES", - H2C_MM_RRQ_ENTRIES_MASK}, - {"H2C_MM_DAT_FIFO_SPC", - H2C_MM_DAT_FIFO_SPC_MASK}, - {"H2C_MM_RD_STALL", - H2C_MM_RD_STALL_MASK}, - {"H2C_MM_RRQ_FIFO_FI", - H2C_MM_RRQ_FIFO_FI_MASK}, - {"H2C_MM_WR_STALL", - H2C_MM_WR_STALL_MASK}, - {"H2C_MM_WRQ_FIFO_FI", - H2C_MM_WRQ_FIFO_FI_MASK}, - {"H2C_MM_WBK_STALL", - H2C_MM_WBK_STALL_MASK}, - {"H2C_MM_DSC_FIFO_EP", - H2C_MM_DSC_FIFO_EP_MASK}, - {"H2C_MM_DSC_FIFO_FL", - H2C_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_1_field_info[] = { - {"C2H_CRDT_COAL_CFG_1_RSVD_1", - C2H_CRDT_COAL_CFG_1_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH", - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_1_TIMER_TH", - C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_2_field_info[] = { - {"C2H_CRDT_COAL_CFG_2_RSVD_1", - C2H_CRDT_COAL_CFG_2_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_2_FIFO_TH", - C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_2_RESERVED1", - C2H_CRDT_COAL_CFG_2_RESERVED1_MASK}, - {"C2H_CRDT_COAL_CFG_2_NT_TH", - C2H_CRDT_COAL_CFG_2_NT_TH_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_qid_field_info[] = { - {"C2H_PFCH_BYP_QID_RSVD_1", - C2H_PFCH_BYP_QID_RSVD_1_MASK}, - {"C2H_PFCH_BYP_QID", - C2H_PFCH_BYP_QID_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_tag_field_info[] = { - {"C2H_PFCH_BYP_TAG_RSVD_1", - C2H_PFCH_BYP_TAG_RSVD_1_MASK}, - {"C2H_PFCH_BYP_TAG_BYP_QID", - C2H_PFCH_BYP_TAG_BYP_QID_MASK}, - {"C2H_PFCH_BYP_TAG_RSVD_2", - C2H_PFCH_BYP_TAG_RSVD_2_MASK}, - {"C2H_PFCH_BYP_TAG", - C2H_PFCH_BYP_TAG_MASK}, -}; - - -static struct regfield_info - c2h_water_mark_field_info[] = { - {"C2H_WATER_MARK_HIGH_WM", - C2H_WATER_MARK_HIGH_WM_MASK}, - {"C2H_WATER_MARK_LOW_WM", - C2H_WATER_MARK_LOW_WM_MASK}, -}; - - -static struct regfield_info - c2h_notify_empty_field_info[] = { - {"C2H_NOTIFY_EMPTY_RSVD_1", - C2H_NOTIFY_EMPTY_RSVD_1_MASK}, - {"C2H_NOTIFY_EMPTY_NOE", - C2H_NOTIFY_EMPTY_NOE_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_1_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED_1", - C2H_STAT_S_AXIS_C2H_ACCEPTED_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_1_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_1", - C2H_STAT_S_AXIS_WRB_ACCEPTED_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_1_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_1_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP_1", - C2H_STAT_AXIS_PKG_CMP_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_2_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_2", - C2H_STAT_S_AXIS_WRB_ACCEPTED_2_MASK}, -}; - - -static struct regfield_info - c2h_st_pld_fifo_depth_field_info[] = { - {"C2H_ST_PLD_FIFO_DEPTH", - C2H_ST_PLD_FIFO_DEPTH_MASK}, -}; - -static struct xreg_info eqdma_cpm5_config_regs[] = { -{"CFG_BLK_IDENTIFIER", 0x00, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_identifier_field_info), - cfg_blk_identifier_field_info -}, -{"CFG_BLK_PCIE_MAX_PLD_SIZE", 0x08, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_pld_size_field_info), - cfg_blk_pcie_max_pld_size_field_info -}, -{"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", 0x0c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_read_req_size_field_info), - cfg_blk_pcie_max_read_req_size_field_info -}, -{"CFG_BLK_SYSTEM_ID", 0x10, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_system_id_field_info), - cfg_blk_system_id_field_info -}, -{"CFG_BLK_MSIX_ENABLE", 0x014, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msix_enable_field_info), - cfg_blk_msix_enable_field_info -}, -{"CFG_PCIE_DATA_WIDTH", 0x18, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_data_width_field_info), - cfg_pcie_data_width_field_info -}, -{"CFG_PCIE_CTL", 0x1c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_ctl_field_info), - cfg_pcie_ctl_field_info -}, -{"CFG_BLK_MSI_ENABLE", 0x20, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msi_enable_field_info), - cfg_blk_msi_enable_field_info -}, -{"CFG_AXI_USER_MAX_PLD_SIZE", 0x40, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_pld_size_field_info), - cfg_axi_user_max_pld_size_field_info -}, -{"CFG_AXI_USER_MAX_READ_REQ_SIZE", 0x44, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_read_req_size_field_info), - cfg_axi_user_max_read_req_size_field_info -}, -{"CFG_BLK_MISC_CTL", 0x4c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_misc_ctl_field_info), - cfg_blk_misc_ctl_field_info -}, -{"CFG_PL_CRED_CTL", 0x68, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pl_cred_ctl_field_info), - cfg_pl_cred_ctl_field_info -}, -{"CFG_BLK_SCRATCH", 0x80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_field_info), - cfg_blk_scratch_field_info -}, -{"CFG_GIC", 0xa0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_gic_field_info), - cfg_gic_field_info -}, -{"RAM_SBE_MSK_1_A", 0xe0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_1_a_field_info), - ram_sbe_msk_1_a_field_info -}, -{"RAM_SBE_STS_1_A", 0xe4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_1_a_field_info), - ram_sbe_sts_1_a_field_info -}, -{"RAM_DBE_MSK_1_A", 0xe8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_1_a_field_info), - ram_dbe_msk_1_a_field_info -}, -{"RAM_DBE_STS_1_A", 0xec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_1_a_field_info), - ram_dbe_sts_1_a_field_info -}, -{"RAM_SBE_MSK_A", 0xf0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_a_field_info), - ram_sbe_msk_a_field_info -}, -{"RAM_SBE_STS_A", 0xf4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_a_field_info), - ram_sbe_sts_a_field_info -}, -{"RAM_DBE_MSK_A", 0xf8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_a_field_info), - ram_dbe_msk_a_field_info -}, -{"RAM_DBE_STS_A", 0xfc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_a_field_info), - ram_dbe_sts_a_field_info -}, -{"GLBL2_IDENTIFIER", 0x100, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_identifier_field_info), - glbl2_identifier_field_info -}, -{"GLBL2_CHANNEL_INST", 0x114, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_inst_field_info), - glbl2_channel_inst_field_info -}, -{"GLBL2_CHANNEL_MDMA", 0x118, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_mdma_field_info), - glbl2_channel_mdma_field_info -}, -{"GLBL2_CHANNEL_STRM", 0x11c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_strm_field_info), - glbl2_channel_strm_field_info -}, -{"GLBL2_CHANNEL_CAP", 0x120, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_cap_field_info), - glbl2_channel_cap_field_info -}, -{"GLBL2_CHANNEL_PASID_CAP", 0x128, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_pasid_cap_field_info), - glbl2_channel_pasid_cap_field_info -}, -{"GLBL2_SYSTEM_ID", 0x130, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_system_id_field_info), - glbl2_system_id_field_info -}, -{"GLBL2_MISC_CAP", 0x134, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_misc_cap_field_info), - glbl2_misc_cap_field_info -}, -{"GLBL2_DBG_PCIE_RQ0", 0x1b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq0_field_info), - glbl2_dbg_pcie_rq0_field_info -}, -{"GLBL2_DBG_PCIE_RQ1", 0x1bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq1_field_info), - glbl2_dbg_pcie_rq1_field_info -}, -{"GLBL2_DBG_AXIMM_WR0", 0x1c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr0_field_info), - glbl2_dbg_aximm_wr0_field_info -}, -{"GLBL2_DBG_AXIMM_WR1", 0x1c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr1_field_info), - glbl2_dbg_aximm_wr1_field_info -}, -{"GLBL2_DBG_AXIMM_RD0", 0x1c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd0_field_info), - glbl2_dbg_aximm_rd0_field_info -}, -{"GLBL2_DBG_AXIMM_RD1", 0x1cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd1_field_info), - glbl2_dbg_aximm_rd1_field_info -}, -{"GLBL2_DBG_FAB0", 0x1d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab0_field_info), - glbl2_dbg_fab0_field_info -}, -{"GLBL2_DBG_FAB1", 0x1d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab1_field_info), - glbl2_dbg_fab1_field_info -}, -{"GLBL2_DBG_MATCH_SEL", 0x1f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_sel_field_info), - glbl2_dbg_match_sel_field_info -}, -{"GLBL2_DBG_MATCH_MSK", 0x1f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_msk_field_info), - glbl2_dbg_match_msk_field_info -}, -{"GLBL2_DBG_MATCH_PAT", 0x1fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_pat_field_info), - glbl2_dbg_match_pat_field_info -}, -{"GLBL_RNG_SZ_1", 0x204, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_1_field_info), - glbl_rng_sz_1_field_info -}, -{"GLBL_RNG_SZ_2", 0x208, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_2_field_info), - glbl_rng_sz_2_field_info -}, -{"GLBL_RNG_SZ_3", 0x20c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_3_field_info), - glbl_rng_sz_3_field_info -}, -{"GLBL_RNG_SZ_4", 0x210, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_4_field_info), - glbl_rng_sz_4_field_info -}, -{"GLBL_RNG_SZ_5", 0x214, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_5_field_info), - glbl_rng_sz_5_field_info -}, -{"GLBL_RNG_SZ_6", 0x218, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_6_field_info), - glbl_rng_sz_6_field_info -}, -{"GLBL_RNG_SZ_7", 0x21c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_7_field_info), - glbl_rng_sz_7_field_info -}, -{"GLBL_RNG_SZ_8", 0x220, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_8_field_info), - glbl_rng_sz_8_field_info -}, -{"GLBL_RNG_SZ_9", 0x224, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_9_field_info), - glbl_rng_sz_9_field_info -}, -{"GLBL_RNG_SZ_A", 0x228, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_a_field_info), - glbl_rng_sz_a_field_info -}, -{"GLBL_RNG_SZ_B", 0x22c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_b_field_info), - glbl_rng_sz_b_field_info -}, -{"GLBL_RNG_SZ_C", 0x230, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_c_field_info), - glbl_rng_sz_c_field_info -}, -{"GLBL_RNG_SZ_D", 0x234, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_d_field_info), - glbl_rng_sz_d_field_info -}, -{"GLBL_RNG_SZ_E", 0x238, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_e_field_info), - glbl_rng_sz_e_field_info -}, -{"GLBL_RNG_SZ_F", 0x23c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_f_field_info), - glbl_rng_sz_f_field_info -}, -{"GLBL_RNG_SZ_10", 0x240, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_10_field_info), - glbl_rng_sz_10_field_info -}, -{"GLBL_ERR_STAT", 0x248, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_stat_field_info), - glbl_err_stat_field_info -}, -{"GLBL_ERR_MASK", 0x24c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_mask_field_info), - glbl_err_mask_field_info -}, -{"GLBL_DSC_CFG", 0x250, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_cfg_field_info), - glbl_dsc_cfg_field_info -}, -{"GLBL_DSC_ERR_STS", 0x254, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_sts_field_info), - glbl_dsc_err_sts_field_info -}, -{"GLBL_DSC_ERR_MSK", 0x258, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_msk_field_info), - glbl_dsc_err_msk_field_info -}, -{"GLBL_DSC_ERR_LOG0", 0x25c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log0_field_info), - glbl_dsc_err_log0_field_info -}, -{"GLBL_DSC_ERR_LOG1", 0x260, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log1_field_info), - glbl_dsc_err_log1_field_info -}, -{"GLBL_TRQ_ERR_STS", 0x264, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_sts_field_info), - glbl_trq_err_sts_field_info -}, -{"GLBL_TRQ_ERR_MSK", 0x268, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_msk_field_info), - glbl_trq_err_msk_field_info -}, -{"GLBL_TRQ_ERR_LOG", 0x26c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_log_field_info), - glbl_trq_err_log_field_info -}, -{"GLBL_DSC_DBG_DAT0", 0x270, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat0_field_info), - glbl_dsc_dbg_dat0_field_info -}, -{"GLBL_DSC_DBG_DAT1", 0x274, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat1_field_info), - glbl_dsc_dbg_dat1_field_info -}, -{"GLBL_DSC_DBG_CTL", 0x278, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_ctl_field_info), - glbl_dsc_dbg_ctl_field_info -}, -{"GLBL_DSC_ERR_LOG2", 0x27c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log2_field_info), - glbl_dsc_err_log2_field_info -}, -{"GLBL_GLBL_INTERRUPT_CFG", 0x2c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_glbl_interrupt_cfg_field_info), - glbl_glbl_interrupt_cfg_field_info -}, -{"GLBL_VCH_HOST_PROFILE", 0x2c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_vch_host_profile_field_info), - glbl_vch_host_profile_field_info -}, -{"GLBL_BRIDGE_HOST_PROFILE", 0x308, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_bridge_host_profile_field_info), - glbl_bridge_host_profile_field_info -}, -{"AXIMM_IRQ_DEST_ADDR", 0x30c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(aximm_irq_dest_addr_field_info), - aximm_irq_dest_addr_field_info -}, -{"FAB_ERR_LOG", 0x314, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(fab_err_log_field_info), - fab_err_log_field_info -}, -{"IND_CTXT_DATA", 0x804, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_field_info), - ind_ctxt_data_field_info -}, -{"IND_CTXT_MASK", 0x824, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_mask_field_info), - ind_ctxt_mask_field_info -}, -{"IND_CTXT_CMD", 0x844, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_cmd_field_info), - ind_ctxt_cmd_field_info -}, -{"C2H_TIMER_CNT", 0xa00, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_field_info), - c2h_timer_cnt_field_info -}, -{"C2H_CNT_TH", 0xa40, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_field_info), - c2h_cnt_th_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xa88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_field_info), - c2h_stat_s_axis_c2h_accepted_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED", 0xa8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_field_info), - c2h_stat_s_axis_wrb_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xa90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_field_info), - c2h_stat_desc_rsp_pkt_accepted_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP", 0xa94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_field_info), - c2h_stat_axis_pkg_cmp_field_info -}, -{"C2H_STAT_DESC_RSP_ACCEPTED", 0xa98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_accepted_field_info), - c2h_stat_desc_rsp_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_CMP", 0xa9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_cmp_field_info), - c2h_stat_desc_rsp_cmp_field_info -}, -{"C2H_STAT_WRQ_OUT", 0xaa0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wrq_out_field_info), - c2h_stat_wrq_out_field_info -}, -{"C2H_STAT_WPL_REN_ACCEPTED", 0xaa4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wpl_ren_accepted_field_info), - c2h_stat_wpl_ren_accepted_field_info -}, -{"C2H_STAT_TOTAL_WRQ_LEN", 0xaa8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wrq_len_field_info), - c2h_stat_total_wrq_len_field_info -}, -{"C2H_STAT_TOTAL_WPL_LEN", 0xaac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wpl_len_field_info), - c2h_stat_total_wpl_len_field_info -}, -{"C2H_BUF_SZ", 0xab0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_field_info), - c2h_buf_sz_field_info -}, -{"C2H_ERR_STAT", 0xaf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_stat_field_info), - c2h_err_stat_field_info -}, -{"C2H_ERR_MASK", 0xaf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_mask_field_info), - c2h_err_mask_field_info -}, -{"C2H_FATAL_ERR_STAT", 0xaf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_stat_field_info), - c2h_fatal_err_stat_field_info -}, -{"C2H_FATAL_ERR_MASK", 0xafc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_mask_field_info), - c2h_fatal_err_mask_field_info -}, -{"C2H_FATAL_ERR_ENABLE", 0xb00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_enable_field_info), - c2h_fatal_err_enable_field_info -}, -{"GLBL_ERR_INT", 0xb04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_int_field_info), - glbl_err_int_field_info -}, -{"C2H_PFCH_CFG", 0xb08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_field_info), - c2h_pfch_cfg_field_info -}, -{"C2H_PFCH_CFG_1", 0xa80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_pfch_cfg_1_field_info), - c2h_pfch_cfg_1_field_info -}, -{"C2H_PFCH_CFG_2", 0xa84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_pfch_cfg_2_field_info), - c2h_pfch_cfg_2_field_info -}, -{"C2H_INT_TIMER_TICK", 0xb0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_timer_tick_field_info), - c2h_int_timer_tick_field_info -}, -{"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xb10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_drop_accepted_field_info), - c2h_stat_desc_rsp_drop_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xb14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_err_accepted_field_info), - c2h_stat_desc_rsp_err_accepted_field_info -}, -{"C2H_STAT_DESC_REQ", 0xb18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_req_field_info), - c2h_stat_desc_req_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_0", 0xb1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_0_field_info), - c2h_stat_dbg_dma_eng_0_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_1", 0xb20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_1_field_info), - c2h_stat_dbg_dma_eng_1_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_2", 0xb24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_2_field_info), - c2h_stat_dbg_dma_eng_2_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_3", 0xb28, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_3_field_info), - c2h_stat_dbg_dma_eng_3_field_info -}, -{"C2H_DBG_PFCH_ERR_CTXT", 0xb2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_err_ctxt_field_info), - c2h_dbg_pfch_err_ctxt_field_info -}, -{"C2H_FIRST_ERR_QID", 0xb30, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_first_err_qid_field_info), - c2h_first_err_qid_field_info -}, -{"STAT_NUM_WRB_IN", 0xb34, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_in_field_info), - stat_num_wrb_in_field_info -}, -{"STAT_NUM_WRB_OUT", 0xb38, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_out_field_info), - stat_num_wrb_out_field_info -}, -{"STAT_NUM_WRB_DRP", 0xb3c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_drp_field_info), - stat_num_wrb_drp_field_info -}, -{"STAT_NUM_STAT_DESC_OUT", 0xb40, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_stat_desc_out_field_info), - stat_num_stat_desc_out_field_info -}, -{"STAT_NUM_DSC_CRDT_SENT", 0xb44, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_dsc_crdt_sent_field_info), - stat_num_dsc_crdt_sent_field_info -}, -{"STAT_NUM_FCH_DSC_RCVD", 0xb48, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_fch_dsc_rcvd_field_info), - stat_num_fch_dsc_rcvd_field_info -}, -{"STAT_NUM_BYP_DSC_RCVD", 0xb4c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_byp_dsc_rcvd_field_info), - stat_num_byp_dsc_rcvd_field_info -}, -{"C2H_WRB_COAL_CFG", 0xb50, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_cfg_field_info), - c2h_wrb_coal_cfg_field_info -}, -{"C2H_INTR_H2C_REQ", 0xb54, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_h2c_req_field_info), - c2h_intr_h2c_req_field_info -}, -{"C2H_INTR_C2H_MM_REQ", 0xb58, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_mm_req_field_info), - c2h_intr_c2h_mm_req_field_info -}, -{"C2H_INTR_ERR_INT_REQ", 0xb5c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_err_int_req_field_info), - c2h_intr_err_int_req_field_info -}, -{"C2H_INTR_C2H_ST_REQ", 0xb60, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_req_field_info), - c2h_intr_c2h_st_req_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK", 0xb64, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_ack_field_info), - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL", 0xb68, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_fail_field_info), - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX", 0xb6c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info), - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL", 0xb70, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info), - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_ACK", 0xb74, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_ack_field_info), - c2h_intr_c2h_st_msix_ack_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_FAIL", 0xb78, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_fail_field_info), - c2h_intr_c2h_st_msix_fail_field_info -}, -{"C2H_INTR_C2H_ST_NO_MSIX", 0xb7c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_no_msix_field_info), - c2h_intr_c2h_st_no_msix_field_info -}, -{"C2H_INTR_C2H_ST_CTXT_INVAL", 0xb80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_ctxt_inval_field_info), - c2h_intr_c2h_st_ctxt_inval_field_info -}, -{"C2H_STAT_WR_CMP", 0xb84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wr_cmp_field_info), - c2h_stat_wr_cmp_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_4", 0xb88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_4_field_info), - c2h_stat_dbg_dma_eng_4_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_5", 0xb8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_5_field_info), - c2h_stat_dbg_dma_eng_5_field_info -}, -{"C2H_DBG_PFCH_QID", 0xb90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_qid_field_info), - c2h_dbg_pfch_qid_field_info -}, -{"C2H_DBG_PFCH", 0xb94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_field_info), - c2h_dbg_pfch_field_info -}, -{"C2H_INT_DBG", 0xb98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_dbg_field_info), - c2h_int_dbg_field_info -}, -{"C2H_STAT_IMM_ACCEPTED", 0xb9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_imm_accepted_field_info), - c2h_stat_imm_accepted_field_info -}, -{"C2H_STAT_MARKER_ACCEPTED", 0xba0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_marker_accepted_field_info), - c2h_stat_marker_accepted_field_info -}, -{"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xba4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_disable_cmp_accepted_field_info), - c2h_stat_disable_cmp_accepted_field_info -}, -{"C2H_PLD_FIFO_CRDT_CNT", 0xba8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_crdt_cnt_field_info), - c2h_pld_fifo_crdt_cnt_field_info -}, -{"C2H_INTR_DYN_REQ", 0xbac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_req_field_info), - c2h_intr_dyn_req_field_info -}, -{"C2H_INTR_DYN_MISC", 0xbb0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_misc_field_info), - c2h_intr_dyn_misc_field_info -}, -{"C2H_DROP_LEN_MISMATCH", 0xbb4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_len_mismatch_field_info), - c2h_drop_len_mismatch_field_info -}, -{"C2H_DROP_DESC_RSP_LEN", 0xbb8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_desc_rsp_len_field_info), - c2h_drop_desc_rsp_len_field_info -}, -{"C2H_DROP_QID_FIFO_LEN", 0xbbc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_qid_fifo_len_field_info), - c2h_drop_qid_fifo_len_field_info -}, -{"C2H_DROP_PLD_CNT", 0xbc0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_field_info), - c2h_drop_pld_cnt_field_info -}, -{"C2H_CMPT_FORMAT_0", 0xbc4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_0_field_info), - c2h_cmpt_format_0_field_info -}, -{"C2H_CMPT_FORMAT_1", 0xbc8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_1_field_info), - c2h_cmpt_format_1_field_info -}, -{"C2H_CMPT_FORMAT_2", 0xbcc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_2_field_info), - c2h_cmpt_format_2_field_info -}, -{"C2H_CMPT_FORMAT_3", 0xbd0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_3_field_info), - c2h_cmpt_format_3_field_info -}, -{"C2H_CMPT_FORMAT_4", 0xbd4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_4_field_info), - c2h_cmpt_format_4_field_info -}, -{"C2H_CMPT_FORMAT_5", 0xbd8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_5_field_info), - c2h_cmpt_format_5_field_info -}, -{"C2H_CMPT_FORMAT_6", 0xbdc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_6_field_info), - c2h_cmpt_format_6_field_info -}, -{"C2H_PFCH_CACHE_DEPTH", 0xbe0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cache_depth_field_info), - c2h_pfch_cache_depth_field_info -}, -{"C2H_WRB_COAL_BUF_DEPTH", 0xbe4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_buf_depth_field_info), - c2h_wrb_coal_buf_depth_field_info -}, -{"C2H_PFCH_CRDT", 0xbe8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_crdt_field_info), - c2h_pfch_crdt_field_info -}, -{"C2H_STAT_HAS_CMPT_ACCEPTED", 0xbec, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_cmpt_accepted_field_info), - c2h_stat_has_cmpt_accepted_field_info -}, -{"C2H_STAT_HAS_PLD_ACCEPTED", 0xbf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_pld_accepted_field_info), - c2h_stat_has_pld_accepted_field_info -}, -{"C2H_PLD_PKT_ID", 0xbf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_field_info), - c2h_pld_pkt_id_field_info -}, -{"C2H_PLD_PKT_ID_1", 0xbf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_1_field_info), - c2h_pld_pkt_id_1_field_info -}, -{"C2H_DROP_PLD_CNT_1", 0xbfc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_1_field_info), - c2h_drop_pld_cnt_1_field_info -}, -{"H2C_ERR_STAT", 0xe00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_stat_field_info), - h2c_err_stat_field_info -}, -{"H2C_ERR_MASK", 0xe04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_mask_field_info), - h2c_err_mask_field_info -}, -{"H2C_FIRST_ERR_QID", 0xe08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_first_err_qid_field_info), - h2c_first_err_qid_field_info -}, -{"H2C_DBG_REG0", 0xe0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg0_field_info), - h2c_dbg_reg0_field_info -}, -{"H2C_DBG_REG1", 0xe10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg1_field_info), - h2c_dbg_reg1_field_info -}, -{"H2C_DBG_REG2", 0xe14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg2_field_info), - h2c_dbg_reg2_field_info -}, -{"H2C_DBG_REG3", 0xe18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg3_field_info), - h2c_dbg_reg3_field_info -}, -{"H2C_DBG_REG4", 0xe1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg4_field_info), - h2c_dbg_reg4_field_info -}, -{"H2C_FATAL_ERR_EN", 0xe20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_fatal_err_en_field_info), - h2c_fatal_err_en_field_info -}, -{"H2C_REQ_THROT_PCIE", 0xe24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_pcie_field_info), - h2c_req_throt_pcie_field_info -}, -{"H2C_ALN_DBG_REG0", 0xe28, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_aln_dbg_reg0_field_info), - h2c_aln_dbg_reg0_field_info -}, -{"H2C_REQ_THROT_AXIMM", 0xe2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_aximm_field_info), - h2c_req_throt_aximm_field_info -}, -{"C2H_MM_CTL", 0x1004, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_ctl_field_info), - c2h_mm_ctl_field_info -}, -{"C2H_MM_STATUS", 0x1040, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_status_field_info), - c2h_mm_status_field_info -}, -{"C2H_MM_CMPL_DESC_CNT", 0x1048, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_cmpl_desc_cnt_field_info), - c2h_mm_cmpl_desc_cnt_field_info -}, -{"C2H_MM_ERR_CODE_ENABLE_MASK", 0x1054, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_enable_mask_field_info), - c2h_mm_err_code_enable_mask_field_info -}, -{"C2H_MM_ERR_CODE", 0x1058, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_field_info), - c2h_mm_err_code_field_info -}, -{"C2H_MM_ERR_INFO", 0x105c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_info_field_info), - c2h_mm_err_info_field_info -}, -{"C2H_MM_PERF_MON_CTL", 0x10c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_ctl_field_info), - c2h_mm_perf_mon_ctl_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT0", 0x10c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt0_field_info), - c2h_mm_perf_mon_cycle_cnt0_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT1", 0x10c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt1_field_info), - c2h_mm_perf_mon_cycle_cnt1_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT0", 0x10cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt0_field_info), - c2h_mm_perf_mon_data_cnt0_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT1", 0x10d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt1_field_info), - c2h_mm_perf_mon_data_cnt1_field_info -}, -{"C2H_MM_DBG", 0x10e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_dbg_field_info), - c2h_mm_dbg_field_info -}, -{"H2C_MM_CTL", 0x1204, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_ctl_field_info), - h2c_mm_ctl_field_info -}, -{"H2C_MM_STATUS", 0x1240, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_status_field_info), - h2c_mm_status_field_info -}, -{"H2C_MM_CMPL_DESC_CNT", 0x1248, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_cmpl_desc_cnt_field_info), - h2c_mm_cmpl_desc_cnt_field_info -}, -{"H2C_MM_ERR_CODE_ENABLE_MASK", 0x1254, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_enable_mask_field_info), - h2c_mm_err_code_enable_mask_field_info -}, -{"H2C_MM_ERR_CODE", 0x1258, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_field_info), - h2c_mm_err_code_field_info -}, -{"H2C_MM_ERR_INFO", 0x125c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_info_field_info), - h2c_mm_err_info_field_info -}, -{"H2C_MM_PERF_MON_CTL", 0x12c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_ctl_field_info), - h2c_mm_perf_mon_ctl_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT0", 0x12c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt0_field_info), - h2c_mm_perf_mon_cycle_cnt0_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT1", 0x12c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt1_field_info), - h2c_mm_perf_mon_cycle_cnt1_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT0", 0x12cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt0_field_info), - h2c_mm_perf_mon_data_cnt0_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT1", 0x12d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt1_field_info), - h2c_mm_perf_mon_data_cnt1_field_info -}, -{"H2C_MM_DBG", 0x12e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_dbg_field_info), - h2c_mm_dbg_field_info -}, -{"C2H_CRDT_COAL_CFG_1", 0x1400, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_1_field_info), - c2h_crdt_coal_cfg_1_field_info -}, -{"C2H_CRDT_COAL_CFG_2", 0x1404, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_2_field_info), - c2h_crdt_coal_cfg_2_field_info -}, -{"C2H_PFCH_BYP_QID", 0x1408, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_qid_field_info), - c2h_pfch_byp_qid_field_info -}, -{"C2H_PFCH_BYP_TAG", 0x140c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_tag_field_info), - c2h_pfch_byp_tag_field_info -}, -{"C2H_WATER_MARK", 0x1500, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_water_mark_field_info), - c2h_water_mark_field_info -}, -{"C2H_NOTIFY_EMPTY", 0x1800, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_notify_empty_field_info), - c2h_notify_empty_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED_1", 0x1804, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_1_field_info), - c2h_stat_s_axis_c2h_accepted_1_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED_1", 0x1808, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_1_field_info), - c2h_stat_s_axis_wrb_accepted_1_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED_1", 0x180c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_1_field_info), - c2h_stat_desc_rsp_pkt_accepted_1_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP_1", 0x1810, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_1_field_info), - c2h_stat_axis_pkg_cmp_1_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED_2", 0x1814, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_2_field_info), - c2h_stat_s_axis_wrb_accepted_2_field_info -}, -{"C2H_ST_PLD_FIFO_DEPTH", 0x1818, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_st_pld_fifo_depth_field_info), - c2h_st_pld_fifo_depth_field_info -}, - -}; - -uint32_t eqdma_cpm5_config_num_regs_get(void) -{ - return (sizeof(eqdma_cpm5_config_regs)/ - sizeof(eqdma_cpm5_config_regs[0])); -} - -struct xreg_info *eqdma_cpm5_config_regs_get(void) -{ - return eqdma_cpm5_config_regs; -} - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.c deleted file mode 100755 index 0a65fba..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.c +++ /dev/null @@ -1,6817 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "eqdma_soft_access.h" -#include "eqdma_soft_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_soft_access.tmh" -#endif - -/** EQDMA Context array size */ -#define EQDMA_FMAP_NUM_WORDS 2 -#define EQDMA_SW_CONTEXT_NUM_WORDS 8 -#define EQDMA_HW_CONTEXT_NUM_WORDS 2 -#define EQDMA_PFETCH_CONTEXT_NUM_WORDS 2 -#define EQDMA_CR_CONTEXT_NUM_WORDS 1 -#define EQDMA_CMPT_CONTEXT_NUM_WORDS 6 -#define EQDMA_IND_INTR_CONTEXT_NUM_WORDS 4 - -#define EQDMA_VF_USER_BAR_ID 2 - -#define EQDMA_REG_GROUP_1_START_ADDR 0x000 -#define EQDMA_REG_GROUP_2_START_ADDR 0x804 -#define EQDMA_REG_GROUP_3_START_ADDR 0xB00 -#define EQDMA_REG_GROUP_4_START_ADDR 0x5014 - -#define EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS 11 -#define EQDMA_GLBL_TRQ_ERR_ALL_MASK 0XB3 -#define EQDMA_GLBL_DSC_ERR_ALL_MASK 0X1F9037E -#define EQDMA_C2H_ERR_ALL_MASK 0X3F6DF -#define EQDMA_C2H_FATAL_ERR_ALL_MASK 0X1FDF1B -#define EQDMA_H2C_ERR_ALL_MASK 0X3F -#define EQDMA_SBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_DBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_MM_C2H_ERR_ALL_MASK 0X70000003 -#define EQDMA_MM_H2C0_ERR_ALL_MASK 0X3041013E - - - - -/* H2C Throttle settings for QDMA 4.0 */ -#define EQDMA_H2C_THROT_DATA_THRESH 0x5000 -#define EQDMA_THROT_EN_DATA 1 -#define EQDMA_THROT_EN_REQ 0 -#define EQDMA_H2C_THROT_REQ_THRESH 0xC0 - -/* H2C Throttle settings for QDMA 5.0 */ -#define EQDMA5_H2C_THROT_DATA_THRESH 0x5000 -#define EQDMA5_THROT_EN_DATA 1 -#define EQDMA5_THROT_EN_REQ 1 -#define EQDMA5_H2C_THROT_REQ_THRESH 0xC0 - -/* CSR Default values for QDMA 5.0 */ -#define EQDMA5_DEFAULT_C2H_UODSC_LIMIT 5 -#define EQDMA5_DEFAULT_H2C_UODSC_LIMIT 8 -#define EQDMA5_DEFAULT_MAX_DSC_FETCH 5 -#define EQDMA5_DEFAULT_WRB_INT QDMA_WRB_INTERVAL_128 - -/* C2H prefetch Throttle configuration. */ -#define EQDMA5_DEFAULT_C2H_EVT_QCNT_TH 0x38 -#define EQDMA5_DEFAULT_C2H_PFCH_QCNT 0x3c - -/** Auxillary Bitmasks for fields spanning multiple words */ -#define EQDMA_SW_CTXT_PASID_GET_H_MASK GENMASK(21, 12) -#define EQDMA_SW_CTXT_PASID_GET_L_MASK GENMASK(11, 0) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK GENMASK_ULL(63, 53) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK GENMASK_ULL(52, 21) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK GENMASK_ULL(20, 0) -#define EQDMA_CMPL_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_CMPL_CTXT_PASID_GET_L_MASK GENMASK(8, 0) -#define EQDMA_INTR_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_INTR_CTXT_PASID_GET_L_MASK GENMASK(8, 0) - - -#define EQDMA_OFFSET_GLBL2_PF_BARLITE_EXT 0x10C - -#define QDMA_OFFSET_GLBL2_PF_BARLITE_INT 0x104 -#define QDMA_GLBL2_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define QDMA_GLBL2_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define QDMA_GLBL2_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define QDMA_GLBL2_PF0_BAR_MAP_MASK GENMASK(5, 0) - -#define EQDMA_GLBL2_DBG_MODE_EN_MASK BIT(4) -#define EQDMA_GLBL2_DESC_ENG_MODE_MASK GENMASK(3, 2) -#define EQDMA_GLBL2_FLR_PRESENT_MASK BIT(1) -#define EQDMA_GLBL2_MAILBOX_EN_MASK BIT(0) - -/** EQDMA_IND_REG_SEL_FMAP */ -#define EQDMA_FMAP_CTXT_W1_QID_MAX_MASK GENMASK(11, 0) -#define EQDMA_FMAP_CTXT_W0_QID_MASK GENMASK(10, 0) - -#define EQDMA_GLBL2_IP_VERSION_MASK GENMASK(23, 20) -#define EQDMA_GLBL2_VF_IP_VERSION_MASK GENMASK(7, 4) - -static void eqdma_hw_st_h2c_err_process(void *dev_hndl); -static void eqdma_hw_st_c2h_err_process(void *dev_hndl); -static void eqdma_hw_desc_err_process(void *dev_hndl); -static void eqdma_hw_trq_err_process(void *dev_hndl); -static void eqdma_hw_ram_sbe_err_process(void *dev_hndl); -static void eqdma_hw_ram_dbe_err_process(void *dev_hndl); -static void eqdma_mm_h2c0_err_process(void *dev_hndl); -static void eqdma_mm_c2h0_err_process(void *dev_hndl); - -static struct eqdma_hw_err_info eqdma_err_info[EQDMA_ERRS_ALL] = { - /* Descriptor errors */ - { - EQDMA_DSC_ERR_POISON, - "Poison error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_UR_CA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_BCNT, - "Unexpected Byte count in completion error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_BCNT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_PARAM, - "Parameter mismatch error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PARAM_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_ADDR, - "Address mismatch error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_ADDR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_TAG, - "Unexpected tag error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TAG_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_FLR, - "FLR error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_TIMEOUT, - "Timed out error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DAT_POISON, - "Poison data error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DAT_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DMA, - "DMA engine error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DMA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DSC, - "Invalid PIDX update error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DSC_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_SBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_PORT_ID, - "Port ID Error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PORT_ID_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_ALL, - "All Descriptor errors", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - EQDMA_GLBL_DSC_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - - /* TRQ errors */ - { - EQDMA_TRQ_ERR_CSR_UNMAPPED, - "Access targeted unmapped register space via CSR pathway error", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_VF_ACCESS, - "VF attempted to access Global register space or Function map", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_TCP_CSR_TIMEOUT, - "Timeout on request to dma internal csr register", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_QSPC_UNMAPPED, - "Access targeted unmapped register via queue space pathway", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_QID_RANGE, - "Qid range error", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QID_RANGE_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_TCP_QSPC_TIMEOUT, - "Timeout on request to dma internal queue space register", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_ALL, - "All TRQ errors", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_GLBL_TRQ_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - - /* C2H Errors*/ - { - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_SH_CMPT_DSC, - "A Shared CMPT queue has encountered a descriptor error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_DESC_RSP_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MSI_INT_FAIL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ERR_DESC_CNT_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - "Writeback on invalid queue error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - "Completion queue gets full error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_QFULL_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - "Bad CIDX update by the software error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_CIDX_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - "C2H completion Parity error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PRTY_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_AVL_RING_DSC, - "Available ring fetch returns descriptor with error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_HDR_ECC_UNC, - "multi-bit ecc error on c2h packet header", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_HDR_ECC_COR, - "single-bit ecc error on c2h packet header", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_WRB_PORT_ID_ERR, - "Port ID error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ALL, - "All C2h errors", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - EQDMA_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_WPL_DATA_PAR, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_HDR_ECC_UNC, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_ALL, - "All fatal errors", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_C2H_FATAL_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - "Zero length descriptor error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_ZERO_LEN_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - "A non-EOP descriptor received", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_NO_DMA_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_DBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_PAR, - "Internal data parity error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_ALL, - "All H2C errors", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - EQDMA_H2C_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Even RAM single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM 1 single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_ALL, - "All SBE Errors.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - EQDMA_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, -{ - EQDMA_SBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slavle FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM single bit ECC error.", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_ALL, - "All SBE errors", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - EQDMA_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - - - /* DBE errors */ - { - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_ALL, - "All DBE errors", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - EQDMA_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_FUNC_MAP, - "Function map RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slave FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_ALL, - "All DBE errors", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - EQDMA_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - /* MM C2H Engine 0 errors */ - { - EQDMA_MM_C2H_WR_SLR_ERR, - "MM C2H0 WR SLV Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_RD_SLR_ERR, - "MM C2H0 RD SLV Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_WR_FLR_ERR, - "MM C2H0 WR FLR Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_UR_ERR, - "MM C2H0 Unsupported Request Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_WR_UC_RAM_ERR, - "MM C2H0 Write Uncorrectable RAM Error", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - { - EQDMA_MM_C2H_ERR_ALL, - "All MM C2H Errors", - EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_C2H_MM_STATUS_ADDR, - EQDMA_MM_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK, - &eqdma_mm_c2h0_err_process - }, - /* MM H2C Engine 0 Errors */ - { - EQDMA_MM_H2C0_RD_HDR_POISON_ERR, - "MM H2C0 Read cmpt header pison Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_UR_CA_ERR, - "MM H2C0 Read cmpt unsupported request Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_HDR_BYTE_ERR, - "MM H2C0 Read cmpt hdr byte cnt Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_HDR_PARAM_ERR, - "MM H2C0 Read cmpt hdr param mismatch Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_HDR_ADR_ERR, - "MM H2C0 Read cmpt hdr address mismatch Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_FLR_ERR, - "MM H2C0 Read flr Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_DAT_POISON_ERR, - "MM H2C0 Read data poison Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_RD_RQ_DIS_ERR, - "MM H2C0 Read request disable Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_WR_DEC_ERR, - "MM H2C0 Write desc Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_WR_SLV_ERR, - "MM H2C0 Write slv Error", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - { - EQDMA_MM_H2C0_ERR_ALL, - "All MM H2C Errors", - EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR, - EQDMA_H2C_MM_STATUS_ADDR, - EQDMA_MM_H2C0_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK, - &eqdma_mm_h2c0_err_process - }, - -}; - -static int32_t all_eqdma_hw_errs[EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS] = { - - EQDMA_DSC_ERR_ALL, - EQDMA_TRQ_ERR_ALL, - EQDMA_ST_C2H_ERR_ALL, - EQDMA_ST_FATAL_ERR_ALL, - EQDMA_ST_H2C_ERR_ALL, - EQDMA_SBE_1_ERR_ALL, - EQDMA_SBE_ERR_ALL, - EQDMA_DBE_1_ERR_ALL, - EQDMA_DBE_ERR_ALL, - EQDMA_MM_C2H_ERR_ALL, - EQDMA_MM_H2C0_ERR_ALL -}; - -static struct qctx_entry eqdma_sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Function Id", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Address Translation", 0}, - {"Fetch Max", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Interrupt with VF", 0}, - {"Pack descriptor output interface", 0}, - {"Irq Bypass", 0}, -}; - -static struct qctx_entry eqdma_hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry eqdma_credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry eqdma_fmap_ctxt_entries[] = { - {"Queue Base", 0}, - {"Queue Max", 0}, -}; - -static struct qctx_entry eqdma_cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Addr High (L)[37:6]", 0}, - {"Base Addr High(H)[63:38]", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, - {"Over Flow Check Disable", 0}, - {"Address Translation", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Insterrupt with VF", 0}, - {"c2h Direction", 0}, - {"Base Addr Low[5:2]", 0}, - {"Shared Completion Queue", 0}, -}; - -static struct qctx_entry eqdma_c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Variable Descriptor", 0}, - {"Number of descriptors prefetched", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry eqdma_ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, - {"at", 0}, - {"Function Id", 0}, -}; - -static int eqdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int eqdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - -uint32_t eqdma_get_config_num_regs(void) -{ - return eqdma_config_num_regs_get(); -} - -struct xreg_info *eqdma_get_config_regs(void) -{ - return eqdma_config_regs_get(); -} - -uint32_t eqdma_reg_dump_buf_len(void) -{ - uint32_t length = (eqdma_config_num_regs_get() + 1) - * REG_DUMP_SIZE_PER_LINE; - return length; -} - -int eqdma_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - int len = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(eqdma_cmpt_ctxt_entries) / - sizeof(eqdma_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(eqdma_sw_ctxt_entries) / - sizeof(eqdma_sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_hw_ctxt_entries) / - sizeof(eqdma_hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_credit_ctxt_entries) / - sizeof(eqdma_credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_fmap_ctxt_entries) / - sizeof(eqdma_fmap_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(eqdma_cmpt_ctxt_entries) / - sizeof(eqdma_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_c2h_pftch_ctxt_entries) / - sizeof(eqdma_c2h_pftch_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } - } - - *buflen = len; - return 0; -} - - -static uint32_t eqdma_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(eqdma_ind_intr_ctxt_entries) / - sizeof(eqdma_ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - - -static void eqdma_set_perf_opt(void *dev_hndl) -{ - uint32_t reg_val = 0, data_th = 0, pfch_cache_dpth = 0; - /**** - * TODO: All the below settings are for QDMA5.0 - * Need to add the QDMA4.0 settings - */ -#define EQDMA_PFTCH_CACHE_DEPTH 64 -#define GLBL_DSC_CFG_RSVD_1_DFLT 0 -#define EQDMA_GLBL_DSC_CFG_C2H_UODSC_LIMIT 5 -#define EQDMA_GLBL_DSC_CFG_H2C_UODSC_LIMIT 8 -#define GLBL_DSC_CFG_UNC_OVR_COR_DFLT 0 -#define GLBL_DSC_CFG_CTXT_FER_DIS_DFLT 0 -#define GLBL_DSC_CFG_RSVD_2_DFLT 0 -#define EQDMA_GLBL_DSC_CFG_MAXFETCH 2 -#define EQDMA_GLBL_DSC_CFG_WB_ACC_INT 5 - - reg_val = - FIELD_SET(GLBL_DSC_CFG_RSVD_1_MASK, GLBL_DSC_CFG_RSVD_1_DFLT) | - FIELD_SET(GLBL_DSC_CFG_C2H_UODSC_LIMIT_MASK, - EQDMA_GLBL_DSC_CFG_C2H_UODSC_LIMIT) | - FIELD_SET(GLBL_DSC_CFG_H2C_UODSC_LIMIT_MASK, - EQDMA_GLBL_DSC_CFG_H2C_UODSC_LIMIT) | - FIELD_SET(GLBL_DSC_CFG_UNC_OVR_COR_MASK, - GLBL_DSC_CFG_UNC_OVR_COR_DFLT) | - FIELD_SET(GLBL_DSC_CFG_CTXT_FER_DIS_MASK, - GLBL_DSC_CFG_CTXT_FER_DIS_DFLT) | - FIELD_SET(GLBL_DSC_CFG_RSVD_2_MASK, GLBL_DSC_CFG_RSVD_2_DFLT) | - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - EQDMA_GLBL_DSC_CFG_MAXFETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - EQDMA_GLBL_DSC_CFG_WB_ACC_INT); - qdma_reg_write(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL_DSC_CFG_ADDR, reg_val); - -#define CFG_BLK_MISC_CTL_RSVD_1_DFLT 0 -#define CFG_BLK_MISC_CTL_10B_TAG_DFLT 0 -#define CFG_BLK_MISC_CTL_RSVD_2_DFLT 0 -#define CFG_BLK_MISC_CTL_AXI_WBK_DFLT 0 -#define CFG_BLK_MISC_CTL_AXI_DSC_DFLT 0 -#define CFG_BLK_MISC_CTL_NUM_TAG_DFLT 256 -#define CFG_BLK_MISC_CTL_RSVD_3_DFLT 0 -#define EQDMA_CFG_BLK_MISC_CTL_RQ_METERING_MUL 9 - - - reg_val = - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_1_MASK, - CFG_BLK_MISC_CTL_RSVD_1_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_10B_TAG_EN_MASK, - CFG_BLK_MISC_CTL_10B_TAG_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_2_MASK, - CFG_BLK_MISC_CTL_RSVD_2_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_AXI_WBK_MASK, - CFG_BLK_MISC_CTL_AXI_WBK_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_AXI_DSC_MASK, - CFG_BLK_MISC_CTL_AXI_DSC_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_NUM_TAG_MASK, - CFG_BLK_MISC_CTL_NUM_TAG_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RSVD_3_MASK, - CFG_BLK_MISC_CTL_RSVD_3_DFLT) | - FIELD_SET(CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK, - EQDMA_CFG_BLK_MISC_CTL_RQ_METERING_MUL); - qdma_reg_write(dev_hndl, EQDMA_CFG_BLK_MISC_CTL_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_CFG_BLK_MISC_CTL_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_CFG_BLK_MISC_CTL_ADDR, reg_val); - -#define EQDMA_PFTCH_CFG_EVT_PFTH_FL_TH 256 -#define C2H_PFCH_CFG_FL_TH_DFLT 256 - - reg_val = - FIELD_SET(C2H_PFCH_CFG_EVTFL_TH_MASK, - EQDMA_PFTCH_CFG_EVT_PFTH_FL_TH) | - FIELD_SET(C2H_PFCH_CFG_FL_TH_MASK, C2H_PFCH_CFG_FL_TH_DFLT); - - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_PFCH_CFG_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_PFCH_CFG_ADDR, reg_val); - -#define EQDMA_C2H_PFCH_CFG_1_QCNT_MASK (EQDMA_PFTCH_CACHE_DEPTH - 4) -#define EQDMA_C2H_PFCH_CFG_1_EVNT_QCNT_TH EQDMA_C2H_PFCH_CFG_1_QCNT_MASK - pfch_cache_dpth = qdma_reg_read(dev_hndl, - EQDMA_C2H_PFCH_CACHE_DEPTH_ADDR); - - reg_val = - FIELD_SET(C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK, - (pfch_cache_dpth - 4)) | - FIELD_SET(C2H_PFCH_CFG_1_QCNT_MASK, (pfch_cache_dpth - 4)); - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_1_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_PFCH_CFG_1_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_PFCH_CFG_1_ADDR, reg_val); - -#define EQDMA_C2H_PFCH_CFG_2_FENCE_EN 1 -#define C2H_PFCH_CFG_2_RSVD_DFLT 0 -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_DFLT 0 -#define C2H_PFCH_CFG_2_LL_SZ_TH_DFLT 1024 -#define C2H_PFCH_CFG_2_VAR_DESC_NUM 15 -#define C2H_PFCH_CFG_2_NUM_DFLT 8 - - reg_val = - FIELD_SET(C2H_PFCH_CFG_2_FENCE_MASK, - EQDMA_C2H_PFCH_CFG_2_FENCE_EN) | - FIELD_SET(C2H_PFCH_CFG_2_RSVD_MASK, C2H_PFCH_CFG_2_RSVD_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK, - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_LL_SZ_TH_MASK, - C2H_PFCH_CFG_2_LL_SZ_TH_DFLT) | - FIELD_SET(C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK, - C2H_PFCH_CFG_2_VAR_DESC_NUM) | - FIELD_SET(C2H_PFCH_CFG_2_NUM_MASK, C2H_PFCH_CFG_2_NUM_DFLT); - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_2_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_PFCH_CFG_2_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_PFCH_CFG_2_ADDR, reg_val); -#define PFCH_CFG_3_RSVD_DFLT 0 -#define PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_DFLT 256 -#define PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_DFLT 0 - - - reg_val = - FIELD_SET(PFCH_CFG_3_RSVD_MASK, PFCH_CFG_3_RSVD_DFLT) | - FIELD_SET(PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_MASK, - PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_DFLT) | - FIELD_SET(PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_MASK, - PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_DFLT); - qdma_reg_write(dev_hndl, EQDMA_PFCH_CFG_3_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_PFCH_CFG_3_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_PFCH_CFG_2_ADDR, reg_val); -#define EQDMA_PFCH_CFG_4_GLB_EVT_TIMER_TICK 64 -#define PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_DFLT 0 -#define EQDMA_PFCH_CFG_4_EVT_TIMER_TICK 400 -#define PFCH_CFG_4_DISABLE_EVT_TIMER_DFLT 0 - - - reg_val = - FIELD_SET(PFCH_CFG_4_GLB_EVT_TIMER_TICK_MASK, - EQDMA_PFCH_CFG_4_GLB_EVT_TIMER_TICK) | - FIELD_SET(PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_MASK, - PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_DFLT) | - FIELD_SET(PFCH_CFG_4_EVT_TIMER_TICK_MASK, - EQDMA_PFCH_CFG_4_EVT_TIMER_TICK) | - FIELD_SET(PFCH_CFG_4_DISABLE_EVT_TIMER_MASK, - PFCH_CFG_4_DISABLE_EVT_TIMER_DFLT); - qdma_reg_write(dev_hndl, EQDMA_PFCH_CFG_4_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_PFCH_CFG_4_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_PFCH_CFG_4_ADDR, reg_val); -/**************** SET_2 *******************/ -#define C2H_CRDT_COAL_CFG_1_RSVD_1_DFLT 0 -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_DFLT 16 -#define EQDMA_C2H_CRDT_COAL_CFG_1_TIMER_TH 16 //64 - - - reg_val = - FIELD_SET(C2H_CRDT_COAL_CFG_1_RSVD_1_MASK, - C2H_CRDT_COAL_CFG_1_RSVD_1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK, - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK, - EQDMA_C2H_CRDT_COAL_CFG_1_TIMER_TH); - qdma_reg_write(dev_hndl, EQDMA_C2H_CRDT_COAL_CFG_1_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_CRDT_COAL_CFG_1_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_CRDT_COAL_CFG_1_ADDR, reg_val); -#define C2H_CRDT_COAL_CFG_2_RSVD_1_DFLT 0 -#define EQDMA_C2H_CRDT_COAL_CFG_2_FIFO_TH (EQDMA_PFTCH_CACHE_DEPTH - 8) -#define C2H_CRDT_COAL_CFG_2_RESERVED1_DFLT 0 -#define EQDMA_C2H_CRDT_COAL_CFG_2_CRDT_TH 96 - - reg_val = - FIELD_SET(C2H_CRDT_COAL_CFG_2_RSVD_1_MASK, - C2H_CRDT_COAL_CFG_2_RSVD_1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK, - (pfch_cache_dpth - 8)) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_RESERVED1_MASK, - C2H_CRDT_COAL_CFG_2_RESERVED1_DFLT) | - FIELD_SET(C2H_CRDT_COAL_CFG_2_NT_TH_MASK, - EQDMA_C2H_CRDT_COAL_CFG_2_CRDT_TH); - qdma_reg_write(dev_hndl, EQDMA_C2H_CRDT_COAL_CFG_2_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_C2H_CRDT_COAL_CFG_2_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_C2H_CRDT_COAL_CFG_2_ADDR, reg_val); - -/**************** SET_3 *******************/ -#define EQDMA_GLBL2_RRQ_PCIE_THROT_REQ_EN 0 -#define GLBL2_RRQ_PCIE_THROT_REQ_DFLT 192 -#define GLBL2_RRQ_PCIE_THROT_DAT_EN_DFLT 1 -#define GLBL2_RRQ_PCIE_THROT_DAT_DFLT 20480 - - - reg_val = - FIELD_SET(GLBL2_RRQ_PCIE_THROT_REQ_EN_MASK, - EQDMA_GLBL2_RRQ_PCIE_THROT_REQ_EN) | - FIELD_SET(GLBL2_RRQ_PCIE_THROT_REQ_MASK, - GLBL2_RRQ_PCIE_THROT_REQ_DFLT) | - FIELD_SET(GLBL2_RRQ_PCIE_THROT_DAT_EN_MASK, - GLBL2_RRQ_PCIE_THROT_DAT_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_PCIE_THROT_DAT_MASK, - GLBL2_RRQ_PCIE_THROT_DAT_DFLT); - qdma_reg_write(dev_hndl, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR, reg_val); -#define GLBL2_RRQ_AXIMM_THROT_REQ_EN_DFLT 0 -#define GLBL2_RRQ_AXIMM_THROT_REQ_DFLT 0 -#define GLBL2_RRQ_AXIMM_THROT_DAT_EN_DFLT 0 -#define GLBL2_RRQ_AXIMM_THROT_DAT_DFLT 0 - - reg_val = - FIELD_SET(GLBL2_RRQ_AXIMM_THROT_REQ_EN_MASK, - GLBL2_RRQ_AXIMM_THROT_REQ_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_AXIMM_THROT_REQ_MASK, - GLBL2_RRQ_AXIMM_THROT_REQ_DFLT) | - FIELD_SET(GLBL2_RRQ_AXIMM_THROT_DAT_EN_MASK, - GLBL2_RRQ_AXIMM_THROT_DAT_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_AXIMM_THROT_DAT_MASK, - GLBL2_RRQ_AXIMM_THROT_DAT_DFLT); - qdma_reg_write(dev_hndl, EQDMA_GLBL2_RRQ_AXIMM_THROT_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_RRQ_AXIMM_THROT_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL2_RRQ_AXIMM_THROT_ADDR, reg_val); -#define GLBL2_RRQ_BRG_THROT_REQ_EN_DFLT 1 -#define GLBL2_RRQ_BRG_THROT_REQ_DFLT GLBL2_RRQ_PCIE_THROT_REQ_DFLT -#define GLBL2_RRQ_BRG_THROT_DAT_EN_DFLT 1 - - - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR); - qdma_log_info("%s: BF reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR, reg_val); - data_th = FIELD_GET(GLBL2_RRQ_PCIE_THROT_DAT_MASK, reg_val); - - reg_val = - FIELD_SET(GLBL2_RRQ_BRG_THROT_REQ_EN_MASK, - GLBL2_RRQ_BRG_THROT_REQ_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_BRG_THROT_REQ_MASK, - GLBL2_RRQ_BRG_THROT_REQ_DFLT) | - FIELD_SET(GLBL2_RRQ_BRG_THROT_DAT_EN_MASK, - GLBL2_RRQ_BRG_THROT_DAT_EN_DFLT) | - FIELD_SET(GLBL2_RRQ_BRG_THROT_DAT_MASK, data_th); - qdma_reg_write(dev_hndl, EQDMA_GLBL2_RRQ_BRG_THROT_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_RRQ_BRG_THROT_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_GLBL2_RRQ_BRG_THROT_ADDR, reg_val); - -/******************* SET_4 *************************/ -#define EQDMA_H2C_REQ_THROT_PCIE_EN_REQ 1 -#define EQDMA_H2C_REQ_THROT_PCIE_REQ_TH GLBL2_RRQ_PCIE_THROT_REQ_DFLT -#define EQDMA_H2C_REQ_THROT_PCIE_EN_DATA 1 -#define EQDMA_H2C_REQ_THROT_PCIE_DATA_TH 24576 - - reg_val = - FIELD_SET(H2C_REQ_THROT_PCIE_EN_REQ_MASK, - EQDMA_H2C_REQ_THROT_PCIE_EN_REQ) | - FIELD_SET(H2C_REQ_THROT_PCIE_MASK, - EQDMA_H2C_REQ_THROT_PCIE_REQ_TH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_DATA_MASK, - EQDMA_H2C_REQ_THROT_PCIE_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_PCIE_DATA_THRESH_MASK, - EQDMA_H2C_REQ_THROT_PCIE_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_H2C_REQ_THROT_PCIE_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_H2C_REQ_THROT_PCIE_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_H2C_REQ_THROT_PCIE_ADDR, reg_val); -#define EQDMA_H2C_REQ_THROT_AXIMM_EN_REQ 1 -#define EQDMA_H2C_REQ_THROT_AXIMM_REQ_TH 64 -#define EQDMA_H2C_REQ_THROT_AXIMM_EN_DATA 1 -#define EQDMA_H2C_REQ_THROT_AXIMM_DATA_TH 16384 - - reg_val = - FIELD_SET(H2C_REQ_THROT_AXIMM_EN_REQ_MASK, - EQDMA_H2C_REQ_THROT_AXIMM_EN_REQ) | - FIELD_SET(H2C_REQ_THROT_AXIMM_MASK, - EQDMA_H2C_REQ_THROT_AXIMM_REQ_TH) | - FIELD_SET(H2C_REQ_THROT_AXIMM_EN_DATA_MASK, - EQDMA_H2C_REQ_THROT_AXIMM_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK, - EQDMA_H2C_REQ_THROT_AXIMM_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_H2C_REQ_THROT_AXIMM_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_H2C_REQ_THROT_AXIMM_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_H2C_REQ_THROT_AXIMM_ADDR, reg_val); - -#define H2C_MM_DATA_THROTTLE_RSVD_1_DFLT 0 -#define EQDMA_H2C_MM_DATA_TH_EN GLBL2_RRQ_PCIE_THROT_DAT_EN_DFLT -#define EQDMA_H2C_MM_DATA_TH GLBL2_RRQ_PCIE_THROT_DAT_DFLT - - reg_val = - FIELD_SET(H2C_MM_DATA_THROTTLE_RSVD_1_MASK, - H2C_MM_DATA_THROTTLE_RSVD_1_DFLT) | - FIELD_SET(H2C_MM_DATA_THROTTLE_DAT_EN_MASK, - EQDMA_H2C_MM_DATA_TH_EN) | - FIELD_SET(H2C_MM_DATA_THROTTLE_DAT_MASK, EQDMA_H2C_MM_DATA_TH); - qdma_reg_write(dev_hndl, EQDMA_H2C_MM_DATA_THROTTLE_ADDR, reg_val); - reg_val = qdma_reg_read(dev_hndl, EQDMA_H2C_MM_DATA_THROTTLE_ADDR); - qdma_log_info("%s: reg = 0x%08X val = 0x%08X\n", - __func__, EQDMA_H2C_MM_DATA_THROTTLE_ADDR, reg_val); - -} - - -/* - * eqdma_indirect_reg_invalidate() - helper function to invalidate indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = EQDMA_IND_CTXT_DATA_ADDR; - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_IND_CTXT_DATA_NUM_REGS; index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = EQDMA_IND_CTXT_DATA_ADDR; - - for (index = 0; index < ((2 * QDMA_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -int eqdma_get_ip_version(void *dev_hndl, uint8_t is_vf, - uint32_t *ip_version) -{ - uint32_t ver_reg_val = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_OFFSET_VF_VERSION : - EQDMA_GLBL2_MISC_CAP_ADDR; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - ver_reg_val = qdma_reg_read(dev_hndl, reg_addr); - - if (!is_vf) { - *ip_version = - FIELD_GET(EQDMA_GLBL2_IP_VERSION_MASK, - ver_reg_val); - } else { - *ip_version = - FIELD_GET(EQDMA_GLBL2_VF_IP_VERSION_MASK, - ver_reg_val); - } - - return QDMA_SUCCESS; -} - -/* - * eqdma_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void eqdma_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - int i = 0; - - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->pidx; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_arm; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->fnc_id; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->qen; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->frcd_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbi_chk; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbi_intvl_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->at; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->fetch_max; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->rngsz_idx; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->desc_sz; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->bypass; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->mm_chn; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbk_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->port_id; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_no_last; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->err; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->err_wb_sent; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_req; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->mrkr_dis; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->is_mm; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - eqdma_sw_ctxt_entries[i++].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->vec; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->intr_aggr; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->dis_intr_on_vf; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->pack_byp_out; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_byp; - -} - -/* - * eqdma_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void eqdma_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - int i = 0; - - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_stat_desc; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_int; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->trig_mode; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->fnc_id; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->counter_idx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_idx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->in_st; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->color; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ringsz_idx; - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->desc_sz; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->pidx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->cidx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->valid; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->err; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->user_trig_pend; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_running; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->full_upd; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ovf_chk_dis; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->at; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->vec; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->int_aggr; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dis_intr_on_vf; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dir_c2h; - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->sh_cmpt; -} - -/* - * eqdma_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void eqdma_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - int i = 0; - - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->cidx; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->crd_use; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->dsc_pend; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->idl_stp_b; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->evt_pnd; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->fetch_pnd; -} - -/* - * eqdma_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void eqdma_fill_credit_ctxt(struct qdma_descq_credit_ctxt *cr_ctxt) -{ - eqdma_credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * eqdma_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void eqdma_fill_pfetch_ctxt(struct qdma_descq_prefetch_ctxt - *pfetch_ctxt) -{ - int i = 0; - - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->bypass; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->bufsz_idx; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->port_id; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->var_desc; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->num_pftch; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->err; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch_en; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->sw_crdt; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->valid; -} - -/* - * eqdma_fill_fmap_ctxt() - Helper function to fill fmap context - * into structure - * - */ -static void eqdma_fill_fmap_ctxt(struct qdma_fmap_cfg *fmap_ctxt) -{ - eqdma_fmap_ctxt_entries[0].value = fmap_ctxt->qbase; - eqdma_fmap_ctxt_entries[1].value = fmap_ctxt->qmax; -} - -/* - * eqdma_fill_intr_ctxt() - Helper function to fill interrupt context - * into structure - * - */ -static void eqdma_fill_intr_ctxt(struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - int i = 0; - - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->valid; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->vec; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->int_st; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->color; - eqdma_ind_intr_ctxt_entries[i++].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - eqdma_ind_intr_ctxt_entries[i++].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->page_size; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->pidx; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->at; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->func_id; -} - -/*****************************************************************************/ -/** - * eqdma_set_default_global_csr() - function to set the global CSR register to - * default values. The value can be modified later by using the set/get csr - * functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_set_default_global_csr(void *dev_hndl) -{ - int rv = QDMA_SUCCESS; - - /* Default values */ - uint32_t cfg_val = 0, reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, 385, - 513, 769, 1025, 1537, 3073, 4097, 6145, 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, 32, 48, 64, - 80, 96, 112, 128, 144, 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 8192, - 9018, 16384}; - struct qdma_dev_attributes dev_cap; - uint32_t eqdma_ip_version; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - rv = eqdma_get_ip_version(dev_hndl, 0, &eqdma_ip_version); - if (rv != QDMA_SUCCESS) - return rv; - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_TIMER_CNT_ADDR, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - /* Writeback Interval */ - if (eqdma_ip_version == EQDMA_IP_VERSION_4) { - reg_val = - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - - qdma_reg_write(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR, - reg_val); - } - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - if (eqdma_ip_version == EQDMA_IP_VERSION_4) { - reg_val = qdma_reg_read(dev_hndl, - EQDMA_C2H_PFCH_CACHE_DEPTH_ADDR); - cfg_val = FIELD_GET(C2H_PFCH_CACHE_DEPTH_MASK, reg_val); - reg_val = FIELD_SET(C2H_PFCH_CFG_1_QCNT_MASK, - (cfg_val >> 2)) | - FIELD_SET(C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK, - ((cfg_val >> 2) - 4)); - - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_1_ADDR, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_C2H_PFCH_CFG_2_ADDR); - reg_val |= FIELD_SET(C2H_PFCH_CFG_2_FENCE_MASK, 1); - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_2_ADDR, - reg_val); - } - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, EQDMA_C2H_INT_TIMER_TICK_ADDR, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - EQDMA_C2H_WRB_COAL_BUF_DEPTH_ADDR); - reg_val = - FIELD_SET(C2H_WRB_COAL_CFG_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(C2H_WRB_COAL_CFG_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK, cfg_val); - qdma_reg_write(dev_hndl, EQDMA_C2H_WRB_COAL_CFG_ADDR, reg_val); - - /* H2C throttle Configuration*/ - if (eqdma_ip_version == EQDMA_IP_VERSION_4) { - reg_val = - FIELD_SET(H2C_REQ_THROT_PCIE_DATA_THRESH_MASK, - EQDMA_H2C_THROT_DATA_THRESH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_DATA_MASK, - EQDMA_THROT_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_PCIE_MASK, - EQDMA_H2C_THROT_REQ_THRESH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_REQ_MASK, - EQDMA_THROT_EN_REQ); - - qdma_reg_write(dev_hndl, EQDMA_H2C_REQ_THROT_PCIE_ADDR, - reg_val); - } - } - - if (eqdma_ip_version == EQDMA_IP_VERSION_5) - eqdma_set_perf_opt(dev_hndl); - return QDMA_SUCCESS; -} - -/* - * dump_eqdma_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - eqdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_H2C) { - eqdma_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_fill_credit_ctxt(&queue_context->cr_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_C2H) { - eqdma_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_fill_credit_ctxt(&queue_context->cr_ctxt); - if (st) { - eqdma_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - eqdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - } - - eqdma_fill_fmap_ctxt(&queue_context->fmap); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* SW context dump */ - n = sizeof(eqdma_sw_ctxt_entries) / - sizeof((eqdma_sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[i].name, - eqdma_sw_ctxt_entries[i].value, - eqdma_sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(eqdma_hw_ctxt_entries) / - sizeof((eqdma_hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_hw_ctxt_entries[i].name, - eqdma_hw_ctxt_entries[i].value, - eqdma_hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(eqdma_credit_ctxt_entries) / - sizeof((eqdma_credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_credit_ctxt_entries[i].name, - eqdma_credit_ctxt_entries[i].value, - eqdma_credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(eqdma_cmpt_ctxt_entries) / - sizeof((eqdma_cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[i].name, - eqdma_cmpt_ctxt_entries[i].value, - eqdma_cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(eqdma_c2h_pftch_ctxt_entries) / - sizeof(eqdma_c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_c2h_pftch_ctxt_entries[i].name, - eqdma_c2h_pftch_ctxt_entries[i].value, - eqdma_c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* FMAP context dump */ - n = sizeof(eqdma_fmap_ctxt_entries) / - sizeof((eqdma_fmap_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "FMAP Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_fmap_ctxt_entries[i].name, - eqdma_fmap_ctxt_entries[i].value, - eqdma_fmap_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * dump_eqdma_intr_context() - Helper function to dump interrupt context into - * string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - eqdma_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(eqdma_ind_intr_ctxt_entries) / - sizeof((eqdma_ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_ind_intr_ctxt_entries[i].name, - eqdma_ind_intr_ctxt_entries[i].value, - eqdma_ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/*****************************************************************************/ -/** - * eqdma_get_version() - Function to get the eqdma version - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @version_info: pointer to hold the version info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_OFFSET_VF_VERSION : - EQDMA_GLBL2_MISC_CAP_ADDR; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - qdma_fetch_version_details(dev_hndl, is_vf, reg_val, version_info); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[EQDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - pasid_l = - FIELD_GET(EQDMA_SW_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_SW_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - virtio_desc_base_l = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_m = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_h = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - ctxt->virtio_dsc_base); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W0_PIDX_MASK, ctxt->pidx) | - FIELD_SET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, ctxt->irq_arm) | - FIELD_SET(SW_IND_CTXT_DATA_W0_FNC_MASK, ctxt->fnc_id); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x\n", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - ctxt->wbi_intvl_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_AT_MASK, ctxt->at) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, ctxt->fetch_max) | - FIELD_SET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - ctxt->irq_no_last) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_MASK, ctxt->err) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - ctxt->err_wb_sent) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, ctxt->is_mm); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,err=%x", - __func__, ctxt->port_id, ctxt->irq_no_last, ctxt->err); - qdma_log_debug(", err_wb_sent=%x\n", ctxt->err_wb_sent); - - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->intr_aggr) | - FIELD_SET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - ctxt->virtio_en) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - ctxt->pack_byp_out) | - FIELD_SET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, ctxt->irq_byp) | - FIELD_SET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - virtio_desc_base_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - virtio_desc_base_m); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - virtio_desc_base_h); - - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t sw_ctxt[EQDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(SW_IND_CTXT_DATA_W0_PIDX_MASK, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, - sw_ctxt[0])); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_FNC_MASK, - sw_ctxt[0])); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - ctxt->qen = FIELD_GET(SW_IND_CTXT_DATA_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, sw_ctxt[1]); - ctxt->at = FIELD_GET(SW_IND_CTXT_DATA_W1_AT_MASK, sw_ctxt[1]); - ctxt->fetch_max = - (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, - sw_ctxt[1]); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, - sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, - sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, - sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, - sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, - sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, - sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, - sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, - sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, - sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, - sw_ctxt[1])); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,", - __func__, ctxt->port_id, ctxt->irq_no_last); - qdma_log_debug(" err=%x, err_wb_sent=%x\n", - ctxt->err, ctxt->err_wb_sent); - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - ctxt->vec = FIELD_GET(SW_IND_CTXT_DATA_W4_VEC_MASK, sw_ctxt[4]); - ctxt->intr_aggr = (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, - sw_ctxt[4])); - ctxt->dis_intr_on_vf = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - sw_ctxt[4])); - ctxt->virtio_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - sw_ctxt[4])); - ctxt->pack_byp_out = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - sw_ctxt[4])); - ctxt->irq_byp = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, - sw_ctxt[4])); - ctxt->host_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, - sw_ctxt[4])); - pasid_l = FIELD_GET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, sw_ctxt[4]); - - pasid_h = FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, sw_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, - sw_ctxt[5]); - virtio_desc_base_l = - FIELD_GET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - sw_ctxt[5]); - virtio_desc_base_m = - FIELD_GET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - sw_ctxt[6]); - - virtio_desc_base_h = - FIELD_GET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - sw_ctxt[6]); - - ctxt->pasid = - FIELD_SET(EQDMA_SW_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_SW_CTXT_PASID_GET_H_MASK, pasid_h); - - ctxt->virtio_dsc_base = - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - (uint64_t)virtio_desc_base_l) | - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - (uint64_t)virtio_desc_base_m) | - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - (uint64_t)virtio_desc_base_h); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_sw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_sw_context_write(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_sw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[EQDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, - ctxt->num_pftch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - ctxt->var_desc) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_ERR_MASK, ctxt->err) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, ctxt->pfch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, sw_crdt_l); - - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(PREFETCH_CTXT_DATA_W1_VALID_MASK, ctxt->valid); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t pfetch_ctxt[EQDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, pfetch_ctxt[0]); - ctxt->bufsz_idx = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - pfetch_ctxt[0]); - ctxt->num_pftch = (uint16_t) FIELD_GET( - PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, pfetch_ctxt[0]); - ctxt->port_id = - FIELD_GET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, pfetch_ctxt[0]); - ctxt->var_desc = (uint8_t) - FIELD_GET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - pfetch_ctxt[0]); - ctxt->err = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - FIELD_GET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, pfetch_ctxt[0]); - - sw_crdt_h = - FIELD_GET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_pfetch_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_pfetch_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_pfetch_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[EQDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr4_high_l, baddr4_high_h, - baddr4_low, pidx_l, pidx_h, pasid_l, pasid_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR) { - qdma_log_error("%s: trig_mode(%d) > (%d) is invalid, err:%d\n", - __func__, - ctxt->trig_mode, - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr4_high_l = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - ctxt->bs_addr); - baddr4_high_h = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - ctxt->bs_addr); - baddr4_low = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - ctxt->bs_addr); - - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, ctxt->pidx); - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, ctxt->pidx); - - pasid_l = - FIELD_GET(EQDMA_CMPL_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CMPL_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(CMPL_CTXT_DATA_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - ctxt->counter_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, ctxt->timer_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_INT_ST_MASK, ctxt->in_st) | - FIELD_SET(CMPL_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, ctxt->ringsz_idx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, baddr4_high_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, baddr4_high_h) | - FIELD_SET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, ctxt->desc_sz) | - FIELD_SET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, pidx_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, pidx_h) | - FIELD_SET(CMPL_CTXT_DATA_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(CMPL_CTXT_DATA_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(CMPL_CTXT_DATA_W3_ERR_MASK, ctxt->err) | - FIELD_SET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - ctxt->user_trig_pend); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, - ctxt->timer_running) | - FIELD_SET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, ctxt->full_upd) | - FIELD_SET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, - ctxt->ovf_chk_dis) | - FIELD_SET(CMPL_CTXT_DATA_W4_AT_MASK, ctxt->at) | - FIELD_SET(CMPL_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->int_aggr) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(CMPL_CTXT_DATA_W4_VIO_MASK, ctxt->vio) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, ctxt->dir_c2h) | - FIELD_SET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(CMPL_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - ctxt->pasid_en) | - FIELD_SET(CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, - baddr4_low) | - FIELD_SET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, ctxt->vio_eop) | - FIELD_SET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, ctxt->sh_cmpt); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cmpt_ctxt[EQDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr4_high_l, baddr4_high_h, baddr4_low, - pidx_l, pidx_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(CMPL_CTXT_DATA_W0_EN_INT_MASK, cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, - cmpt_ctxt[0])); - - baddr4_high_l = FIELD_GET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, - cmpt_ctxt[1]); - - baddr4_high_h = FIELD_GET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, - cmpt_ctxt[2]); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, cmpt_ctxt[2]); - - pidx_h = FIELD_GET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(CMPL_CTXT_DATA_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_ERR_MASK, - cmpt_ctxt[3])); - ctxt->user_trig_pend = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - cmpt_ctxt[3])); - - ctxt->timer_running = - FIELD_GET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, cmpt_ctxt[4]); - ctxt->full_upd = - FIELD_GET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, cmpt_ctxt[4]); - ctxt->ovf_chk_dis = - FIELD_GET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, cmpt_ctxt[4]); - ctxt->at = FIELD_GET(CMPL_CTXT_DATA_W4_AT_MASK, cmpt_ctxt[4]); - ctxt->vec = FIELD_GET(CMPL_CTXT_DATA_W4_VEC_MASK, cmpt_ctxt[4]); - ctxt->int_aggr = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, cmpt_ctxt[4])); - ctxt->dis_intr_on_vf = (uint8_t) - FIELD_GET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - cmpt_ctxt[4]); - ctxt->vio = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_VIO_MASK, - cmpt_ctxt[4]); - ctxt->dir_c2h = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, - cmpt_ctxt[4]); - ctxt->host_id = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, - cmpt_ctxt[4]); - pasid_l = FIELD_GET(CMPL_CTXT_DATA_W4_PASID_L_MASK, cmpt_ctxt[4]); - - pasid_h = (uint32_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_H_MASK, - cmpt_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - cmpt_ctxt[5]); - baddr4_low = (uint8_t)FIELD_GET( - CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, cmpt_ctxt[5]); - ctxt->vio_eop = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, - cmpt_ctxt[5]); - ctxt->sh_cmpt = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, - cmpt_ctxt[5]); - - ctxt->bs_addr = - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - (uint64_t)baddr4_high_l) | - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - (uint64_t)baddr4_high_h) | - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - (uint64_t)baddr4_low); - - ctxt->pasid = - FIELD_SET(EQDMA_CMPL_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CMPL_CTXT_PASID_GET_H_MASK, - (uint64_t)pasid_h); - - ctxt->pidx = - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, pidx_l) | - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, pidx_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cmpt_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cmpt_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cmpt_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t hw_ctxt[EQDMA_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or hw_ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(HW_IND_CTXT_DATA_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(HW_IND_CTXT_DATA_W0_CRD_USE_MASK, - hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, - hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->evt_pnd = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_EVT_PND_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = (uint8_t) - (FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, hw_ctxt[1])); - - qdma_log_debug("%s: cidx=%hu, crd_use=%hu, dsc_pend=%x\n", - __func__, ctxt->cidx, ctxt->crd_use, ctxt->dsc_pend); - qdma_log_debug("%s: idl_stp_b=%x, evt_pnd=%x, fetch_pnd=%x\n", - __func__, ctxt->idl_stp_b, ctxt->evt_pnd, - ctxt->fetch_pnd); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_hw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_hw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[EQDMA_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(CRED_CTXT_DATA_W0_CREDT_MASK, cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_credit_ctx_conf() - configure credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_credit_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_credit_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_fmap_context_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_fmap_context_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap[EQDMA_FMAP_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - fmap[num_words_count++] = - FIELD_SET(EQDMA_FMAP_CTXT_W0_QID_MASK, config->qbase); - fmap[num_words_count++] = - FIELD_SET(EQDMA_FMAP_CTXT_W1_QID_MAX_MASK, config->qmax); - - return eqdma_indirect_reg_write(dev_hndl, sel, func_id, - fmap, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_fmap_context_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_fmap_context_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - int rv = QDMA_SUCCESS; - uint32_t fmap[EQDMA_FMAP_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, func_id, - EQDMA_FMAP_NUM_WORDS, fmap); - if (rv < 0) - return rv; - - config->qbase = FIELD_GET(EQDMA_FMAP_CTXT_W0_QID_MASK, fmap[0]); - config->qmax = FIELD_GET(EQDMA_FMAP_CTXT_W1_QID_MAX_MASK, fmap[1]); - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_fmap_context_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_fmap_context_clear(void *dev_hndl, uint16_t func_id) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu\n", __func__, func_id); - return eqdma_indirect_reg_clear(dev_hndl, sel, func_id); -} - -/*****************************************************************************/ -/** - * eqdma_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_fmap_context_read(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_fmap_context_write(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_fmap_context_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_write() - create indirect interrupt context - * and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_write(void *dev_hndl, - uint16_t ring_index, const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[EQDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint32_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_m = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, - ctxt->baddr_4k); - baddr_h = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - pasid_l = - FIELD_GET(EQDMA_INTR_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_INTR_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(INTR_CTXT_DATA_W0_VEC_MASK, ctxt->vec) | - FIELD_SET(INTR_CTXT_DATA_W0_INT_ST_MASK, ctxt->int_st) | - FIELD_SET(INTR_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, baddr_m); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, baddr_h) | - FIELD_SET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, ctxt->page_size) | - FIELD_SET(INTR_CTXT_DATA_W2_PIDX_MASK, ctxt->pidx) | - FIELD_SET(INTR_CTXT_DATA_W2_AT_MASK, ctxt->at) | - FIELD_SET(INTR_CTXT_DATA_W2_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(INTR_CTXT_DATA_W2_PASID_L_MASK, pasid_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W3_PASID_H_MASK, pasid_h) | - FIELD_SET(INTR_CTXT_DATA_W3_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(INTR_CTXT_DATA_W3_FUNC_MASK, ctxt->func_id); - - return eqdma_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_read(void *dev_hndl, - uint16_t ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t intr_ctxt[EQDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, ring_index, - EQDMA_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(INTR_CTXT_DATA_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(INTR_CTXT_DATA_W0_VEC_MASK, intr_ctxt[0]); - ctxt->int_st = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_INT_ST_MASK, - intr_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_COLOR_MASK, - intr_ctxt[0])); - baddr_l = FIELD_GET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, intr_ctxt[0]); - - baddr_m = FIELD_GET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, intr_ctxt[1]); - - baddr_h = FIELD_GET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, intr_ctxt[2]); - ctxt->page_size = - FIELD_GET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, intr_ctxt[2]); - ctxt->pidx = - (uint16_t)(FIELD_GET(INTR_CTXT_DATA_W2_PIDX_MASK, - intr_ctxt[2])); - ctxt->at = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_AT_MASK, intr_ctxt[2])); - ctxt->host_id = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_HOST_ID_MASK, - intr_ctxt[2])); - pasid_l = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_PASID_L_MASK, - intr_ctxt[2])); - - pasid_h = FIELD_GET(INTR_CTXT_DATA_W3_PASID_H_MASK, intr_ctxt[3]); - ctxt->pasid_en = (uint8_t)FIELD_GET(INTR_CTXT_DATA_W3_PASID_EN_MASK, - intr_ctxt[3]); - - ctxt->func_id = (uint16_t)FIELD_GET(INTR_CTXT_DATA_W3_FUNC_MASK, - intr_ctxt[3]); - - ctxt->baddr_4k = - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, baddr_m) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - ctxt->pasid = - FIELD_SET(EQDMA_INTR_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_INTR_CTXT_PASID_GET_H_MASK, pasid_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_clear() - clear indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_clear(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_invalidate() - invalidate indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_indirect_intr_context_read(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_indirect_intr_context_write(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_indirect_intr_context_invalidate(dev_hndl, - ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < eqdma_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = eqdma_config_regs_get(); - - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s", reg_info[i].name); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm_queue_context() - Function to get qdma queue context dump - * in a buffer - * - * @dev_hndl: device handle - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @context: Queue Context - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_context(ctxt_data, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_dump_intr_context() - Function to get qdma interrupt context dump - * in a buffer - * - * @dev_hndl: device handle - * @intr_ctx: Interrupt Context - * @ring_index: Ring index - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - req_buflen = eqdma_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @func_id: function id - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = eqdma_sw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.sw_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read sw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_hw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.hw_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read hw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read credit context, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = eqdma_pfetch_ctx_conf(dev_hndl, - qid_hw, - &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read pftech context, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = eqdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read cmpt context, err = %d", - __func__, rv); - return rv; - } - } - - rv = eqdma_fmap_conf(dev_hndl, func_id, - &(context.fmap), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read fmap context, err = %d", - __func__, rv); - return rv; - } - - rv = dump_eqdma_context(&context, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_get_user_bar() - Function to get the AXI Master Lite(user bar) number - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite bar number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_OFFSET_VF_USER_BAR : - EQDMA_OFFSET_GLBL2_PF_BARLITE_EXT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: AXI Master Lite bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_hw_ram_sbe_err_process() - Function to dump SBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_ram_sbe_err_process(void *dev_hndl) -{ - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_SBE_STS_A_ADDR, - 1, NULL, 0); - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_SBE_STS_1_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_hw_ram_dbe_err_process() - Function to dump DBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_ram_dbe_err_process(void *dev_hndl) -{ - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_DBE_STS_A_ADDR, - 1, NULL, 0); - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_DBE_STS_1_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_hw_desc_err_process() - Function to dump Descriptor Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - EQDMA_GLBL_DSC_ERR_STS_ADDR, - EQDMA_GLBL_DSC_ERR_LOG0_ADDR, - EQDMA_GLBL_DSC_ERR_LOG1_ADDR, - EQDMA_GLBL_DSC_DBG_DAT0_ADDR, - EQDMA_GLBL_DSC_DBG_DAT1_ADDR, - EQDMA_GLBL_DSC_ERR_LOG2_ADDR - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_hw_trq_err_process() - Function to dump Target Access Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_GLBL_TRQ_ERR_LOG_ADDR - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_hw_err_dump_ctxt_info() - Dump the imp ctxt fields on HW error - * - * @dev_hndl: device handle - * @first_err_qid: First Error QID - * @en_st: ST Mode or MM Mode enabled - * @c2h: C2H or H2C Mode - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_err_dump_ctxt_info(void *dev_hndl, - uint32_t first_err_qid_reg, - uint8_t en_st, uint8_t c2h) -{ - uint16_t first_err_qid = 0; - struct qdma_descq_sw_ctxt sw_ctxt; - struct qdma_descq_hw_ctxt hw_ctxt; - struct qdma_descq_cmpt_ctxt cmpt_ctxt; - - first_err_qid = qdma_reg_read(dev_hndl, first_err_qid_reg); - - eqdma_sw_context_read(dev_hndl, c2h, first_err_qid, &sw_ctxt); - eqdma_hw_context_read(dev_hndl, c2h, first_err_qid, &hw_ctxt); - eqdma_fill_sw_ctxt(&sw_ctxt); - eqdma_fill_hw_ctxt(&hw_ctxt); - - if (sw_ctxt.pidx != hw_ctxt.cidx) { - qdma_log_info("\n%40s\n", "SW Context:"); - /** SW Context: PIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[0].name, - eqdma_sw_ctxt_entries[0].value, - eqdma_sw_ctxt_entries[0].value); - qdma_log_info("\n%40s\n", "HW Context:"); - /*** HW Context: CIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_hw_ctxt_entries[0].name, - eqdma_hw_ctxt_entries[0].value, - eqdma_hw_ctxt_entries[0].value); - } - - if (sw_ctxt.err != 0) { - /*** SW Context: ERR ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[17].name, - eqdma_sw_ctxt_entries[17].value, - eqdma_sw_ctxt_entries[17].value); - } - - /*** SW Context: ERR WB SENT***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[18].name, - eqdma_sw_ctxt_entries[18].value, - eqdma_sw_ctxt_entries[18].value); - - /*** SW Context: IRQ REQ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[19].name, - eqdma_sw_ctxt_entries[19].value, - eqdma_sw_ctxt_entries[19].value); - - if (en_st && c2h) { - eqdma_cmpt_context_read(dev_hndl, first_err_qid, &cmpt_ctxt); - eqdma_fill_cmpt_ctxt(&cmpt_ctxt); - - qdma_log_info("\n%40s\n", "CMPT Context:"); - - /*** CMPT Context: int_st ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[6].name, - eqdma_cmpt_ctxt_entries[6].value, - eqdma_cmpt_ctxt_entries[6].value); - - /** CMPT Context: PIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[12].name, - eqdma_cmpt_ctxt_entries[12].value, - eqdma_cmpt_ctxt_entries[12].value); - /*** CMPT Context: CIDX ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[13].name, - eqdma_cmpt_ctxt_entries[13].value, - eqdma_cmpt_ctxt_entries[13].value); - - if (cmpt_ctxt.err != 0) { - /*** CMPT Context: ERR ***/ - qdma_log_info("%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[15].name, - eqdma_cmpt_ctxt_entries[15].value, - eqdma_cmpt_ctxt_entries[15].value); - } - } -} -/*****************************************************************************/ -/** - * eqdma_hw_st_h2c_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - EQDMA_H2C_ERR_STAT_ADDR, - EQDMA_H2C_FIRST_ERR_QID_ADDR, - EQDMA_H2C_DBG_REG0_ADDR, - EQDMA_H2C_DBG_REG1_ADDR, - EQDMA_H2C_DBG_REG2_ADDR, - EQDMA_H2C_DBG_REG3_ADDR, - EQDMA_H2C_DBG_REG4_ADDR - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, st_h2c_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_H2C_FIRST_ERR_QID_ADDR, 1, 0); - -} - - -/*****************************************************************************/ -/** - * eqdma_hw_st_c2h_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - - uint32_t st_c2h_err_reg_list[] = { - EQDMA_C2H_ERR_STAT_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_C2H_FIRST_ERR_QID_ADDR, - EQDMA_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR, - EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR, - EQDMA_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR, - EQDMA_C2H_STAT_AXIS_PKG_CMP_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_0_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_1_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_2_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_3_ADDR, - EQDMA_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR, - EQDMA_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, st_c2h_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_C2H_FIRST_ERR_QID_ADDR, 1, 1); - -} - -/*****************************************************************************/ -/** - * eqdma_mm_c2h0_err_process() - Function to dump MM C2H - * Error information - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -static void eqdma_mm_c2h0_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t mm_c2h_err_reg_list[] = { - EQDMA_C2H_MM_STATUS_ADDR, - EQDMA_C2H_MM_CMPL_DESC_CNT_ADDR, - EQDMA_C2H_MM_ERR_CODE_ADDR, - EQDMA_C2H_MM_ERR_INFO_ADDR, - EQDMA_C2H_MM_DBG_ADDR - }; - int mm_c2h_err_num_regs = sizeof(mm_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < mm_c2h_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, mm_c2h_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_C2H_MM_ERR_INFO_ADDR, 0, 1); -} - -/*****************************************************************************/ -/** - * eqdma_mm_h2c0_err_process() - Function to dump MM H2C - * Error information - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -static void eqdma_mm_h2c0_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t mm_h2c_err_reg_list[] = { - EQDMA_H2C_MM_STATUS_ADDR, - EQDMA_H2C_MM_CMPL_DESC_CNT_ADDR, - EQDMA_H2C_MM_ERR_CODE_ADDR, - EQDMA_H2C_MM_ERR_INFO_ADDR, - EQDMA_H2C_MM_DBG_ADDR - }; - int mm_h2c_err_num_regs = sizeof(mm_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < mm_h2c_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, mm_h2c_err_reg_list[i], - 1, NULL, 0); - } - - eqdma_hw_err_dump_ctxt_info(dev_hndl, - EQDMA_H2C_MM_ERR_INFO_ADDR, 0, 1); -} - -/*****************************************************************************/ -/** - * eqdma_hw_get_error_name() - Function to get the error in string format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *eqdma_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= EQDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, (enum eqdma_error_idx)err_idx); - return NULL; - } - - return eqdma_err_info[(enum eqdma_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * eqdma_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t bit = 0, i = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS] = { - EQDMA_DSC_ERR_POISON, - EQDMA_TRQ_ERR_CSR_UNMAPPED, - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_SBE_ERR_MI_H2C0_DAT, - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_DBE_ERR_MI_H2C0_DAT, - EQDMA_MM_C2H_WR_SLR_ERR, - EQDMA_MM_H2C0_RD_HDR_POISON_ERR - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, EQDMA_GLBL_ERR_STAT_ADDR); - - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - - qdma_log_info("%s: Global Err Reg(0x%x) = 0x%x\n", - __func__, EQDMA_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - for (i = 0; i < EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - bit = hw_err_position[i]; - - if ((!dev_cap.st_en) && (bit == EQDMA_ST_C2H_ERR_MTY_MISMATCH || - bit == EQDMA_ST_FATAL_ERR_MTY_MISMATCH || - bit == EQDMA_ST_H2C_ERR_ZERO_LEN_DESC)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - eqdma_err_info[bit].stat_reg_addr); - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - eqdma_err_info[bit].stat_reg_addr, - err_stat); - - eqdma_err_info[bit].eqdma_hw_err_process( - dev_hndl); - for (idx = bit; idx < all_eqdma_hw_errs[i]; idx++) { - /* call the platform specific handler */ - if (err_stat & - eqdma_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s\n", - __func__, - eqdma_hw_get_error_name(idx)); - } - qdma_reg_write(dev_hndl, - eqdma_err_info[bit].stat_reg_addr, - err_stat); - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_STAT_ADDR, glbl_err_stat); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > EQDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, (enum eqdma_error_idx)err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == EQDMA_ERRS_ALL) { - for (i = 0; i < EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - - idx = all_eqdma_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == EQDMA_ST_C2H_ERR_ALL || - idx == EQDMA_ST_FATAL_ERR_ALL || - idx == EQDMA_ST_H2C_ERR_ALL) - continue; - } - - reg_val = eqdma_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - eqdma_err_info[idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_GLBL_ERR_MASK_ADDR); - reg_val |= FIELD_SET( - eqdma_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= EQDMA_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= EQDMA_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - eqdma_err_info[err_idx].mask_reg_addr); - reg_val |= FIELD_SET(eqdma_err_info[err_idx].leaf_err_mask, 1); - qdma_reg_write(dev_hndl, - eqdma_err_info[err_idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR); - reg_val |= - FIELD_SET(eqdma_err_info[err_idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_get_device_attributes() - Function to get the qdma device - * attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_PF_BARLITE_INT); - if (FIELD_GET(QDMA_GLBL2_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_CHANNEL_CAP_ADDR); - dev_info->num_qs = - FIELD_GET(GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK, reg_val); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_MISC_CAP_ADDR); - dev_info->mailbox_en = FIELD_GET(EQDMA_GLBL2_MAILBOX_EN_MASK, - reg_val); - dev_info->flr_present = FIELD_GET(EQDMA_GLBL2_FLR_PRESENT_MASK, - reg_val); - dev_info->mm_cmpt_en = 0; - dev_info->debug_mode = FIELD_GET(EQDMA_GLBL2_DBG_MODE_EN_MASK, - reg_val); - dev_info->desc_eng_mode = FIELD_GET(EQDMA_GLBL2_DESC_ENG_MODE_MASK, - reg_val); - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_CHANNEL_MDMA_ADDR); - dev_info->st_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ST_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ST_MASK, reg_val)) ? 1 : 0; - dev_info->mm_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ENG_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ENG_MASK, reg_val)) ? 1 : 0; - - /* num of mm channels */ - /* TODO : Register not yet defined for this. Hard coding it to 1.*/ - dev_info->mm_channel_max = 1; - - dev_info->qid2vec_ctx = 0; - dev_info->cmpt_ovf_chk_dis = 1; - dev_info->mailbox_intr = 1; - dev_info->sw_desc_64b = 1; - dev_info->cmpt_desc_64b = 1; - dev_info->dynamic_bar = 1; - dev_info->legacy_intr = 1; - dev_info->cmpt_trig_count_timer = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_init_ctxt_memory() - function to initialize the context memory - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - eqdma_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = eqdma_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - eqdma_indirect_reg_clear(dev_hndl, - QDMA_CTXT_SEL_FMAP, i); - -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return QDMA_SUCCESS; - -} - - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - - reg_info = eqdma_config_regs_get(); - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * eqdma_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - for (reg_count = 0; - (reg_count < total_regs);) { - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[reg_count].is_debug_reg == 1) - continue; - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; - -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - struct xreg_info *eqdma_config_regs = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_group) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = EQDMA_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = EQDMA_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = EQDMA_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = EQDMA_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid slot received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - reg_info = &eqdma_config_regs[reg_index]; - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_ring_sizes() - function to set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_ring_sizes() - function to get the global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_TIMER_CNT_ADDR, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - EQDMA_C2H_TIMER_CNT_ADDR, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_counter_threshold() - function to get the counter threshold - * values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_write() - function to set the writeback - * interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR); - reg_val |= FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - qdma_reg_write(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_read() - function to get the writeback - * interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_global_writeback_interval_write(dev_hndl, *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * eqdma_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? EQDMA_C2H_MM_CTL_ADDR : - EQDMA_H2C_MM_CTL_ADDR; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - - - return QDMA_SUCCESS; -} - -int eqdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = eqdma_config_num_regs_get(); - struct xreg_info *config_regs = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - config_regs[j].is_debug_reg == 1) - continue; - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.h deleted file mode 100755 index 4cc8ca9..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.h +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __EQDMA_SOFT_ACCESS_H_ -#define __EQDMA_SOFT_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum eqdma_error_idx { - /* Descriptor errors */ - EQDMA_DSC_ERR_POISON, - EQDMA_DSC_ERR_UR_CA, - EQDMA_DSC_ERR_BCNT, - EQDMA_DSC_ERR_PARAM, - EQDMA_DSC_ERR_ADDR, - EQDMA_DSC_ERR_TAG, - EQDMA_DSC_ERR_FLR, - EQDMA_DSC_ERR_TIMEOUT, - EQDMA_DSC_ERR_DAT_POISON, - EQDMA_DSC_ERR_FLR_CANCEL, - EQDMA_DSC_ERR_DMA, - EQDMA_DSC_ERR_DSC, - EQDMA_DSC_ERR_RQ_CANCEL, - EQDMA_DSC_ERR_DBE, - EQDMA_DSC_ERR_SBE, - EQDMA_DSC_ERR_PORT_ID, - EQDMA_DSC_ERR_ALL, - - /* TRQ Errors */ - EQDMA_TRQ_ERR_CSR_UNMAPPED, - EQDMA_TRQ_ERR_VF_ACCESS, - EQDMA_TRQ_ERR_TCP_CSR_TIMEOUT, - EQDMA_TRQ_ERR_QSPC_UNMAPPED, - EQDMA_TRQ_ERR_QID_RANGE, - EQDMA_TRQ_ERR_TCP_QSPC_TIMEOUT, - EQDMA_TRQ_ERR_ALL, - - /* C2H Errors */ - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_ST_C2H_ERR_LEN_MISMATCH, - EQDMA_ST_C2H_ERR_SH_CMPT_DSC, - EQDMA_ST_C2H_ERR_QID_MISMATCH, - EQDMA_ST_C2H_ERR_DESC_RSP_ERR, - EQDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - EQDMA_ST_C2H_ERR_MSI_INT_FAIL, - EQDMA_ST_C2H_ERR_ERR_DESC_CNT, - EQDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - EQDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - EQDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - EQDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - EQDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - EQDMA_ST_C2H_ERR_AVL_RING_DSC, - EQDMA_ST_C2H_ERR_HDR_ECC_UNC, - EQDMA_ST_C2H_ERR_HDR_ECC_COR, - EQDMA_ST_C2H_ERR_WRB_PORT_ID_ERR, - EQDMA_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_ST_FATAL_ERR_LEN_MISMATCH, - EQDMA_ST_FATAL_ERR_QID_MISMATCH, - EQDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_WPL_DATA_PAR, - EQDMA_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_HDR_ECC_UNC, - EQDMA_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - EQDMA_ST_H2C_ERR_NO_DMA_DSC, - EQDMA_ST_H2C_ERR_SBE, - EQDMA_ST_H2C_ERR_DBE, - EQDMA_ST_H2C_ERR_PAR, - EQDMA_ST_H2C_ERR_ALL, - - /* Single bit errors */ - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_SBE_1_ERR_TAG_ODD_RAM, - EQDMA_SBE_1_ERR_TAG_EVEN_RAM, - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_SBE_1_ERR_ALL, - - /* Single bit errors */ - EQDMA_SBE_ERR_MI_H2C0_DAT, - EQDMA_SBE_ERR_MI_H2C1_DAT, - EQDMA_SBE_ERR_MI_H2C2_DAT, - EQDMA_SBE_ERR_MI_H2C3_DAT, - EQDMA_SBE_ERR_MI_C2H0_DAT, - EQDMA_SBE_ERR_MI_C2H1_DAT, - EQDMA_SBE_ERR_MI_C2H2_DAT, - EQDMA_SBE_ERR_MI_C2H3_DAT, - EQDMA_SBE_ERR_H2C_RD_BRG_DAT, - EQDMA_SBE_ERR_H2C_WR_BRG_DAT, - EQDMA_SBE_ERR_C2H_RD_BRG_DAT, - EQDMA_SBE_ERR_C2H_WR_BRG_DAT, - EQDMA_SBE_ERR_FUNC_MAP, - EQDMA_SBE_ERR_DSC_HW_CTXT, - EQDMA_SBE_ERR_DSC_CRD_RCV, - EQDMA_SBE_ERR_DSC_SW_CTXT, - EQDMA_SBE_ERR_DSC_CPLI, - EQDMA_SBE_ERR_DSC_CPLD, - EQDMA_SBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_SBE_ERR_TIMER_FIFO_RAM, - EQDMA_SBE_ERR_QID_FIFO_RAM, - EQDMA_SBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_SBE_ERR_INT_CTXT_RAM, - EQDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_SBE_ERR_PFCH_CTXT_RAM, - EQDMA_SBE_ERR_WRB_CTXT_RAM, - EQDMA_SBE_ERR_PFCH_LL_RAM, - EQDMA_SBE_ERR_PEND_FIFO_RAM, - EQDMA_SBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_SBE_ERR_ALL, - - /* Double bit Errors */ - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_DBE_1_ERR_TAG_ODD_RAM, - EQDMA_DBE_1_ERR_TAG_EVEN_RAM, - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_DBE_1_ERR_ALL, - - /* Double bit Errors */ - EQDMA_DBE_ERR_MI_H2C0_DAT, - EQDMA_DBE_ERR_MI_H2C1_DAT, - EQDMA_DBE_ERR_MI_H2C2_DAT, - EQDMA_DBE_ERR_MI_H2C3_DAT, - EQDMA_DBE_ERR_MI_C2H0_DAT, - EQDMA_DBE_ERR_MI_C2H1_DAT, - EQDMA_DBE_ERR_MI_C2H2_DAT, - EQDMA_DBE_ERR_MI_C2H3_DAT, - EQDMA_DBE_ERR_H2C_RD_BRG_DAT, - EQDMA_DBE_ERR_H2C_WR_BRG_DAT, - EQDMA_DBE_ERR_C2H_RD_BRG_DAT, - EQDMA_DBE_ERR_C2H_WR_BRG_DAT, - EQDMA_DBE_ERR_FUNC_MAP, - EQDMA_DBE_ERR_DSC_HW_CTXT, - EQDMA_DBE_ERR_DSC_CRD_RCV, - EQDMA_DBE_ERR_DSC_SW_CTXT, - EQDMA_DBE_ERR_DSC_CPLI, - EQDMA_DBE_ERR_DSC_CPLD, - EQDMA_DBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_DBE_ERR_TIMER_FIFO_RAM, - EQDMA_DBE_ERR_QID_FIFO_RAM, - EQDMA_DBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_DBE_ERR_INT_CTXT_RAM, - EQDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_DBE_ERR_PFCH_CTXT_RAM, - EQDMA_DBE_ERR_WRB_CTXT_RAM, - EQDMA_DBE_ERR_PFCH_LL_RAM, - EQDMA_DBE_ERR_PEND_FIFO_RAM, - EQDMA_DBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_DBE_ERR_ALL, - - /* MM C2H Errors */ - EQDMA_MM_C2H_WR_SLR_ERR, - EQDMA_MM_C2H_RD_SLR_ERR, - EQDMA_MM_C2H_WR_FLR_ERR, - EQDMA_MM_C2H_UR_ERR, - EQDMA_MM_C2H_WR_UC_RAM_ERR, - EQDMA_MM_C2H_ERR_ALL, - - /* MM H2C Engine0 Errors */ - EQDMA_MM_H2C0_RD_HDR_POISON_ERR, - EQDMA_MM_H2C0_RD_UR_CA_ERR, - EQDMA_MM_H2C0_RD_HDR_BYTE_ERR, - EQDMA_MM_H2C0_RD_HDR_PARAM_ERR, - EQDMA_MM_H2C0_RD_HDR_ADR_ERR, - EQDMA_MM_H2C0_RD_FLR_ERR, - EQDMA_MM_H2C0_RD_DAT_POISON_ERR, - EQDMA_MM_H2C0_RD_RQ_DIS_ERR, - EQDMA_MM_H2C0_WR_DEC_ERR, - EQDMA_MM_H2C0_WR_SLV_ERR, - EQDMA_MM_H2C0_ERR_ALL, - - EQDMA_ERRS_ALL -}; - -struct eqdma_hw_err_info { - enum eqdma_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*eqdma_hw_err_process)(void *dev_hndl); -}; - -/* In QDMA_GLBL2_MISC_CAP(0x134) register, - * Bits [23:20] gives QDMA IP version. - * 0: QDMA3.1, 1: QDMA4.0, 2: QDMA5.0 - */ -#define EQDMA_IP_VERSION_4 1 -#define EQDMA_IP_VERSION_5 2 - -#define EQDMA_OFFSET_VF_VERSION 0x5014 -#define EQDMA_OFFSET_VF_USER_BAR 0x5018 - -#define EQDMA_OFFSET_MBOX_BASE_PF 0x22400 -#define EQDMA_OFFSET_MBOX_BASE_VF 0x5000 - -#define EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK GENMASK_ULL(63, 38) -#define EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK GENMASK_ULL(37, 6) -#define EQDMA_COMPL_CTXT_BADDR_LOW_MASK GENMASK_ULL(5, 2) - -int eqdma_init_ctxt_memory(void *dev_hndl); - -int eqdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - -int eqdma_get_ip_version(void *dev_hndl, uint8_t is_vf, - uint32_t *ip_version); - -int eqdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int eqdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int eqdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -int eqdma_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -uint32_t eqdma_reg_dump_buf_len(void); - -int eqdma_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int eqdma_hw_error_process(void *dev_hndl); -const char *eqdma_hw_get_error_name(uint32_t err_idx); -int eqdma_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int eqdma_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int eqdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -int eqdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - -int eqdma_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int eqdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int eqdma_set_default_global_csr(void *dev_hndl); - -int eqdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int eqdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int eqdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable); - -int eqdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -uint32_t eqdma_get_config_num_regs(void); - -struct xreg_info *eqdma_get_config_regs(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __EQDMA_SOFT_ACCESS_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg.h deleted file mode 100755 index 0905d50..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg.h +++ /dev/null @@ -1,1524 +0,0 @@ -/* - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __EQDMA_SOFT_REG_H -#define __EQDMA_SOFT_REG_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - -#define DEBGFS_LINE_SZ (81) - -#ifdef ARRAY_SIZE -#undef ARRAY_SIZE -#endif -#define ARRAY_SIZE(arr) (sizeof(arr) / \ - sizeof(arr[0])) - - -uint32_t eqdma_config_num_regs_get(void); -struct xreg_info *eqdma_config_regs_get(void); -#define EQDMA_CFG_BLK_IDENTIFIER_ADDR 0x00 -#define CFG_BLK_IDENTIFIER_MASK GENMASK(31, 20) -#define CFG_BLK_IDENTIFIER_1_MASK GENMASK(19, 16) -#define CFG_BLK_IDENTIFIER_RSVD_1_MASK GENMASK(15, 8) -#define CFG_BLK_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_CFG_BLK_PCIE_MAX_PLD_SIZE_ADDR 0x08 -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ADDR 0x0C -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_SYSTEM_ID_ADDR 0x10 -#define CFG_BLK_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 17) -#define CFG_BLK_SYSTEM_ID_INST_TYPE_MASK BIT(16) -#define CFG_BLK_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_CFG_BLK_MSIX_ENABLE_ADDR 0x014 -#define CFG_BLK_MSIX_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CFG_PCIE_DATA_WIDTH_ADDR 0x18 -#define CFG_PCIE_DATA_WIDTH_RSVD_1_MASK GENMASK(31, 3) -#define CFG_PCIE_DATA_WIDTH_DATAPATH_MASK GENMASK(2, 0) -#define EQDMA_CFG_PCIE_CTL_ADDR 0x1C -#define CFG_PCIE_CTL_RSVD_1_MASK GENMASK(31, 18) -#define CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK GENMASK(17, 16) -#define CFG_PCIE_CTL_RSVD_2_MASK GENMASK(15, 2) -#define CFG_PCIE_CTL_RRQ_DISABLE_MASK BIT(1) -#define CFG_PCIE_CTL_RELAXED_ORDERING_MASK BIT(0) -#define EQDMA_CFG_BLK_MSI_ENABLE_ADDR 0x20 -#define CFG_BLK_MSI_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CFG_AXI_USER_MAX_PLD_SIZE_ADDR 0x40 -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK GENMASK(2, 0) -#define EQDMA_CFG_AXI_USER_MAX_READ_REQ_SIZE_ADDR 0x44 -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_MISC_CTL_ADDR 0x4C -#define CFG_BLK_MISC_CTL_RSVD_1_MASK GENMASK(31, 24) -#define CFG_BLK_MISC_CTL_10B_TAG_EN_MASK BIT(23) -#define CFG_BLK_MISC_CTL_RSVD_2_MASK BIT(22) -#define CFG_BLK_MISC_CTL_AXI_WBK_MASK BIT(21) -#define CFG_BLK_MISC_CTL_AXI_DSC_MASK BIT(20) -#define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) -#define CFG_BLK_MISC_CTL_RSVD_3_MASK GENMASK(7, 5) -#define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) -#define EQDMA_CFG_PL_CRED_CTL_ADDR 0x68 -#define CFG_PL_CRED_CTL_RSVD_1_MASK GENMASK(31, 5) -#define CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK BIT(4) -#define CFG_PL_CRED_CTL_RSVD_2_MASK GENMASK(3, 1) -#define CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK BIT(0) -#define EQDMA_CFG_BLK_SCRATCH_ADDR 0x80 -#define CFG_BLK_SCRATCH_MASK GENMASK(31, 0) -#define EQDMA_CFG_GIC_ADDR 0xA0 -#define CFG_GIC_RSVD_1_MASK GENMASK(31, 1) -#define CFG_GIC_GIC_IRQ_MASK BIT(0) -#define EQDMA_RAM_SBE_MSK_1_A_ADDR 0xE0 -#define RAM_SBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_SBE_STS_1_A_ADDR 0xE4 -#define RAM_SBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_RAM_DBE_MSK_1_A_ADDR 0xE8 -#define RAM_DBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_DBE_STS_1_A_ADDR 0xEC -#define RAM_DBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_RAM_SBE_MSK_A_ADDR 0xF0 -#define RAM_SBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_SBE_STS_A_ADDR 0xF4 -#define RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_SBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_SBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_SBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_SBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_SBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_SBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_SBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_SBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_SBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_SBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_SBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_SBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_SBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_SBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_SBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_SBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_SBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_SBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_SBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_RAM_DBE_MSK_A_ADDR 0xF8 -#define RAM_DBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_DBE_STS_A_ADDR 0xFC -#define RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_DBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_DBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_DBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_DBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_DBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_DBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_DBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_DBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_DBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_DBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_DBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_DBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_DBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_DBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_DBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_DBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_DBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_DBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_DBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_GLBL2_IDENTIFIER_ADDR 0x100 -#define GLBL2_IDENTIFIER_MASK GENMASK(31, 8) -#define GLBL2_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_GLBL2_CHANNEL_INST_ADDR 0x114 -#define GLBL2_CHANNEL_INST_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_INST_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_INST_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_INST_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_INST_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_INST_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_INST_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_MDMA_ADDR 0x118 -#define GLBL2_CHANNEL_MDMA_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_MDMA_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_MDMA_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_MDMA_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_MDMA_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_MDMA_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_MDMA_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_STRM_ADDR 0x11C -#define GLBL2_CHANNEL_STRM_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_STRM_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_STRM_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_STRM_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_STRM_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_STRM_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_STRM_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_CAP_ADDR 0x120 -#define GLBL2_CHANNEL_CAP_RSVD_1_MASK GENMASK(31, 12) -#define GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK GENMASK(11, 0) -#define EQDMA_GLBL2_CHANNEL_PASID_CAP_ADDR 0x128 -#define GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK GENMASK(31, 2) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK BIT(1) -#define GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK BIT(0) -#define EQDMA_GLBL2_SYSTEM_ID_ADDR 0x130 -#define GLBL2_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_MISC_CAP_ADDR 0x134 -#define GLBL2_MISC_CAP_MASK GENMASK(31, 0) -#define EQDMA_GLBL2_RRQ_BRG_THROT_ADDR 0x158 -#define GLBL2_RRQ_BRG_THROT_REQ_EN_MASK BIT(31) -#define GLBL2_RRQ_BRG_THROT_REQ_MASK GENMASK(30, 19) -#define GLBL2_RRQ_BRG_THROT_DAT_EN_MASK BIT(18) -#define GLBL2_RRQ_BRG_THROT_DAT_MASK GENMASK(17, 0) -#define EQDMA_GLBL2_RRQ_PCIE_THROT_ADDR 0x15C -#define GLBL2_RRQ_PCIE_THROT_REQ_EN_MASK BIT(31) -#define GLBL2_RRQ_PCIE_THROT_REQ_MASK GENMASK(30, 19) -#define GLBL2_RRQ_PCIE_THROT_DAT_EN_MASK BIT(18) -#define GLBL2_RRQ_PCIE_THROT_DAT_MASK GENMASK(17, 0) -#define EQDMA_GLBL2_RRQ_AXIMM_THROT_ADDR 0x160 -#define GLBL2_RRQ_AXIMM_THROT_REQ_EN_MASK BIT(31) -#define GLBL2_RRQ_AXIMM_THROT_REQ_MASK GENMASK(30, 19) -#define GLBL2_RRQ_AXIMM_THROT_DAT_EN_MASK BIT(18) -#define GLBL2_RRQ_AXIMM_THROT_DAT_MASK GENMASK(17, 0) -#define EQDMA_GLBL2_RRQ_PCIE_LAT0_ADDR 0x164 -#define GLBL2_RRQ_PCIE_LAT0_MAX_MASK GENMASK(31, 16) -#define GLBL2_RRQ_PCIE_LAT0_MIN_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_RRQ_PCIE_LAT1_ADDR 0x168 -#define GLBL2_RRQ_PCIE_LAT1_RSVD_MASK GENMASK(31, 17) -#define GLBL2_RRQ_PCIE_LAT1_OVFL_MASK BIT(16) -#define GLBL2_RRQ_PCIE_LAT1_AVG_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_RRQ_AXIMM_LAT0_ADDR 0x16C -#define GLBL2_RRQ_AXIMM_LAT0_MAX_MASK GENMASK(31, 16) -#define GLBL2_RRQ_AXIMM_LAT0_MIN_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_RRQ_AXIMM_LAT1_ADDR 0x170 -#define GLBL2_RRQ_AXIMM_LAT1_RSVD_MASK GENMASK(31, 17) -#define GLBL2_RRQ_AXIMM_LAT1_OVFL_MASK BIT(16) -#define GLBL2_RRQ_AXIMM_LAT1_AVG_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_DBG_PCIE_RQ0_ADDR 0x1B8 -#define GLBL2_PCIE_RQ0_NPH_AVL_MASK GENMASK(31, 20) -#define GLBL2_PCIE_RQ0_RCB_AVL_MASK GENMASK(19, 9) -#define GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK GENMASK(8, 2) -#define GLBL2_PCIE_RQ0_TAG_EP_MASK GENMASK(1, 0) -#define EQDMA_GLBL2_DBG_PCIE_RQ1_ADDR 0x1BC -#define GLBL2_PCIE_RQ1_RSVD_1_MASK GENMASK(31, 21) -#define GLBL2_PCIE_RQ1_TAG_FL_MASK GENMASK(20, 19) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK BIT(18) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK BIT(17) -#define GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK BIT(16) -#define GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK BIT(15) -#define GLBL2_PCIE_RQ1_TLPSM_MASK GENMASK(14, 12) -#define GLBL2_PCIE_RQ1_TLPSM512_MASK GENMASK(11, 9) -#define GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK BIT(8) -#define GLBL2_PCIE_RQ1_RREQ0_SLV_MASK BIT(7) -#define GLBL2_PCIE_RQ1_RREQ0_VLD_MASK BIT(6) -#define GLBL2_PCIE_RQ1_RREQ0_RDY_MASK BIT(5) -#define GLBL2_PCIE_RQ1_RREQ1_SLV_MASK BIT(4) -#define GLBL2_PCIE_RQ1_RREQ1_VLD_MASK BIT(3) -#define GLBL2_PCIE_RQ1_RREQ1_RDY_MASK BIT(2) -#define GLBL2_PCIE_RQ1_WTLP_REQ_MASK BIT(1) -#define GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_WR0_ADDR 0x1C0 -#define GLBL2_AXIMM_WR0_RSVD_1_MASK GENMASK(31, 27) -#define GLBL2_AXIMM_WR0_WR_REQ_MASK BIT(26) -#define GLBL2_AXIMM_WR0_WR_CHN_MASK GENMASK(25, 23) -#define GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK BIT(22) -#define GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK BIT(21) -#define GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK GENMASK(20, 18) -#define GLBL2_AXIMM_WR0_WRREQ_CNT_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR0_BID_MASK GENMASK(11, 9) -#define GLBL2_AXIMM_WR0_BVALID_MASK BIT(8) -#define GLBL2_AXIMM_WR0_BREADY_MASK BIT(7) -#define GLBL2_AXIMM_WR0_WVALID_MASK BIT(6) -#define GLBL2_AXIMM_WR0_WREADY_MASK BIT(5) -#define GLBL2_AXIMM_WR0_AWID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_WR0_AWVALID_MASK BIT(1) -#define GLBL2_AXIMM_WR0_AWREADY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_WR1_ADDR 0x1C4 -#define GLBL2_AXIMM_WR1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_WR1_BRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_WR1_BRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_WR1_BRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR1_BRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_WR1_BRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_GLBL2_DBG_AXIMM_RD0_ADDR 0x1C8 -#define GLBL2_AXIMM_RD0_RSVD_1_MASK GENMASK(31, 23) -#define GLBL2_AXIMM_RD0_PND_CNT_MASK GENMASK(22, 17) -#define GLBL2_AXIMM_RD0_RD_REQ_MASK BIT(16) -#define GLBL2_AXIMM_RD0_RD_CHNL_MASK GENMASK(15, 13) -#define GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK GENMASK(12, 10) -#define GLBL2_AXIMM_RD0_RID_MASK GENMASK(9, 7) -#define GLBL2_AXIMM_RD0_RVALID_MASK BIT(6) -#define GLBL2_AXIMM_RD0_RREADY_MASK BIT(5) -#define GLBL2_AXIMM_RD0_ARID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_RD0_ARVALID_MASK BIT(1) -#define GLBL2_AXIMM_RD0_ARREADY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_RD1_ADDR 0x1CC -#define GLBL2_AXIMM_RD1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_RD1_RRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_RD1_RRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_RD1_RRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_RD1_RRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_RD1_RRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_GLBL2_DBG_FAB0_ADDR 0x1D0 -#define GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK BIT(31) -#define GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK BIT(30) -#define GLBL2_FAB0_H2C_SEG_IN_VLD_MASK BIT(29) -#define GLBL2_FAB0_H2C_SEG_IN_RDY_MASK BIT(28) -#define GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK GENMASK(27, 24) -#define GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK BIT(23) -#define GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK GENMASK(22, 16) -#define GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK BIT(15) -#define GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK BIT(14) -#define GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK GENMASK(13, 10) -#define GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK BIT(9) -#define GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK BIT(8) -#define GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK BIT(7) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK BIT(6) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK BIT(5) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK BIT(3) -#define GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK BIT(2) -#define GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK BIT(1) -#define GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_FAB1_ADDR 0x1D4 -#define GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK GENMASK(31, 25) -#define GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK GENMASK(24, 18) -#define GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK BIT(17) -#define GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK BIT(16) -#define GLBL2_FAB1_RSVD_1_MASK GENMASK(15, 13) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK BIT(12) -#define GLBL2_FAB1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK BIT(8) -#define GLBL2_FAB1_RSVD_3_MASK GENMASK(7, 5) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB1_RSVD_4_MASK GENMASK(3, 1) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_MATCH_SEL_ADDR 0x1F4 -#define GLBL2_MATCH_SEL_RSV_MASK GENMASK(31, 18) -#define GLBL2_MATCH_SEL_CSR_SEL_MASK GENMASK(17, 13) -#define GLBL2_MATCH_SEL_CSR_EN_MASK BIT(12) -#define GLBL2_MATCH_SEL_ROTATE1_MASK GENMASK(11, 10) -#define GLBL2_MATCH_SEL_ROTATE0_MASK GENMASK(9, 8) -#define GLBL2_MATCH_SEL_SEL_MASK GENMASK(7, 0) -#define EQDMA_GLBL2_DBG_MATCH_MSK_ADDR 0x1F8 -#define GLBL2_MATCH_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL2_DBG_MATCH_PAT_ADDR 0x1FC -#define GLBL2_MATCH_PAT_PATTERN_MASK GENMASK(31, 0) -#define EQDMA_GLBL_RNG_SZ_1_ADDR 0x204 -#define GLBL_RNG_SZ_1_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_1_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_2_ADDR 0x208 -#define GLBL_RNG_SZ_2_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_2_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_3_ADDR 0x20C -#define GLBL_RNG_SZ_3_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_3_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_4_ADDR 0x210 -#define GLBL_RNG_SZ_4_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_4_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_5_ADDR 0x214 -#define GLBL_RNG_SZ_5_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_5_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_6_ADDR 0x218 -#define GLBL_RNG_SZ_6_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_6_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_7_ADDR 0x21C -#define GLBL_RNG_SZ_7_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_7_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_8_ADDR 0x220 -#define GLBL_RNG_SZ_8_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_8_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_9_ADDR 0x224 -#define GLBL_RNG_SZ_9_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_9_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_A_ADDR 0x228 -#define GLBL_RNG_SZ_A_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_A_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_B_ADDR 0x22C -#define GLBL_RNG_SZ_B_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_B_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_C_ADDR 0x230 -#define GLBL_RNG_SZ_C_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_C_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_D_ADDR 0x234 -#define GLBL_RNG_SZ_D_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_D_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_E_ADDR 0x238 -#define GLBL_RNG_SZ_E_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_E_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_F_ADDR 0x23C -#define GLBL_RNG_SZ_F_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_F_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_10_ADDR 0x240 -#define GLBL_RNG_SZ_10_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_10_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_ERR_STAT_ADDR 0x248 -#define GLBL_ERR_STAT_RSVD_1_MASK GENMASK(31, 18) -#define GLBL_ERR_STAT_ERR_FAB_MASK BIT(17) -#define GLBL_ERR_STAT_ERR_H2C_ST_MASK BIT(16) -#define GLBL_ERR_STAT_ERR_BDG_MASK BIT(15) -#define GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK GENMASK(14, 9) -#define GLBL_ERR_STAT_ERR_C2H_ST_MASK BIT(8) -#define GLBL_ERR_STAT_ERR_C2H_MM_1_MASK BIT(7) -#define GLBL_ERR_STAT_ERR_C2H_MM_0_MASK BIT(6) -#define GLBL_ERR_STAT_ERR_H2C_MM_1_MASK BIT(5) -#define GLBL_ERR_STAT_ERR_H2C_MM_0_MASK BIT(4) -#define GLBL_ERR_STAT_ERR_TRQ_MASK BIT(3) -#define GLBL_ERR_STAT_ERR_DSC_MASK BIT(2) -#define GLBL_ERR_STAT_ERR_RAM_DBE_MASK BIT(1) -#define GLBL_ERR_STAT_ERR_RAM_SBE_MASK BIT(0) -#define EQDMA_GLBL_ERR_MASK_ADDR 0x24C -#define GLBL_ERR_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CFG_ADDR 0x250 -#define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_CFG_C2H_UODSC_LIMIT_MASK GENMASK(29, 20) -#define GLBL_DSC_CFG_H2C_UODSC_LIMIT_MASK GENMASK(19, 10) -#define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) -#define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) -#define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) -#define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) -#define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define EQDMA_GLBL_DSC_ERR_STS_ADDR 0x254 -#define GLBL_DSC_ERR_STS_RSVD_1_MASK GENMASK(31, 26) -#define GLBL_DSC_ERR_STS_PORT_ID_MASK BIT(25) -#define GLBL_DSC_ERR_STS_SBE_MASK BIT(24) -#define GLBL_DSC_ERR_STS_DBE_MASK BIT(23) -#define GLBL_DSC_ERR_STS_RQ_CANCEL_MASK BIT(22) -#define GLBL_DSC_ERR_STS_DSC_MASK BIT(21) -#define GLBL_DSC_ERR_STS_DMA_MASK BIT(20) -#define GLBL_DSC_ERR_STS_FLR_CANCEL_MASK BIT(19) -#define GLBL_DSC_ERR_STS_RSVD_2_MASK GENMASK(18, 17) -#define GLBL_DSC_ERR_STS_DAT_POISON_MASK BIT(16) -#define GLBL_DSC_ERR_STS_TIMEOUT_MASK BIT(9) -#define GLBL_DSC_ERR_STS_FLR_MASK BIT(8) -#define GLBL_DSC_ERR_STS_TAG_MASK BIT(6) -#define GLBL_DSC_ERR_STS_ADDR_MASK BIT(5) -#define GLBL_DSC_ERR_STS_PARAM_MASK BIT(4) -#define GLBL_DSC_ERR_STS_BCNT_MASK BIT(3) -#define GLBL_DSC_ERR_STS_UR_CA_MASK BIT(2) -#define GLBL_DSC_ERR_STS_POISON_MASK BIT(1) -#define EQDMA_GLBL_DSC_ERR_MSK_ADDR 0x258 -#define GLBL_DSC_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_ERR_LOG0_ADDR 0x25C -#define GLBL_DSC_ERR_LOG0_VALID_MASK BIT(31) -#define GLBL_DSC_ERR_LOG0_SEL_MASK BIT(30) -#define GLBL_DSC_ERR_LOG0_RSVD_1_MASK GENMASK(29, 13) -#define GLBL_DSC_ERR_LOG0_QID_MASK GENMASK(12, 0) -#define EQDMA_GLBL_DSC_ERR_LOG1_ADDR 0x260 -#define GLBL_DSC_ERR_LOG1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_ERR_LOG1_CIDX_MASK GENMASK(27, 12) -#define GLBL_DSC_ERR_LOG1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK GENMASK(8, 5) -#define GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK GENMASK(4, 0) -#define EQDMA_GLBL_TRQ_ERR_STS_ADDR 0x264 -#define GLBL_TRQ_ERR_STS_RSVD_1_MASK GENMASK(31, 8) -#define GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK BIT(7) -#define GLBL_TRQ_ERR_STS_RSVD_2_MASK BIT(6) -#define GLBL_TRQ_ERR_STS_QID_RANGE_MASK BIT(5) -#define GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK BIT(4) -#define GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK BIT(3) -#define GLBL_TRQ_ERR_STS_RSVD_3_MASK BIT(2) -#define GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK BIT(1) -#define GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK BIT(0) -#define EQDMA_GLBL_TRQ_ERR_MSK_ADDR 0x268 -#define GLBL_TRQ_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL_TRQ_ERR_LOG_ADDR 0x26C -#define GLBL_TRQ_ERR_LOG_SRC_MASK BIT(31) -#define GLBL_TRQ_ERR_LOG_TARGET_MASK GENMASK(30, 27) -#define GLBL_TRQ_ERR_LOG_FUNC_MASK GENMASK(26, 17) -#define GLBL_TRQ_ERR_LOG_ADDRESS_MASK GENMASK(16, 0) -#define EQDMA_GLBL_DSC_DBG_DAT0_ADDR 0x270 -#define GLBL_DSC_DAT0_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK BIT(29) -#define GLBL_DSC_DAT0_CTXT_ARB_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK GENMASK(16, 12) -#define GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK BIT(11) -#define GLBL_DSC_DAT0_TMSTALL_MASK BIT(10) -#define GLBL_DSC_DAT0_RRQ_STALL_MASK GENMASK(9, 8) -#define GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK GENMASK(7, 6) -#define GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK GENMASK(5, 4) -#define GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK GENMASK(3, 2) -#define GLBL_DSC_DAT0_DSC_OUT_STALL_MASK GENMASK(1, 0) -#define EQDMA_GLBL_DSC_DBG_DAT1_ADDR 0x274 -#define GLBL_DSC_DAT1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_DAT1_EVT_SPC_C2H_MASK GENMASK(27, 22) -#define GLBL_DSC_DAT1_EVT_SP_H2C_MASK GENMASK(21, 16) -#define GLBL_DSC_DAT1_DSC_SPC_C2H_MASK GENMASK(15, 8) -#define GLBL_DSC_DAT1_DSC_SPC_H2C_MASK GENMASK(7, 0) -#define EQDMA_GLBL_DSC_DBG_CTL_ADDR 0x278 -#define GLBL_DSC_CTL_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_DSC_CTL_LAT_QID_MASK GENMASK(15, 4) -#define GLBL_DSC_CTL_DSC_ENG_LAT_CLR_MASK BIT(3) -#define GLBL_DSC_CTL_SELECT_MASK GENMASK(2, 0) -#define EQDMA_GLBL_DSC_ERR_LOG2_ADDR 0x27c -#define GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK GENMASK(31, 16) -#define GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK GENMASK(15, 0) -#define EQDMA_GLBL_GLBL_INTERRUPT_CFG_ADDR 0x2c4 -#define GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK GENMASK(31, 2) -#define GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK BIT(1) -#define GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK BIT(0) -#define EQDMA_GLBL_VCH_HOST_PROFILE_ADDR 0x2c8 -#define GLBL_VCH_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_VCH_HOST_PROFILE_2C_MM_MASK GENMASK(27, 24) -#define GLBL_VCH_HOST_PROFILE_2C_ST_MASK GENMASK(23, 20) -#define GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK GENMASK(19, 16) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK GENMASK(15, 12) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK GENMASK(7, 4) -#define GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK GENMASK(3, 0) -#define EQDMA_GLBL_BRIDGE_HOST_PROFILE_ADDR 0x308 -#define GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 4) -#define GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK GENMASK(3, 0) -#define EQDMA_AXIMM_IRQ_DEST_ADDR_ADDR 0x30c -#define AXIMM_IRQ_DEST_ADDR_ADDR_MASK GENMASK(31, 0) -#define EQDMA_FAB_ERR_LOG_ADDR 0x314 -#define FAB_ERR_LOG_RSVD_1_MASK GENMASK(31, 7) -#define FAB_ERR_LOG_SRC_MASK GENMASK(6, 0) -#define EQDMA_GLBL_REQ_ERR_STS_ADDR 0x318 -#define GLBL_REQ_ERR_STS_RSVD_1_MASK GENMASK(31, 11) -#define GLBL_REQ_ERR_STS_RC_DISCONTINUE_MASK BIT(10) -#define GLBL_REQ_ERR_STS_RC_PRTY_MASK BIT(9) -#define GLBL_REQ_ERR_STS_RC_FLR_MASK BIT(8) -#define GLBL_REQ_ERR_STS_RC_TIMEOUT_MASK BIT(7) -#define GLBL_REQ_ERR_STS_RC_INV_BCNT_MASK BIT(6) -#define GLBL_REQ_ERR_STS_RC_INV_TAG_MASK BIT(5) -#define GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH_MASK BIT(4) -#define GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH_MASK BIT(3) -#define GLBL_REQ_ERR_STS_RC_NO_DATA_MASK BIT(2) -#define GLBL_REQ_ERR_STS_RC_UR_CA_CRS_MASK BIT(1) -#define GLBL_REQ_ERR_STS_RC_POISONED_MASK BIT(0) -#define EQDMA_GLBL_REQ_ERR_MSK_ADDR 0x31C -#define GLBL_REQ_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_DBG_LAT0_A_ADDR 0x320 -#define GLBL_DSC_LAT0_A_LAT_MAX_MASK GENMASK(31, 16) -#define GLBL_DSC_LAT0_A_LAT_MIN_MASK GENMASK(15, 0) -#define EQDMA_GLBL_DSC_DBG_LAT1_A_ADDR 0x324 -#define GLBL_DSC_LAT1_A_RSVD_MASK GENMASK(31, 17) -#define GLBL_DSC_LAT1_A_LAT_OVF_MASK BIT(16) -#define GLBL_DSC_LAT1_A_LAT_AVG_MASK GENMASK(15, 0) -#define EQDMA_GLBL_DSC_CRD_CTR0_A_ADDR 0x328 -#define GLBL_DSC_CRD_CTR0_A_CRD_RCV_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CRD_CTR1_A_ADDR 0x32C -#define GLBL_DSC_CRD_CTR1_A_CRD_RCV_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CRD_CTR2_A_ADDR 0x330 -#define GLBL_DSC_CRD_CTR2_A_CRD_RCV_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CRD_CTR3_A_ADDR 0x334 -#define GLBL_DSC_CRD_CTR3_A_CRD_RCV_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_IMM_CRD_CTR0_A_ADDR 0x338 -#define GLBL_DSC_IMM_CRD_CTR0_A_RCV_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_IMM_CRD_CTR1_A_ADDR 0x33C -#define GLBL_DSC_IMM_CRD_CTR1_A_RCV_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_IMM_CRD_CTR2_A_ADDR 0x340 -#define GLBL_DSC_IMM_CRD_CTR2_A_RCV_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_IMM_CRD_CTR3_A_ADDR 0x344 -#define GLBL_DSC_IMM_CRD_CTR3_A_RCV_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_H2C_OUT_CTR0_A_ADDR 0x348 -#define GLBL_DSC_H2C_OUT_CTR0_A_H2CVLD_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_H2C_OUT_CTR1_A_ADDR 0x34C -#define GLBL_DSC_H2C_OUT_CTR1_A_H2CVLD_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_H2C_OUT_CTR2_A_ADDR 0x350 -#define GLBL_DSC_H2C_OUT_CTR2_A_H2CVLD_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_H2C_OUT_CTR3_A_ADDR 0x354 -#define GLBL_DSC_H2C_OUT_CTR3_A_H2CVLD_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_C2H_OUT_CTR0_A_ADDR 0x358 -#define GLBL_DSC_C2H_OUT_CTR0_A_C2HVLD_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_C2H_OUT_CTR1_A_ADDR 0x35C -#define GLBL_DSC_C2H_OUT_CTR1_A_C2HVLD_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_C2H_OUT_CTR2_A_ADDR 0x360 -#define GLBL_DSC_C2H_OUT_CTR2_A_C2HVLD_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_C2H_OUT_CTR3_A_ADDR 0x364 -#define GLBL_DSC_C2H_OUT_CTR3_A_C2HVLD_NRDY_CNT_MASK GENMASK(31, 0) -#define EQDMA_T_ADDR 0x368 -#define T_USER_CTR_MAX_MASK GENMASK(31, 0) -#define EQDMA_GLBL_PERF_CNTR_CTL_A1_ADDR 0x36C -#define GLBL_PERF_CNTR_CTL_A1_RSVD_MASK GENMASK(31, 18) -#define GLBL_PERF_CNTR_CTL_A1_USER_CTR_CLEAR_MASK BIT(17) -#define GLBL_PERF_CNTR_CTL_A1_USER_CTR_READ_MASK BIT(16) -#define GLBL_PERF_CNTR_CTL_A1_USER_CTR_MAX_MASK GENMASK(15, 0) -#define EQDMA_GLBL_FREE_CNT_A0_ADDR 0x370 -#define GLBL_FREE_CNT_A0_S_MASK GENMASK(31, 0) -#define EQDMA_GLBL_FREE_CNT_A1_ADDR 0x374 -#define GLBL_FREE_CNT_A1_RSVD_MASK GENMASK(31, 16) -#define GLBL_FREE_CNT_A1_S_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A0_ADDR 0x378 -#define GLBL_AXIS_H2C_CNT_A0_MPKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A1_ADDR 0x37C -#define GLBL_AXIS_H2C_CNT_A1_MIDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_AXIS_H2C_CNT_A1_MPKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A2_ADDR 0x380 -#define GLBL_AXIS_H2C_CNT_A2_MIDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A3_ADDR 0x384 -#define GLBL_AXIS_H2C_CNT_A3_MACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A4_ADDR 0x388 -#define GLBL_AXIS_H2C_CNT_A4_MBUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_AXIS_H2C_CNT_A4_MACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_H2C_CNT_A5_ADDR 0x38C -#define GLBL_AXIS_H2C_CNT_A5_MBUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A0_ADDR 0x390 -#define GLBL_AXIS_C2H_CNT_A0_SPKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A1_ADDR 0x394 -#define GLBL_AXIS_C2H_CNT_A1_SIDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_AXIS_C2H_CNT_A1_SPKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A2_ADDR 0x398 -#define GLBL_AXIS_C2H_CNT_A2_SIDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A3_ADDR 0x39C -#define GLBL_AXIS_C2H_CNT_A3_SACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A4_ADDR 0x3A0 -#define GLBL_AXIS_C2H_CNT_A4_SBUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_AXIS_C2H_CNT_A4_SACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_AXIS_C2H_CNT_A5_ADDR 0x3A4 -#define GLBL_AXIS_C2H_CNT_A5_SBUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A0_ADDR 0x3A8 -#define GLBL_M_AXI_WR_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A1_ADDR 0x3AC -#define GLBL_M_AXI_WR_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXI_WR_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A2_ADDR 0x3B0 -#define GLBL_M_AXI_WR_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A3_ADDR 0x3B4 -#define GLBL_M_AXI_WR_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A4_ADDR 0x3B8 -#define GLBL_M_AXI_WR_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXI_WR_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXI_WR_CNT_A5_ADDR 0x3BC -#define GLBL_M_AXI_WR_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A0_ADDR 0x3C0 -#define GLBL_M_AXI_RD_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A1_ADDR 0x3C4 -#define GLBL_M_AXI_RD_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXI_RD_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A2_ADDR 0x3C8 -#define GLBL_M_AXI_RD_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A3_ADDR 0x3CC -#define GLBL_M_AXI_RD_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A4_ADDR 0x3D0 -#define GLBL_M_AXI_RD_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXI_RD_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXI_RD_CNT_A5_ADDR 0x3D4 -#define GLBL_M_AXI_RD_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A0_ADDR 0x3D8 -#define GLBL_M_AXIB_WR_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A1_ADDR 0x3DC -#define GLBL_M_AXIB_WR_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXIB_WR_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A2_ADDR 0x3E0 -#define GLBL_M_AXIB_WR_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A3_ADDR 0x3E4 -#define GLBL_M_AXIB_WR_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A4_ADDR 0x3E8 -#define GLBL_M_AXIB_WR_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXIB_WR_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXIB_WR_CNT_A5_ADDR 0x3EC -#define GLBL_M_AXIB_WR_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A0_ADDR 0x3F0 -#define GLBL_M_AXIB_RD_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A1_ADDR 0x3F4 -#define GLBL_M_AXIB_RD_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXIB_RD_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A2_ADDR 0x3F8 -#define GLBL_M_AXIB_RD_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A3_ADDR 0x3FC -#define GLBL_M_AXIB_RD_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A4_ADDR 0x400 -#define GLBL_M_AXIB_RD_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_M_AXIB_RD_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_M_AXIB_RD_CNT_A5_ADDR 0x404 -#define GLBL_M_AXIB_RD_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A0_ADDR 0x408 -#define GLBL_S_AXI_WR_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A1_ADDR 0x40C -#define GLBL_S_AXI_WR_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXI_WR_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A2_ADDR 0x410 -#define GLBL_S_AXI_WR_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A3_ADDR 0x414 -#define GLBL_S_AXI_WR_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A4_ADDR 0x418 -#define GLBL_S_AXI_WR_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXI_WR_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXI_WR_CNT_A5_ADDR 0x41C -#define GLBL_S_AXI_WR_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A0_ADDR 0x420 -#define GLBL_S_AXI_RD_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A1_ADDR 0x424 -#define GLBL_S_AXI_RD_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXI_RD_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A2_ADDR 0x428 -#define GLBL_S_AXI_RD_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A3_ADDR 0x42C -#define GLBL_S_AXI_RD_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A4_ADDR 0x430 -#define GLBL_S_AXI_RD_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXI_RD_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXI_RD_CNT_A5_ADDR 0x434 -#define GLBL_S_AXI_RD_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A0_ADDR 0x438 -#define GLBL_S_AXIS_CMP_CNT_A0_PKT_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A1_ADDR 0x43C -#define GLBL_S_AXIS_CMP_CNT_A1_IDLE_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXIS_CMP_CNT_A1_PKT_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A2_ADDR 0x440 -#define GLBL_S_AXIS_CMP_CNT_A2_IDLE_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A3_ADDR 0x444 -#define GLBL_S_AXIS_CMP_CNT_A3_ACTV_CNTS_MASK GENMASK(31, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A4_ADDR 0x448 -#define GLBL_S_AXIS_CMP_CNT_A4_BUSY_CNTS_MASK GENMASK(15, 0) -#define GLBL_S_AXIS_CMP_CNT_A4_ACTV_CNTS_MASK GENMASK(15, 0) -#define EQDMA_GLBL_S_AXIS_CMP_CNT_A5_ADDR 0x44C -#define GLBL_S_AXIS_CMP_CNT_A5_BUSY_CNTS_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_DATA_ADDR 0x804 -#define IND_CTXT_DATA_DATA_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_MASK_ADDR 0x824 -#define IND_CTXT_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_CMD_ADDR 0x844 -#define IND_CTXT_CMD_RSVD_1_MASK GENMASK(31, 20) -#define IND_CTXT_CMD_QID_MASK GENMASK(19, 7) -#define IND_CTXT_CMD_OP_MASK GENMASK(6, 5) -#define IND_CTXT_CMD_SEL_MASK GENMASK(4, 1) -#define IND_CTXT_CMD_BUSY_MASK BIT(0) -#define EQDMA_C2H_TIMER_CNT_ADDR 0xA00 -#define C2H_TIMER_CNT_RSVD_1_MASK GENMASK(31, 16) -#define C2H_TIMER_CNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_CNT_TH_ADDR 0xA40 -#define C2H_CNT_TH_RSVD_1_MASK GENMASK(31, 16) -#define C2H_CNT_TH_THESHOLD_CNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CFG_1_ADDR 0xA80 -#define C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_1_QCNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CFG_2_ADDR 0xA84 -#define C2H_PFCH_CFG_2_FENCE_MASK BIT(31) -#define C2H_PFCH_CFG_2_RSVD_MASK GENMASK(30, 29) -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK BIT(28) -#define C2H_PFCH_CFG_2_LL_SZ_TH_MASK GENMASK(27, 12) -#define C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK GENMASK(11, 6) -#define C2H_PFCH_CFG_2_NUM_MASK GENMASK(5, 0) -#define EQDMA_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR 0xA88 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR 0xA8C -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR 0xA90 -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_AXIS_PKG_CMP_ADDR 0xA94 -#define C2H_STAT_AXIS_PKG_CMP_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_ACCEPTED_ADDR 0xA98 -#define C2H_STAT_DESC_RSP_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_CMP_ADDR 0xA9C -#define C2H_STAT_DESC_RSP_CMP_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_WRQ_OUT_ADDR 0xAA0 -#define C2H_STAT_WRQ_OUT_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_WPL_REN_ACCEPTED_ADDR 0xAA4 -#define C2H_STAT_WPL_REN_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_TOTAL_WRQ_LEN_ADDR 0xAA8 -#define C2H_STAT_TOTAL_WRQ_LEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_TOTAL_WPL_LEN_ADDR 0xAAC -#define C2H_STAT_TOTAL_WPL_LEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_BUF_SZ_ADDR 0xAB0 -#define C2H_BUF_SZ_IZE_MASK GENMASK(31, 0) -#define EQDMA_C2H_ERR_STAT_ADDR 0xAF0 -#define C2H_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK BIT(20) -#define C2H_ERR_STAT_HDR_PAR_ERR_MASK BIT(19) -#define C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK BIT(18) -#define C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(17) -#define C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK BIT(16) -#define C2H_ERR_STAT_WRB_PRTY_ERR_MASK BIT(15) -#define C2H_ERR_STAT_WRB_CIDX_ERR_MASK BIT(14) -#define C2H_ERR_STAT_WRB_QFULL_ERR_MASK BIT(13) -#define C2H_ERR_STAT_WRB_INV_Q_ERR_MASK BIT(12) -#define C2H_ERR_STAT_RSVD_2_MASK BIT(11) -#define C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK BIT(10) -#define C2H_ERR_STAT_ERR_DESC_CNT_MASK BIT(9) -#define C2H_ERR_STAT_RSVD_3_MASK BIT(8) -#define C2H_ERR_STAT_MSI_INT_FAIL_MASK BIT(7) -#define C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define C2H_ERR_STAT_RSVD_4_MASK BIT(5) -#define C2H_ERR_STAT_DESC_RSP_ERR_MASK BIT(4) -#define C2H_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK BIT(2) -#define C2H_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_C2H_ERR_MASK_ADDR 0xAF4 -#define C2H_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_C2H_FATAL_ERR_STAT_ADDR 0xAF8 -#define C2H_FATAL_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(20) -#define C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK BIT(19) -#define C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK BIT(18) -#define C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK BIT(17) -#define C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK BIT(15) -#define C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define C2H_FATAL_ERR_STAT_RESERVED2_MASK BIT(13) -#define C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK BIT(9) -#define C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK BIT(8) -#define C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK GENMASK(7, 4) -#define C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_FATAL_ERR_STAT_RESERVED1_MASK BIT(2) -#define C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_C2H_FATAL_ERR_MASK_ADDR 0xAFC -#define C2H_FATAL_ERR_C2HEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_FATAL_ERR_ENABLE_ADDR 0xB00 -#define C2H_FATAL_ERR_ENABLE_RSVD_1_MASK GENMASK(31, 2) -#define C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK BIT(1) -#define C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK BIT(0) -#define EQDMA_GLBL_ERR_INT_ADDR 0xB04 -#define GLBL_ERR_INT_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_ERR_INT_HOST_ID_MASK GENMASK(29, 26) -#define GLBL_ERR_INT_DIS_INTR_ON_VF_MASK BIT(25) -#define GLBL_ERR_INT_ARM_MASK BIT(24) -#define GLBL_ERR_INT_EN_COAL_MASK BIT(23) -#define GLBL_ERR_INT_VEC_MASK GENMASK(22, 12) -#define GLBL_ERR_INT_FUNC_MASK GENMASK(11, 0) -#define EQDMA_C2H_PFCH_CFG_ADDR 0xB08 -#define C2H_PFCH_CFG_EVTFL_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_FL_TH_MASK GENMASK(15, 0) -#define EQDMA_C2H_INT_TIMER_TICK_ADDR 0xB0C -#define C2H_INT_TIMER_TICK_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR 0xB10 -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR 0xB14 -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_REQ_ADDR 0xB18 -#define C2H_STAT_DESC_REQ_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_0_ADDR 0xB1C -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK BIT(31) -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK BIT(30) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK GENMASK(29, 27) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK GENMASK(26, 24) -#define C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK BIT(23) -#define C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK BIT(22) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK BIT(21) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK GENMASK(20, 9) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK BIT(8) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK GENMASK(7, 5) -#define C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK BIT(4) -#define C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK GENMASK(3, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_1_ADDR 0xB20 -#define C2H_STAT_DMA_ENG_1_WRB_USER_0_CMPT_TYPE_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_1_DESC_RSP_FIFO_OUT_VLD_MASK GENMASK(29, 29) -#define C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK GENMASK(6, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_2_ADDR 0xB24 -#define C2H_STAT_DMA_ENG_2_WRB_USER_1_CMPT_TYPE_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_2_DESC_RSP_FIFO_OUT_VLD_1_MASK GENMASK(29, 29) -#define C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_1_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_1_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_1_MASK GENMASK(6, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_3_ADDR 0xB28 -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_HAS_CMPT_MASK BIT(31) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_MARKER_MASK BIT(30) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_DROP_REQ_MASK BIT(29) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_QID_MASK GENMASK(28, 17) -#define C2H_STAT_DMA_ENG_3_WR_HDR_FIFO_OUT_CNT_MASK GENMASK(16, 12) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK BIT(11) -#define C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK BIT(10) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK BIT(9) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK BIT(8) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK BIT(7) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK BIT(6) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK BIT(5) -#define C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK BIT(4) -#define C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK BIT(3) -#define C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_MASK BIT(2) -#define C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK BIT(1) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK BIT(0) -#define EQDMA_C2H_DBG_PFCH_ERR_CTXT_ADDR 0xB2C -#define C2H_PFCH_ERR_CTXT_RSVD_1_MASK GENMASK(31, 14) -#define C2H_PFCH_ERR_CTXT_ERR_STAT_MASK BIT(13) -#define C2H_PFCH_ERR_CTXT_CMD_WR_MASK BIT(12) -#define C2H_PFCH_ERR_CTXT_QID_MASK GENMASK(11, 1) -#define C2H_PFCH_ERR_CTXT_DONE_MASK BIT(0) -#define EQDMA_C2H_FIRST_ERR_QID_ADDR 0xB30 -#define C2H_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(20, 16) -#define C2H_FIRST_ERR_QID_RSVD_MASK GENMASK(15, 13) -#define C2H_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_STAT_NUM_WRB_IN_ADDR 0xB34 -#define STAT_NUM_WRB_IN_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_IN_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_WRB_OUT_ADDR 0xB38 -#define STAT_NUM_WRB_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_OUT_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_WRB_DRP_ADDR 0xB3C -#define STAT_NUM_WRB_DRP_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_DRP_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_STAT_DESC_OUT_ADDR 0xB40 -#define STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_STAT_DESC_OUT_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_DSC_CRDT_SENT_ADDR 0xB44 -#define STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_DSC_CRDT_SENT_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_FCH_DSC_RCVD_ADDR 0xB48 -#define STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_BYP_DSC_RCVD_ADDR 0xB4C -#define STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK GENMASK(31, 11) -#define STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK GENMASK(10, 0) -#define EQDMA_C2H_WRB_COAL_CFG_ADDR 0xB50 -#define C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define C2H_WRB_COAL_CFG_TICK_VAL_MASK GENMASK(25, 14) -#define C2H_WRB_COAL_CFG_TICK_CNT_MASK GENMASK(13, 2) -#define C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK BIT(1) -#define C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK BIT(0) -#define EQDMA_C2H_INTR_H2C_REQ_ADDR 0xB54 -#define C2H_INTR_H2C_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_MM_REQ_ADDR 0xB58 -#define C2H_INTR_C2H_MM_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_MM_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_ERR_INT_REQ_ADDR 0xB5C -#define C2H_INTR_ERR_INT_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_ERR_INT_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_REQ_ADDR 0xB60 -#define C2H_INTR_C2H_ST_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_ADDR 0xB64 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_ADDR 0xB68 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_ADDR 0xB6C -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_ADDR 0xB70 -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_MSIX_ACK_ADDR 0xB74 -#define C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_MSIX_FAIL_ADDR 0xB78 -#define C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_NO_MSIX_ADDR 0xB7C -#define C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_CTXT_INVAL_ADDR 0xB80 -#define C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_WR_CMP_ADDR 0xB84 -#define C2H_STAT_WR_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WR_CMP_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_4_ADDR 0xB88 -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_HAS_CMPT_1_MASK BIT(31) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_MARKER_1_MASK BIT(30) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_DROP_REQ_1_MASK BIT(29) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_QID_1_MASK GENMASK(28, 17) -#define C2H_STAT_DMA_ENG_4_WR_HDR_FIFO_OUT_CNT_1_MASK GENMASK(16, 12) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_1_MASK BIT(11) -#define C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_1_MASK BIT(10) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_1_MASK BIT(9) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_1_MASK BIT(8) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_1_MASK BIT(7) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_1_MASK BIT(6) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_1_MASK BIT(5) -#define C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_1_MASK BIT(4) -#define C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_1_MASK BIT(3) -#define C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_1_MASK BIT(2) -#define C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_1_MASK BIT(1) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_1_MASK BIT(0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_5_ADDR 0xB8C -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_IN_RDY_MASK BIT(31) -#define C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK BIT(30) -#define C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK GENMASK(29, 24) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK GENMASK(23, 22) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK GENMASK(21, 6) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK BIT(5) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK BIT(4) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK BIT(3) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK BIT(2) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK BIT(1) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK BIT(0) -#define EQDMA_C2H_DBG_PFCH_QID_ADDR 0xB90 -#define C2H_PFCH_QID_RSVD_1_MASK GENMASK(31, 16) -#define C2H_PFCH_QID_ERR_CTXT_MASK BIT(15) -#define C2H_PFCH_QID_TARGET_MASK GENMASK(14, 12) -#define C2H_PFCH_QID_QID_OR_TAG_MASK GENMASK(11, 0) -#define EQDMA_C2H_DBG_PFCH_ADDR 0xB94 -#define C2H_PFCH_DATA_MASK GENMASK(31, 0) -#define EQDMA_C2H_INT_DBG_ADDR 0xB98 -#define C2H_INT_RSVD_1_MASK GENMASK(31, 8) -#define C2H_INT_INT_COAL_SM_MASK GENMASK(7, 4) -#define C2H_INT_INT_SM_MASK GENMASK(3, 0) -#define EQDMA_C2H_STAT_IMM_ACCEPTED_ADDR 0xB9C -#define C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_IMM_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_MARKER_ACCEPTED_ADDR 0xBA0 -#define C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_MARKER_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_DISABLE_CMP_ACCEPTED_ADDR 0xBA4 -#define C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_PLD_FIFO_CRDT_CNT_ADDR 0xBA8 -#define C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_PLD_FIFO_CRDT_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_DYN_REQ_ADDR 0xBAC -#define C2H_INTR_DYN_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_DYN_MISC_ADDR 0xBB0 -#define C2H_INTR_DYN_MISC_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_MISC_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_LEN_MISMATCH_ADDR 0xBB4 -#define C2H_DROP_LEN_MISMATCH_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_LEN_MISMATCH_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_DESC_RSP_LEN_ADDR 0xBB8 -#define C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_DESC_RSP_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_QID_FIFO_LEN_ADDR 0xBBC -#define C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_QID_FIFO_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_PLD_CNT_ADDR 0xBC0 -#define C2H_DROP_PLD_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_CMPT_FORMAT_0_ADDR 0xBC4 -#define C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_0_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_1_ADDR 0xBC8 -#define C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_1_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_2_ADDR 0xBCC -#define C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_2_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_3_ADDR 0xBD0 -#define C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_3_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_4_ADDR 0xBD4 -#define C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_4_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_5_ADDR 0xBD8 -#define C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_5_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_6_ADDR 0xBDC -#define C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_6_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CACHE_DEPTH_ADDR 0xBE0 -#define C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK GENMASK(23, 16) -#define C2H_PFCH_CACHE_DEPTH_MASK GENMASK(7, 0) -#define EQDMA_C2H_WRB_COAL_BUF_DEPTH_ADDR 0xBE4 -#define C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK GENMASK(31, 8) -#define C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK GENMASK(7, 0) -#define EQDMA_C2H_PFCH_CRDT_ADDR 0xBE8 -#define C2H_PFCH_CRDT_RSVD_1_MASK GENMASK(31, 1) -#define C2H_PFCH_CRDT_RSVD_2_MASK BIT(0) -#define EQDMA_C2H_STAT_HAS_CMPT_ACCEPTED_ADDR 0xBEC -#define C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_HAS_PLD_ACCEPTED_ADDR 0xBF0 -#define C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_PLD_PKT_ID_ADDR 0xBF4 -#define C2H_PLD_PKT_ID_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_DATA_MASK GENMASK(15, 0) -#define EQDMA_C2H_PLD_PKT_ID_1_ADDR 0xBF8 -#define C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_1_DATA_MASK GENMASK(15, 0) -#define EQDMA_C2H_DROP_PLD_CNT_1_ADDR 0xBFC -#define C2H_DROP_PLD_CNT_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_1_CNT_MASK GENMASK(17, 0) -#define EQDMA_H2C_ERR_STAT_ADDR 0xE00 -#define H2C_ERR_STAT_RSVD_1_MASK GENMASK(31, 6) -#define H2C_ERR_STAT_PAR_ERR_MASK BIT(5) -#define H2C_ERR_STAT_SBE_MASK BIT(4) -#define H2C_ERR_STAT_DBE_MASK BIT(3) -#define H2C_ERR_STAT_NO_DMA_DS_MASK BIT(2) -#define H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK BIT(1) -#define H2C_ERR_STAT_ZERO_LEN_DS_MASK BIT(0) -#define EQDMA_H2C_ERR_MASK_ADDR 0xE04 -#define H2C_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_H2C_FIRST_ERR_QID_ADDR 0xE08 -#define H2C_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 20) -#define H2C_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(19, 16) -#define H2C_FIRST_ERR_QID_RSVD_2_MASK GENMASK(15, 13) -#define H2C_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_H2C_DBG_REG0_ADDR 0xE0C -#define H2C_REG0_NUM_DSC_RCVD_MASK GENMASK(31, 16) -#define H2C_REG0_NUM_WRB_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG1_ADDR 0xE10 -#define H2C_REG1_NUM_REQ_SENT_MASK GENMASK(31, 16) -#define H2C_REG1_NUM_CMP_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG2_ADDR 0xE14 -#define H2C_REG2_RSVD_1_MASK GENMASK(31, 16) -#define H2C_REG2_NUM_ERR_DSC_RCVD_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG3_ADDR 0xE18 -#define H2C_REG3_RSVD_1_MASK BIT(31) -#define H2C_REG3_DSCO_FIFO_EMPTY_MASK BIT(30) -#define H2C_REG3_DSCO_FIFO_FULL_MASK BIT(29) -#define H2C_REG3_CUR_RC_STATE_MASK GENMASK(28, 26) -#define H2C_REG3_RDREQ_LINES_MASK GENMASK(25, 16) -#define H2C_REG3_RDATA_LINES_AVAIL_MASK GENMASK(15, 6) -#define H2C_REG3_PEND_FIFO_EMPTY_MASK BIT(5) -#define H2C_REG3_PEND_FIFO_FULL_MASK BIT(4) -#define H2C_REG3_CUR_RQ_STATE_MASK GENMASK(3, 2) -#define H2C_REG3_DSCI_FIFO_FULL_MASK BIT(1) -#define H2C_REG3_DSCI_FIFO_EMPTY_MASK BIT(0) -#define EQDMA_H2C_DBG_REG4_ADDR 0xE1C -#define H2C_REG4_RDREQ_ADDR_MASK GENMASK(31, 0) -#define EQDMA_H2C_FATAL_ERR_EN_ADDR 0xE20 -#define H2C_FATAL_ERR_EN_RSVD_1_MASK GENMASK(31, 1) -#define H2C_FATAL_ERR_EN_H2C_MASK BIT(0) -#define EQDMA_H2C_REQ_THROT_PCIE_ADDR 0xE24 -#define H2C_REQ_THROT_PCIE_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_PCIE_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_PCIE_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_PCIE_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_H2C_ALN_DBG_REG0_ADDR 0xE28 -#define H2C_ALN_REG0_NUM_PKT_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_REQ_THROT_AXIMM_ADDR 0xE2C -#define H2C_REQ_THROT_AXIMM_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_AXIMM_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_AXIMM_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_C2H_MM_CTL_ADDR 0x1004 -#define C2H_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define C2H_MM_CTL_ERRC_EN_MASK BIT(8) -#define C2H_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define C2H_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_C2H_MM_STATUS_ADDR 0x1040 -#define C2H_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define C2H_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_C2H_MM_CMPL_DESC_CNT_ADDR 0x1048 -#define C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1054 -#define C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK BIT(31) -#define C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK BIT(30) -#define C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK BIT(29) -#define C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK BIT(28) -#define C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK GENMASK(27, 2) -#define C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK BIT(1) -#define C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(0) -#define EQDMA_C2H_MM_ERR_CODE_ADDR 0x1058 -#define C2H_MM_ERR_CODE_RESERVED1_MASK GENMASK(31, 28) -#define C2H_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define C2H_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define C2H_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define C2H_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_C2H_MM_ERR_INFO_ADDR 0x105C -#define C2H_MM_ERR_INFO_VALID_MASK BIT(31) -#define C2H_MM_ERR_INFO_SEL_MASK BIT(30) -#define C2H_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define C2H_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_C2H_MM_PERF_MON_CTL_ADDR 0x10C0 -#define C2H_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define C2H_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define C2H_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_C2H_MM_PERF_MON_CYCLE_CNT0_ADDR 0x10C4 -#define C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_PERF_MON_CYCLE_CNT1_ADDR 0x10C8 -#define C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_C2H_MM_PERF_MON_DATA_CNT0_ADDR 0x10CC -#define C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_PERF_MON_DATA_CNT1_ADDR 0x10D0 -#define C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_C2H_MM_DBG_ADDR 0x10E8 -#define C2H_MM_RSVD_1_MASK GENMASK(31, 24) -#define C2H_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define C2H_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define C2H_MM_RD_STALL_MASK BIT(6) -#define C2H_MM_RRQ_FIFO_FI_MASK BIT(5) -#define C2H_MM_WR_STALL_MASK BIT(4) -#define C2H_MM_WRQ_FIFO_FI_MASK BIT(3) -#define C2H_MM_WBK_STALL_MASK BIT(2) -#define C2H_MM_DSC_FIFO_EP_MASK BIT(1) -#define C2H_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_H2C_MM_CTL_ADDR 0x1204 -#define H2C_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define H2C_MM_CTL_ERRC_EN_MASK BIT(8) -#define H2C_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define H2C_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_H2C_MM_STATUS_ADDR 0x1240 -#define H2C_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define H2C_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_H2C_MM_CMPL_DESC_CNT_ADDR 0x1248 -#define H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1254 -#define H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK GENMASK(31, 30) -#define H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(29) -#define H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK BIT(28) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK GENMASK(27, 23) -#define H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK BIT(22) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK GENMASK(21, 17) -#define H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK BIT(16) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK GENMASK(15, 9) -#define H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK BIT(8) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK GENMASK(7, 6) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK BIT(5) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK BIT(4) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK BIT(3) -#define H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK BIT(2) -#define H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK BIT(1) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK BIT(0) -#define EQDMA_H2C_MM_ERR_CODE_ADDR 0x1258 -#define H2C_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 28) -#define H2C_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define H2C_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define H2C_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define H2C_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_H2C_MM_ERR_INFO_ADDR 0x125C -#define H2C_MM_ERR_INFO_VALID_MASK BIT(31) -#define H2C_MM_ERR_INFO_SEL_MASK BIT(30) -#define H2C_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define H2C_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_H2C_MM_PERF_MON_CTL_ADDR 0x12C0 -#define H2C_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define H2C_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define H2C_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_H2C_MM_PERF_MON_CYCLE_CNT0_ADDR 0x12C4 -#define H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_PERF_MON_CYCLE_CNT1_ADDR 0x12C8 -#define H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_H2C_MM_PERF_MON_DATA_CNT0_ADDR 0x12CC -#define H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_PERF_MON_DATA_CNT1_ADDR 0x12D0 -#define H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_H2C_MM_DBG_ADDR 0x12E8 -#define H2C_MM_RSVD_1_MASK GENMASK(31, 24) -#define H2C_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define H2C_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define H2C_MM_RD_STALL_MASK BIT(6) -#define H2C_MM_RRQ_FIFO_FI_MASK BIT(5) -#define H2C_MM_WR_STALL_MASK BIT(4) -#define H2C_MM_WRQ_FIFO_FI_MASK BIT(3) -#define H2C_MM_WBK_STALL_MASK BIT(2) -#define H2C_MM_DSC_FIFO_EP_MASK BIT(1) -#define H2C_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_H2C_MM_DATA_THROTTLE_ADDR 0x12EC -#define H2C_MM_DATA_THROTTLE_RSVD_1_MASK GENMASK(31, 17) -#define H2C_MM_DATA_THROTTLE_DAT_EN_MASK BIT(16) -#define H2C_MM_DATA_THROTTLE_DAT_MASK GENMASK(15, 0) -#define EQDMA_C2H_CRDT_COAL_CFG_1_ADDR 0x1400 -#define C2H_CRDT_COAL_CFG_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK GENMASK(17, 10) -#define C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK GENMASK(9, 0) -#define EQDMA_C2H_CRDT_COAL_CFG_2_ADDR 0x1404 -#define C2H_CRDT_COAL_CFG_2_RSVD_1_MASK GENMASK(31, 24) -#define C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK GENMASK(23, 16) -#define C2H_CRDT_COAL_CFG_2_RESERVED1_MASK GENMASK(15, 11) -#define C2H_CRDT_COAL_CFG_2_NT_TH_MASK GENMASK(10, 0) -#define EQDMA_C2H_PFCH_BYP_QID_ADDR 0x1408 -#define C2H_PFCH_BYP_QID_RSVD_1_MASK GENMASK(31, 12) -#define C2H_PFCH_BYP_QID_MASK GENMASK(11, 0) -#define EQDMA_C2H_PFCH_BYP_TAG_ADDR 0x140C -#define C2H_PFCH_BYP_TAG_RSVD_1_MASK GENMASK(31, 20) -#define C2H_PFCH_BYP_TAG_BYP_QID_MASK GENMASK(19, 8) -#define C2H_PFCH_BYP_TAG_RSVD_2_MASK BIT(7) -#define C2H_PFCH_BYP_TAG_MASK GENMASK(6, 0) -#define EQDMA_C2H_WATER_MARK_ADDR 0x1410 -#define C2H_WATER_MARK_HIGH_WM_MASK GENMASK(31, 16) -#define C2H_WATER_MARK_LOW_WM_MASK GENMASK(15, 0) -#define EQDMA_C2H_NOTIFY_EMPTY_ADDR 0x1450 -#define C2H_NOTIFY_EMPTY_RSVD_1_MASK GENMASK(31, 16) -#define C2H_NOTIFY_EMPTY_NOE_MASK GENMASK(15, 0) -#define EQDMA_C2H_STAT_S_AXIS_C2H_ACCEPTED_1_ADDR 0x1454 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_1_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_1_ADDR 0x1458 -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_1_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_ADDR 0x145C -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_AXIS_PKG_CMP_1_ADDR 0x1460 -#define C2H_STAT_AXIS_PKG_CMP_1_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_2_ADDR 0x1464 -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_2_MASK GENMASK(31, 0) -#define EQDMA_C2H_ST_PLD_FIFO_DEPTH_ADDR 0x1468 -#define C2H_ST_PLD_FIFO_DEPTH_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_6_ADDR 0x146C -#define C2H_STAT_DMA_ENG_6_RSVD_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_6_PLD_ST_FIFO_OUT_DATA_QID_MASK GENMASK(28, 17) -#define C2H_STAT_DMA_ENG_6_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_MASK \ - GENMASK(16, 1) -#define C2H_STAT_DMA_ENG_6_PLD_PKT_ID_LARGER_PLD_ST_MASK BIT(0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_7_ADDR 0x1470 -#define C2H_STAT_DMA_ENG_7_RSVD_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_7_PLD_ST_FIFO_OUT_DATA_QID_1_MASK GENMASK(28, 17) -#define C2H_STAT_DMA_ENG_7_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_1_MASK \ - GENMASK(16, 1) -#define C2H_STAT_DMA_ENG_7_PLD_PKT_ID_LARGER_PLD_ST_1_MASK BIT(0) -#define EQDMA_C2H_STAT_PCIE_CMP_1_ADDR 0x1474 -#define C2H_STAT_PCIE_CMP_1_DEPTH_MASK GENMASK(31, 0) -#define EQDMA_C2H_PLD_FIFO_ALMOST_FULL_ADDR 0x1478 -#define C2H_PLD_FIFO_ALMOST_FULL_ENABLE_MASK BIT(31) -#define C2H_PLD_FIFO_ALMOST_FULL_TH_MASK GENMASK(30, 0) -#define EQDMA_PFCH_CFG_3_ADDR 0x147C -#define PFCH_CFG_3_RSVD_MASK GENMASK(31, 16) -#define PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_MASK GENMASK(15, 7) -#define PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_MASK GENMASK(6, 0) -#define EQDMA_CMPT_CFG_0_ADDR 0x1480 -#define CMPT_CFG_0_RSVD_MASK GENMASK(31, 2) -#define CMPT_CFG_0_VIO_SPRS_INT_AFTER_RTY_MASK BIT(1) -#define CMPT_CFG_0_VIO_EVNT_SUP_EN_MASK BIT(0) -#define EQDMA_PFCH_CFG_4_ADDR 0x1484 -#define PFCH_CFG_4_GLB_EVT_TIMER_TICK_MASK GENMASK(31, 17) -#define PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_MASK BIT(16) -#define PFCH_CFG_4_EVT_TIMER_TICK_MASK GENMASK(15, 1) -#define PFCH_CFG_4_DISABLE_EVT_TIMER_MASK BIT(0) -#define SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK GENMASK(31, 11) -#define SW_IND_CTXT_DATA_W5_PASID_EN_MASK BIT(10) -#define SW_IND_CTXT_DATA_W5_PASID_H_MASK GENMASK(9, 0) -#define SW_IND_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 20) -#define SW_IND_CTXT_DATA_W4_HOST_ID_MASK GENMASK(19, 16) -#define SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK BIT(15) -#define SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK BIT(14) -#define SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK BIT(13) -#define SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(12) -#define SW_IND_CTXT_DATA_W4_INT_AGGR_MASK BIT(11) -#define SW_IND_CTXT_DATA_W4_VEC_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W3_DSC_BASE_H_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W2_DSC_BASE_L_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W1_IS_MM_MASK BIT(31) -#define SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK BIT(30) -#define SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK BIT(29) -#define SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK BIT(28) -#define SW_IND_CTXT_DATA_W1_ERR_MASK GENMASK(27, 26) -#define SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK BIT(25) -#define SW_IND_CTXT_DATA_W1_PORT_ID_MASK GENMASK(24, 22) -#define SW_IND_CTXT_DATA_W1_IRQ_EN_MASK BIT(21) -#define SW_IND_CTXT_DATA_W1_WBK_EN_MASK BIT(20) -#define SW_IND_CTXT_DATA_W1_MM_CHN_MASK BIT(19) -#define SW_IND_CTXT_DATA_W1_BYPASS_MASK BIT(18) -#define SW_IND_CTXT_DATA_W1_DSC_SZ_MASK GENMASK(17, 16) -#define SW_IND_CTXT_DATA_W1_RNG_SZ_MASK GENMASK(15, 12) -#define SW_IND_CTXT_DATA_W1_RSVD_1_MASK GENMASK(11, 9) -#define SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK GENMASK(8, 5) -#define SW_IND_CTXT_DATA_W1_AT_MASK BIT(4) -#define SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK BIT(3) -#define SW_IND_CTXT_DATA_W1_WBI_CHK_MASK BIT(2) -#define SW_IND_CTXT_DATA_W1_FCRD_EN_MASK BIT(1) -#define SW_IND_CTXT_DATA_W1_QEN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W0_RSV_MASK GENMASK(31, 29) -#define SW_IND_CTXT_DATA_W0_FNC_MASK GENMASK(28, 17) -#define SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK BIT(16) -#define SW_IND_CTXT_DATA_W0_PIDX_MASK GENMASK(15, 0) -#define HW_IND_CTXT_DATA_W1_RSVD_1_MASK BIT(15) -#define HW_IND_CTXT_DATA_W1_FETCH_PND_MASK GENMASK(14, 11) -#define HW_IND_CTXT_DATA_W1_EVT_PND_MASK BIT(10) -#define HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK BIT(9) -#define HW_IND_CTXT_DATA_W1_DSC_PND_MASK BIT(8) -#define HW_IND_CTXT_DATA_W1_RSVD_2_MASK GENMASK(7, 0) -#define HW_IND_CTXT_DATA_W0_CRD_USE_MASK GENMASK(31, 16) -#define HW_IND_CTXT_DATA_W0_CIDX_MASK GENMASK(15, 0) -#define CRED_CTXT_DATA_W0_RSVD_1_MASK GENMASK(31, 16) -#define CRED_CTXT_DATA_W0_CREDT_MASK GENMASK(15, 0) -#define PREFETCH_CTXT_DATA_W1_VALID_MASK BIT(13) -#define PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define PREFETCH_CTXT_DATA_W0_PFCH_MASK BIT(28) -#define PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK BIT(27) -#define PREFETCH_CTXT_DATA_W0_ERR_MASK BIT(26) -#define PREFETCH_CTXT_DATA_W0_RSVD_MASK GENMASK(25, 22) -#define PREFETCH_CTXT_DATA_W0_PFCH_NEED_MASK GENMASK(21, 16) -#define PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK GENMASK(15, 10) -#define PREFETCH_CTXT_DATA_W0_VIRTIO_MASK BIT(9) -#define PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK BIT(8) -#define PREFETCH_CTXT_DATA_W0_PORT_ID_MASK GENMASK(7, 5) -#define PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK GENMASK(4, 1) -#define PREFETCH_CTXT_DATA_W0_BYPASS_MASK BIT(0) -#define CMPL_CTXT_DATA_W6_RSVD_1_H_MASK GENMASK(7, 0) -#define CMPL_CTXT_DATA_W5_RSVD_1_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W5_PORT_ID_MASK GENMASK(22, 20) -#define CMPL_CTXT_DATA_W5_SH_CMPT_MASK BIT(19) -#define CMPL_CTXT_DATA_W5_VIO_EOP_MASK BIT(18) -#define CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK GENMASK(17, 14) -#define CMPL_CTXT_DATA_W5_PASID_EN_MASK BIT(13) -#define CMPL_CTXT_DATA_W5_PASID_H_MASK GENMASK(12, 0) -#define CMPL_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W4_HOST_ID_MASK GENMASK(22, 19) -#define CMPL_CTXT_DATA_W4_DIR_C2H_MASK BIT(18) -#define CMPL_CTXT_DATA_W4_VIO_MASK BIT(17) -#define CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(16) -#define CMPL_CTXT_DATA_W4_INT_AGGR_MASK BIT(15) -#define CMPL_CTXT_DATA_W4_VEC_MASK GENMASK(14, 4) -#define CMPL_CTXT_DATA_W4_AT_MASK BIT(3) -#define CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK BIT(2) -#define CMPL_CTXT_DATA_W4_FULL_UPD_MASK BIT(1) -#define CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK BIT(0) -#define CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK BIT(31) -#define CMPL_CTXT_DATA_W3_ERR_MASK GENMASK(30, 29) -#define CMPL_CTXT_DATA_W3_VALID_MASK BIT(28) -#define CMPL_CTXT_DATA_W3_CIDX_MASK GENMASK(27, 12) -#define CMPL_CTXT_DATA_W3_PIDX_H_MASK GENMASK(11, 0) -#define CMPL_CTXT_DATA_W2_PIDX_L_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W2_DESC_SIZE_MASK GENMASK(27, 26) -#define CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK GENMASK(25, 0) -#define CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK GENMASK(31, 0) -#define CMPL_CTXT_DATA_W0_QSIZE_IX_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W0_COLOR_MASK BIT(27) -#define CMPL_CTXT_DATA_W0_INT_ST_MASK GENMASK(26, 25) -#define CMPL_CTXT_DATA_W0_TIMER_IX_MASK GENMASK(24, 21) -#define CMPL_CTXT_DATA_W0_CNTER_IX_MASK GENMASK(20, 17) -#define CMPL_CTXT_DATA_W0_FNC_ID_MASK GENMASK(16, 5) -#define CMPL_CTXT_DATA_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define CMPL_CTXT_DATA_W0_EN_INT_MASK BIT(1) -#define CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK BIT(0) -#define INTR_CTXT_DATA_W3_FUNC_MASK GENMASK(29, 18) -#define INTR_CTXT_DATA_W3_RSVD_MASK GENMASK(17, 14) -#define INTR_CTXT_DATA_W3_PASID_EN_MASK BIT(13) -#define INTR_CTXT_DATA_W3_PASID_H_MASK GENMASK(12, 0) -#define INTR_CTXT_DATA_W2_PASID_L_MASK GENMASK(31, 23) -#define INTR_CTXT_DATA_W2_HOST_ID_MASK GENMASK(22, 19) -#define INTR_CTXT_DATA_W2_AT_MASK BIT(18) -#define INTR_CTXT_DATA_W2_PIDX_MASK GENMASK(17, 6) -#define INTR_CTXT_DATA_W2_PAGE_SIZE_MASK GENMASK(5, 3) -#define INTR_CTXT_DATA_W2_BADDR_4K_H_MASK GENMASK(2, 0) -#define INTR_CTXT_DATA_W1_BADDR_4K_M_MASK GENMASK(31, 0) -#define INTR_CTXT_DATA_W0_BADDR_4K_L_MASK GENMASK(31, 15) -#define INTR_CTXT_DATA_W0_COLOR_MASK BIT(14) -#define INTR_CTXT_DATA_W0_INT_ST_MASK BIT(13) -#define INTR_CTXT_DATA_W0_RSVD1_MASK BIT(12) -#define INTR_CTXT_DATA_W0_VEC_MASK GENMASK(11, 1) -#define INTR_CTXT_DATA_W0_VALID_MASK BIT(0) -#define HOSTID_TABLE_W6_SMID_MASK GENMASK(9, 0) -#define HOSTID_TABLE_W5_H2C_MM_AWPROT_MASK GENMASK(27, 26) -#define HOSTID_TABLE_W5_H2C_MM_AWCACHE_MASK GENMASK(25, 22) -#define HOSTID_TABLE_W5_H2C_MM_AWSTEERING_MASK GENMASK(20, 18) -#define HOSTID_TABLE_W5_DSC_AWPROT_MASK GENMASK(17, 16) -#define HOSTID_TABLE_W5_DSC_AWCACHE_MASK GENMASK(15, 12) -#define HOSTID_TABLE_W5_DSC_AWSTEERING_MASK GENMASK(11, 8) -#define HOSTID_TABLE_W5_INT_MSG_AWPROT_MASK GENMASK(7, 6) -#define HOSTID_TABLE_W5_INT_MSG_AWCACHE_MASK GENMASK(5, 2) -#define HOSTID_TABLE_W5_INT_MSG_AWSTEERING_H_MASK GENMASK(0, 0) -#define HOSTID_TABLE_W4_INT_MSG_AWSTEERING_L_MASK GENMASK(31, 30) -#define HOSTID_TABLE_W4_INT_AGGR_AWPROT_MASK GENMASK(29, 28) -#define HOSTID_TABLE_W4_INT_AGGR_AWCACHE_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W4_INT_AGGR_AWSTEERING_MASK GENMASK(22, 20) -#define HOSTID_TABLE_W4_CMPT_AWPROT_MASK GENMASK(19, 18) -#define HOSTID_TABLE_W4_CMPT_AWCACHE_MASK GENMASK(17, 14) -#define HOSTID_TABLE_W4_CMPT_AWSTEERING_MASK GENMASK(12, 10) -#define HOSTID_TABLE_W4_C2H_PLD_AWPROT_MASK GENMASK(9, 8) -#define HOSTID_TABLE_W4_C2H_PLD_AWCACHE_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W4_C2H_PLD_AWSTEERING_MASK GENMASK(2, 0) -#define HOSTID_TABLE_W3_C2H_MM_ARPROT_MASK GENMASK(7, 6) -#define HOSTID_TABLE_W3_C2H_MM_ARCACHE_MASK GENMASK(5, 2) -#define HOSTID_TABLE_W3_C2H_MM_ARSTEERING_H_MASK GENMASK(0, 0) -#define HOSTID_TABLE_W2_C2H_MM_ARSTEERING_L_MASK GENMASK(31, 30) -#define HOSTID_TABLE_W2_H2C_MM_ARPROT_MASK GENMASK(29, 28) -#define HOSTID_TABLE_W2_H2C_MM_ARCACHE_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W2_H2C_MM_ARSTEERING_MASK GENMASK(22, 20) -#define HOSTID_TABLE_W2_H2C_ST_ARPROT_MASK GENMASK(19, 18) -#define HOSTID_TABLE_W2_H2C_ST_ARCACHE_MASK GENMASK(17, 14) -#define HOSTID_TABLE_W2_H2C_ST_ARSTEERING_MASK GENMASK(12, 10) -#define HOSTID_TABLE_W2_DSC_ARPOT_MASK GENMASK(9, 8) -#define HOSTID_TABLE_W2_DSC_ARCACHE_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W2_DSC_ARSTEERING_MASK GENMASK(2, 0) -#define HOSTID_TABLE_W0_VCH_H2C_MM_MASK GENMASK(27, 24) -#define HOSTID_TABLE_W0_VCH_H2C_ST_MASK GENMASK(23, 20) -#define HOSTID_TABLE_W0_VCH_DSC_MASK GENMASK(19, 16) -#define HOSTID_TABLE_W0_VCH_INT_MSG_MASK GENMASK(15, 12) -#define HOSTID_TABLE_W0_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define HOSTID_TABLE_W0_VCH_CMPT_MASK GENMASK(7, 4) -#define HOSTID_TABLE_W0_VCH_H2C_PLD_MASK GENMASK(3, 0) -#define CTXT_SELC_FNC_STS_W0_MSIX_MASK GENMASK(3, 3) -#define CTXT_SELC_FNC_STS_W0_MSIX_ENABLE_MASK GENMASK(2, 2) -#define CTXT_SELC_FNC_STS_W0_MEM_SPACE_ENABLE_MASK GENMASK(1, 1) -#define CTXT_SELC_FNC_STS_W0_BUS_MASTER_ENABLE_MASK GENMASK(0, 0) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c deleted file mode 100755 index 8754fb7..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c +++ /dev/null @@ -1,5322 +0,0 @@ -/* - * Copyright (c) 2019-2022 Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "eqdma_soft_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_soft_reg_dump.tmh" -#endif - - -static struct regfield_info - cfg_blk_identifier_field_info[] = { - {"CFG_BLK_IDENTIFIER", - CFG_BLK_IDENTIFIER_MASK}, - {"CFG_BLK_IDENTIFIER_1", - CFG_BLK_IDENTIFIER_1_MASK}, - {"CFG_BLK_IDENTIFIER_RSVD_1", - CFG_BLK_IDENTIFIER_RSVD_1_MASK}, - {"CFG_BLK_IDENTIFIER_VERSION", - CFG_BLK_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_pld_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_PROG", - CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_read_req_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_system_id_field_info[] = { - {"CFG_BLK_SYSTEM_ID_RSVD_1", - CFG_BLK_SYSTEM_ID_RSVD_1_MASK}, - {"CFG_BLK_SYSTEM_ID_INST_TYPE", - CFG_BLK_SYSTEM_ID_INST_TYPE_MASK}, - {"CFG_BLK_SYSTEM_ID", - CFG_BLK_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - cfg_blk_msix_enable_field_info[] = { - {"CFG_BLK_MSIX_ENABLE", - CFG_BLK_MSIX_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_pcie_data_width_field_info[] = { - {"CFG_PCIE_DATA_WIDTH_RSVD_1", - CFG_PCIE_DATA_WIDTH_RSVD_1_MASK}, - {"CFG_PCIE_DATA_WIDTH_DATAPATH", - CFG_PCIE_DATA_WIDTH_DATAPATH_MASK}, -}; - - -static struct regfield_info - cfg_pcie_ctl_field_info[] = { - {"CFG_PCIE_CTL_RSVD_1", - CFG_PCIE_CTL_RSVD_1_MASK}, - {"CFG_PCIE_CTL_MGMT_AXIL_CTRL", - CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK}, - {"CFG_PCIE_CTL_RSVD_2", - CFG_PCIE_CTL_RSVD_2_MASK}, - {"CFG_PCIE_CTL_RRQ_DISABLE", - CFG_PCIE_CTL_RRQ_DISABLE_MASK}, - {"CFG_PCIE_CTL_RELAXED_ORDERING", - CFG_PCIE_CTL_RELAXED_ORDERING_MASK}, -}; - - -static struct regfield_info - cfg_blk_msi_enable_field_info[] = { - {"CFG_BLK_MSI_ENABLE", - CFG_BLK_MSI_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_pld_size_field_info[] = { - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_ISSUED", - CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_PROG", - CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_read_req_size_field_info[] = { - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK}, -}; - - -static struct regfield_info - cfg_blk_misc_ctl_field_info[] = { - {"CFG_BLK_MISC_CTL_RSVD_1", - CFG_BLK_MISC_CTL_RSVD_1_MASK}, - {"CFG_BLK_MISC_CTL_10B_TAG_EN", - CFG_BLK_MISC_CTL_10B_TAG_EN_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_2", - CFG_BLK_MISC_CTL_RSVD_2_MASK}, - {"CFG_BLK_MISC_CTL_AXI_WBK", - CFG_BLK_MISC_CTL_AXI_WBK_MASK}, - {"CFG_BLK_MISC_CTL_AXI_DSC", - CFG_BLK_MISC_CTL_AXI_DSC_MASK}, - {"CFG_BLK_MISC_CTL_NUM_TAG", - CFG_BLK_MISC_CTL_NUM_TAG_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_3", - CFG_BLK_MISC_CTL_RSVD_3_MASK}, - {"CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER", - CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK}, -}; - - -static struct regfield_info - cfg_pl_cred_ctl_field_info[] = { - {"CFG_PL_CRED_CTL_RSVD_1", - CFG_PL_CRED_CTL_RSVD_1_MASK}, - {"CFG_PL_CRED_CTL_SLAVE_CRD_RLS", - CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK}, - {"CFG_PL_CRED_CTL_RSVD_2", - CFG_PL_CRED_CTL_RSVD_2_MASK}, - {"CFG_PL_CRED_CTL_MASTER_CRD_RST", - CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_field_info[] = { - {"CFG_BLK_SCRATCH", - CFG_BLK_SCRATCH_MASK}, -}; - - -static struct regfield_info - cfg_gic_field_info[] = { - {"CFG_GIC_RSVD_1", - CFG_GIC_RSVD_1_MASK}, - {"CFG_GIC_GIC_IRQ", - CFG_GIC_GIC_IRQ_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_1_a_field_info[] = { - {"RAM_SBE_MSK_1_A", - RAM_SBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_1_a_field_info[] = { - {"RAM_SBE_STS_1_A_RSVD", - RAM_SBE_STS_1_A_RSVD_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_SBE_STS_1_A_TAG_EVEN_RAM", - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_SBE_STS_1_A_TAG_ODD_RAM", - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_1_a_field_info[] = { - {"RAM_DBE_MSK_1_A", - RAM_DBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_1_a_field_info[] = { - {"RAM_DBE_STS_1_A_RSVD", - RAM_DBE_STS_1_A_RSVD_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_DBE_STS_1_A_TAG_EVEN_RAM", - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_DBE_STS_1_A_TAG_ODD_RAM", - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_a_field_info[] = { - {"RAM_SBE_MSK_A", - RAM_SBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_a_field_info[] = { - {"RAM_SBE_STS_A_RC_RRQ_ODD_RAM", - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_SBE_STS_A_PEND_FIFO_RAM", - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_LL_RAM", - RAM_SBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_CTXT_RAM", - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_CTXT_RAM", - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_INT_CTXT_RAM", - RAM_SBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_COAL_DATA_RAM", - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_SBE_STS_A_QID_FIFO_RAM", - RAM_SBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_TIMER_FIFO_RAM", - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_DSC_CPLD", - RAM_SBE_STS_A_DSC_CPLD_MASK}, - {"RAM_SBE_STS_A_DSC_CPLI", - RAM_SBE_STS_A_DSC_CPLI_MASK}, - {"RAM_SBE_STS_A_DSC_SW_CTXT", - RAM_SBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_SBE_STS_A_DSC_CRD_RCV", - RAM_SBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_SBE_STS_A_DSC_HW_CTXT", - RAM_SBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_SBE_STS_A_FUNC_MAP", - RAM_SBE_STS_A_FUNC_MAP_MASK}, - {"RAM_SBE_STS_A_C2H_WR_BRG_DAT", - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_C2H_RD_BRG_DAT", - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_WR_BRG_DAT", - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_RD_BRG_DAT", - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H3_DAT", - RAM_SBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H2_DAT", - RAM_SBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H1_DAT", - RAM_SBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H0_DAT", - RAM_SBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C3_DAT", - RAM_SBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C2_DAT", - RAM_SBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C1_DAT", - RAM_SBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C0_DAT", - RAM_SBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_a_field_info[] = { - {"RAM_DBE_MSK_A", - RAM_DBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_a_field_info[] = { - {"RAM_DBE_STS_A_RC_RRQ_ODD_RAM", - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_DBE_STS_A_PEND_FIFO_RAM", - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_LL_RAM", - RAM_DBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_CTXT_RAM", - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_CTXT_RAM", - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_INT_CTXT_RAM", - RAM_DBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_COAL_DATA_RAM", - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_DBE_STS_A_QID_FIFO_RAM", - RAM_DBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_TIMER_FIFO_RAM", - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_DSC_CPLD", - RAM_DBE_STS_A_DSC_CPLD_MASK}, - {"RAM_DBE_STS_A_DSC_CPLI", - RAM_DBE_STS_A_DSC_CPLI_MASK}, - {"RAM_DBE_STS_A_DSC_SW_CTXT", - RAM_DBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_DBE_STS_A_DSC_CRD_RCV", - RAM_DBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_DBE_STS_A_DSC_HW_CTXT", - RAM_DBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_DBE_STS_A_FUNC_MAP", - RAM_DBE_STS_A_FUNC_MAP_MASK}, - {"RAM_DBE_STS_A_C2H_WR_BRG_DAT", - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_C2H_RD_BRG_DAT", - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_WR_BRG_DAT", - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_RD_BRG_DAT", - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H3_DAT", - RAM_DBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H2_DAT", - RAM_DBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H1_DAT", - RAM_DBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H0_DAT", - RAM_DBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C3_DAT", - RAM_DBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C2_DAT", - RAM_DBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C1_DAT", - RAM_DBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C0_DAT", - RAM_DBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_identifier_field_info[] = { - {"GLBL2_IDENTIFIER", - GLBL2_IDENTIFIER_MASK}, - {"GLBL2_IDENTIFIER_VERSION", - GLBL2_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - glbl2_channel_inst_field_info[] = { - {"GLBL2_CHANNEL_INST_RSVD_1", - GLBL2_CHANNEL_INST_RSVD_1_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ST", - GLBL2_CHANNEL_INST_C2H_ST_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ST", - GLBL2_CHANNEL_INST_H2C_ST_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_2", - GLBL2_CHANNEL_INST_RSVD_2_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ENG", - GLBL2_CHANNEL_INST_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_3", - GLBL2_CHANNEL_INST_RSVD_3_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ENG", - GLBL2_CHANNEL_INST_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_mdma_field_info[] = { - {"GLBL2_CHANNEL_MDMA_RSVD_1", - GLBL2_CHANNEL_MDMA_RSVD_1_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ST", - GLBL2_CHANNEL_MDMA_C2H_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ST", - GLBL2_CHANNEL_MDMA_H2C_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_2", - GLBL2_CHANNEL_MDMA_RSVD_2_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ENG", - GLBL2_CHANNEL_MDMA_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_3", - GLBL2_CHANNEL_MDMA_RSVD_3_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ENG", - GLBL2_CHANNEL_MDMA_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_strm_field_info[] = { - {"GLBL2_CHANNEL_STRM_RSVD_1", - GLBL2_CHANNEL_STRM_RSVD_1_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ST", - GLBL2_CHANNEL_STRM_C2H_ST_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ST", - GLBL2_CHANNEL_STRM_H2C_ST_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_2", - GLBL2_CHANNEL_STRM_RSVD_2_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ENG", - GLBL2_CHANNEL_STRM_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_3", - GLBL2_CHANNEL_STRM_RSVD_3_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ENG", - GLBL2_CHANNEL_STRM_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_cap_field_info[] = { - {"GLBL2_CHANNEL_CAP_RSVD_1", - GLBL2_CHANNEL_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_CAP_MULTIQ_MAX", - GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK}, -}; - - -static struct regfield_info - glbl2_channel_pasid_cap_field_info[] = { - {"GLBL2_CHANNEL_PASID_CAP_RSVD_1", - GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEEN", - GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_DMAEN", - GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK}, -}; - - -static struct regfield_info - glbl2_system_id_field_info[] = { - {"GLBL2_SYSTEM_ID_RSVD_1", - GLBL2_SYSTEM_ID_RSVD_1_MASK}, - {"GLBL2_SYSTEM_ID", - GLBL2_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - glbl2_misc_cap_field_info[] = { - {"GLBL2_MISC_CAP", - GLBL2_MISC_CAP_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_brg_throt_field_info[] = { - {"GLBL2_RRQ_BRG_THROT_REQ_EN", - GLBL2_RRQ_BRG_THROT_REQ_EN_MASK}, - {"GLBL2_RRQ_BRG_THROT_REQ", - GLBL2_RRQ_BRG_THROT_REQ_MASK}, - {"GLBL2_RRQ_BRG_THROT_DAT_EN", - GLBL2_RRQ_BRG_THROT_DAT_EN_MASK}, - {"GLBL2_RRQ_BRG_THROT_DAT", - GLBL2_RRQ_BRG_THROT_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_pcie_throt_field_info[] = { - {"GLBL2_RRQ_PCIE_THROT_REQ_EN", - GLBL2_RRQ_PCIE_THROT_REQ_EN_MASK}, - {"GLBL2_RRQ_PCIE_THROT_REQ", - GLBL2_RRQ_PCIE_THROT_REQ_MASK}, - {"GLBL2_RRQ_PCIE_THROT_DAT_EN", - GLBL2_RRQ_PCIE_THROT_DAT_EN_MASK}, - {"GLBL2_RRQ_PCIE_THROT_DAT", - GLBL2_RRQ_PCIE_THROT_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_aximm_throt_field_info[] = { - {"GLBL2_RRQ_AXIMM_THROT_REQ_EN", - GLBL2_RRQ_AXIMM_THROT_REQ_EN_MASK}, - {"GLBL2_RRQ_AXIMM_THROT_REQ", - GLBL2_RRQ_AXIMM_THROT_REQ_MASK}, - {"GLBL2_RRQ_AXIMM_THROT_DAT_EN", - GLBL2_RRQ_AXIMM_THROT_DAT_EN_MASK}, - {"GLBL2_RRQ_AXIMM_THROT_DAT", - GLBL2_RRQ_AXIMM_THROT_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_pcie_lat0_field_info[] = { - {"GLBL2_RRQ_PCIE_LAT0_MAX", - GLBL2_RRQ_PCIE_LAT0_MAX_MASK}, - {"GLBL2_RRQ_PCIE_LAT0_MIN", - GLBL2_RRQ_PCIE_LAT0_MIN_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_pcie_lat1_field_info[] = { - {"GLBL2_RRQ_PCIE_LAT1_RSVD", - GLBL2_RRQ_PCIE_LAT1_RSVD_MASK}, - {"GLBL2_RRQ_PCIE_LAT1_OVFL", - GLBL2_RRQ_PCIE_LAT1_OVFL_MASK}, - {"GLBL2_RRQ_PCIE_LAT1_AVG", - GLBL2_RRQ_PCIE_LAT1_AVG_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_aximm_lat0_field_info[] = { - {"GLBL2_RRQ_AXIMM_LAT0_MAX", - GLBL2_RRQ_AXIMM_LAT0_MAX_MASK}, - {"GLBL2_RRQ_AXIMM_LAT0_MIN", - GLBL2_RRQ_AXIMM_LAT0_MIN_MASK}, -}; - - -static struct regfield_info - glbl2_rrq_aximm_lat1_field_info[] = { - {"GLBL2_RRQ_AXIMM_LAT1_RSVD", - GLBL2_RRQ_AXIMM_LAT1_RSVD_MASK}, - {"GLBL2_RRQ_AXIMM_LAT1_OVFL", - GLBL2_RRQ_AXIMM_LAT1_OVFL_MASK}, - {"GLBL2_RRQ_AXIMM_LAT1_AVG", - GLBL2_RRQ_AXIMM_LAT1_AVG_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq0_field_info[] = { - {"GLBL2_PCIE_RQ0_NPH_AVL", - GLBL2_PCIE_RQ0_NPH_AVL_MASK}, - {"GLBL2_PCIE_RQ0_RCB_AVL", - GLBL2_PCIE_RQ0_RCB_AVL_MASK}, - {"GLBL2_PCIE_RQ0_SLV_RD_CREDS", - GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK}, - {"GLBL2_PCIE_RQ0_TAG_EP", - GLBL2_PCIE_RQ0_TAG_EP_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq1_field_info[] = { - {"GLBL2_PCIE_RQ1_RSVD_1", - GLBL2_PCIE_RQ1_RSVD_1_MASK}, - {"GLBL2_PCIE_RQ1_TAG_FL", - GLBL2_PCIE_RQ1_TAG_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_EP", - GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_FL", - GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM", - GLBL2_PCIE_RQ1_TLPSM_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM512", - GLBL2_PCIE_RQ1_TLPSM512_MASK}, - {"GLBL2_PCIE_RQ1_RREQ_RCB_OK", - GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_SLV", - GLBL2_PCIE_RQ1_RREQ0_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_VLD", - GLBL2_PCIE_RQ1_RREQ0_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_RDY", - GLBL2_PCIE_RQ1_RREQ0_RDY_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_SLV", - GLBL2_PCIE_RQ1_RREQ1_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_VLD", - GLBL2_PCIE_RQ1_RREQ1_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_RDY", - GLBL2_PCIE_RQ1_RREQ1_RDY_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_REQ", - GLBL2_PCIE_RQ1_WTLP_REQ_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_STRADDLE", - GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr0_field_info[] = { - {"GLBL2_AXIMM_WR0_RSVD_1", - GLBL2_AXIMM_WR0_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR0_WR_REQ", - GLBL2_AXIMM_WR0_WR_REQ_MASK}, - {"GLBL2_AXIMM_WR0_WR_CHN", - GLBL2_AXIMM_WR0_WR_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP", - GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_WPL_FIFO_EP", - GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN", - GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WRREQ_CNT", - GLBL2_AXIMM_WR0_WRREQ_CNT_MASK}, - {"GLBL2_AXIMM_WR0_BID", - GLBL2_AXIMM_WR0_BID_MASK}, - {"GLBL2_AXIMM_WR0_BVALID", - GLBL2_AXIMM_WR0_BVALID_MASK}, - {"GLBL2_AXIMM_WR0_BREADY", - GLBL2_AXIMM_WR0_BREADY_MASK}, - {"GLBL2_AXIMM_WR0_WVALID", - GLBL2_AXIMM_WR0_WVALID_MASK}, - {"GLBL2_AXIMM_WR0_WREADY", - GLBL2_AXIMM_WR0_WREADY_MASK}, - {"GLBL2_AXIMM_WR0_AWID", - GLBL2_AXIMM_WR0_AWID_MASK}, - {"GLBL2_AXIMM_WR0_AWVALID", - GLBL2_AXIMM_WR0_AWVALID_MASK}, - {"GLBL2_AXIMM_WR0_AWREADY", - GLBL2_AXIMM_WR0_AWREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr1_field_info[] = { - {"GLBL2_AXIMM_WR1_RSVD_1", - GLBL2_AXIMM_WR1_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT4", - GLBL2_AXIMM_WR1_BRSP_CNT4_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT3", - GLBL2_AXIMM_WR1_BRSP_CNT3_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT2", - GLBL2_AXIMM_WR1_BRSP_CNT2_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT1", - GLBL2_AXIMM_WR1_BRSP_CNT1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT0", - GLBL2_AXIMM_WR1_BRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd0_field_info[] = { - {"GLBL2_AXIMM_RD0_RSVD_1", - GLBL2_AXIMM_RD0_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD0_PND_CNT", - GLBL2_AXIMM_RD0_PND_CNT_MASK}, - {"GLBL2_AXIMM_RD0_RD_REQ", - GLBL2_AXIMM_RD0_RD_REQ_MASK}, - {"GLBL2_AXIMM_RD0_RD_CHNL", - GLBL2_AXIMM_RD0_RD_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL", - GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RID", - GLBL2_AXIMM_RD0_RID_MASK}, - {"GLBL2_AXIMM_RD0_RVALID", - GLBL2_AXIMM_RD0_RVALID_MASK}, - {"GLBL2_AXIMM_RD0_RREADY", - GLBL2_AXIMM_RD0_RREADY_MASK}, - {"GLBL2_AXIMM_RD0_ARID", - GLBL2_AXIMM_RD0_ARID_MASK}, - {"GLBL2_AXIMM_RD0_ARVALID", - GLBL2_AXIMM_RD0_ARVALID_MASK}, - {"GLBL2_AXIMM_RD0_ARREADY", - GLBL2_AXIMM_RD0_ARREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd1_field_info[] = { - {"GLBL2_AXIMM_RD1_RSVD_1", - GLBL2_AXIMM_RD1_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT4", - GLBL2_AXIMM_RD1_RRSP_CNT4_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT3", - GLBL2_AXIMM_RD1_RRSP_CNT3_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT2", - GLBL2_AXIMM_RD1_RRSP_CNT2_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT1", - GLBL2_AXIMM_RD1_RRSP_CNT1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT0", - GLBL2_AXIMM_RD1_RRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab0_field_info[] = { - {"GLBL2_FAB0_H2C_INB_CONV_IN_VLD", - GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_INB_CONV_IN_RDY", - GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_VLD", - GLBL2_FAB0_H2C_SEG_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_RDY", - GLBL2_FAB0_H2C_SEG_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_VLD", - GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_RDY", - GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_H2C_MST_CRDT_STAT", - GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_FULL", - GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY", - GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_VLD", - GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_RDY", - GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_VLD", - GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_RDY", - GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD", - GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY", - GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_FULL", - GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY", - GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY", - GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab1_field_info[] = { - {"GLBL2_FAB1_BYP_OUT_CRDT_STAT", - GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK}, - {"GLBL2_FAB1_TM_DSC_STS_CRDT_STAT", - GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_FULL", - GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_1", - GLBL2_FAB1_RSVD_1_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_2", - GLBL2_FAB1_RSVD_2_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_3", - GLBL2_FAB1_RSVD_3_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_4", - GLBL2_FAB1_RSVD_4_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_sel_field_info[] = { - {"GLBL2_MATCH_SEL_RSV", - GLBL2_MATCH_SEL_RSV_MASK}, - {"GLBL2_MATCH_SEL_CSR_SEL", - GLBL2_MATCH_SEL_CSR_SEL_MASK}, - {"GLBL2_MATCH_SEL_CSR_EN", - GLBL2_MATCH_SEL_CSR_EN_MASK}, - {"GLBL2_MATCH_SEL_ROTATE1", - GLBL2_MATCH_SEL_ROTATE1_MASK}, - {"GLBL2_MATCH_SEL_ROTATE0", - GLBL2_MATCH_SEL_ROTATE0_MASK}, - {"GLBL2_MATCH_SEL_SEL", - GLBL2_MATCH_SEL_SEL_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_msk_field_info[] = { - {"GLBL2_MATCH_MSK", - GLBL2_MATCH_MSK_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_pat_field_info[] = { - {"GLBL2_MATCH_PAT_PATTERN", - GLBL2_MATCH_PAT_PATTERN_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_1_field_info[] = { - {"GLBL_RNG_SZ_1_RSVD_1", - GLBL_RNG_SZ_1_RSVD_1_MASK}, - {"GLBL_RNG_SZ_1_RING_SIZE", - GLBL_RNG_SZ_1_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_2_field_info[] = { - {"GLBL_RNG_SZ_2_RSVD_1", - GLBL_RNG_SZ_2_RSVD_1_MASK}, - {"GLBL_RNG_SZ_2_RING_SIZE", - GLBL_RNG_SZ_2_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_3_field_info[] = { - {"GLBL_RNG_SZ_3_RSVD_1", - GLBL_RNG_SZ_3_RSVD_1_MASK}, - {"GLBL_RNG_SZ_3_RING_SIZE", - GLBL_RNG_SZ_3_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_4_field_info[] = { - {"GLBL_RNG_SZ_4_RSVD_1", - GLBL_RNG_SZ_4_RSVD_1_MASK}, - {"GLBL_RNG_SZ_4_RING_SIZE", - GLBL_RNG_SZ_4_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_5_field_info[] = { - {"GLBL_RNG_SZ_5_RSVD_1", - GLBL_RNG_SZ_5_RSVD_1_MASK}, - {"GLBL_RNG_SZ_5_RING_SIZE", - GLBL_RNG_SZ_5_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_6_field_info[] = { - {"GLBL_RNG_SZ_6_RSVD_1", - GLBL_RNG_SZ_6_RSVD_1_MASK}, - {"GLBL_RNG_SZ_6_RING_SIZE", - GLBL_RNG_SZ_6_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_7_field_info[] = { - {"GLBL_RNG_SZ_7_RSVD_1", - GLBL_RNG_SZ_7_RSVD_1_MASK}, - {"GLBL_RNG_SZ_7_RING_SIZE", - GLBL_RNG_SZ_7_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_8_field_info[] = { - {"GLBL_RNG_SZ_8_RSVD_1", - GLBL_RNG_SZ_8_RSVD_1_MASK}, - {"GLBL_RNG_SZ_8_RING_SIZE", - GLBL_RNG_SZ_8_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_9_field_info[] = { - {"GLBL_RNG_SZ_9_RSVD_1", - GLBL_RNG_SZ_9_RSVD_1_MASK}, - {"GLBL_RNG_SZ_9_RING_SIZE", - GLBL_RNG_SZ_9_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_a_field_info[] = { - {"GLBL_RNG_SZ_A_RSVD_1", - GLBL_RNG_SZ_A_RSVD_1_MASK}, - {"GLBL_RNG_SZ_A_RING_SIZE", - GLBL_RNG_SZ_A_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_b_field_info[] = { - {"GLBL_RNG_SZ_B_RSVD_1", - GLBL_RNG_SZ_B_RSVD_1_MASK}, - {"GLBL_RNG_SZ_B_RING_SIZE", - GLBL_RNG_SZ_B_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_c_field_info[] = { - {"GLBL_RNG_SZ_C_RSVD_1", - GLBL_RNG_SZ_C_RSVD_1_MASK}, - {"GLBL_RNG_SZ_C_RING_SIZE", - GLBL_RNG_SZ_C_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_d_field_info[] = { - {"GLBL_RNG_SZ_D_RSVD_1", - GLBL_RNG_SZ_D_RSVD_1_MASK}, - {"GLBL_RNG_SZ_D_RING_SIZE", - GLBL_RNG_SZ_D_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_e_field_info[] = { - {"GLBL_RNG_SZ_E_RSVD_1", - GLBL_RNG_SZ_E_RSVD_1_MASK}, - {"GLBL_RNG_SZ_E_RING_SIZE", - GLBL_RNG_SZ_E_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_f_field_info[] = { - {"GLBL_RNG_SZ_F_RSVD_1", - GLBL_RNG_SZ_F_RSVD_1_MASK}, - {"GLBL_RNG_SZ_F_RING_SIZE", - GLBL_RNG_SZ_F_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_10_field_info[] = { - {"GLBL_RNG_SZ_10_RSVD_1", - GLBL_RNG_SZ_10_RSVD_1_MASK}, - {"GLBL_RNG_SZ_10_RING_SIZE", - GLBL_RNG_SZ_10_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_err_stat_field_info[] = { - {"GLBL_ERR_STAT_RSVD_1", - GLBL_ERR_STAT_RSVD_1_MASK}, - {"GLBL_ERR_STAT_ERR_FAB", - GLBL_ERR_STAT_ERR_FAB_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_ST", - GLBL_ERR_STAT_ERR_H2C_ST_MASK}, - {"GLBL_ERR_STAT_ERR_BDG", - GLBL_ERR_STAT_ERR_BDG_MASK}, - {"GLBL_ERR_STAT_IND_CTXT_CMD_ERR", - GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_ST", - GLBL_ERR_STAT_ERR_C2H_ST_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_1", - GLBL_ERR_STAT_ERR_C2H_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_0", - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_1", - GLBL_ERR_STAT_ERR_H2C_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_0", - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_TRQ", - GLBL_ERR_STAT_ERR_TRQ_MASK}, - {"GLBL_ERR_STAT_ERR_DSC", - GLBL_ERR_STAT_ERR_DSC_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_DBE", - GLBL_ERR_STAT_ERR_RAM_DBE_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_SBE", - GLBL_ERR_STAT_ERR_RAM_SBE_MASK}, -}; - - -static struct regfield_info - glbl_err_mask_field_info[] = { - {"GLBL_ERR", - GLBL_ERR_MASK}, -}; - - -static struct regfield_info - glbl_dsc_cfg_field_info[] = { - {"GLBL_DSC_CFG_RSVD_1", - GLBL_DSC_CFG_RSVD_1_MASK}, - {"GLBL_DSC_CFG_C2H_UODSC_LIMIT", - GLBL_DSC_CFG_C2H_UODSC_LIMIT_MASK}, - {"GLBL_DSC_CFG_H2C_UODSC_LIMIT", - GLBL_DSC_CFG_H2C_UODSC_LIMIT_MASK}, - {"GLBL_DSC_CFG_UNC_OVR_COR", - GLBL_DSC_CFG_UNC_OVR_COR_MASK}, - {"GLBL_DSC_CFG_CTXT_FER_DIS", - GLBL_DSC_CFG_CTXT_FER_DIS_MASK}, - {"GLBL_DSC_CFG_RSVD_2", - GLBL_DSC_CFG_RSVD_2_MASK}, - {"GLBL_DSC_CFG_MAXFETCH", - GLBL_DSC_CFG_MAXFETCH_MASK}, - {"GLBL_DSC_CFG_WB_ACC_INT", - GLBL_DSC_CFG_WB_ACC_INT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_sts_field_info[] = { - {"GLBL_DSC_ERR_STS_RSVD_1", - GLBL_DSC_ERR_STS_RSVD_1_MASK}, - {"GLBL_DSC_ERR_STS_PORT_ID", - GLBL_DSC_ERR_STS_PORT_ID_MASK}, - {"GLBL_DSC_ERR_STS_SBE", - GLBL_DSC_ERR_STS_SBE_MASK}, - {"GLBL_DSC_ERR_STS_DBE", - GLBL_DSC_ERR_STS_DBE_MASK}, - {"GLBL_DSC_ERR_STS_RQ_CANCEL", - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_DSC", - GLBL_DSC_ERR_STS_DSC_MASK}, - {"GLBL_DSC_ERR_STS_DMA", - GLBL_DSC_ERR_STS_DMA_MASK}, - {"GLBL_DSC_ERR_STS_FLR_CANCEL", - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_RSVD_2", - GLBL_DSC_ERR_STS_RSVD_2_MASK}, - {"GLBL_DSC_ERR_STS_DAT_POISON", - GLBL_DSC_ERR_STS_DAT_POISON_MASK}, - {"GLBL_DSC_ERR_STS_TIMEOUT", - GLBL_DSC_ERR_STS_TIMEOUT_MASK}, - {"GLBL_DSC_ERR_STS_FLR", - GLBL_DSC_ERR_STS_FLR_MASK}, - {"GLBL_DSC_ERR_STS_TAG", - GLBL_DSC_ERR_STS_TAG_MASK}, - {"GLBL_DSC_ERR_STS_ADDR", - GLBL_DSC_ERR_STS_ADDR_MASK}, - {"GLBL_DSC_ERR_STS_PARAM", - GLBL_DSC_ERR_STS_PARAM_MASK}, - {"GLBL_DSC_ERR_STS_BCNT", - GLBL_DSC_ERR_STS_BCNT_MASK}, - {"GLBL_DSC_ERR_STS_UR_CA", - GLBL_DSC_ERR_STS_UR_CA_MASK}, - {"GLBL_DSC_ERR_STS_POISON", - GLBL_DSC_ERR_STS_POISON_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_msk_field_info[] = { - {"GLBL_DSC_ERR_MSK", - GLBL_DSC_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log0_field_info[] = { - {"GLBL_DSC_ERR_LOG0_VALID", - GLBL_DSC_ERR_LOG0_VALID_MASK}, - {"GLBL_DSC_ERR_LOG0_SEL", - GLBL_DSC_ERR_LOG0_SEL_MASK}, - {"GLBL_DSC_ERR_LOG0_RSVD_1", - GLBL_DSC_ERR_LOG0_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG0_QID", - GLBL_DSC_ERR_LOG0_QID_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log1_field_info[] = { - {"GLBL_DSC_ERR_LOG1_RSVD_1", - GLBL_DSC_ERR_LOG1_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG1_CIDX", - GLBL_DSC_ERR_LOG1_CIDX_MASK}, - {"GLBL_DSC_ERR_LOG1_RSVD_2", - GLBL_DSC_ERR_LOG1_RSVD_2_MASK}, - {"GLBL_DSC_ERR_LOG1_SUB_TYPE", - GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK}, - {"GLBL_DSC_ERR_LOG1_ERR_TYPE", - GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_sts_field_info[] = { - {"GLBL_TRQ_ERR_STS_RSVD_1", - GLBL_TRQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_2", - GLBL_TRQ_ERR_STS_RSVD_2_MASK}, - {"GLBL_TRQ_ERR_STS_QID_RANGE", - GLBL_TRQ_ERR_STS_QID_RANGE_MASK}, - {"GLBL_TRQ_ERR_STS_QSPC_UNMAPPED", - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_3", - GLBL_TRQ_ERR_STS_RSVD_3_MASK}, - {"GLBL_TRQ_ERR_STS_VF_ACCESS_ERR", - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK}, - {"GLBL_TRQ_ERR_STS_CSR_UNMAPPED", - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_msk_field_info[] = { - {"GLBL_TRQ_ERR_MSK", - GLBL_TRQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_log_field_info[] = { - {"GLBL_TRQ_ERR_LOG_SRC", - GLBL_TRQ_ERR_LOG_SRC_MASK}, - {"GLBL_TRQ_ERR_LOG_TARGET", - GLBL_TRQ_ERR_LOG_TARGET_MASK}, - {"GLBL_TRQ_ERR_LOG_FUNC", - GLBL_TRQ_ERR_LOG_FUNC_MASK}, - {"GLBL_TRQ_ERR_LOG_ADDRESS", - GLBL_TRQ_ERR_LOG_ADDRESS_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat0_field_info[] = { - {"GLBL_DSC_DAT0_RSVD_1", - GLBL_DSC_DAT0_RSVD_1_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_DIR", - GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_QID", - GLBL_DSC_DAT0_CTXT_ARB_QID_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_REQ", - GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK}, - {"GLBL_DSC_DAT0_IRQ_FIFO_FL", - GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK}, - {"GLBL_DSC_DAT0_TMSTALL", - GLBL_DSC_DAT0_TMSTALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_STALL", - GLBL_DSC_DAT0_RRQ_STALL_MASK}, - {"GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL", - GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK}, - {"GLBL_DSC_DAT0_DSC_OUT_STALL", - GLBL_DSC_DAT0_DSC_OUT_STALL_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat1_field_info[] = { - {"GLBL_DSC_DAT1_RSVD_1", - GLBL_DSC_DAT1_RSVD_1_MASK}, - {"GLBL_DSC_DAT1_EVT_SPC_C2H", - GLBL_DSC_DAT1_EVT_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_EVT_SP_H2C", - GLBL_DSC_DAT1_EVT_SP_H2C_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_C2H", - GLBL_DSC_DAT1_DSC_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_H2C", - GLBL_DSC_DAT1_DSC_SPC_H2C_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_ctl_field_info[] = { - {"GLBL_DSC_CTL_RSVD_1", - GLBL_DSC_CTL_RSVD_1_MASK}, - {"GLBL_DSC_CTL_LAT_QID", - GLBL_DSC_CTL_LAT_QID_MASK}, - {"GLBL_DSC_CTL_DSC_ENG_LAT_CLR", - GLBL_DSC_CTL_DSC_ENG_LAT_CLR_MASK}, - {"GLBL_DSC_CTL_SELECT", - GLBL_DSC_CTL_SELECT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log2_field_info[] = { - {"GLBL_DSC_ERR_LOG2_OLD_PIDX", - GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK}, - {"GLBL_DSC_ERR_LOG2_NEW_PIDX", - GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK}, -}; - - -static struct regfield_info - glbl_glbl_interrupt_cfg_field_info[] = { - {"GLBL_GLBL_INTERRUPT_CFG_RSVD_1", - GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING", - GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR", - GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK}, -}; - - -static struct regfield_info - glbl_vch_host_profile_field_info[] = { - {"GLBL_VCH_HOST_PROFILE_RSVD_1", - GLBL_VCH_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_MM", - GLBL_VCH_HOST_PROFILE_2C_MM_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_ST", - GLBL_VCH_HOST_PROFILE_2C_ST_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_DSC", - GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_MSG", - GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR", - GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_CMPT", - GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD", - GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK}, -}; - - -static struct regfield_info - glbl_bridge_host_profile_field_info[] = { - {"GLBL_BRIDGE_HOST_PROFILE_RSVD_1", - GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_BRIDGE_HOST_PROFILE_BDGID", - GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK}, -}; - - -static struct regfield_info - aximm_irq_dest_addr_field_info[] = { - {"AXIMM_IRQ_DEST_ADDR_ADDR", - AXIMM_IRQ_DEST_ADDR_ADDR_MASK}, -}; - - -static struct regfield_info - fab_err_log_field_info[] = { - {"FAB_ERR_LOG_RSVD_1", - FAB_ERR_LOG_RSVD_1_MASK}, - {"FAB_ERR_LOG_SRC", - FAB_ERR_LOG_SRC_MASK}, -}; - - -static struct regfield_info - glbl_req_err_sts_field_info[] = { - {"GLBL_REQ_ERR_STS_RSVD_1", - GLBL_REQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_REQ_ERR_STS_RC_DISCONTINUE", - GLBL_REQ_ERR_STS_RC_DISCONTINUE_MASK}, - {"GLBL_REQ_ERR_STS_RC_PRTY", - GLBL_REQ_ERR_STS_RC_PRTY_MASK}, - {"GLBL_REQ_ERR_STS_RC_FLR", - GLBL_REQ_ERR_STS_RC_FLR_MASK}, - {"GLBL_REQ_ERR_STS_RC_TIMEOUT", - GLBL_REQ_ERR_STS_RC_TIMEOUT_MASK}, - {"GLBL_REQ_ERR_STS_RC_INV_BCNT", - GLBL_REQ_ERR_STS_RC_INV_BCNT_MASK}, - {"GLBL_REQ_ERR_STS_RC_INV_TAG", - GLBL_REQ_ERR_STS_RC_INV_TAG_MASK}, - {"GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH", - GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH_MASK}, - {"GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH", - GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH_MASK}, - {"GLBL_REQ_ERR_STS_RC_NO_DATA", - GLBL_REQ_ERR_STS_RC_NO_DATA_MASK}, - {"GLBL_REQ_ERR_STS_RC_UR_CA_CRS", - GLBL_REQ_ERR_STS_RC_UR_CA_CRS_MASK}, - {"GLBL_REQ_ERR_STS_RC_POISONED", - GLBL_REQ_ERR_STS_RC_POISONED_MASK}, -}; - - -static struct regfield_info - glbl_req_err_msk_field_info[] = { - {"GLBL_REQ_ERR_MSK", - GLBL_REQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_lat0_a_field_info[] = { - {"GLBL_DSC_LAT0_A_LAT_MAX", - GLBL_DSC_LAT0_A_LAT_MAX_MASK}, - {"GLBL_DSC_LAT0_A_LAT_MIN", - GLBL_DSC_LAT0_A_LAT_MIN_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_lat1_a_field_info[] = { - {"GLBL_DSC_LAT1_A_RSVD", - GLBL_DSC_LAT1_A_RSVD_MASK}, - {"GLBL_DSC_LAT1_A_LAT_OVF", - GLBL_DSC_LAT1_A_LAT_OVF_MASK}, - {"GLBL_DSC_LAT1_A_LAT_AVG", - GLBL_DSC_LAT1_A_LAT_AVG_MASK}, -}; - - -static struct regfield_info - glbl_dsc_crd_ctr0_a_field_info[] = { - {"GLBL_DSC_CRD_CTR0_A_CRD_RCV_CNT", - GLBL_DSC_CRD_CTR0_A_CRD_RCV_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_crd_ctr1_a_field_info[] = { - {"GLBL_DSC_CRD_CTR1_A_CRD_RCV_CNT", - GLBL_DSC_CRD_CTR1_A_CRD_RCV_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_crd_ctr2_a_field_info[] = { - {"GLBL_DSC_CRD_CTR2_A_CRD_RCV_NRDY_CNT", - GLBL_DSC_CRD_CTR2_A_CRD_RCV_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_crd_ctr3_a_field_info[] = { - {"GLBL_DSC_CRD_CTR3_A_CRD_RCV_NRDY_CNT", - GLBL_DSC_CRD_CTR3_A_CRD_RCV_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_imm_crd_ctr0_a_field_info[] = { - {"GLBL_DSC_IMM_CRD_CTR0_A_RCV_CNT", - GLBL_DSC_IMM_CRD_CTR0_A_RCV_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_imm_crd_ctr1_a_field_info[] = { - {"GLBL_DSC_IMM_CRD_CTR1_A_RCV_CNT", - GLBL_DSC_IMM_CRD_CTR1_A_RCV_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_imm_crd_ctr2_a_field_info[] = { - {"GLBL_DSC_IMM_CRD_CTR2_A_RCV_NRDY_CNT", - GLBL_DSC_IMM_CRD_CTR2_A_RCV_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_imm_crd_ctr3_a_field_info[] = { - {"GLBL_DSC_IMM_CRD_CTR3_A_RCV_NRDY_CNT", - GLBL_DSC_IMM_CRD_CTR3_A_RCV_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_h2c_out_ctr0_a_field_info[] = { - {"GLBL_DSC_H2C_OUT_CTR0_A_H2CVLD_CNT", - GLBL_DSC_H2C_OUT_CTR0_A_H2CVLD_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_h2c_out_ctr1_a_field_info[] = { - {"GLBL_DSC_H2C_OUT_CTR1_A_H2CVLD_CNT", - GLBL_DSC_H2C_OUT_CTR1_A_H2CVLD_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_h2c_out_ctr2_a_field_info[] = { - {"GLBL_DSC_H2C_OUT_CTR2_A_H2CVLD_NRDY_CNT", - GLBL_DSC_H2C_OUT_CTR2_A_H2CVLD_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_h2c_out_ctr3_a_field_info[] = { - {"GLBL_DSC_H2C_OUT_CTR3_A_H2CVLD_NRDY_CNT", - GLBL_DSC_H2C_OUT_CTR3_A_H2CVLD_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_c2h_out_ctr0_a_field_info[] = { - {"GLBL_DSC_C2H_OUT_CTR0_A_C2HVLD_CNT", - GLBL_DSC_C2H_OUT_CTR0_A_C2HVLD_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_c2h_out_ctr1_a_field_info[] = { - {"GLBL_DSC_C2H_OUT_CTR1_A_C2HVLD_CNT", - GLBL_DSC_C2H_OUT_CTR1_A_C2HVLD_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_c2h_out_ctr2_a_field_info[] = { - {"GLBL_DSC_C2H_OUT_CTR2_A_C2HVLD_NRDY_CNT", - GLBL_DSC_C2H_OUT_CTR2_A_C2HVLD_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_c2h_out_ctr3_a_field_info[] = { - {"GLBL_DSC_C2H_OUT_CTR3_A_C2HVLD_NRDY_CNT", - GLBL_DSC_C2H_OUT_CTR3_A_C2HVLD_NRDY_CNT_MASK}, -}; - - -static struct regfield_info - t_field_info[] = { - {"T_USER_CTR_MAX", - T_USER_CTR_MAX_MASK}, -}; - - -static struct regfield_info - glbl_perf_cntr_ctl_a1_field_info[] = { - {"GLBL_PERF_CNTR_CTL_A1_RSVD", - GLBL_PERF_CNTR_CTL_A1_RSVD_MASK}, - {"GLBL_PERF_CNTR_CTL_A1_USER_CTR_CLEAR", - GLBL_PERF_CNTR_CTL_A1_USER_CTR_CLEAR_MASK}, - {"GLBL_PERF_CNTR_CTL_A1_USER_CTR_READ", - GLBL_PERF_CNTR_CTL_A1_USER_CTR_READ_MASK}, - {"GLBL_PERF_CNTR_CTL_A1_USER_CTR_MAX", - GLBL_PERF_CNTR_CTL_A1_USER_CTR_MAX_MASK}, -}; - - -static struct regfield_info - glbl_free_cnt_a0_field_info[] = { - {"GLBL_FREE_CNT_A0_S", - GLBL_FREE_CNT_A0_S_MASK}, -}; - - -static struct regfield_info - glbl_free_cnt_a1_field_info[] = { - {"GLBL_FREE_CNT_A1_RSVD", - GLBL_FREE_CNT_A1_RSVD_MASK}, - {"GLBL_FREE_CNT_A1_S", - GLBL_FREE_CNT_A1_S_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a0_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A0_MPKT_CNTS", - GLBL_AXIS_H2C_CNT_A0_MPKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a1_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A1_MIDLE_CNTS", - GLBL_AXIS_H2C_CNT_A1_MIDLE_CNTS_MASK}, - {"GLBL_AXIS_H2C_CNT_A1_MPKT_CNTS", - GLBL_AXIS_H2C_CNT_A1_MPKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a2_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A2_MIDLE_CNTS", - GLBL_AXIS_H2C_CNT_A2_MIDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a3_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A3_MACTV_CNTS", - GLBL_AXIS_H2C_CNT_A3_MACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a4_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A4_MBUSY_CNTS", - GLBL_AXIS_H2C_CNT_A4_MBUSY_CNTS_MASK}, - {"GLBL_AXIS_H2C_CNT_A4_MACTV_CNTS", - GLBL_AXIS_H2C_CNT_A4_MACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_h2c_cnt_a5_field_info[] = { - {"GLBL_AXIS_H2C_CNT_A5_MBUSY_CNTS", - GLBL_AXIS_H2C_CNT_A5_MBUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a0_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A0_SPKT_CNTS", - GLBL_AXIS_C2H_CNT_A0_SPKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a1_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A1_SIDLE_CNTS", - GLBL_AXIS_C2H_CNT_A1_SIDLE_CNTS_MASK}, - {"GLBL_AXIS_C2H_CNT_A1_SPKT_CNTS", - GLBL_AXIS_C2H_CNT_A1_SPKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a2_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A2_SIDLE_CNTS", - GLBL_AXIS_C2H_CNT_A2_SIDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a3_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A3_SACTV_CNTS", - GLBL_AXIS_C2H_CNT_A3_SACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a4_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A4_SBUSY_CNTS", - GLBL_AXIS_C2H_CNT_A4_SBUSY_CNTS_MASK}, - {"GLBL_AXIS_C2H_CNT_A4_SACTV_CNTS", - GLBL_AXIS_C2H_CNT_A4_SACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_axis_c2h_cnt_a5_field_info[] = { - {"GLBL_AXIS_C2H_CNT_A5_SBUSY_CNTS", - GLBL_AXIS_C2H_CNT_A5_SBUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a0_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A0_PKT_CNTS", - GLBL_M_AXI_WR_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a1_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A1_IDLE_CNTS", - GLBL_M_AXI_WR_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_M_AXI_WR_CNT_A1_PKT_CNTS", - GLBL_M_AXI_WR_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a2_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A2_IDLE_CNTS", - GLBL_M_AXI_WR_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a3_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A3_ACTV_CNTS", - GLBL_M_AXI_WR_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a4_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A4_BUSY_CNTS", - GLBL_M_AXI_WR_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_M_AXI_WR_CNT_A4_ACTV_CNTS", - GLBL_M_AXI_WR_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_wr_cnt_a5_field_info[] = { - {"GLBL_M_AXI_WR_CNT_A5_BUSY_CNTS", - GLBL_M_AXI_WR_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a0_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A0_PKT_CNTS", - GLBL_M_AXI_RD_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a1_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A1_IDLE_CNTS", - GLBL_M_AXI_RD_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_M_AXI_RD_CNT_A1_PKT_CNTS", - GLBL_M_AXI_RD_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a2_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A2_IDLE_CNTS", - GLBL_M_AXI_RD_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a3_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A3_ACTV_CNTS", - GLBL_M_AXI_RD_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a4_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A4_BUSY_CNTS", - GLBL_M_AXI_RD_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_M_AXI_RD_CNT_A4_ACTV_CNTS", - GLBL_M_AXI_RD_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axi_rd_cnt_a5_field_info[] = { - {"GLBL_M_AXI_RD_CNT_A5_BUSY_CNTS", - GLBL_M_AXI_RD_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a0_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A0_PKT_CNTS", - GLBL_M_AXIB_WR_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a1_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A1_IDLE_CNTS", - GLBL_M_AXIB_WR_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_M_AXIB_WR_CNT_A1_PKT_CNTS", - GLBL_M_AXIB_WR_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a2_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A2_IDLE_CNTS", - GLBL_M_AXIB_WR_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a3_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A3_ACTV_CNTS", - GLBL_M_AXIB_WR_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a4_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A4_BUSY_CNTS", - GLBL_M_AXIB_WR_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_M_AXIB_WR_CNT_A4_ACTV_CNTS", - GLBL_M_AXIB_WR_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_wr_cnt_a5_field_info[] = { - {"GLBL_M_AXIB_WR_CNT_A5_BUSY_CNTS", - GLBL_M_AXIB_WR_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a0_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A0_PKT_CNTS", - GLBL_M_AXIB_RD_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a1_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A1_IDLE_CNTS", - GLBL_M_AXIB_RD_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_M_AXIB_RD_CNT_A1_PKT_CNTS", - GLBL_M_AXIB_RD_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a2_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A2_IDLE_CNTS", - GLBL_M_AXIB_RD_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a3_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A3_ACTV_CNTS", - GLBL_M_AXIB_RD_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a4_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A4_BUSY_CNTS", - GLBL_M_AXIB_RD_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_M_AXIB_RD_CNT_A4_ACTV_CNTS", - GLBL_M_AXIB_RD_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_m_axib_rd_cnt_a5_field_info[] = { - {"GLBL_M_AXIB_RD_CNT_A5_BUSY_CNTS", - GLBL_M_AXIB_RD_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a0_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A0_PKT_CNTS", - GLBL_S_AXI_WR_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a1_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A1_IDLE_CNTS", - GLBL_S_AXI_WR_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_S_AXI_WR_CNT_A1_PKT_CNTS", - GLBL_S_AXI_WR_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a2_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A2_IDLE_CNTS", - GLBL_S_AXI_WR_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a3_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A3_ACTV_CNTS", - GLBL_S_AXI_WR_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a4_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A4_BUSY_CNTS", - GLBL_S_AXI_WR_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_S_AXI_WR_CNT_A4_ACTV_CNTS", - GLBL_S_AXI_WR_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_wr_cnt_a5_field_info[] = { - {"GLBL_S_AXI_WR_CNT_A5_BUSY_CNTS", - GLBL_S_AXI_WR_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a0_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A0_PKT_CNTS", - GLBL_S_AXI_RD_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a1_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A1_IDLE_CNTS", - GLBL_S_AXI_RD_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_S_AXI_RD_CNT_A1_PKT_CNTS", - GLBL_S_AXI_RD_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a2_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A2_IDLE_CNTS", - GLBL_S_AXI_RD_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a3_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A3_ACTV_CNTS", - GLBL_S_AXI_RD_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a4_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A4_BUSY_CNTS", - GLBL_S_AXI_RD_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_S_AXI_RD_CNT_A4_ACTV_CNTS", - GLBL_S_AXI_RD_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axi_rd_cnt_a5_field_info[] = { - {"GLBL_S_AXI_RD_CNT_A5_BUSY_CNTS", - GLBL_S_AXI_RD_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a0_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A0_PKT_CNTS", - GLBL_S_AXIS_CMP_CNT_A0_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a1_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A1_IDLE_CNTS", - GLBL_S_AXIS_CMP_CNT_A1_IDLE_CNTS_MASK}, - {"GLBL_S_AXIS_CMP_CNT_A1_PKT_CNTS", - GLBL_S_AXIS_CMP_CNT_A1_PKT_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a2_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A2_IDLE_CNTS", - GLBL_S_AXIS_CMP_CNT_A2_IDLE_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a3_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A3_ACTV_CNTS", - GLBL_S_AXIS_CMP_CNT_A3_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a4_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A4_BUSY_CNTS", - GLBL_S_AXIS_CMP_CNT_A4_BUSY_CNTS_MASK}, - {"GLBL_S_AXIS_CMP_CNT_A4_ACTV_CNTS", - GLBL_S_AXIS_CMP_CNT_A4_ACTV_CNTS_MASK}, -}; - - -static struct regfield_info - glbl_s_axis_cmp_cnt_a5_field_info[] = { - {"GLBL_S_AXIS_CMP_CNT_A5_BUSY_CNTS", - GLBL_S_AXIS_CMP_CNT_A5_BUSY_CNTS_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_field_info[] = { - {"IND_CTXT_DATA_DATA", - IND_CTXT_DATA_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_mask_field_info[] = { - {"IND_CTXT", - IND_CTXT_MASK}, -}; - - -static struct regfield_info - ind_ctxt_cmd_field_info[] = { - {"IND_CTXT_CMD_RSVD_1", - IND_CTXT_CMD_RSVD_1_MASK}, - {"IND_CTXT_CMD_QID", - IND_CTXT_CMD_QID_MASK}, - {"IND_CTXT_CMD_OP", - IND_CTXT_CMD_OP_MASK}, - {"IND_CTXT_CMD_SEL", - IND_CTXT_CMD_SEL_MASK}, - {"IND_CTXT_CMD_BUSY", - IND_CTXT_CMD_BUSY_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_field_info[] = { - {"C2H_TIMER_CNT_RSVD_1", - C2H_TIMER_CNT_RSVD_1_MASK}, - {"C2H_TIMER_CNT", - C2H_TIMER_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_field_info[] = { - {"C2H_CNT_TH_RSVD_1", - C2H_CNT_TH_RSVD_1_MASK}, - {"C2H_CNT_TH_THESHOLD_CNT", - C2H_CNT_TH_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_1_field_info[] = { - {"C2H_PFCH_CFG_1_EVT_QCNT_TH", - C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK}, - {"C2H_PFCH_CFG_1_QCNT", - C2H_PFCH_CFG_1_QCNT_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_2_field_info[] = { - {"C2H_PFCH_CFG_2_FENCE", - C2H_PFCH_CFG_2_FENCE_MASK}, - {"C2H_PFCH_CFG_2_RSVD", - C2H_PFCH_CFG_2_RSVD_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NO_DROP", - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK}, - {"C2H_PFCH_CFG_2_LL_SZ_TH", - C2H_PFCH_CFG_2_LL_SZ_TH_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NUM", - C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK}, - {"C2H_PFCH_CFG_2_NUM", - C2H_PFCH_CFG_2_NUM_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED", - C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP", - C2H_STAT_AXIS_PKG_CMP_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ACCEPTED_D", - C2H_STAT_DESC_RSP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_cmp_field_info[] = { - {"C2H_STAT_DESC_RSP_CMP_D", - C2H_STAT_DESC_RSP_CMP_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_wrq_out_field_info[] = { - {"C2H_STAT_WRQ_OUT", - C2H_STAT_WRQ_OUT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wpl_ren_accepted_field_info[] = { - {"C2H_STAT_WPL_REN_ACCEPTED", - C2H_STAT_WPL_REN_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wrq_len_field_info[] = { - {"C2H_STAT_TOTAL_WRQ_LEN", - C2H_STAT_TOTAL_WRQ_LEN_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wpl_len_field_info[] = { - {"C2H_STAT_TOTAL_WPL_LEN", - C2H_STAT_TOTAL_WPL_LEN_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_field_info[] = { - {"C2H_BUF_SZ_IZE", - C2H_BUF_SZ_IZE_MASK}, -}; - - -static struct regfield_info - c2h_err_stat_field_info[] = { - {"C2H_ERR_STAT_RSVD_1", - C2H_ERR_STAT_RSVD_1_MASK}, - {"C2H_ERR_STAT_WRB_PORT_ID_ERR", - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK}, - {"C2H_ERR_STAT_HDR_PAR_ERR", - C2H_ERR_STAT_HDR_PAR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_COR_ERR", - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_ERR_STAT_AVL_RING_DSC_ERR", - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK}, - {"C2H_ERR_STAT_WRB_PRTY_ERR", - C2H_ERR_STAT_WRB_PRTY_ERR_MASK}, - {"C2H_ERR_STAT_WRB_CIDX_ERR", - C2H_ERR_STAT_WRB_CIDX_ERR_MASK}, - {"C2H_ERR_STAT_WRB_QFULL_ERR", - C2H_ERR_STAT_WRB_QFULL_ERR_MASK}, - {"C2H_ERR_STAT_WRB_INV_Q_ERR", - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_2", - C2H_ERR_STAT_RSVD_2_MASK}, - {"C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH", - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK}, - {"C2H_ERR_STAT_ERR_DESC_CNT", - C2H_ERR_STAT_ERR_DESC_CNT_MASK}, - {"C2H_ERR_STAT_RSVD_3", - C2H_ERR_STAT_RSVD_3_MASK}, - {"C2H_ERR_STAT_MSI_INT_FAIL", - C2H_ERR_STAT_MSI_INT_FAIL_MASK}, - {"C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR", - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_4", - C2H_ERR_STAT_RSVD_4_MASK}, - {"C2H_ERR_STAT_DESC_RSP_ERR", - C2H_ERR_STAT_DESC_RSP_ERR_MASK}, - {"C2H_ERR_STAT_QID_MISMATCH", - C2H_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_ERR_STAT_SH_CMPT_DSC_ERR", - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK}, - {"C2H_ERR_STAT_LEN_MISMATCH", - C2H_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_ERR_STAT_MTY_MISMATCH", - C2H_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_err_mask_field_info[] = { - {"C2H_ERR_EN", - C2H_ERR_EN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_stat_field_info[] = { - {"C2H_FATAL_ERR_STAT_RSVD_1", - C2H_FATAL_ERR_STAT_RSVD_1_MASK}, - {"C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR", - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED2", - C2H_FATAL_ERR_STAT_RESERVED2_MASK}, - {"C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_MISMATCH", - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED1", - C2H_FATAL_ERR_STAT_RESERVED1_MASK}, - {"C2H_FATAL_ERR_STAT_LEN_MISMATCH", - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_MTY_MISMATCH", - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_mask_field_info[] = { - {"C2H_FATAL_ERR_C2HEN", - C2H_FATAL_ERR_C2HEN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_enable_field_info[] = { - {"C2H_FATAL_ERR_ENABLE_RSVD_1", - C2H_FATAL_ERR_ENABLE_RSVD_1_MASK}, - {"C2H_FATAL_ERR_ENABLE_WPL_PAR_INV", - C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK}, - {"C2H_FATAL_ERR_ENABLE_WRQ_DIS", - C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK}, -}; - - -static struct regfield_info - glbl_err_int_field_info[] = { - {"GLBL_ERR_INT_RSVD_1", - GLBL_ERR_INT_RSVD_1_MASK}, - {"GLBL_ERR_INT_HOST_ID", - GLBL_ERR_INT_HOST_ID_MASK}, - {"GLBL_ERR_INT_DIS_INTR_ON_VF", - GLBL_ERR_INT_DIS_INTR_ON_VF_MASK}, - {"GLBL_ERR_INT_ARM", - GLBL_ERR_INT_ARM_MASK}, - {"GLBL_ERR_INT_EN_COAL", - GLBL_ERR_INT_EN_COAL_MASK}, - {"GLBL_ERR_INT_VEC", - GLBL_ERR_INT_VEC_MASK}, - {"GLBL_ERR_INT_FUNC", - GLBL_ERR_INT_FUNC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_field_info[] = { - {"C2H_PFCH_CFG_EVTFL_TH", - C2H_PFCH_CFG_EVTFL_TH_MASK}, - {"C2H_PFCH_CFG_FL_TH", - C2H_PFCH_CFG_FL_TH_MASK}, -}; - - -static struct regfield_info - c2h_int_timer_tick_field_info[] = { - {"C2H_INT_TIMER_TICK", - C2H_INT_TIMER_TICK_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_drop_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_D", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_err_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_D", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_req_field_info[] = { - {"C2H_STAT_DESC_REQ", - C2H_STAT_DESC_REQ_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_0_field_info[] = { - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_SM_CS", - C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK}, - {"C2H_STAT_DMA_ENG_0_MAIN_SM_CS", - C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_1_field_info[] = { - {"C2H_STAT_DMA_ENG_1_WRB_USER_0_CMPT_TYPE", - C2H_STAT_DMA_ENG_1_WRB_USER_0_CMPT_TYPE_MASK}, - {"C2H_STAT_DMA_ENG_1_DESC_RSP_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_1_DESC_RSP_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT", - C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_2_field_info[] = { - {"C2H_STAT_DMA_ENG_2_WRB_USER_1_CMPT_TYPE", - C2H_STAT_DMA_ENG_2_WRB_USER_1_CMPT_TYPE_MASK}, - {"C2H_STAT_DMA_ENG_2_DESC_RSP_FIFO_OUT_VLD_1", - C2H_STAT_DMA_ENG_2_DESC_RSP_FIFO_OUT_VLD_1_MASK}, - {"C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_1", - C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_1_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_1", - C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_1_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_1", - C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_3_field_info[] = { - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_HAS_CMPT", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_HAS_CMPT_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_MARKER", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_DROP_REQ", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_DROP_REQ_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_QID", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_DAT_QID_MASK}, - {"C2H_STAT_DMA_ENG_3_WR_HDR_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_3_WR_HDR_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER", - C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_MASK}, - {"C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_err_ctxt_field_info[] = { - {"C2H_PFCH_ERR_CTXT_RSVD_1", - C2H_PFCH_ERR_CTXT_RSVD_1_MASK}, - {"C2H_PFCH_ERR_CTXT_ERR_STAT", - C2H_PFCH_ERR_CTXT_ERR_STAT_MASK}, - {"C2H_PFCH_ERR_CTXT_CMD_WR", - C2H_PFCH_ERR_CTXT_CMD_WR_MASK}, - {"C2H_PFCH_ERR_CTXT_QID", - C2H_PFCH_ERR_CTXT_QID_MASK}, - {"C2H_PFCH_ERR_CTXT_DONE", - C2H_PFCH_ERR_CTXT_DONE_MASK}, -}; - - -static struct regfield_info - c2h_first_err_qid_field_info[] = { - {"C2H_FIRST_ERR_QID_RSVD_1", - C2H_FIRST_ERR_QID_RSVD_1_MASK}, - {"C2H_FIRST_ERR_QID_ERR_TYPE", - C2H_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"C2H_FIRST_ERR_QID_RSVD", - C2H_FIRST_ERR_QID_RSVD_MASK}, - {"C2H_FIRST_ERR_QID_QID", - C2H_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_in_field_info[] = { - {"STAT_NUM_WRB_IN_RSVD_1", - STAT_NUM_WRB_IN_RSVD_1_MASK}, - {"STAT_NUM_WRB_IN_WRB_CNT", - STAT_NUM_WRB_IN_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_out_field_info[] = { - {"STAT_NUM_WRB_OUT_RSVD_1", - STAT_NUM_WRB_OUT_RSVD_1_MASK}, - {"STAT_NUM_WRB_OUT_WRB_CNT", - STAT_NUM_WRB_OUT_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_drp_field_info[] = { - {"STAT_NUM_WRB_DRP_RSVD_1", - STAT_NUM_WRB_DRP_RSVD_1_MASK}, - {"STAT_NUM_WRB_DRP_WRB_CNT", - STAT_NUM_WRB_DRP_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_stat_desc_out_field_info[] = { - {"STAT_NUM_STAT_DESC_OUT_RSVD_1", - STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK}, - {"STAT_NUM_STAT_DESC_OUT_CNT", - STAT_NUM_STAT_DESC_OUT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_dsc_crdt_sent_field_info[] = { - {"STAT_NUM_DSC_CRDT_SENT_RSVD_1", - STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK}, - {"STAT_NUM_DSC_CRDT_SENT_CNT", - STAT_NUM_DSC_CRDT_SENT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_fch_dsc_rcvd_field_info[] = { - {"STAT_NUM_FCH_DSC_RCVD_RSVD_1", - STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_FCH_DSC_RCVD_DSC_CNT", - STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_byp_dsc_rcvd_field_info[] = { - {"STAT_NUM_BYP_DSC_RCVD_RSVD_1", - STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_BYP_DSC_RCVD_DSC_CNT", - STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_cfg_field_info[] = { - {"C2H_WRB_COAL_CFG_MAX_BUF_SZ", - C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK}, - {"C2H_WRB_COAL_CFG_TICK_VAL", - C2H_WRB_COAL_CFG_TICK_VAL_MASK}, - {"C2H_WRB_COAL_CFG_TICK_CNT", - C2H_WRB_COAL_CFG_TICK_CNT_MASK}, - {"C2H_WRB_COAL_CFG_SET_GLB_FLUSH", - C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK}, - {"C2H_WRB_COAL_CFG_DONE_GLB_FLUSH", - C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_req_field_info[] = { - {"C2H_INTR_H2C_REQ_RSVD_1", - C2H_INTR_H2C_REQ_RSVD_1_MASK}, - {"C2H_INTR_H2C_REQ_CNT", - C2H_INTR_H2C_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_mm_req_field_info[] = { - {"C2H_INTR_C2H_MM_REQ_RSVD_1", - C2H_INTR_C2H_MM_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_MM_REQ_CNT", - C2H_INTR_C2H_MM_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_err_int_req_field_info[] = { - {"C2H_INTR_ERR_INT_REQ_RSVD_1", - C2H_INTR_ERR_INT_REQ_RSVD_1_MASK}, - {"C2H_INTR_ERR_INT_REQ_CNT", - C2H_INTR_ERR_INT_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_req_field_info[] = { - {"C2H_INTR_C2H_ST_REQ_RSVD_1", - C2H_INTR_C2H_ST_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_REQ_CNT", - C2H_INTR_C2H_ST_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_ack_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1", - C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_ACK_CNT", - C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_fail_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1", - C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_FAIL_CNT", - C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_no_msix_field_info[] = { - {"C2H_INTR_C2H_ST_NO_MSIX_RSVD_1", - C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_NO_MSIX_CNT", - C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_ctxt_inval_field_info[] = { - {"C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1", - C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_CTXT_INVAL_CNT", - C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wr_cmp_field_info[] = { - {"C2H_STAT_WR_CMP_RSVD_1", - C2H_STAT_WR_CMP_RSVD_1_MASK}, - {"C2H_STAT_WR_CMP_CNT", - C2H_STAT_WR_CMP_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_4_field_info[] = { - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_HAS_CMPT_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_HAS_CMPT_1_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_MARKER_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_MARKER_1_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_DROP_REQ_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_DROP_REQ_1_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_QID_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_DAT_QID_1_MASK}, - {"C2H_STAT_DMA_ENG_4_WR_HDR_FIFO_OUT_CNT_1", - C2H_STAT_DMA_ENG_4_WR_HDR_FIFO_OUT_CNT_1_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_1", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_1", - C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_1_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_1", - C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_1_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_1", - C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_1", - C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_1_MASK}, - {"C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_1", - C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_1_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_1", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_5_field_info[] = { - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_5_ARB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH", - C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ", - C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_qid_field_info[] = { - {"C2H_PFCH_QID_RSVD_1", - C2H_PFCH_QID_RSVD_1_MASK}, - {"C2H_PFCH_QID_ERR_CTXT", - C2H_PFCH_QID_ERR_CTXT_MASK}, - {"C2H_PFCH_QID_TARGET", - C2H_PFCH_QID_TARGET_MASK}, - {"C2H_PFCH_QID_QID_OR_TAG", - C2H_PFCH_QID_QID_OR_TAG_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_field_info[] = { - {"C2H_PFCH_DATA", - C2H_PFCH_DATA_MASK}, -}; - - -static struct regfield_info - c2h_int_dbg_field_info[] = { - {"C2H_INT_RSVD_1", - C2H_INT_RSVD_1_MASK}, - {"C2H_INT_INT_COAL_SM", - C2H_INT_INT_COAL_SM_MASK}, - {"C2H_INT_INT_SM", - C2H_INT_INT_SM_MASK}, -}; - - -static struct regfield_info - c2h_stat_imm_accepted_field_info[] = { - {"C2H_STAT_IMM_ACCEPTED_RSVD_1", - C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_IMM_ACCEPTED_CNT", - C2H_STAT_IMM_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_marker_accepted_field_info[] = { - {"C2H_STAT_MARKER_ACCEPTED_RSVD_1", - C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_MARKER_ACCEPTED_CNT", - C2H_STAT_MARKER_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_disable_cmp_accepted_field_info[] = { - {"C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1", - C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED_CNT", - C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_crdt_cnt_field_info[] = { - {"C2H_PLD_FIFO_CRDT_CNT_RSVD_1", - C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK}, - {"C2H_PLD_FIFO_CRDT_CNT_CNT", - C2H_PLD_FIFO_CRDT_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_req_field_info[] = { - {"C2H_INTR_DYN_REQ_RSVD_1", - C2H_INTR_DYN_REQ_RSVD_1_MASK}, - {"C2H_INTR_DYN_REQ_CNT", - C2H_INTR_DYN_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_misc_field_info[] = { - {"C2H_INTR_DYN_MISC_RSVD_1", - C2H_INTR_DYN_MISC_RSVD_1_MASK}, - {"C2H_INTR_DYN_MISC_CNT", - C2H_INTR_DYN_MISC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_len_mismatch_field_info[] = { - {"C2H_DROP_LEN_MISMATCH_RSVD_1", - C2H_DROP_LEN_MISMATCH_RSVD_1_MASK}, - {"C2H_DROP_LEN_MISMATCH_CNT", - C2H_DROP_LEN_MISMATCH_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_desc_rsp_len_field_info[] = { - {"C2H_DROP_DESC_RSP_LEN_RSVD_1", - C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK}, - {"C2H_DROP_DESC_RSP_LEN_CNT", - C2H_DROP_DESC_RSP_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_qid_fifo_len_field_info[] = { - {"C2H_DROP_QID_FIFO_LEN_RSVD_1", - C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK}, - {"C2H_DROP_QID_FIFO_LEN_CNT", - C2H_DROP_QID_FIFO_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_field_info[] = { - {"C2H_DROP_PLD_CNT_RSVD_1", - C2H_DROP_PLD_CNT_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_CNT", - C2H_DROP_PLD_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_0_field_info[] = { - {"C2H_CMPT_FORMAT_0_DESC_ERR_LOC", - C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_0_COLOR_LOC", - C2H_CMPT_FORMAT_0_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_1_field_info[] = { - {"C2H_CMPT_FORMAT_1_DESC_ERR_LOC", - C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_1_COLOR_LOC", - C2H_CMPT_FORMAT_1_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_2_field_info[] = { - {"C2H_CMPT_FORMAT_2_DESC_ERR_LOC", - C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_2_COLOR_LOC", - C2H_CMPT_FORMAT_2_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_3_field_info[] = { - {"C2H_CMPT_FORMAT_3_DESC_ERR_LOC", - C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_3_COLOR_LOC", - C2H_CMPT_FORMAT_3_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_4_field_info[] = { - {"C2H_CMPT_FORMAT_4_DESC_ERR_LOC", - C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_4_COLOR_LOC", - C2H_CMPT_FORMAT_4_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_5_field_info[] = { - {"C2H_CMPT_FORMAT_5_DESC_ERR_LOC", - C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_5_COLOR_LOC", - C2H_CMPT_FORMAT_5_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_6_field_info[] = { - {"C2H_CMPT_FORMAT_6_DESC_ERR_LOC", - C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_6_COLOR_LOC", - C2H_CMPT_FORMAT_6_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cache_depth_field_info[] = { - {"C2H_PFCH_CACHE_DEPTH_MAX_STBUF", - C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK}, - {"C2H_PFCH_CACHE_DEPTH", - C2H_PFCH_CACHE_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_buf_depth_field_info[] = { - {"C2H_WRB_COAL_BUF_DEPTH_RSVD_1", - C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK}, - {"C2H_WRB_COAL_BUF_DEPTH_BUFFER", - C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK}, -}; - - -static struct regfield_info - c2h_pfch_crdt_field_info[] = { - {"C2H_PFCH_CRDT_RSVD_1", - C2H_PFCH_CRDT_RSVD_1_MASK}, - {"C2H_PFCH_CRDT_RSVD_2", - C2H_PFCH_CRDT_RSVD_2_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_cmpt_accepted_field_info[] = { - {"C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1", - C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_CMPT_ACCEPTED_CNT", - C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_pld_accepted_field_info[] = { - {"C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1", - C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_PLD_ACCEPTED_CNT", - C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_field_info[] = { - {"C2H_PLD_PKT_ID_CMPT_WAIT", - C2H_PLD_PKT_ID_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_DATA", - C2H_PLD_PKT_ID_DATA_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_1_field_info[] = { - {"C2H_PLD_PKT_ID_1_CMPT_WAIT", - C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_1_DATA", - C2H_PLD_PKT_ID_1_DATA_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_1_field_info[] = { - {"C2H_DROP_PLD_CNT_1_RSVD_1", - C2H_DROP_PLD_CNT_1_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_1_CNT", - C2H_DROP_PLD_CNT_1_CNT_MASK}, -}; - - -static struct regfield_info - h2c_err_stat_field_info[] = { - {"H2C_ERR_STAT_RSVD_1", - H2C_ERR_STAT_RSVD_1_MASK}, - {"H2C_ERR_STAT_PAR_ERR", - H2C_ERR_STAT_PAR_ERR_MASK}, - {"H2C_ERR_STAT_SBE", - H2C_ERR_STAT_SBE_MASK}, - {"H2C_ERR_STAT_DBE", - H2C_ERR_STAT_DBE_MASK}, - {"H2C_ERR_STAT_NO_DMA_DS", - H2C_ERR_STAT_NO_DMA_DS_MASK}, - {"H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR", - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK}, - {"H2C_ERR_STAT_ZERO_LEN_DS", - H2C_ERR_STAT_ZERO_LEN_DS_MASK}, -}; - - -static struct regfield_info - h2c_err_mask_field_info[] = { - {"H2C_ERR_EN", - H2C_ERR_EN_MASK}, -}; - - -static struct regfield_info - h2c_first_err_qid_field_info[] = { - {"H2C_FIRST_ERR_QID_RSVD_1", - H2C_FIRST_ERR_QID_RSVD_1_MASK}, - {"H2C_FIRST_ERR_QID_ERR_TYPE", - H2C_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"H2C_FIRST_ERR_QID_RSVD_2", - H2C_FIRST_ERR_QID_RSVD_2_MASK}, - {"H2C_FIRST_ERR_QID_QID", - H2C_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg0_field_info[] = { - {"H2C_REG0_NUM_DSC_RCVD", - H2C_REG0_NUM_DSC_RCVD_MASK}, - {"H2C_REG0_NUM_WRB_SENT", - H2C_REG0_NUM_WRB_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg1_field_info[] = { - {"H2C_REG1_NUM_REQ_SENT", - H2C_REG1_NUM_REQ_SENT_MASK}, - {"H2C_REG1_NUM_CMP_SENT", - H2C_REG1_NUM_CMP_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg2_field_info[] = { - {"H2C_REG2_RSVD_1", - H2C_REG2_RSVD_1_MASK}, - {"H2C_REG2_NUM_ERR_DSC_RCVD", - H2C_REG2_NUM_ERR_DSC_RCVD_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg3_field_info[] = { - {"H2C_REG3_RSVD_1", - H2C_REG3_RSVD_1_MASK}, - {"H2C_REG3_DSCO_FIFO_EMPTY", - H2C_REG3_DSCO_FIFO_EMPTY_MASK}, - {"H2C_REG3_DSCO_FIFO_FULL", - H2C_REG3_DSCO_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RC_STATE", - H2C_REG3_CUR_RC_STATE_MASK}, - {"H2C_REG3_RDREQ_LINES", - H2C_REG3_RDREQ_LINES_MASK}, - {"H2C_REG3_RDATA_LINES_AVAIL", - H2C_REG3_RDATA_LINES_AVAIL_MASK}, - {"H2C_REG3_PEND_FIFO_EMPTY", - H2C_REG3_PEND_FIFO_EMPTY_MASK}, - {"H2C_REG3_PEND_FIFO_FULL", - H2C_REG3_PEND_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RQ_STATE", - H2C_REG3_CUR_RQ_STATE_MASK}, - {"H2C_REG3_DSCI_FIFO_FULL", - H2C_REG3_DSCI_FIFO_FULL_MASK}, - {"H2C_REG3_DSCI_FIFO_EMPTY", - H2C_REG3_DSCI_FIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg4_field_info[] = { - {"H2C_REG4_RDREQ_ADDR", - H2C_REG4_RDREQ_ADDR_MASK}, -}; - - -static struct regfield_info - h2c_fatal_err_en_field_info[] = { - {"H2C_FATAL_ERR_EN_RSVD_1", - H2C_FATAL_ERR_EN_RSVD_1_MASK}, - {"H2C_FATAL_ERR_EN_H2C", - H2C_FATAL_ERR_EN_H2C_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_pcie_field_info[] = { - {"H2C_REQ_THROT_PCIE_EN_REQ", - H2C_REQ_THROT_PCIE_EN_REQ_MASK}, - {"H2C_REQ_THROT_PCIE", - H2C_REQ_THROT_PCIE_MASK}, - {"H2C_REQ_THROT_PCIE_EN_DATA", - H2C_REQ_THROT_PCIE_EN_DATA_MASK}, - {"H2C_REQ_THROT_PCIE_DATA_THRESH", - H2C_REQ_THROT_PCIE_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - h2c_aln_dbg_reg0_field_info[] = { - {"H2C_ALN_REG0_NUM_PKT_SENT", - H2C_ALN_REG0_NUM_PKT_SENT_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_aximm_field_info[] = { - {"H2C_REQ_THROT_AXIMM_EN_REQ", - H2C_REQ_THROT_AXIMM_EN_REQ_MASK}, - {"H2C_REQ_THROT_AXIMM", - H2C_REQ_THROT_AXIMM_MASK}, - {"H2C_REQ_THROT_AXIMM_EN_DATA", - H2C_REQ_THROT_AXIMM_EN_DATA_MASK}, - {"H2C_REQ_THROT_AXIMM_DATA_THRESH", - H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - c2h_mm_ctl_field_info[] = { - {"C2H_MM_CTL_RESERVED1", - C2H_MM_CTL_RESERVED1_MASK}, - {"C2H_MM_CTL_ERRC_EN", - C2H_MM_CTL_ERRC_EN_MASK}, - {"C2H_MM_CTL_RESERVED0", - C2H_MM_CTL_RESERVED0_MASK}, - {"C2H_MM_CTL_RUN", - C2H_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_status_field_info[] = { - {"C2H_MM_STATUS_RSVD_1", - C2H_MM_STATUS_RSVD_1_MASK}, - {"C2H_MM_STATUS_RUN", - C2H_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_cmpl_desc_cnt_field_info[] = { - {"C2H_MM_CMPL_DESC_CNT_C2H_CO", - C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_enable_mask_field_info[] = { - {"C2H_MM_ERR_CODE_ENABLE_RESERVED1", - C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM", - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UR", - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_FLR", - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RESERVED0", - C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_field_info[] = { - {"C2H_MM_ERR_CODE_RESERVED1", - C2H_MM_ERR_CODE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_CIDX", - C2H_MM_ERR_CODE_CIDX_MASK}, - {"C2H_MM_ERR_CODE_RESERVED0", - C2H_MM_ERR_CODE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_SUB_TYPE", - C2H_MM_ERR_CODE_SUB_TYPE_MASK}, - {"C2H_MM_ERR_CODE", - C2H_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_info_field_info[] = { - {"C2H_MM_ERR_INFO_VALID", - C2H_MM_ERR_INFO_VALID_MASK}, - {"C2H_MM_ERR_INFO_SEL", - C2H_MM_ERR_INFO_SEL_MASK}, - {"C2H_MM_ERR_INFO_RSVD_1", - C2H_MM_ERR_INFO_RSVD_1_MASK}, - {"C2H_MM_ERR_INFO_QID", - C2H_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_ctl_field_info[] = { - {"C2H_MM_PERF_MON_CTL_RSVD_1", - C2H_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_START", - C2H_MM_PERF_MON_CTL_IMM_START_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_START", - C2H_MM_PERF_MON_CTL_RUN_START_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_CLEAR", - C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_CLEAR", - C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT0_DCNT", - C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT1_RSVD_1", - C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_DATA_CNT1_DCNT", - C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_dbg_field_info[] = { - {"C2H_MM_RSVD_1", - C2H_MM_RSVD_1_MASK}, - {"C2H_MM_RRQ_ENTRIES", - C2H_MM_RRQ_ENTRIES_MASK}, - {"C2H_MM_DAT_FIFO_SPC", - C2H_MM_DAT_FIFO_SPC_MASK}, - {"C2H_MM_RD_STALL", - C2H_MM_RD_STALL_MASK}, - {"C2H_MM_RRQ_FIFO_FI", - C2H_MM_RRQ_FIFO_FI_MASK}, - {"C2H_MM_WR_STALL", - C2H_MM_WR_STALL_MASK}, - {"C2H_MM_WRQ_FIFO_FI", - C2H_MM_WRQ_FIFO_FI_MASK}, - {"C2H_MM_WBK_STALL", - C2H_MM_WBK_STALL_MASK}, - {"C2H_MM_DSC_FIFO_EP", - C2H_MM_DSC_FIFO_EP_MASK}, - {"C2H_MM_DSC_FIFO_FL", - C2H_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_mm_ctl_field_info[] = { - {"H2C_MM_CTL_RESERVED1", - H2C_MM_CTL_RESERVED1_MASK}, - {"H2C_MM_CTL_ERRC_EN", - H2C_MM_CTL_ERRC_EN_MASK}, - {"H2C_MM_CTL_RESERVED0", - H2C_MM_CTL_RESERVED0_MASK}, - {"H2C_MM_CTL_RUN", - H2C_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_status_field_info[] = { - {"H2C_MM_STATUS_RSVD_1", - H2C_MM_STATUS_RSVD_1_MASK}, - {"H2C_MM_STATUS_RUN", - H2C_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_cmpl_desc_cnt_field_info[] = { - {"H2C_MM_CMPL_DESC_CNT_H2C_CO", - H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_enable_mask_field_info[] = { - {"H2C_MM_ERR_CODE_ENABLE_RESERVED5", - H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED4", - H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED3", - H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED2", - H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED1", - H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_UR_CA", - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED0", - H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_field_info[] = { - {"H2C_MM_ERR_CODE_RSVD_1", - H2C_MM_ERR_CODE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_CIDX", - H2C_MM_ERR_CODE_CIDX_MASK}, - {"H2C_MM_ERR_CODE_RESERVED0", - H2C_MM_ERR_CODE_RESERVED0_MASK}, - {"H2C_MM_ERR_CODE_SUB_TYPE", - H2C_MM_ERR_CODE_SUB_TYPE_MASK}, - {"H2C_MM_ERR_CODE", - H2C_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_info_field_info[] = { - {"H2C_MM_ERR_INFO_VALID", - H2C_MM_ERR_INFO_VALID_MASK}, - {"H2C_MM_ERR_INFO_SEL", - H2C_MM_ERR_INFO_SEL_MASK}, - {"H2C_MM_ERR_INFO_RSVD_1", - H2C_MM_ERR_INFO_RSVD_1_MASK}, - {"H2C_MM_ERR_INFO_QID", - H2C_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_ctl_field_info[] = { - {"H2C_MM_PERF_MON_CTL_RSVD_1", - H2C_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_START", - H2C_MM_PERF_MON_CTL_IMM_START_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_START", - H2C_MM_PERF_MON_CTL_RUN_START_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_CLEAR", - H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_CLEAR", - H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT0_DCNT", - H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT1_RSVD_1", - H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_DATA_CNT1_DCNT", - H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_dbg_field_info[] = { - {"H2C_MM_RSVD_1", - H2C_MM_RSVD_1_MASK}, - {"H2C_MM_RRQ_ENTRIES", - H2C_MM_RRQ_ENTRIES_MASK}, - {"H2C_MM_DAT_FIFO_SPC", - H2C_MM_DAT_FIFO_SPC_MASK}, - {"H2C_MM_RD_STALL", - H2C_MM_RD_STALL_MASK}, - {"H2C_MM_RRQ_FIFO_FI", - H2C_MM_RRQ_FIFO_FI_MASK}, - {"H2C_MM_WR_STALL", - H2C_MM_WR_STALL_MASK}, - {"H2C_MM_WRQ_FIFO_FI", - H2C_MM_WRQ_FIFO_FI_MASK}, - {"H2C_MM_WBK_STALL", - H2C_MM_WBK_STALL_MASK}, - {"H2C_MM_DSC_FIFO_EP", - H2C_MM_DSC_FIFO_EP_MASK}, - {"H2C_MM_DSC_FIFO_FL", - H2C_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_mm_data_throttle_field_info[] = { - {"H2C_MM_DATA_THROTTLE_RSVD_1", - H2C_MM_DATA_THROTTLE_RSVD_1_MASK}, - {"H2C_MM_DATA_THROTTLE_DAT_EN", - H2C_MM_DATA_THROTTLE_DAT_EN_MASK}, - {"H2C_MM_DATA_THROTTLE_DAT", - H2C_MM_DATA_THROTTLE_DAT_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_1_field_info[] = { - {"C2H_CRDT_COAL_CFG_1_RSVD_1", - C2H_CRDT_COAL_CFG_1_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH", - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_1_TIMER_TH", - C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_2_field_info[] = { - {"C2H_CRDT_COAL_CFG_2_RSVD_1", - C2H_CRDT_COAL_CFG_2_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_2_FIFO_TH", - C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_2_RESERVED1", - C2H_CRDT_COAL_CFG_2_RESERVED1_MASK}, - {"C2H_CRDT_COAL_CFG_2_NT_TH", - C2H_CRDT_COAL_CFG_2_NT_TH_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_qid_field_info[] = { - {"C2H_PFCH_BYP_QID_RSVD_1", - C2H_PFCH_BYP_QID_RSVD_1_MASK}, - {"C2H_PFCH_BYP_QID", - C2H_PFCH_BYP_QID_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_tag_field_info[] = { - {"C2H_PFCH_BYP_TAG_RSVD_1", - C2H_PFCH_BYP_TAG_RSVD_1_MASK}, - {"C2H_PFCH_BYP_TAG_BYP_QID", - C2H_PFCH_BYP_TAG_BYP_QID_MASK}, - {"C2H_PFCH_BYP_TAG_RSVD_2", - C2H_PFCH_BYP_TAG_RSVD_2_MASK}, - {"C2H_PFCH_BYP_TAG", - C2H_PFCH_BYP_TAG_MASK}, -}; - - -static struct regfield_info - c2h_water_mark_field_info[] = { - {"C2H_WATER_MARK_HIGH_WM", - C2H_WATER_MARK_HIGH_WM_MASK}, - {"C2H_WATER_MARK_LOW_WM", - C2H_WATER_MARK_LOW_WM_MASK}, -}; - - -static struct regfield_info - c2h_notify_empty_field_info[] = { - {"C2H_NOTIFY_EMPTY_RSVD_1", - C2H_NOTIFY_EMPTY_RSVD_1_MASK}, - {"C2H_NOTIFY_EMPTY_NOE", - C2H_NOTIFY_EMPTY_NOE_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_1_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED_1", - C2H_STAT_S_AXIS_C2H_ACCEPTED_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_1_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_1", - C2H_STAT_S_AXIS_WRB_ACCEPTED_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_1_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_1_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_1_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP_1", - C2H_STAT_AXIS_PKG_CMP_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_2_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED_2", - C2H_STAT_S_AXIS_WRB_ACCEPTED_2_MASK}, -}; - - -static struct regfield_info - c2h_st_pld_fifo_depth_field_info[] = { - {"C2H_ST_PLD_FIFO_DEPTH", - C2H_ST_PLD_FIFO_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_6_field_info[] = { - {"C2H_STAT_DMA_ENG_6_RSVD", - C2H_STAT_DMA_ENG_6_RSVD_MASK}, - {"C2H_STAT_DMA_ENG_6_PLD_ST_FIFO_OUT_DATA_QID", - C2H_STAT_DMA_ENG_6_PLD_ST_FIFO_OUT_DATA_QID_MASK}, - {"C2H_STAT_DMA_ENG_6_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID", - C2H_STAT_DMA_ENG_6_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_MASK}, - {"C2H_STAT_DMA_ENG_6_PLD_PKT_ID_LARGER_PLD_ST", - C2H_STAT_DMA_ENG_6_PLD_PKT_ID_LARGER_PLD_ST_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_7_field_info[] = { - {"C2H_STAT_DMA_ENG_7_RSVD", - C2H_STAT_DMA_ENG_7_RSVD_MASK}, - {"C2H_STAT_DMA_ENG_7_PLD_ST_FIFO_OUT_DATA_QID_1", - C2H_STAT_DMA_ENG_7_PLD_ST_FIFO_OUT_DATA_QID_1_MASK}, - {"C2H_STAT_DMA_ENG_7_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_1", - C2H_STAT_DMA_ENG_7_PLD_STS_FIFO_OUT_DATA_PLD_ST_PKT_ID_1_MASK}, - {"C2H_STAT_DMA_ENG_7_PLD_PKT_ID_LARGER_PLD_ST_1", - C2H_STAT_DMA_ENG_7_PLD_PKT_ID_LARGER_PLD_ST_1_MASK}, -}; - - -static struct regfield_info - c2h_stat_pcie_cmp_1_field_info[] = { - {"C2H_STAT_PCIE_CMP_1_DEPTH", - C2H_STAT_PCIE_CMP_1_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_almost_full_field_info[] = { - {"C2H_PLD_FIFO_ALMOST_FULL_ENABLE", - C2H_PLD_FIFO_ALMOST_FULL_ENABLE_MASK}, - {"C2H_PLD_FIFO_ALMOST_FULL_TH", - C2H_PLD_FIFO_ALMOST_FULL_TH_MASK}, -}; - - -static struct regfield_info - pfch_cfg_3_field_info[] = { - {"PFCH_CFG_3_RSVD", - PFCH_CFG_3_RSVD_MASK}, - {"PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH", - PFCH_CFG_3_VAR_DESC_FL_FREE_CNT_TH_MASK}, - {"PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH", - PFCH_CFG_3_VAR_DESC_LG_PKT_CAM_CN_TH_MASK}, -}; - - -static struct regfield_info - cmpt_cfg_0_field_info[] = { - {"CMPT_CFG_0_RSVD", - CMPT_CFG_0_RSVD_MASK}, - {"CMPT_CFG_0_VIO_SPRS_INT_AFTER_RTY", - CMPT_CFG_0_VIO_SPRS_INT_AFTER_RTY_MASK}, - {"CMPT_CFG_0_VIO_EVNT_SUP_EN", - CMPT_CFG_0_VIO_EVNT_SUP_EN_MASK}, -}; - - -static struct regfield_info - pfch_cfg_4_field_info[] = { - {"PFCH_CFG_4_GLB_EVT_TIMER_TICK", - PFCH_CFG_4_GLB_EVT_TIMER_TICK_MASK}, - {"PFCH_CFG_4_DISABLE_GLB_EVT_TIMER", - PFCH_CFG_4_DISABLE_GLB_EVT_TIMER_MASK}, - {"PFCH_CFG_4_EVT_TIMER_TICK", - PFCH_CFG_4_EVT_TIMER_TICK_MASK}, - {"PFCH_CFG_4_DISABLE_EVT_TIMER", - PFCH_CFG_4_DISABLE_EVT_TIMER_MASK}, -}; - -static struct xreg_info eqdma_config_regs[] = { -{"CFG_BLK_IDENTIFIER", 0x00, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_identifier_field_info), - cfg_blk_identifier_field_info -}, -{"CFG_BLK_PCIE_MAX_PLD_SIZE", 0x08, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_pld_size_field_info), - cfg_blk_pcie_max_pld_size_field_info -}, -{"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", 0x0c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_read_req_size_field_info), - cfg_blk_pcie_max_read_req_size_field_info -}, -{"CFG_BLK_SYSTEM_ID", 0x10, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_system_id_field_info), - cfg_blk_system_id_field_info -}, -{"CFG_BLK_MSIX_ENABLE", 0x014, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msix_enable_field_info), - cfg_blk_msix_enable_field_info -}, -{"CFG_PCIE_DATA_WIDTH", 0x18, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_data_width_field_info), - cfg_pcie_data_width_field_info -}, -{"CFG_PCIE_CTL", 0x1c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_ctl_field_info), - cfg_pcie_ctl_field_info -}, -{"CFG_BLK_MSI_ENABLE", 0x20, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msi_enable_field_info), - cfg_blk_msi_enable_field_info -}, -{"CFG_AXI_USER_MAX_PLD_SIZE", 0x40, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_pld_size_field_info), - cfg_axi_user_max_pld_size_field_info -}, -{"CFG_AXI_USER_MAX_READ_REQ_SIZE", 0x44, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_read_req_size_field_info), - cfg_axi_user_max_read_req_size_field_info -}, -{"CFG_BLK_MISC_CTL", 0x4c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_misc_ctl_field_info), - cfg_blk_misc_ctl_field_info -}, -{"CFG_PL_CRED_CTL", 0x68, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pl_cred_ctl_field_info), - cfg_pl_cred_ctl_field_info -}, -{"CFG_BLK_SCRATCH", 0x80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_field_info), - cfg_blk_scratch_field_info -}, -{"CFG_GIC", 0xa0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_gic_field_info), - cfg_gic_field_info -}, -{"RAM_SBE_MSK_1_A", 0xe0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_1_a_field_info), - ram_sbe_msk_1_a_field_info -}, -{"RAM_SBE_STS_1_A", 0xe4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_1_a_field_info), - ram_sbe_sts_1_a_field_info -}, -{"RAM_DBE_MSK_1_A", 0xe8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_1_a_field_info), - ram_dbe_msk_1_a_field_info -}, -{"RAM_DBE_STS_1_A", 0xec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_1_a_field_info), - ram_dbe_sts_1_a_field_info -}, -{"RAM_SBE_MSK_A", 0xf0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_a_field_info), - ram_sbe_msk_a_field_info -}, -{"RAM_SBE_STS_A", 0xf4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_a_field_info), - ram_sbe_sts_a_field_info -}, -{"RAM_DBE_MSK_A", 0xf8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_a_field_info), - ram_dbe_msk_a_field_info -}, -{"RAM_DBE_STS_A", 0xfc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_a_field_info), - ram_dbe_sts_a_field_info -}, -{"GLBL2_IDENTIFIER", 0x100, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_identifier_field_info), - glbl2_identifier_field_info -}, -{"GLBL2_CHANNEL_INST", 0x114, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_inst_field_info), - glbl2_channel_inst_field_info -}, -{"GLBL2_CHANNEL_MDMA", 0x118, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_mdma_field_info), - glbl2_channel_mdma_field_info -}, -{"GLBL2_CHANNEL_STRM", 0x11c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_strm_field_info), - glbl2_channel_strm_field_info -}, -{"GLBL2_CHANNEL_CAP", 0x120, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_cap_field_info), - glbl2_channel_cap_field_info -}, -{"GLBL2_CHANNEL_PASID_CAP", 0x128, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_pasid_cap_field_info), - glbl2_channel_pasid_cap_field_info -}, -{"GLBL2_SYSTEM_ID", 0x130, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_system_id_field_info), - glbl2_system_id_field_info -}, -{"GLBL2_MISC_CAP", 0x134, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_misc_cap_field_info), - glbl2_misc_cap_field_info -}, -{"GLBL2_RRQ_BRG_THROT", 0x158, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_brg_throt_field_info), - glbl2_rrq_brg_throt_field_info -}, -{"GLBL2_RRQ_PCIE_THROT", 0x15c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_pcie_throt_field_info), - glbl2_rrq_pcie_throt_field_info -}, -{"GLBL2_RRQ_AXIMM_THROT", 0x160, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_aximm_throt_field_info), - glbl2_rrq_aximm_throt_field_info -}, -{"GLBL2_RRQ_PCIE_LAT0", 0x164, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_pcie_lat0_field_info), - glbl2_rrq_pcie_lat0_field_info -}, -{"GLBL2_RRQ_PCIE_LAT1", 0x168, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_pcie_lat1_field_info), - glbl2_rrq_pcie_lat1_field_info -}, -{"GLBL2_RRQ_AXIMM_LAT0", 0x16c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_aximm_lat0_field_info), - glbl2_rrq_aximm_lat0_field_info -}, -{"GLBL2_RRQ_AXIMM_LAT1", 0x170, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_rrq_aximm_lat1_field_info), - glbl2_rrq_aximm_lat1_field_info -}, -{"GLBL2_DBG_PCIE_RQ0", 0x1b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq0_field_info), - glbl2_dbg_pcie_rq0_field_info -}, -{"GLBL2_DBG_PCIE_RQ1", 0x1bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq1_field_info), - glbl2_dbg_pcie_rq1_field_info -}, -{"GLBL2_DBG_AXIMM_WR0", 0x1c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr0_field_info), - glbl2_dbg_aximm_wr0_field_info -}, -{"GLBL2_DBG_AXIMM_WR1", 0x1c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr1_field_info), - glbl2_dbg_aximm_wr1_field_info -}, -{"GLBL2_DBG_AXIMM_RD0", 0x1c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd0_field_info), - glbl2_dbg_aximm_rd0_field_info -}, -{"GLBL2_DBG_AXIMM_RD1", 0x1cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd1_field_info), - glbl2_dbg_aximm_rd1_field_info -}, -{"GLBL2_DBG_FAB0", 0x1d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab0_field_info), - glbl2_dbg_fab0_field_info -}, -{"GLBL2_DBG_FAB1", 0x1d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab1_field_info), - glbl2_dbg_fab1_field_info -}, -{"GLBL2_DBG_MATCH_SEL", 0x1f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_sel_field_info), - glbl2_dbg_match_sel_field_info -}, -{"GLBL2_DBG_MATCH_MSK", 0x1f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_msk_field_info), - glbl2_dbg_match_msk_field_info -}, -{"GLBL2_DBG_MATCH_PAT", 0x1fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_pat_field_info), - glbl2_dbg_match_pat_field_info -}, -{"GLBL_RNG_SZ_1", 0x204, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_1_field_info), - glbl_rng_sz_1_field_info -}, -{"GLBL_RNG_SZ_2", 0x208, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_2_field_info), - glbl_rng_sz_2_field_info -}, -{"GLBL_RNG_SZ_3", 0x20c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_3_field_info), - glbl_rng_sz_3_field_info -}, -{"GLBL_RNG_SZ_4", 0x210, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_4_field_info), - glbl_rng_sz_4_field_info -}, -{"GLBL_RNG_SZ_5", 0x214, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_5_field_info), - glbl_rng_sz_5_field_info -}, -{"GLBL_RNG_SZ_6", 0x218, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_6_field_info), - glbl_rng_sz_6_field_info -}, -{"GLBL_RNG_SZ_7", 0x21c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_7_field_info), - glbl_rng_sz_7_field_info -}, -{"GLBL_RNG_SZ_8", 0x220, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_8_field_info), - glbl_rng_sz_8_field_info -}, -{"GLBL_RNG_SZ_9", 0x224, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_9_field_info), - glbl_rng_sz_9_field_info -}, -{"GLBL_RNG_SZ_A", 0x228, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_a_field_info), - glbl_rng_sz_a_field_info -}, -{"GLBL_RNG_SZ_B", 0x22c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_b_field_info), - glbl_rng_sz_b_field_info -}, -{"GLBL_RNG_SZ_C", 0x230, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_c_field_info), - glbl_rng_sz_c_field_info -}, -{"GLBL_RNG_SZ_D", 0x234, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_d_field_info), - glbl_rng_sz_d_field_info -}, -{"GLBL_RNG_SZ_E", 0x238, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_e_field_info), - glbl_rng_sz_e_field_info -}, -{"GLBL_RNG_SZ_F", 0x23c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_f_field_info), - glbl_rng_sz_f_field_info -}, -{"GLBL_RNG_SZ_10", 0x240, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_10_field_info), - glbl_rng_sz_10_field_info -}, -{"GLBL_ERR_STAT", 0x248, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_stat_field_info), - glbl_err_stat_field_info -}, -{"GLBL_ERR_MASK", 0x24c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_mask_field_info), - glbl_err_mask_field_info -}, -{"GLBL_DSC_CFG", 0x250, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_cfg_field_info), - glbl_dsc_cfg_field_info -}, -{"GLBL_DSC_ERR_STS", 0x254, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_sts_field_info), - glbl_dsc_err_sts_field_info -}, -{"GLBL_DSC_ERR_MSK", 0x258, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_msk_field_info), - glbl_dsc_err_msk_field_info -}, -{"GLBL_DSC_ERR_LOG0", 0x25c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log0_field_info), - glbl_dsc_err_log0_field_info -}, -{"GLBL_DSC_ERR_LOG1", 0x260, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log1_field_info), - glbl_dsc_err_log1_field_info -}, -{"GLBL_TRQ_ERR_STS", 0x264, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_sts_field_info), - glbl_trq_err_sts_field_info -}, -{"GLBL_TRQ_ERR_MSK", 0x268, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_msk_field_info), - glbl_trq_err_msk_field_info -}, -{"GLBL_TRQ_ERR_LOG", 0x26c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_log_field_info), - glbl_trq_err_log_field_info -}, -{"GLBL_DSC_DBG_DAT0", 0x270, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat0_field_info), - glbl_dsc_dbg_dat0_field_info -}, -{"GLBL_DSC_DBG_DAT1", 0x274, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat1_field_info), - glbl_dsc_dbg_dat1_field_info -}, -{"GLBL_DSC_DBG_CTL", 0x278, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_ctl_field_info), - glbl_dsc_dbg_ctl_field_info -}, -{"GLBL_DSC_ERR_LOG2", 0x27c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log2_field_info), - glbl_dsc_err_log2_field_info -}, -{"GLBL_GLBL_INTERRUPT_CFG", 0x2c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_glbl_interrupt_cfg_field_info), - glbl_glbl_interrupt_cfg_field_info -}, -{"GLBL_VCH_HOST_PROFILE", 0x2c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_vch_host_profile_field_info), - glbl_vch_host_profile_field_info -}, -{"GLBL_BRIDGE_HOST_PROFILE", 0x308, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_bridge_host_profile_field_info), - glbl_bridge_host_profile_field_info -}, -{"AXIMM_IRQ_DEST_ADDR", 0x30c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(aximm_irq_dest_addr_field_info), - aximm_irq_dest_addr_field_info -}, -{"FAB_ERR_LOG", 0x314, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(fab_err_log_field_info), - fab_err_log_field_info -}, -{"GLBL_REQ_ERR_STS", 0x318, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_req_err_sts_field_info), - glbl_req_err_sts_field_info -}, -{"GLBL_REQ_ERR_MSK", 0x31c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_req_err_msk_field_info), - glbl_req_err_msk_field_info -}, -{"GLBL_DSC_DBG_LAT0_A", 0x320, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_dbg_lat0_a_field_info), - glbl_dsc_dbg_lat0_a_field_info -}, -{"GLBL_DSC_DBG_LAT1_A", 0x324, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_dbg_lat1_a_field_info), - glbl_dsc_dbg_lat1_a_field_info -}, -{"GLBL_DSC_CRD_CTR0_A", 0x328, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_crd_ctr0_a_field_info), - glbl_dsc_crd_ctr0_a_field_info -}, -{"GLBL_DSC_CRD_CTR1_A", 0x32c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_crd_ctr1_a_field_info), - glbl_dsc_crd_ctr1_a_field_info -}, -{"GLBL_DSC_CRD_CTR2_A", 0x330, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_crd_ctr2_a_field_info), - glbl_dsc_crd_ctr2_a_field_info -}, -{"GLBL_DSC_CRD_CTR3_A", 0x334, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_crd_ctr3_a_field_info), - glbl_dsc_crd_ctr3_a_field_info -}, -{"GLBL_DSC_IMM_CRD_CTR0_A", 0x338, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_imm_crd_ctr0_a_field_info), - glbl_dsc_imm_crd_ctr0_a_field_info -}, -{"GLBL_DSC_IMM_CRD_CTR1_A", 0x33c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_imm_crd_ctr1_a_field_info), - glbl_dsc_imm_crd_ctr1_a_field_info -}, -{"GLBL_DSC_IMM_CRD_CTR2_A", 0x340, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_imm_crd_ctr2_a_field_info), - glbl_dsc_imm_crd_ctr2_a_field_info -}, -{"GLBL_DSC_IMM_CRD_CTR3_A", 0x344, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_imm_crd_ctr3_a_field_info), - glbl_dsc_imm_crd_ctr3_a_field_info -}, -{"GLBL_DSC_H2C_OUT_CTR0_A", 0x348, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_h2c_out_ctr0_a_field_info), - glbl_dsc_h2c_out_ctr0_a_field_info -}, -{"GLBL_DSC_H2C_OUT_CTR1_A", 0x34c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_h2c_out_ctr1_a_field_info), - glbl_dsc_h2c_out_ctr1_a_field_info -}, -{"GLBL_DSC_H2C_OUT_CTR2_A", 0x350, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_h2c_out_ctr2_a_field_info), - glbl_dsc_h2c_out_ctr2_a_field_info -}, -{"GLBL_DSC_H2C_OUT_CTR3_A", 0x354, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_h2c_out_ctr3_a_field_info), - glbl_dsc_h2c_out_ctr3_a_field_info -}, -{"GLBL_DSC_C2H_OUT_CTR0_A", 0x358, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_c2h_out_ctr0_a_field_info), - glbl_dsc_c2h_out_ctr0_a_field_info -}, -{"GLBL_DSC_C2H_OUT_CTR1_A", 0x35c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_c2h_out_ctr1_a_field_info), - glbl_dsc_c2h_out_ctr1_a_field_info -}, -{"GLBL_DSC_C2H_OUT_CTR2_A", 0x360, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_c2h_out_ctr2_a_field_info), - glbl_dsc_c2h_out_ctr2_a_field_info -}, -{"GLBL_DSC_C2H_OUT_CTR3_A", 0x364, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_dsc_c2h_out_ctr3_a_field_info), - glbl_dsc_c2h_out_ctr3_a_field_info -}, -{"T", 0x368, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(t_field_info), - t_field_info -}, -{"GLBL_PERF_CNTR_CTL_A1", 0x36c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_perf_cntr_ctl_a1_field_info), - glbl_perf_cntr_ctl_a1_field_info -}, -{"GLBL_FREE_CNT_A0", 0x370, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_free_cnt_a0_field_info), - glbl_free_cnt_a0_field_info -}, -{"GLBL_FREE_CNT_A1", 0x374, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_free_cnt_a1_field_info), - glbl_free_cnt_a1_field_info -}, -{"GLBL_AXIS_H2C_CNT_A0", 0x378, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a0_field_info), - glbl_axis_h2c_cnt_a0_field_info -}, -{"GLBL_AXIS_H2C_CNT_A1", 0x37c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a1_field_info), - glbl_axis_h2c_cnt_a1_field_info -}, -{"GLBL_AXIS_H2C_CNT_A2", 0x380, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a2_field_info), - glbl_axis_h2c_cnt_a2_field_info -}, -{"GLBL_AXIS_H2C_CNT_A3", 0x384, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a3_field_info), - glbl_axis_h2c_cnt_a3_field_info -}, -{"GLBL_AXIS_H2C_CNT_A4", 0x388, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a4_field_info), - glbl_axis_h2c_cnt_a4_field_info -}, -{"GLBL_AXIS_H2C_CNT_A5", 0x38c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_h2c_cnt_a5_field_info), - glbl_axis_h2c_cnt_a5_field_info -}, -{"GLBL_AXIS_C2H_CNT_A0", 0x390, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a0_field_info), - glbl_axis_c2h_cnt_a0_field_info -}, -{"GLBL_AXIS_C2H_CNT_A1", 0x394, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a1_field_info), - glbl_axis_c2h_cnt_a1_field_info -}, -{"GLBL_AXIS_C2H_CNT_A2", 0x398, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a2_field_info), - glbl_axis_c2h_cnt_a2_field_info -}, -{"GLBL_AXIS_C2H_CNT_A3", 0x39c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a3_field_info), - glbl_axis_c2h_cnt_a3_field_info -}, -{"GLBL_AXIS_C2H_CNT_A4", 0x3a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a4_field_info), - glbl_axis_c2h_cnt_a4_field_info -}, -{"GLBL_AXIS_C2H_CNT_A5", 0x3a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_axis_c2h_cnt_a5_field_info), - glbl_axis_c2h_cnt_a5_field_info -}, -{"GLBL_M_AXI_WR_CNT_A0", 0x3a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a0_field_info), - glbl_m_axi_wr_cnt_a0_field_info -}, -{"GLBL_M_AXI_WR_CNT_A1", 0x3ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a1_field_info), - glbl_m_axi_wr_cnt_a1_field_info -}, -{"GLBL_M_AXI_WR_CNT_A2", 0x3b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a2_field_info), - glbl_m_axi_wr_cnt_a2_field_info -}, -{"GLBL_M_AXI_WR_CNT_A3", 0x3b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a3_field_info), - glbl_m_axi_wr_cnt_a3_field_info -}, -{"GLBL_M_AXI_WR_CNT_A4", 0x3b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a4_field_info), - glbl_m_axi_wr_cnt_a4_field_info -}, -{"GLBL_M_AXI_WR_CNT_A5", 0x3bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_wr_cnt_a5_field_info), - glbl_m_axi_wr_cnt_a5_field_info -}, -{"GLBL_M_AXI_RD_CNT_A0", 0x3c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a0_field_info), - glbl_m_axi_rd_cnt_a0_field_info -}, -{"GLBL_M_AXI_RD_CNT_A1", 0x3c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a1_field_info), - glbl_m_axi_rd_cnt_a1_field_info -}, -{"GLBL_M_AXI_RD_CNT_A2", 0x3c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a2_field_info), - glbl_m_axi_rd_cnt_a2_field_info -}, -{"GLBL_M_AXI_RD_CNT_A3", 0x3cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a3_field_info), - glbl_m_axi_rd_cnt_a3_field_info -}, -{"GLBL_M_AXI_RD_CNT_A4", 0x3d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a4_field_info), - glbl_m_axi_rd_cnt_a4_field_info -}, -{"GLBL_M_AXI_RD_CNT_A5", 0x3d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axi_rd_cnt_a5_field_info), - glbl_m_axi_rd_cnt_a5_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A0", 0x3d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a0_field_info), - glbl_m_axib_wr_cnt_a0_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A1", 0x3dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a1_field_info), - glbl_m_axib_wr_cnt_a1_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A2", 0x3e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a2_field_info), - glbl_m_axib_wr_cnt_a2_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A3", 0x3e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a3_field_info), - glbl_m_axib_wr_cnt_a3_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A4", 0x3e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a4_field_info), - glbl_m_axib_wr_cnt_a4_field_info -}, -{"GLBL_M_AXIB_WR_CNT_A5", 0x3ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_wr_cnt_a5_field_info), - glbl_m_axib_wr_cnt_a5_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A0", 0x3f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a0_field_info), - glbl_m_axib_rd_cnt_a0_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A1", 0x3f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a1_field_info), - glbl_m_axib_rd_cnt_a1_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A2", 0x3f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a2_field_info), - glbl_m_axib_rd_cnt_a2_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A3", 0x3fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a3_field_info), - glbl_m_axib_rd_cnt_a3_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A4", 0x400, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a4_field_info), - glbl_m_axib_rd_cnt_a4_field_info -}, -{"GLBL_M_AXIB_RD_CNT_A5", 0x404, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_m_axib_rd_cnt_a5_field_info), - glbl_m_axib_rd_cnt_a5_field_info -}, -{"GLBL_S_AXI_WR_CNT_A0", 0x408, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a0_field_info), - glbl_s_axi_wr_cnt_a0_field_info -}, -{"GLBL_S_AXI_WR_CNT_A1", 0x40c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a1_field_info), - glbl_s_axi_wr_cnt_a1_field_info -}, -{"GLBL_S_AXI_WR_CNT_A2", 0x410, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a2_field_info), - glbl_s_axi_wr_cnt_a2_field_info -}, -{"GLBL_S_AXI_WR_CNT_A3", 0x414, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a3_field_info), - glbl_s_axi_wr_cnt_a3_field_info -}, -{"GLBL_S_AXI_WR_CNT_A4", 0x418, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a4_field_info), - glbl_s_axi_wr_cnt_a4_field_info -}, -{"GLBL_S_AXI_WR_CNT_A5", 0x41c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_wr_cnt_a5_field_info), - glbl_s_axi_wr_cnt_a5_field_info -}, -{"GLBL_S_AXI_RD_CNT_A0", 0x420, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a0_field_info), - glbl_s_axi_rd_cnt_a0_field_info -}, -{"GLBL_S_AXI_RD_CNT_A1", 0x424, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a1_field_info), - glbl_s_axi_rd_cnt_a1_field_info -}, -{"GLBL_S_AXI_RD_CNT_A2", 0x428, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a2_field_info), - glbl_s_axi_rd_cnt_a2_field_info -}, -{"GLBL_S_AXI_RD_CNT_A3", 0x42c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a3_field_info), - glbl_s_axi_rd_cnt_a3_field_info -}, -{"GLBL_S_AXI_RD_CNT_A4", 0x430, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a4_field_info), - glbl_s_axi_rd_cnt_a4_field_info -}, -{"GLBL_S_AXI_RD_CNT_A5", 0x434, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axi_rd_cnt_a5_field_info), - glbl_s_axi_rd_cnt_a5_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A0", 0x438, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a0_field_info), - glbl_s_axis_cmp_cnt_a0_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A1", 0x43c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a1_field_info), - glbl_s_axis_cmp_cnt_a1_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A2", 0x440, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a2_field_info), - glbl_s_axis_cmp_cnt_a2_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A3", 0x444, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a3_field_info), - glbl_s_axis_cmp_cnt_a3_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A4", 0x448, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a4_field_info), - glbl_s_axis_cmp_cnt_a4_field_info -}, -{"GLBL_S_AXIS_CMP_CNT_A5", 0x44c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_s_axis_cmp_cnt_a5_field_info), - glbl_s_axis_cmp_cnt_a5_field_info -}, -{"IND_CTXT_DATA", 0x804, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_field_info), - ind_ctxt_data_field_info -}, -{"IND_CTXT_MASK", 0x824, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_mask_field_info), - ind_ctxt_mask_field_info -}, -{"IND_CTXT_CMD", 0x844, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_cmd_field_info), - ind_ctxt_cmd_field_info -}, -{"C2H_TIMER_CNT", 0xa00, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_field_info), - c2h_timer_cnt_field_info -}, -{"C2H_CNT_TH", 0xa40, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_field_info), - c2h_cnt_th_field_info -}, -{"C2H_PFCH_CFG_1", 0xa80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_pfch_cfg_1_field_info), - c2h_pfch_cfg_1_field_info -}, -{"C2H_PFCH_CFG_2", 0xa84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_pfch_cfg_2_field_info), - c2h_pfch_cfg_2_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xa88, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_field_info), - c2h_stat_s_axis_c2h_accepted_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED", 0xa8c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_field_info), - c2h_stat_s_axis_wrb_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xa90, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_field_info), - c2h_stat_desc_rsp_pkt_accepted_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP", 0xa94, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_field_info), - c2h_stat_axis_pkg_cmp_field_info -}, -{"C2H_STAT_DESC_RSP_ACCEPTED", 0xa98, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_accepted_field_info), - c2h_stat_desc_rsp_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_CMP", 0xa9c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_cmp_field_info), - c2h_stat_desc_rsp_cmp_field_info -}, -{"C2H_STAT_WRQ_OUT", 0xaa0, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wrq_out_field_info), - c2h_stat_wrq_out_field_info -}, -{"C2H_STAT_WPL_REN_ACCEPTED", 0xaa4, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wpl_ren_accepted_field_info), - c2h_stat_wpl_ren_accepted_field_info -}, -{"C2H_STAT_TOTAL_WRQ_LEN", 0xaa8, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wrq_len_field_info), - c2h_stat_total_wrq_len_field_info -}, -{"C2H_STAT_TOTAL_WPL_LEN", 0xaac, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wpl_len_field_info), - c2h_stat_total_wpl_len_field_info -}, -{"C2H_BUF_SZ", 0xab0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_field_info), - c2h_buf_sz_field_info -}, -{"C2H_ERR_STAT", 0xaf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_stat_field_info), - c2h_err_stat_field_info -}, -{"C2H_ERR_MASK", 0xaf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_mask_field_info), - c2h_err_mask_field_info -}, -{"C2H_FATAL_ERR_STAT", 0xaf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_stat_field_info), - c2h_fatal_err_stat_field_info -}, -{"C2H_FATAL_ERR_MASK", 0xafc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_mask_field_info), - c2h_fatal_err_mask_field_info -}, -{"C2H_FATAL_ERR_ENABLE", 0xb00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_enable_field_info), - c2h_fatal_err_enable_field_info -}, -{"GLBL_ERR_INT", 0xb04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_int_field_info), - glbl_err_int_field_info -}, -{"C2H_PFCH_CFG", 0xb08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_field_info), - c2h_pfch_cfg_field_info -}, -{"C2H_INT_TIMER_TICK", 0xb0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_timer_tick_field_info), - c2h_int_timer_tick_field_info -}, -{"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xb10, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_drop_accepted_field_info), - c2h_stat_desc_rsp_drop_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xb14, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_err_accepted_field_info), - c2h_stat_desc_rsp_err_accepted_field_info -}, -{"C2H_STAT_DESC_REQ", 0xb18, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_req_field_info), - c2h_stat_desc_req_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_0", 0xb1c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_0_field_info), - c2h_stat_dbg_dma_eng_0_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_1", 0xb20, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_1_field_info), - c2h_stat_dbg_dma_eng_1_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_2", 0xb24, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_2_field_info), - c2h_stat_dbg_dma_eng_2_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_3", 0xb28, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_3_field_info), - c2h_stat_dbg_dma_eng_3_field_info -}, -{"C2H_DBG_PFCH_ERR_CTXT", 0xb2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_err_ctxt_field_info), - c2h_dbg_pfch_err_ctxt_field_info -}, -{"C2H_FIRST_ERR_QID", 0xb30, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_first_err_qid_field_info), - c2h_first_err_qid_field_info -}, -{"STAT_NUM_WRB_IN", 0xb34, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_in_field_info), - stat_num_wrb_in_field_info -}, -{"STAT_NUM_WRB_OUT", 0xb38, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_out_field_info), - stat_num_wrb_out_field_info -}, -{"STAT_NUM_WRB_DRP", 0xb3c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_drp_field_info), - stat_num_wrb_drp_field_info -}, -{"STAT_NUM_STAT_DESC_OUT", 0xb40, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_stat_desc_out_field_info), - stat_num_stat_desc_out_field_info -}, -{"STAT_NUM_DSC_CRDT_SENT", 0xb44, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_dsc_crdt_sent_field_info), - stat_num_dsc_crdt_sent_field_info -}, -{"STAT_NUM_FCH_DSC_RCVD", 0xb48, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_fch_dsc_rcvd_field_info), - stat_num_fch_dsc_rcvd_field_info -}, -{"STAT_NUM_BYP_DSC_RCVD", 0xb4c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_byp_dsc_rcvd_field_info), - stat_num_byp_dsc_rcvd_field_info -}, -{"C2H_WRB_COAL_CFG", 0xb50, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_cfg_field_info), - c2h_wrb_coal_cfg_field_info -}, -{"C2H_INTR_H2C_REQ", 0xb54, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_h2c_req_field_info), - c2h_intr_h2c_req_field_info -}, -{"C2H_INTR_C2H_MM_REQ", 0xb58, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_mm_req_field_info), - c2h_intr_c2h_mm_req_field_info -}, -{"C2H_INTR_ERR_INT_REQ", 0xb5c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_err_int_req_field_info), - c2h_intr_err_int_req_field_info -}, -{"C2H_INTR_C2H_ST_REQ", 0xb60, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_req_field_info), - c2h_intr_c2h_st_req_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK", 0xb64, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_ack_field_info), - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL", 0xb68, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_fail_field_info), - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX", 0xb6c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info), - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL", 0xb70, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info), - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_ACK", 0xb74, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_ack_field_info), - c2h_intr_c2h_st_msix_ack_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_FAIL", 0xb78, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_fail_field_info), - c2h_intr_c2h_st_msix_fail_field_info -}, -{"C2H_INTR_C2H_ST_NO_MSIX", 0xb7c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_no_msix_field_info), - c2h_intr_c2h_st_no_msix_field_info -}, -{"C2H_INTR_C2H_ST_CTXT_INVAL", 0xb80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_ctxt_inval_field_info), - c2h_intr_c2h_st_ctxt_inval_field_info -}, -{"C2H_STAT_WR_CMP", 0xb84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wr_cmp_field_info), - c2h_stat_wr_cmp_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_4", 0xb88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_4_field_info), - c2h_stat_dbg_dma_eng_4_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_5", 0xb8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_5_field_info), - c2h_stat_dbg_dma_eng_5_field_info -}, -{"C2H_DBG_PFCH_QID", 0xb90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_qid_field_info), - c2h_dbg_pfch_qid_field_info -}, -{"C2H_DBG_PFCH", 0xb94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_field_info), - c2h_dbg_pfch_field_info -}, -{"C2H_INT_DBG", 0xb98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_dbg_field_info), - c2h_int_dbg_field_info -}, -{"C2H_STAT_IMM_ACCEPTED", 0xb9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_imm_accepted_field_info), - c2h_stat_imm_accepted_field_info -}, -{"C2H_STAT_MARKER_ACCEPTED", 0xba0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_marker_accepted_field_info), - c2h_stat_marker_accepted_field_info -}, -{"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xba4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_disable_cmp_accepted_field_info), - c2h_stat_disable_cmp_accepted_field_info -}, -{"C2H_PLD_FIFO_CRDT_CNT", 0xba8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_crdt_cnt_field_info), - c2h_pld_fifo_crdt_cnt_field_info -}, -{"C2H_INTR_DYN_REQ", 0xbac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_req_field_info), - c2h_intr_dyn_req_field_info -}, -{"C2H_INTR_DYN_MISC", 0xbb0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_misc_field_info), - c2h_intr_dyn_misc_field_info -}, -{"C2H_DROP_LEN_MISMATCH", 0xbb4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_len_mismatch_field_info), - c2h_drop_len_mismatch_field_info -}, -{"C2H_DROP_DESC_RSP_LEN", 0xbb8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_desc_rsp_len_field_info), - c2h_drop_desc_rsp_len_field_info -}, -{"C2H_DROP_QID_FIFO_LEN", 0xbbc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_qid_fifo_len_field_info), - c2h_drop_qid_fifo_len_field_info -}, -{"C2H_DROP_PLD_CNT", 0xbc0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_field_info), - c2h_drop_pld_cnt_field_info -}, -{"C2H_CMPT_FORMAT_0", 0xbc4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_0_field_info), - c2h_cmpt_format_0_field_info -}, -{"C2H_CMPT_FORMAT_1", 0xbc8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_1_field_info), - c2h_cmpt_format_1_field_info -}, -{"C2H_CMPT_FORMAT_2", 0xbcc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_2_field_info), - c2h_cmpt_format_2_field_info -}, -{"C2H_CMPT_FORMAT_3", 0xbd0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_3_field_info), - c2h_cmpt_format_3_field_info -}, -{"C2H_CMPT_FORMAT_4", 0xbd4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_4_field_info), - c2h_cmpt_format_4_field_info -}, -{"C2H_CMPT_FORMAT_5", 0xbd8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_5_field_info), - c2h_cmpt_format_5_field_info -}, -{"C2H_CMPT_FORMAT_6", 0xbdc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_6_field_info), - c2h_cmpt_format_6_field_info -}, -{"C2H_PFCH_CACHE_DEPTH", 0xbe0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cache_depth_field_info), - c2h_pfch_cache_depth_field_info -}, -{"C2H_WRB_COAL_BUF_DEPTH", 0xbe4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_buf_depth_field_info), - c2h_wrb_coal_buf_depth_field_info -}, -{"C2H_PFCH_CRDT", 0xbe8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_crdt_field_info), - c2h_pfch_crdt_field_info -}, -{"C2H_STAT_HAS_CMPT_ACCEPTED", 0xbec, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_cmpt_accepted_field_info), - c2h_stat_has_cmpt_accepted_field_info -}, -{"C2H_STAT_HAS_PLD_ACCEPTED", 0xbf0, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_pld_accepted_field_info), - c2h_stat_has_pld_accepted_field_info -}, -{"C2H_PLD_PKT_ID", 0xbf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_field_info), - c2h_pld_pkt_id_field_info -}, -{"C2H_PLD_PKT_ID_1", 0xbf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_1_field_info), - c2h_pld_pkt_id_1_field_info -}, -{"C2H_DROP_PLD_CNT_1", 0xbfc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_1_field_info), - c2h_drop_pld_cnt_1_field_info -}, -{"H2C_ERR_STAT", 0xe00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_stat_field_info), - h2c_err_stat_field_info -}, -{"H2C_ERR_MASK", 0xe04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_mask_field_info), - h2c_err_mask_field_info -}, -{"H2C_FIRST_ERR_QID", 0xe08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_first_err_qid_field_info), - h2c_first_err_qid_field_info -}, -{"H2C_DBG_REG0", 0xe0c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg0_field_info), - h2c_dbg_reg0_field_info -}, -{"H2C_DBG_REG1", 0xe10, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg1_field_info), - h2c_dbg_reg1_field_info -}, -{"H2C_DBG_REG2", 0xe14, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg2_field_info), - h2c_dbg_reg2_field_info -}, -{"H2C_DBG_REG3", 0xe18, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg3_field_info), - h2c_dbg_reg3_field_info -}, -{"H2C_DBG_REG4", 0xe1c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg4_field_info), - h2c_dbg_reg4_field_info -}, -{"H2C_FATAL_ERR_EN", 0xe20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_fatal_err_en_field_info), - h2c_fatal_err_en_field_info -}, -{"H2C_REQ_THROT_PCIE", 0xe24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_pcie_field_info), - h2c_req_throt_pcie_field_info -}, -{"H2C_ALN_DBG_REG0", 0xe28, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_aln_dbg_reg0_field_info), - h2c_aln_dbg_reg0_field_info -}, -{"H2C_REQ_THROT_AXIMM", 0xe2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_aximm_field_info), - h2c_req_throt_aximm_field_info -}, -{"C2H_MM_CTL", 0x1004, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_ctl_field_info), - c2h_mm_ctl_field_info -}, -{"C2H_MM_STATUS", 0x1040, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_status_field_info), - c2h_mm_status_field_info -}, -{"C2H_MM_CMPL_DESC_CNT", 0x1048, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_cmpl_desc_cnt_field_info), - c2h_mm_cmpl_desc_cnt_field_info -}, -{"C2H_MM_ERR_CODE_ENABLE_MASK", 0x1054, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_enable_mask_field_info), - c2h_mm_err_code_enable_mask_field_info -}, -{"C2H_MM_ERR_CODE", 0x1058, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_field_info), - c2h_mm_err_code_field_info -}, -{"C2H_MM_ERR_INFO", 0x105c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_info_field_info), - c2h_mm_err_info_field_info -}, -{"C2H_MM_PERF_MON_CTL", 0x10c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_ctl_field_info), - c2h_mm_perf_mon_ctl_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT0", 0x10c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt0_field_info), - c2h_mm_perf_mon_cycle_cnt0_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT1", 0x10c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt1_field_info), - c2h_mm_perf_mon_cycle_cnt1_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT0", 0x10cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt0_field_info), - c2h_mm_perf_mon_data_cnt0_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT1", 0x10d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt1_field_info), - c2h_mm_perf_mon_data_cnt1_field_info -}, -{"C2H_MM_DBG", 0x10e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_dbg_field_info), - c2h_mm_dbg_field_info -}, -{"H2C_MM_CTL", 0x1204, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_ctl_field_info), - h2c_mm_ctl_field_info -}, -{"H2C_MM_STATUS", 0x1240, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_status_field_info), - h2c_mm_status_field_info -}, -{"H2C_MM_CMPL_DESC_CNT", 0x1248, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_cmpl_desc_cnt_field_info), - h2c_mm_cmpl_desc_cnt_field_info -}, -{"H2C_MM_ERR_CODE_ENABLE_MASK", 0x1254, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_enable_mask_field_info), - h2c_mm_err_code_enable_mask_field_info -}, -{"H2C_MM_ERR_CODE", 0x1258, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_field_info), - h2c_mm_err_code_field_info -}, -{"H2C_MM_ERR_INFO", 0x125c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_info_field_info), - h2c_mm_err_info_field_info -}, -{"H2C_MM_PERF_MON_CTL", 0x12c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_ctl_field_info), - h2c_mm_perf_mon_ctl_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT0", 0x12c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt0_field_info), - h2c_mm_perf_mon_cycle_cnt0_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT1", 0x12c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt1_field_info), - h2c_mm_perf_mon_cycle_cnt1_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT0", 0x12cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt0_field_info), - h2c_mm_perf_mon_data_cnt0_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT1", 0x12d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt1_field_info), - h2c_mm_perf_mon_data_cnt1_field_info -}, -{"H2C_MM_DBG", 0x12e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_dbg_field_info), - h2c_mm_dbg_field_info -}, -{"H2C_MM_DATA_THROTTLE", 0x12ec, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_data_throttle_field_info), - h2c_mm_data_throttle_field_info -}, -{"C2H_CRDT_COAL_CFG_1", 0x1400, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_1_field_info), - c2h_crdt_coal_cfg_1_field_info -}, -{"C2H_CRDT_COAL_CFG_2", 0x1404, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_2_field_info), - c2h_crdt_coal_cfg_2_field_info -}, -{"C2H_PFCH_BYP_QID", 0x1408, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_qid_field_info), - c2h_pfch_byp_qid_field_info -}, -{"C2H_PFCH_BYP_TAG", 0x140c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_tag_field_info), - c2h_pfch_byp_tag_field_info -}, -{"C2H_WATER_MARK", 0x1410, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_water_mark_field_info), - c2h_water_mark_field_info -}, -{"C2H_NOTIFY_EMPTY", 0x1450, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_notify_empty_field_info), - c2h_notify_empty_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED_1", 0x1454, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_1_field_info), - c2h_stat_s_axis_c2h_accepted_1_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED_1", 0x1458, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_1_field_info), - c2h_stat_s_axis_wrb_accepted_1_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED_1", 0x145c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_1_field_info), - c2h_stat_desc_rsp_pkt_accepted_1_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP_1", 0x1460, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_1_field_info), - c2h_stat_axis_pkg_cmp_1_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED_2", 0x1464, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_2_field_info), - c2h_stat_s_axis_wrb_accepted_2_field_info -}, -{"C2H_ST_PLD_FIFO_DEPTH", 0x1468, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_st_pld_fifo_depth_field_info), - c2h_st_pld_fifo_depth_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_6", 0x146c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_6_field_info), - c2h_stat_dbg_dma_eng_6_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_7", 0x1470, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_7_field_info), - c2h_stat_dbg_dma_eng_7_field_info -}, -{"C2H_STAT_PCIE_CMP_1", 0x1474, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_pcie_cmp_1_field_info), - c2h_stat_pcie_cmp_1_field_info -}, -{"C2H_PLD_FIFO_ALMOST_FULL", 0x1478, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_almost_full_field_info), - c2h_pld_fifo_almost_full_field_info -}, -{"PFCH_CFG_3", 0x147c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(pfch_cfg_3_field_info), - pfch_cfg_3_field_info -}, -{"CMPT_CFG_0", 0x1480, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cmpt_cfg_0_field_info), - cmpt_cfg_0_field_info -}, -{"PFCH_CFG_4", 0x1484, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(pfch_cfg_4_field_info), - pfch_cfg_4_field_info -}, - -}; - -uint32_t eqdma_config_num_regs_get(void) -{ - return (sizeof(eqdma_config_regs)/ - sizeof(eqdma_config_regs[0])); -} - -struct xreg_info *eqdma_config_regs_get(void) -{ - return eqdma_config_regs; -} - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_common.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_common.c deleted file mode 100755 index 6b468d5..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_common.c +++ /dev/null @@ -1,1514 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "qdma_access_common.h" -#include "qdma_platform.h" -#include "qdma_soft_reg.h" -#include "qdma_soft_access.h" -#include "qdma_cpm4_access/qdma_cpm4_access.h" -#include "eqdma_soft_access.h" -#include "eqdma_cpm5_access/eqdma_cpm5_access.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_access_common.tmh" -#endif - -/* qdma version info */ -#define RTL_BASE_VERSION 2 -#define RTL_PATCH_VERSION 3 - -/** - * enum qdma_ip - To hold ip type - */ -enum qdma_ip { - QDMA_OR_VERSAL_IP, - EQDMA_IP, - EQDMA_CPM5_IP -}; - - -/* - * hw_monitor_reg() - polling a register repeatly until - * (the register value & mask) == val or time is up - * - * return -QDMA_BUSY_IIMEOUT_ERR if register value didn't match, 0 other wise - */ -int hw_monitor_reg(void *dev_hndl, uint32_t reg, uint32_t mask, - uint32_t val, uint32_t interval_us, uint32_t timeout_us) -{ - int count; - uint32_t v; - - if (!interval_us) - interval_us = QDMA_REG_POLL_DFLT_INTERVAL_US; - if (!timeout_us) - timeout_us = QDMA_REG_POLL_DFLT_TIMEOUT_US; - - count = timeout_us / interval_us; - - do { - v = qdma_reg_read(dev_hndl, reg); - if ((v & mask) == val) - return QDMA_SUCCESS; - qdma_udelay(interval_us); - } while (--count); - - v = qdma_reg_read(dev_hndl, reg); - if ((v & mask) == val) - return QDMA_SUCCESS; - - qdma_log_error("%s: Reg read=%u Expected=%u, err:%d\n", - __func__, v, val, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; -} - -/*****************************************************************************/ -/** - * qdma_get_rtl_version() - Function to get the rtl_version in - * string format - * - * @rtl_version: Vivado release ID - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_rtl_version(enum qdma_rtl_version rtl_version) -{ - switch (rtl_version) { - case QDMA_RTL_PATCH: - return "RTL Patch"; - case QDMA_RTL_BASE: - return "RTL Base"; - default: - qdma_log_error("%s: invalid rtl_version(%d), err:%d\n", - __func__, rtl_version, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_ip_type() - Function to get the ip type in string format - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: IP Type - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_ip_type(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type) -{ - uint32_t ip_version; - int rv = QDMA_SUCCESS; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return NULL; - } - - switch (ip_type) { - case QDMA_VERSAL_HARD_IP: - return "Versal Hard IP"; - case QDMA_VERSAL_SOFT_IP: - return "Versal Soft IP"; - case QDMA_SOFT_IP: - return "QDMA Soft IP"; - case EQDMA_SOFT_IP: - rv = eqdma_get_ip_version(dev_hndl, is_vf, &ip_version); - if (rv != QDMA_SUCCESS) - return NULL; - - if (ip_version == EQDMA_IP_VERSION_4) - return "EQDMA4.0 Soft IP"; - else if (ip_version == EQDMA_IP_VERSION_5) - return "EQDMA5.0 Soft IP"; - - qdma_log_error("%s: invalid eqdma ip version(%d), err:%d\n", - __func__, ip_version, -QDMA_ERR_INV_PARAM); - return NULL; - default: - qdma_log_error("%s: invalid ip type(%d), err:%d\n", - __func__, ip_type, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_device_type() - Function to get the device type in - * string format - * - * @device_type: Device Type - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_device_type(enum qdma_device_type device_type) -{ - switch (device_type) { - case QDMA_DEVICE_SOFT: - return "Soft IP"; - case QDMA_DEVICE_VERSAL_CPM4: - return "Versal CPM4 Hard IP"; - case QDMA_DEVICE_VERSAL_CPM5: - return "Versal Hard CPM5"; - default: - qdma_log_error("%s: invalid device type(%d), err:%d\n", - __func__, device_type, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_vivado_release_id() - Function to get the vivado release id in - * string format - * - * @vivado_release_id: Vivado release ID - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_vivado_release_id( - enum qdma_vivado_release_id vivado_release_id) -{ - switch (vivado_release_id) { - case QDMA_VIVADO_2018_3: - return "vivado 2018.3"; - case QDMA_VIVADO_2019_1: - return "vivado 2019.1"; - case QDMA_VIVADO_2019_2: - return "vivado 2019.2"; - case QDMA_VIVADO_2020_1: - return "vivado 2020.1"; - case QDMA_VIVADO_2020_2: - return "vivado 2020.2"; - case QDMA_VIVADO_2021_1: - return "vivado 2021.1"; - case QDMA_VIVADO_2022_1: - return "vivado 2022.1"; - default: - qdma_log_error("%s: invalid vivado_release_id(%d), err:%d\n", - __func__, - vivado_release_id, - -QDMA_ERR_INV_PARAM); - return NULL; - } -} - - -void qdma_write_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, const uint32_t *values) -{ - uint32_t index, reg_addr; - - for (index = idx; index < (idx + cnt); index++) { - reg_addr = reg_offst + (index * sizeof(uint32_t)); - qdma_reg_write(dev_hndl, reg_addr, values[index - idx]); - } -} - -void qdma_read_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, uint32_t *values) -{ - uint32_t index, reg_addr; - - reg_addr = reg_offst + (idx * sizeof(uint32_t)); - for (index = 0; index < cnt; index++) { - values[index] = qdma_reg_read(dev_hndl, reg_addr + - (index * sizeof(uint32_t))); - } -} - -void qdma_fetch_version_details(void *dev_hndl, uint8_t is_vf, - uint32_t version_reg_val, struct qdma_hw_version_info *version_info) -{ - uint32_t rtl_version, vivado_release_id, ip_type, device_type; - const char *version_str; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return; - } - - if (!is_vf) { - rtl_version = FIELD_GET(QDMA_GLBL2_RTL_VERSION_MASK, - version_reg_val); - vivado_release_id = - FIELD_GET(QDMA_GLBL2_VIVADO_RELEASE_MASK, - version_reg_val); - device_type = FIELD_GET(QDMA_GLBL2_DEVICE_ID_MASK, - version_reg_val); - ip_type = FIELD_GET(QDMA_GLBL2_VERSAL_IP_MASK, - version_reg_val); - } else { - rtl_version = - FIELD_GET(QDMA_GLBL2_VF_RTL_VERSION_MASK, - version_reg_val); - vivado_release_id = - FIELD_GET(QDMA_GLBL2_VF_VIVADO_RELEASE_MASK, - version_reg_val); - device_type = FIELD_GET(QDMA_GLBL2_VF_DEVICE_ID_MASK, - version_reg_val); - ip_type = - FIELD_GET(QDMA_GLBL2_VF_VERSAL_IP_MASK, - version_reg_val); - } - - switch (rtl_version) { - case 0: - version_info->rtl_version = QDMA_RTL_BASE; - break; - case 1: - version_info->rtl_version = QDMA_RTL_PATCH; - break; - default: - version_info->rtl_version = QDMA_RTL_NONE; - break; - } - - version_str = qdma_get_rtl_version(version_info->rtl_version); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_rtl_version_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - switch (device_type) { - case 0: - version_info->device_type = QDMA_DEVICE_SOFT; - break; - case 1: - version_info->device_type = QDMA_DEVICE_VERSAL_CPM4; - break; - case 2: - version_info->device_type = QDMA_DEVICE_VERSAL_CPM5; - break; - default: - version_info->device_type = QDMA_DEVICE_NONE; - break; - } - - version_str = qdma_get_device_type(version_info->device_type); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_device_type_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - - if (version_info->device_type == QDMA_DEVICE_SOFT) { - switch (ip_type) { - case 0: - version_info->ip_type = QDMA_SOFT_IP; - break; - case 1: - case 2: - /* For QDMA4.0 and QDMA5.0, HW design and - * register map is same except some - * performance optimizations - */ - version_info->ip_type = EQDMA_SOFT_IP; - break; - default: - version_info->ip_type = QDMA_NONE_IP; - } - } else { - switch (ip_type) { - case 0: - version_info->ip_type = QDMA_VERSAL_HARD_IP; - break; - case 1: - version_info->ip_type = QDMA_VERSAL_SOFT_IP; - break; - default: - version_info->ip_type = QDMA_NONE_IP; - } - } - - version_str = qdma_get_ip_type(dev_hndl, is_vf, version_info->ip_type); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_ip_type_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - if (version_info->ip_type == QDMA_SOFT_IP) { - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2018_3; - break; - case 1: - version_info->vivado_release = QDMA_VIVADO_2019_1; - break; - case 2: - version_info->vivado_release = QDMA_VIVADO_2019_2; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } else if (version_info->ip_type == EQDMA_SOFT_IP) { - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2020_1; - break; - case 1: - version_info->vivado_release = QDMA_VIVADO_2020_2; - break; - case 2: - version_info->vivado_release = QDMA_VIVADO_2022_1; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } else if (version_info->device_type == QDMA_DEVICE_VERSAL_CPM5) { - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2021_1; - break; - case 1: - version_info->vivado_release = QDMA_VIVADO_2022_1; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } else { /* Versal case */ - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2019_2; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } - - version_str = qdma_get_vivado_release_id( - version_info->vivado_release); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_vivado_release_id_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); -} - - -/* - * dump_reg() - Helper function to dump register value into string - * - * return len - length of the string copied into buffer - */ -int dump_reg(char *buf, int buf_sz, uint32_t raddr, - const char *rname, uint32_t rval) -{ - /* length of the line should be minimum 80 chars. - * If below print pattern is changed, check for - * new buffer size requirement - */ - if (buf_sz < DEBGFS_LINE_SZ) { - qdma_log_error("%s: buf_sz(%d) < expected(%d): err: %d\n", - __func__, - buf_sz, DEBGFS_LINE_SZ, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return QDMA_SNPRINTF_S(buf, buf_sz, DEBGFS_LINE_SZ, - "[%#7x] %-47s %#-10x %u\n", - raddr, rname, rval, rval); - -} - -void qdma_memset(void *to, uint8_t val, uint32_t size) -{ - uint32_t i; - uint8_t *_to = (uint8_t *)to; - - for (i = 0; i < size; i++) - _to[i] = val; -} - -/*****************************************************************************/ -/** - * qdma_queue_cmpt_cidx_read() - function to read the CMPT CIDX register - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: pointer to array to hold the values read - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_queue_cmpt_cidx_read(void *dev_hndl, uint8_t is_vf, - uint16_t qid, struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_OFFSET_DMAP_SEL_CMPT_CIDX; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - reg_addr += qid * QDMA_CMPT_CIDX_STEP; - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - reg_info->wrb_cidx = - FIELD_GET(QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK, reg_val); - reg_info->counter_idx = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_val)); - reg_info->wrb_en = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_val)); - reg_info->irq_en = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK, reg_val)); - reg_info->timer_idx = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK, reg_val)); - reg_info->trig_mode = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK, reg_val)); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_initiate_flr() - function to initiate Function Level Reset - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_initiate_flr(void *dev_hndl, uint8_t is_vf) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_REG_FLR_STATUS : - QDMA_OFFSET_PF_REG_FLR_STATUS; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_reg_write(dev_hndl, reg_addr, 1); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_is_flr_done() - function to check whether the FLR is done or not - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @done: if FLR process completed , done is 1 else 0. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_is_flr_done(void *dev_hndl, uint8_t is_vf, uint8_t *done) -{ - int rv; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_REG_FLR_STATUS : - QDMA_OFFSET_PF_REG_FLR_STATUS; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!done) { - qdma_log_error("%s: done is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* wait for it to become zero */ - rv = hw_monitor_reg(dev_hndl, reg_addr, QDMA_FLR_STATUS_MASK, - 0, 5 * QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US); - if (rv < 0) - *done = 0; - else - *done = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_is_config_bar() - function for the config bar verification - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_is_config_bar(void *dev_hndl, uint8_t is_vf, enum qdma_ip *ip) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_VERSION : - QDMA_OFFSET_CONFIG_BLOCK_ID; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - /** TODO: Version register for VFs is 0x5014 for EQDMA and - * 0x1014 for QDMA/Versal. First time reading 0x5014 for - * all the device and based on the upper 16 bits value - * (i.e. 0x1fd3), finding out whether its EQDMA or QDMA/Versal - * for EQDMA VFs. - * Need to modify this logic once the hardware team - * comes up with a common register for VFs - */ - if (is_vf) { - if (FIELD_GET(QDMA_GLBL2_VF_UNIQUE_ID_MASK, reg_val) - != QDMA_MAGIC_NUMBER) { - /* Its either QDMA or Versal */ - -#ifdef EQDMA_CPM5_VF_GT_256Q_SUPPORTED - *ip = EQDMA_CPM5_IP; - reg_addr = EQDMA_CPM5_OFFSET_VF_VERSION; -#else - *ip = EQDMA_IP; - reg_addr = EQDMA_OFFSET_VF_VERSION; -#endif - reg_val = qdma_reg_read(dev_hndl, reg_addr); - } else { - *ip = QDMA_OR_VERSAL_IP; - return QDMA_SUCCESS; - } - } - - if (FIELD_GET(QDMA_CONFIG_BLOCK_ID_MASK, reg_val) - != QDMA_MAGIC_NUMBER) { - qdma_log_error("%s: Invalid config bar, err:%d\n", - __func__, - -QDMA_ERR_HWACC_INV_CONFIG_BAR); - return -QDMA_ERR_HWACC_INV_CONFIG_BAR; - } - - return QDMA_SUCCESS; -} - -int qdma_acc_reg_dump_buf_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, int *buflen) -{ - uint32_t len = 0; - int rv = 0; - - *buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - len = qdma_soft_reg_dump_buf_len(); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - len = qdma_cpm4_reg_dump_buf_len(); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - len = eqdma_cpm5_reg_dump_buf_len(); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - len = eqdma_reg_dump_buf_len(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *buflen = (int)len; - return rv; -} - -int qdma_acc_reg_info_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, int *buflen, int *num_regs) -{ - uint32_t len = 0; - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buflen) { - qdma_log_error("%s: buflen is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!num_regs) { - qdma_log_error("%s: num_regs is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - *buflen = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - len = 0; - *num_regs = 0; - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) { - len = qdma_cpm4_reg_dump_buf_len(); - *num_regs = (int)((len / REG_DUMP_SIZE_PER_LINE) - 1); - } else if (device_type == QDMA_DEVICE_VERSAL_CPM5) { - len = eqdma_cpm5_reg_dump_buf_len(); - *num_regs = (int)((len / REG_DUMP_SIZE_PER_LINE) - 1); - } else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - break; - case EQDMA_SOFT_IP: - len = eqdma_reg_dump_buf_len(); - *num_regs = (int)((len / REG_DUMP_SIZE_PER_LINE) - 1); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *buflen = (int)len; - return rv; -} - -int qdma_acc_context_buf_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - int rv = 0; - - *buflen = 0; - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_context_buf_len(st, q_type, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_context_buf_len(st, q_type, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_context_buf_len(st, q_type, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_context_buf_len(st, q_type, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -int qdma_acc_get_num_config_regs(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint32_t *num_regs) -{ - int rv = 0; - - *num_regs = 0; - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_get_config_num_regs(); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_get_config_num_regs(); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_get_config_num_regs(); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_get_config_num_regs(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *num_regs = rv; - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_acc_get_config_regs() - Function to get qdma config registers. - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @reg_data: pointer to register data to be filled - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_get_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, enum qdma_device_type device_type, - uint32_t *reg_data) -{ - struct xreg_info *reg_info; - uint32_t count = 0; - uint32_t num_regs; - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (is_vf) { - qdma_log_error("%s: Get Config regs not valid for VF, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (reg_data == NULL) { - qdma_log_error("%s: reg_data is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - num_regs = qdma_get_config_num_regs(); - reg_info = qdma_get_config_regs(); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) { - num_regs = qdma_cpm4_get_config_num_regs(); - reg_info = qdma_cpm4_get_config_regs(); - } else if (device_type == QDMA_DEVICE_VERSAL_CPM5) { - num_regs = eqdma_cpm5_get_config_num_regs(); - reg_info = eqdma_cpm5_get_config_regs(); - } else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - break; - case EQDMA_SOFT_IP: - num_regs = eqdma_get_config_num_regs(); - reg_info = eqdma_get_config_regs(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (count = 0; count < num_regs - 1; count++) { - reg_data[count] = qdma_reg_read(dev_hndl, - reg_info[count].addr); - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, enum qdma_device_type device_type, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_reg_info() - Function to dump fileds in - * a specified register. - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_reg_info(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf || !buflen) { - qdma_log_error("%s: Invalid input buffer, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - QDMA_SNPRINTF_S(buf, buflen, DEBGFS_LINE_SZ, - "QDMA reg field info not supported for QDMA_SOFT_IP\n"); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_dump_reg_info(dev_hndl, reg_addr, - num_regs, buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_dump_reg_info(dev_hndl, reg_addr, - num_regs, buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_reg_info(dev_hndl, reg_addr, - num_regs, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_queue_context() - Function to get qdma queue context dump in a - * buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @st: Queue Mode (ST or MM) - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_read_dump_queue_context() - Function to read and dump the queue - * context in the user-provided buffer. This API is valid only for PF and - * should not be used for VFs. For VF's use qdma_dump_queue_context() API - * after reading the context through mailbox. - * - * @dev_hndl: device handle - * @ip_type: QDMA IP type - * @device_type:QDMA DEVICE Type - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT)* - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_read_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_read_dump_queue_context(dev_hndl, func_id, - qid_hw, st, q_type, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_read_dump_queue_context(dev_hndl, - func_id, qid_hw, st, q_type, buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_read_dump_queue_context(dev_hndl, - func_id, qid_hw, st, q_type, buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_read_dump_queue_context(dev_hndl, func_id, - qid_hw, st, q_type, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @ip_type: QDMA ip type - * @num_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_acc_dump_config_reg_list(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - if (device_type == QDMA_DEVICE_VERSAL_CPM4) - rv = qdma_cpm4_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - else if (device_type == QDMA_DEVICE_VERSAL_CPM5) - rv = eqdma_cpm5_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - else { - qdma_log_error("%s: Invalid device type, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_get_function_number() - Function to get the function number - * - * @dev_hndl: device handle - * @func_id: pointer to hold the function id - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_get_function_number(void *dev_hndl, uint16_t *func_id) -{ - if (!dev_hndl || !func_id) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *func_id = (uint8_t)qdma_reg_read(dev_hndl, - QDMA_OFFSET_GLBL2_CHANNEL_FUNC_RET); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_hw_error_intr_setup() - Function to set up the qdma error - * interrupt - * - * @dev_hndl: device handle - * @func_id: Function id - * @err_intr_index: Interrupt vector - * @rearm: rearm or not - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_error_intr_setup(void *dev_hndl, uint16_t func_id, - uint8_t err_intr_index) -{ - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = - FIELD_SET(QDMA_GLBL_ERR_FUNC_MASK, func_id) | - FIELD_SET(QDMA_GLBL_ERR_VEC_MASK, err_intr_index); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_intr_rearm() - Function to re-arm the error interrupt - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_error_intr_rearm(void *dev_hndl) -{ - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT); - reg_val |= FIELD_SET(QDMA_GLBL_ERR_ARM_MASK, 1); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_error_code() - function to get the qdma access mapped - * error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_error_code(int acc_err_code) -{ - return qdma_get_err_code(acc_err_code); -} - -int qdma_hw_access_init(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_access *hw_access) -{ - int rv = QDMA_SUCCESS; - enum qdma_ip ip = EQDMA_IP; - - struct qdma_hw_version_info version_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!hw_access) { - qdma_log_error("%s: hw_access is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_is_config_bar(dev_hndl, is_vf, &ip); - if (rv != QDMA_SUCCESS) { - qdma_log_error("%s: config bar passed is INVALID, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return rv; - } - - qdma_memset(hw_access, 0, sizeof(struct qdma_hw_access)); - - if (ip == EQDMA_IP) - hw_access->qdma_get_version = &eqdma_get_version; - else if (ip == EQDMA_CPM5_IP) - hw_access->qdma_get_version = &eqdma_cpm5_get_version; - else - hw_access->qdma_get_version = &qdma_get_version; - - hw_access->qdma_init_ctxt_memory = &qdma_init_ctxt_memory; - hw_access->qdma_fmap_conf = &qdma_fmap_conf; - hw_access->qdma_sw_ctx_conf = &qdma_sw_ctx_conf; - hw_access->qdma_pfetch_ctx_conf = &qdma_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &qdma_cmpt_ctx_conf; - hw_access->qdma_hw_ctx_conf = &qdma_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = &qdma_credit_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = &qdma_indirect_intr_ctx_conf; - hw_access->qdma_set_default_global_csr = &qdma_set_default_global_csr; - hw_access->qdma_global_csr_conf = &qdma_global_csr_conf; - hw_access->qdma_global_writeback_interval_conf = - &qdma_global_writeback_interval_conf; - hw_access->qdma_queue_pidx_update = &qdma_queue_pidx_update; - hw_access->qdma_queue_cmpt_cidx_read = &qdma_queue_cmpt_cidx_read; - hw_access->qdma_queue_cmpt_cidx_update = &qdma_queue_cmpt_cidx_update; - hw_access->qdma_queue_intr_cidx_update = &qdma_queue_intr_cidx_update; - hw_access->qdma_mm_channel_conf = &qdma_mm_channel_conf; - hw_access->qdma_get_user_bar = &qdma_get_user_bar; - hw_access->qdma_get_function_number = &qdma_get_function_number; - hw_access->qdma_get_device_attributes = &qdma_get_device_attributes; - hw_access->qdma_hw_error_intr_setup = &qdma_hw_error_intr_setup; - hw_access->qdma_hw_error_intr_rearm = &qdma_hw_error_intr_rearm; - hw_access->qdma_hw_error_enable = &qdma_hw_error_enable; - hw_access->qdma_hw_get_error_name = &qdma_hw_get_error_name; - hw_access->qdma_hw_error_process = &qdma_hw_error_process; - hw_access->qdma_dump_config_regs = &qdma_soft_dump_config_regs; - hw_access->qdma_dump_queue_context = &qdma_soft_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &qdma_soft_read_dump_queue_context; - hw_access->qdma_dump_intr_context = &qdma_dump_intr_context; - hw_access->qdma_is_legacy_intr_pend = &qdma_is_legacy_intr_pend; - hw_access->qdma_clear_pend_legacy_intr = &qdma_clear_pend_legacy_intr; - hw_access->qdma_legacy_intr_conf = &qdma_legacy_intr_conf; - hw_access->qdma_initiate_flr = &qdma_initiate_flr; - hw_access->qdma_is_flr_done = &qdma_is_flr_done; - hw_access->qdma_get_error_code = &qdma_get_error_code; - hw_access->qdma_read_reg_list = &qdma_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &qdma_soft_dump_config_reg_list; - hw_access->qdma_dump_reg_info = &qdma_dump_reg_info; - hw_access->mbox_base_pf = QDMA_OFFSET_MBOX_BASE_PF; - hw_access->mbox_base_vf = QDMA_OFFSET_MBOX_BASE_VF; - hw_access->qdma_max_errors = QDMA_ERRS_ALL; - - rv = hw_access->qdma_get_version(dev_hndl, is_vf, &version_info); - if (rv != QDMA_SUCCESS) - return rv; - - qdma_log_info("Device Type: %s\n", - qdma_get_device_type(version_info.device_type)); - - qdma_log_info("IP Type: %s\n", - qdma_get_ip_type(dev_hndl, is_vf, version_info.ip_type)); - - qdma_log_info("Vivado Release: %s\n", - qdma_get_vivado_release_id(version_info.vivado_release)); - - if (version_info.ip_type == QDMA_VERSAL_HARD_IP && - version_info.device_type == QDMA_DEVICE_VERSAL_CPM4) { - hw_access->qdma_init_ctxt_memory = - &qdma_cpm4_init_ctxt_memory; - hw_access->qdma_qid2vec_conf = &qdma_cpm4_qid2vec_conf; - hw_access->qdma_fmap_conf = &qdma_cpm4_fmap_conf; - hw_access->qdma_sw_ctx_conf = &qdma_cpm4_sw_ctx_conf; - hw_access->qdma_pfetch_ctx_conf = - &qdma_cpm4_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &qdma_cpm4_cmpt_ctx_conf; - hw_access->qdma_hw_ctx_conf = &qdma_cpm4_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = - &qdma_cpm4_credit_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = - &qdma_cpm4_indirect_intr_ctx_conf; - hw_access->qdma_set_default_global_csr = - &qdma_cpm4_set_default_global_csr; - hw_access->qdma_queue_pidx_update = - &qdma_cpm4_queue_pidx_update; - hw_access->qdma_queue_cmpt_cidx_update = - &qdma_cpm4_queue_cmpt_cidx_update; - hw_access->qdma_queue_intr_cidx_update = - &qdma_cpm4_queue_intr_cidx_update; - hw_access->qdma_get_user_bar = &qdma_cmp_get_user_bar; - hw_access->qdma_get_device_attributes = - &qdma_cpm4_get_device_attributes; - hw_access->qdma_dump_config_regs = - &qdma_cpm4_dump_config_regs; - hw_access->qdma_dump_intr_context = - &qdma_cpm4_dump_intr_context; - hw_access->qdma_hw_error_enable = - &qdma_cpm4_hw_error_enable; - hw_access->qdma_hw_error_process = - &qdma_cpm4_hw_error_process; - hw_access->qdma_hw_get_error_name = - &qdma_cpm4_hw_get_error_name; - hw_access->qdma_legacy_intr_conf = NULL; - hw_access->qdma_read_reg_list = &qdma_cpm4_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &qdma_cpm4_dump_config_reg_list; - hw_access->qdma_dump_queue_context = - &qdma_cpm4_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &qdma_cpm4_read_dump_queue_context; - hw_access->qdma_dump_reg_info = &qdma_cpm4_dump_reg_info; - hw_access->qdma_max_errors = QDMA_CPM4_ERRS_ALL; - } - - if (version_info.ip_type == QDMA_VERSAL_HARD_IP && - version_info.device_type == QDMA_DEVICE_VERSAL_CPM5) { - hw_access->qdma_init_ctxt_memory = - &eqdma_cpm5_init_ctxt_memory; -#ifdef TANDEM_BOOT_SUPPORTED - hw_access->qdma_init_st_ctxt = - &eqdma_cpm5_init_st_ctxt; -#endif - hw_access->qdma_sw_ctx_conf = &eqdma_cpm5_sw_ctx_conf; - hw_access->qdma_fmap_conf = &eqdma_cpm5_fmap_conf; - hw_access->qdma_pfetch_ctx_conf = - &eqdma_cpm5_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &eqdma_cpm5_cmpt_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = - &eqdma_cpm5_indirect_intr_ctx_conf; - hw_access->qdma_dump_config_regs = - &eqdma_cpm5_dump_config_regs; - hw_access->qdma_dump_intr_context = - &eqdma_cpm5_dump_intr_context; - hw_access->qdma_hw_error_enable = - &eqdma_cpm5_hw_error_enable; - hw_access->qdma_hw_error_process = - &eqdma_cpm5_hw_error_process; - hw_access->qdma_hw_get_error_name = - &eqdma_cpm5_hw_get_error_name; - hw_access->qdma_hw_ctx_conf = &eqdma_cpm5_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = - &eqdma_cpm5_credit_ctx_conf; - hw_access->qdma_set_default_global_csr = - &eqdma_cpm5_set_default_global_csr; - hw_access->qdma_get_device_attributes = - &eqdma_cpm5_get_device_attributes; - hw_access->qdma_get_user_bar = &eqdma_cpm5_get_user_bar; - hw_access->qdma_read_reg_list = &eqdma_cpm5_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &eqdma_cpm5_dump_config_reg_list; - hw_access->qdma_dump_queue_context = - &eqdma_cpm5_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &eqdma_cpm5_read_dump_queue_context; - hw_access->qdma_dump_reg_info = &eqdma_cpm5_dump_reg_info; - /* All CSR and Queue space register belongs to Window 0. - * Mailbox and MSIX register belongs to Window 1 - * Therefore, Mailbox offsets are different for EQDMA - * Mailbox offset for PF : 128K + original address - * Mailbox offset for VF : 16K + original address - */ - hw_access->mbox_base_pf = EQDMA_CPM5_OFFSET_MBOX_BASE_PF; - hw_access->mbox_base_vf = EQDMA_CPM5_OFFSET_MBOX_BASE_VF; - hw_access->qdma_max_errors = EQDMA_CPM5_ERRS_ALL; - -} - - if (version_info.ip_type == EQDMA_SOFT_IP) { - hw_access->qdma_init_ctxt_memory = &eqdma_init_ctxt_memory; - hw_access->qdma_sw_ctx_conf = &eqdma_sw_ctx_conf; - hw_access->qdma_fmap_conf = &eqdma_fmap_conf; - hw_access->qdma_pfetch_ctx_conf = &eqdma_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &eqdma_cmpt_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = - &eqdma_indirect_intr_ctx_conf; - hw_access->qdma_dump_config_regs = &eqdma_dump_config_regs; - hw_access->qdma_dump_intr_context = &eqdma_dump_intr_context; - hw_access->qdma_hw_error_enable = &eqdma_hw_error_enable; - hw_access->qdma_hw_error_process = &eqdma_hw_error_process; - hw_access->qdma_hw_get_error_name = &eqdma_hw_get_error_name; - hw_access->qdma_hw_ctx_conf = &eqdma_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = &eqdma_credit_ctx_conf; - hw_access->qdma_set_default_global_csr = - &eqdma_set_default_global_csr; - hw_access->qdma_get_device_attributes = - &eqdma_get_device_attributes; - hw_access->qdma_get_user_bar = &eqdma_get_user_bar; - hw_access->qdma_read_reg_list = &eqdma_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &eqdma_dump_config_reg_list; - hw_access->qdma_dump_queue_context = - &eqdma_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &eqdma_read_dump_queue_context; - hw_access->qdma_dump_reg_info = &eqdma_dump_reg_info; - /* All CSR and Queue space register belongs to Window 0. - * Mailbox and MSIX register belongs to Window 1 - * Therefore, Mailbox offsets are different for EQDMA - * Mailbox offset for PF : 128K + original address - * Mailbox offset for VF : 16K + original address - */ - hw_access->mbox_base_pf = EQDMA_OFFSET_MBOX_BASE_PF; - hw_access->mbox_base_vf = EQDMA_OFFSET_MBOX_BASE_VF; - hw_access->qdma_max_errors = EQDMA_ERRS_ALL; - } - - return QDMA_SUCCESS; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_common.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_common.h deleted file mode 100755 index f88c015..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_common.h +++ /dev/null @@ -1,926 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_ACCESS_COMMON_H_ -#define __QDMA_ACCESS_COMMON_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_access_export.h" -#include "qdma_access_errors.h" - -/* QDMA HW version string array length */ -#define QDMA_HW_VERSION_STRING_LEN 32 - -#define ENABLE_INIT_CTXT_MEMORY 1 - -#ifdef GCC_COMPILER -static inline uint32_t get_trailing_zeros(uint64_t x) -{ - uint32_t rv = - __builtin_ffsll(x) - 1; - return rv; -} -#else -static inline uint32_t get_trailing_zeros(uint64_t value) -{ - uint32_t pos = 0; - - if ((value & 0xffffffff) == 0) { - pos += 32; - value >>= 32; - } - if ((value & 0xffff) == 0) { - pos += 16; - value >>= 16; - } - if ((value & 0xff) == 0) { - pos += 8; - value >>= 8; - } - if ((value & 0xf) == 0) { - pos += 4; - value >>= 4; - } - if ((value & 0x3) == 0) { - pos += 2; - value >>= 2; - } - if ((value & 0x1) == 0) - pos += 1; - - return pos; -} -#endif - -#define FIELD_SHIFT(mask) get_trailing_zeros(mask) -#define FIELD_SET(mask, val) ((val << FIELD_SHIFT(mask)) & mask) -#define FIELD_GET(mask, reg) ((reg & mask) >> FIELD_SHIFT(mask)) - - -/* CSR Default values */ -#define DEFAULT_MAX_DSC_FETCH 6 -#define DEFAULT_WRB_INT QDMA_WRB_INTERVAL_128 - -/* Default values for 0xB08 */ -#define DEFAULT_PFCH_NUM_ENTRIES_PER_Q 8 -#define DEFAULT_PFCH_MAX_Q_CNT 16 -#define DEFAULT_C2H_INTR_TIMER_TICK 25 -#define DEFAULT_CMPT_COAL_TIMER_TICK 25 -#define DEFAULT_CMPT_COAL_MAX_BUF_SZ 32 - -#ifdef THROUGHPUT_MEASUREMENT -/* Update WRB coalesce timer count for throughput measurement */ -#define DEFAULT_CMPT_COAL_TIMER_CNT 10 -#else -/* Update WRB coalesce timer count for low latency measurement */ -#define DEFAULT_CMPT_COAL_TIMER_CNT 5 -#endif - -#define QDMA_BAR_NUM 6 - -/** Maximum data vectors to be used for each function - * TODO: Please note that for 2018.2 only one vector would be used - * per pf and only one ring would be created for this vector - * It is also assumed that all functions have the same number of data vectors - * and currently different number of vectors per PF is not supported - */ -#define QDMA_NUM_DATA_VEC_FOR_INTR_CXT 1 - -enum ind_ctxt_cmd_op { - QDMA_CTXT_CMD_CLR, - QDMA_CTXT_CMD_WR, - QDMA_CTXT_CMD_RD, - QDMA_CTXT_CMD_INV -}; - -enum ind_ctxt_cmd_sel { - QDMA_CTXT_SEL_SW_C2H, - QDMA_CTXT_SEL_SW_H2C, - QDMA_CTXT_SEL_HW_C2H, - QDMA_CTXT_SEL_HW_H2C, - QDMA_CTXT_SEL_CR_C2H, - QDMA_CTXT_SEL_CR_H2C, - QDMA_CTXT_SEL_CMPT, - QDMA_CTXT_SEL_PFTCH, - QDMA_CTXT_SEL_INT_COAL, - QDMA_CTXT_SEL_PASID_RAM_LOW, - QDMA_CTXT_SEL_PASID_RAM_HIGH, - QDMA_CTXT_SEL_TIMER, - QDMA_CTXT_SEL_FMAP, -}; - -/* polling a register */ -#define QDMA_REG_POLL_DFLT_INTERVAL_US 10 /* 10us per poll */ -#define QDMA_REG_POLL_DFLT_TIMEOUT_US (500*1000) /* 500ms */ - -/** Constants */ -#define QDMA_NUM_RING_SIZES 16 -#define QDMA_NUM_C2H_TIMERS 16 -#define QDMA_NUM_C2H_BUFFER_SIZES 16 -#define QDMA_NUM_C2H_COUNTERS 16 -#define QDMA_MM_CONTROL_RUN 0x1 -#define QDMA_MM_CONTROL_STEP 0x100 -#define QDMA_MAGIC_NUMBER 0x1fd3 -#define QDMA_PIDX_STEP 0x10 -#define QDMA_CMPT_CIDX_STEP 0x10 -#define QDMA_INT_CIDX_STEP 0x10 - - -/** QDMA_IND_REG_SEL_PFTCH */ -#define QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK GENMASK(15, 3) -#define QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK GENMASK(2, 0) - -/** QDMA_IND_REG_SEL_CMPT */ -#define QDMA_COMPL_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 38) -#define QDMA_COMPL_CTXT_BADDR_GET_L_MASK GENMASK_ULL(37, 12) -#define QDMA_COMPL_CTXT_PIDX_GET_H_MASK GENMASK(15, 4) -#define QDMA_COMPL_CTXT_PIDX_GET_L_MASK GENMASK(3, 0) - -#define QDMA_INTR_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 61) -#define QDMA_INTR_CTXT_BADDR_GET_M_MASK GENMASK_ULL(60, 29) -#define QDMA_INTR_CTXT_BADDR_GET_L_MASK GENMASK_ULL(28, 12) - -#define QDMA_GLBL2_MM_CMPT_EN_MASK BIT(2) -#define QDMA_GLBL2_FLR_PRESENT_MASK BIT(1) -#define QDMA_GLBL2_MAILBOX_EN_MASK BIT(0) - -#define QDMA_REG_IND_CTXT_REG_COUNT 8 - -/* ------------------------ indirect register context fields -----------*/ -union qdma_ind_ctxt_cmd { - uint32_t word; - struct { - uint32_t busy:1; - uint32_t sel:4; - uint32_t op:2; - uint32_t qid:12; - uint32_t rsvd:14; - } bits; -}; - -#define QDMA_IND_CTXT_DATA_NUM_REGS 8 - -/** - * struct qdma_indirect_ctxt_regs - Inirect Context programming registers - */ -struct qdma_indirect_ctxt_regs { - uint32_t qdma_ind_ctxt_data[QDMA_IND_CTXT_DATA_NUM_REGS]; - uint32_t qdma_ind_ctxt_mask[QDMA_IND_CTXT_DATA_NUM_REGS]; - union qdma_ind_ctxt_cmd cmd; -}; - -/** - * struct qdma_fmap_cfg - fmap config data structure - */ -struct qdma_fmap_cfg { - - /** @qbase - queue base for the function */ - uint16_t qbase; - /** @qmax - maximum queues in the function */ - uint16_t qmax; -}; - -/** - * struct qdma_qid2vec - qid to vector mapping data structure - */ -struct qdma_qid2vec { - - /** @c2h_vector - For direct interrupt, it is the interrupt - * vector index of msix table; - * for indirect interrupt, it is the ring index - */ - uint8_t c2h_vector; - /** @c2h_en_coal - C2H Interrupt aggregation enable */ - uint8_t c2h_en_coal; - /** @h2c_vector - For direct interrupt, it is the interrupt - * vector index of msix table; - * for indirect interrupt, it is the ring index - */ - uint8_t h2c_vector; - /** @h2c_en_coal - H2C Interrupt aggregation enable */ - uint8_t h2c_en_coal; -}; - -/** - * struct qdma_descq_sw_ctxt - descq SW context config data structure - */ -struct qdma_descq_sw_ctxt { - - /** @ring_bs_addr - ring base address */ - uint64_t ring_bs_addr; - /** @vec - vector number */ - uint16_t vec; - /** @pidx - initial producer index */ - uint16_t pidx; - /** @irq_arm - Interrupt Arm */ - uint8_t irq_arm; - /** @fnc_id - Function ID */ - uint8_t fnc_id; - /** @qen - Indicates that the queue is enabled */ - uint8_t qen; - /** @frcd_en -Enable fetch credit */ - uint8_t frcd_en; - /** @wbi_chk -Writeback/Interrupt after pending check */ - uint8_t wbi_chk; - /** @wbi_intvl_en -Write back/Interrupt interval */ - uint8_t wbi_intvl_en; - /** @at - Address tanslation */ - uint8_t at; - /** @fetch_max - Maximum number of descriptor fetches outstanding */ - uint8_t fetch_max; - /** @rngsz_idx - Descriptor ring size index */ - uint8_t rngsz_idx; - /** @desc_sz -Descriptor fetch size */ - uint8_t desc_sz; - /** @bypass - bypass enable */ - uint8_t bypass; - /** @mm_chn - MM channel */ - uint8_t mm_chn; - /** @wbk_en -Writeback enable */ - uint8_t wbk_en; - /** @irq_en -Interrupt enable */ - uint8_t irq_en; - /** @port_id -Port_id */ - uint8_t port_id; - /** @irq_no_last - No interrupt was sent */ - uint8_t irq_no_last; - /** @err - Error status */ - uint8_t err; - /** @err_wb_sent -writeback/interrupt was sent for an error */ - uint8_t err_wb_sent; - /** @irq_req - Interrupt due to error waiting to be sent */ - uint8_t irq_req; - /** @mrkr_dis - Marker disable */ - uint8_t mrkr_dis; - /** @is_mm - MM mode */ - uint8_t is_mm; - /** @intr_aggr - interrupt aggregation enable */ - uint8_t intr_aggr; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @dis_intr_on_vf - Disbale interrupt with VF */ - uint8_t dis_intr_on_vf; - /** @virtio_en - Queue is in Virtio Mode */ - uint8_t virtio_en; - /** @pack_byp_out - descs on desc output interface can be packed */ - uint8_t pack_byp_out; - /** @irq_byp - IRQ Bypass mode */ - uint8_t irq_byp; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @virtio_dsc_base - Virtio Desc Base Address */ - uint64_t virtio_dsc_base; -}; - -/** - * struct qdma_descq_hw_ctxt - descq hw context config data structure - */ -struct qdma_descq_hw_ctxt { - /** @cidx - consumer index */ - uint16_t cidx; - /** @crd_use - credits consumed */ - uint16_t crd_use; - /** @dsc_pend - descriptors pending */ - uint8_t dsc_pend; - /** @idl_stp_b -Queue invalid and no descriptors pending */ - uint8_t idl_stp_b; - /** @evt_pnd - Event pending */ - uint8_t evt_pnd; - /** @fetch_pnd -Descriptor fetch pending */ - uint8_t fetch_pnd; -}; - -/** - * struct qdma_descq_credit_ctxt - descq credit context config data structure - */ -struct qdma_descq_credit_ctxt { - - /** @credit -Fetch credits received. */ - uint32_t credit; -}; - -/** - * struct qdma_descq_prefetch_ctxt - descq pfetch context config data structure - */ -struct qdma_descq_prefetch_ctxt { - /** @sw_crdt -Software credit */ - uint16_t sw_crdt; - /** @bypass - bypass enable */ - uint8_t bypass; - /** @bufsz_idx - c2h buffer size index */ - uint8_t bufsz_idx; - /** @port_id - port ID */ - uint8_t port_id; - /** @var_desc - Variable Descriptor */ - uint8_t var_desc; - /** @num_pftch - Number of descs prefetched */ - uint16_t num_pftch; - /** @err -Error detected on this queue */ - uint8_t err; - /** @pfch_en - Enable prefetch */ - uint8_t pfch_en; - /** @pfch - Queue is in prefetch */ - uint8_t pfch; - /** @valid - context is valid */ - uint8_t valid; -}; - -/** - * struct qdma_descq_cmpt_ctxt - descq completion context config data structure - */ -struct qdma_descq_cmpt_ctxt { - /** @bs_addr - completion ring base address */ - uint64_t bs_addr; - /** @vec - Interrupt Vector */ - uint16_t vec; - /** @pidx_l - producer index low */ - uint16_t pidx; - /** @cidx - consumer index */ - uint16_t cidx; - /** @en_stat_desc - Enable Completion Status writes */ - uint8_t en_stat_desc; - /** @en_int - Enable Completion interrupts */ - uint8_t en_int; - /** @trig_mode - Interrupt and Completion Status Write Trigger Mode */ - uint8_t trig_mode; - /** @fnc_id - Function ID */ - uint8_t fnc_id; - /** @counter_idx - Index to counter register */ - uint8_t counter_idx; - /** @timer_idx - Index to timer register */ - uint8_t timer_idx; - /** @in_st - Interrupt State */ - uint8_t in_st; - /** @color - initial color bit to be used on Completion */ - uint8_t color; - /** @ringsz_idx - Completion ring size index to ring size registers */ - uint8_t ringsz_idx; - /** @desc_sz -descriptor size */ - uint8_t desc_sz; - /** @valid - context valid */ - uint8_t valid; - /** @err - error status */ - uint8_t err; - /** - * @user_trig_pend - user logic initiated interrupt is - * pending to be generate - */ - uint8_t user_trig_pend; - /** @timer_running - timer is running on this queue */ - uint8_t timer_running; - /** @full_upd - Full update */ - uint8_t full_upd; - /** @ovf_chk_dis - Completion Ring Overflow Check Disable */ - uint8_t ovf_chk_dis; - /** @at -Address Translation */ - uint8_t at; - /** @int_aggr -Interrupt Aggregation */ - uint8_t int_aggr; - /** @dis_intr_on_vf - Disbale interrupt with VF */ - uint8_t dis_intr_on_vf; - /** @vio - queue is in VirtIO mode */ - uint8_t vio; - /** @dir_c2h - DMA direction is C2H */ - uint8_t dir_c2h; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @vio_eop - Virtio End-of-packet */ - uint8_t vio_eop; - /** @sh_cmpt - Shared Completion Queue */ - uint8_t sh_cmpt; -}; - -/** - * struct qdma_indirect_intr_ctxt - indirect interrupt context config data - * structure - */ -struct qdma_indirect_intr_ctxt { - /** @baddr_4k -Base address of Interrupt Aggregation Ring */ - uint64_t baddr_4k; - /** @vec - Interrupt vector index in msix table */ - uint16_t vec; - /** @pidx - Producer Index */ - uint16_t pidx; - /** @valid - context valid */ - uint8_t valid; - /** @int_st -Interrupt State */ - uint8_t int_st; - /** @color - Color bit */ - uint8_t color; - /** @page_size - Interrupt Aggregation Ring size */ - uint8_t page_size; - /** @at - Address translation */ - uint8_t at; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @func_id - Function ID */ - uint16_t func_id; -}; - -struct qdma_hw_version_info { - /** @rtl_version - RTL Version */ - enum qdma_rtl_version rtl_version; - /** @vivado_release - Vivado Release id */ - enum qdma_vivado_release_id vivado_release; - /** @versal_ip_state - Versal IP state */ - enum qdma_ip_type ip_type; - /** @device_type - Device Type */ - enum qdma_device_type device_type; - /** @qdma_rtl_version_str - RTL Version string*/ - char qdma_rtl_version_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_vivado_release_id_str - Vivado Release id string*/ - char qdma_vivado_release_id_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_device_type_str - Qdma device type string*/ - char qdma_device_type_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_versal_ip_state_str - Versal IP state string*/ - char qdma_ip_type_str[QDMA_HW_VERSION_STRING_LEN]; -}; - -#define CTXT_ENTRY_NAME_SZ 64 -struct qctx_entry { - char name[CTXT_ENTRY_NAME_SZ]; - uint32_t value; -}; - -/** - * @struct - qdma_descq_context - * @brief queue context information - */ -struct qdma_descq_context { - struct qdma_qid2vec qid2vec; - struct qdma_fmap_cfg fmap; - struct qdma_descq_sw_ctxt sw_ctxt; - struct qdma_descq_hw_ctxt hw_ctxt; - struct qdma_descq_credit_ctxt cr_ctxt; - struct qdma_descq_prefetch_ctxt pfetch_ctxt; - struct qdma_descq_cmpt_ctxt cmpt_ctxt; -}; - -/** - * struct qdma_q_pidx_reg_info - Software PIDX register fields - */ -struct qdma_q_pidx_reg_info { - /** @pidx - Producer Index */ - uint16_t pidx; - /** @irq_en - Interrupt enable */ - uint8_t irq_en; -}; - -/** - * struct qdma_q_intr_cidx_reg_info - Interrupt Ring CIDX register fields - */ -struct qdma_intr_cidx_reg_info { - /** @sw_cidx - Software Consumer Index */ - uint16_t sw_cidx; - /** @rng_idx - Ring Index of the Interrupt Aggregation ring */ - uint8_t rng_idx; -}; - -/** - * struct qdma_q_cmpt_cidx_reg_info - CMPT CIDX register fields - */ -struct qdma_q_cmpt_cidx_reg_info { - /** @wrb_cidx - CMPT Consumer Index */ - uint16_t wrb_cidx; - /** @counter_idx - Counter Threshold Index */ - uint8_t counter_idx; - /** @timer_idx - Timer Count Index */ - uint8_t timer_idx; - /** @trig_mode - Trigger mode */ - uint8_t trig_mode; - /** @wrb_en - Enable status descriptor for CMPT */ - uint8_t wrb_en; - /** @irq_en - Enable Interrupt for CMPT */ - uint8_t irq_en; -}; - - -/** - * struct qdma_csr_info - Global CSR info data structure - */ -struct qdma_csr_info { - /** @ringsz: ring size values */ - uint16_t ringsz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @bufsz: buffer size values */ - uint16_t bufsz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @timer_cnt: timer threshold values */ - uint8_t timer_cnt[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @cnt_thres: counter threshold values */ - uint8_t cnt_thres[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @wb_intvl: writeback interval */ - uint8_t wb_intvl; -}; - -#define QDMA_MAX_REGISTER_DUMP 14 - -/** - * struct qdma_reg_data - Structure to - * hold address value and pair - */ -struct qdma_reg_data { - /** @reg_addr: register address */ - uint32_t reg_addr; - /** @reg_val: register value */ - uint32_t reg_val; -}; - -/** - * enum qdma_hw_access_type - To hold hw access type - */ -enum qdma_hw_access_type { - QDMA_HW_ACCESS_READ, - QDMA_HW_ACCESS_WRITE, - QDMA_HW_ACCESS_CLEAR, - QDMA_HW_ACCESS_INVALIDATE, - QDMA_HW_ACCESS_MAX -}; - -/** - * enum qdma_global_csr_type - To hold global csr type - */ -enum qdma_global_csr_type { - QDMA_CSR_RING_SZ, - QDMA_CSR_TIMER_CNT, - QDMA_CSR_CNT_TH, - QDMA_CSR_BUF_SZ, - QDMA_CSR_MAX -}; - -/** - * enum status_type - To hold enable/disable status type - */ -enum status_type { - DISABLE = 0, - ENABLE = 1, -}; - -/** - * enum qdma_reg_read_type - Indicates reg read type - */ -enum qdma_reg_read_type { - /** @QDMA_REG_READ_PF_ONLY: Read the register for PFs only */ - QDMA_REG_READ_PF_ONLY, - /** @QDMA_REG_READ_VF_ONLY: Read the register for VFs only */ - QDMA_REG_READ_VF_ONLY, - /** @QDMA_REG_READ_PF_VF: Read the register for both PF and VF */ - QDMA_REG_READ_PF_VF, - /** @QDMA_REG_READ_MAX: Reg read enum max */ - QDMA_REG_READ_MAX -}; - -/** - * enum qdma_reg_read_groups - Indicates reg read groups - */ -enum qdma_reg_read_groups { - /** @QDMA_REG_READ_GROUP_1: Read the register from 0x000 to 0x288 */ - QDMA_REG_READ_GROUP_1, - /** @QDMA_REG_READ_GROUP_2: Read the register from 0x400 to 0xAFC */ - QDMA_REG_READ_GROUP_2, - /** @QDMA_REG_READ_GROUP_3: Read the register from 0xB00 to 0xE28 */ - QDMA_REG_READ_GROUP_3, - /** @QDMA_REG_READ_GROUP_4: Read the register Mailbox Registers */ - QDMA_REG_READ_GROUP_4, - /** @QDMA_REG_READ_GROUP_MAX: Reg read max groups */ - QDMA_REG_READ_GROUP_MAX -}; - -void qdma_write_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, const uint32_t *values); - -void qdma_read_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, uint32_t *values); - -int dump_reg(char *buf, int buf_sz, uint32_t raddr, - const char *rname, uint32_t rval); - -int hw_monitor_reg(void *dev_hndl, uint32_t reg, uint32_t mask, - uint32_t val, uint32_t interval_us, - uint32_t timeout_us); - -void qdma_memset(void *to, uint8_t val, uint32_t size); - -int qdma_acc_reg_dump_buf_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, int *buflen); - -int qdma_acc_reg_info_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, int *buflen, int *num_regs); - -int qdma_acc_context_buf_len(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int qdma_acc_get_num_config_regs(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint32_t *num_regs); - -/* - * struct qdma_hw_access - Structure to hold HW access function pointers - */ -struct qdma_hw_access { - int (*qdma_set_default_global_csr)(void *dev_hndl); - int (*qdma_global_csr_conf)(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - int (*qdma_global_writeback_interval_conf)(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - int (*qdma_init_ctxt_memory)(void *dev_hndl); - int (*qdma_qid2vec_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_fmap_conf)(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - int (*qdma_sw_ctx_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_pfetch_ctx_conf)(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_cmpt_ctx_conf)(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_hw_ctx_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_credit_ctx_conf)(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_indirect_intr_ctx_conf)(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_queue_pidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - uint8_t is_c2h, - const struct qdma_q_pidx_reg_info *reg_info); - int (*qdma_queue_cmpt_cidx_read)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - struct qdma_q_cmpt_cidx_reg_info *reg_info); - int (*qdma_queue_cmpt_cidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - const struct qdma_q_cmpt_cidx_reg_info *reg_info); - int (*qdma_queue_intr_cidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - const struct qdma_intr_cidx_reg_info *reg_info); - int (*qdma_mm_channel_conf)(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, uint8_t enable); - int (*qdma_get_user_bar)(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - int (*qdma_get_function_number)(void *dev_hndl, uint16_t *func_id); - int (*qdma_get_version)(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - int (*qdma_get_device_attributes)(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - int (*qdma_hw_error_intr_setup)(void *dev_hndl, uint16_t func_id, - uint8_t err_intr_index); - int (*qdma_hw_error_intr_rearm)(void *dev_hndl); - int (*qdma_hw_error_enable)(void *dev_hndl, - uint32_t err_idx); - const char *(*qdma_hw_get_error_name)(uint32_t err_idx); - int (*qdma_hw_error_process)(void *dev_hndl); - int (*qdma_dump_config_regs)(void *dev_hndl, uint8_t is_vf, char *buf, - uint32_t buflen); - int (*qdma_dump_reg_info)(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, - char *buf, - uint32_t buflen); - int (*qdma_dump_queue_context)(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - int (*qdma_read_dump_queue_context)(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - int (*qdma_dump_intr_context)(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - int (*qdma_is_legacy_intr_pend)(void *dev_hndl); - int (*qdma_clear_pend_legacy_intr)(void *dev_hndl); - int (*qdma_legacy_intr_conf)(void *dev_hndl, enum status_type enable); - int (*qdma_initiate_flr)(void *dev_hndl, uint8_t is_vf); - int (*qdma_is_flr_done)(void *dev_hndl, uint8_t is_vf, uint8_t *done); - int (*qdma_get_error_code)(int acc_err_code); - int (*qdma_read_reg_list)(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - int (*qdma_dump_config_reg_list)(void *dev_hndl, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); -#ifdef TANDEM_BOOT_SUPPORTED - int (*qdma_init_st_ctxt)(void *dev_hndl); -#endif - uint32_t mbox_base_pf; - uint32_t mbox_base_vf; - uint32_t qdma_max_errors; -}; - -/*****************************************************************************/ -/** - * qdma_hw_access_init() - Function to get the QDMA hardware - * access function pointers - * This function should be called once per device from - * device_open()/probe(). Caller shall allocate memory for - * qdma_hw_access structure and store pointer to it in their - * per device structure. Config BAR validation will be done - * inside this function - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @hw_access: qdma_hw_access structure pointer. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_access_init(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_access *hw_access); - -/*****************************************************************************/ -/** - * qdma_acc_get_config_regs() - Function to get qdma config registers - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @reg_data: pointer to register data to be filled - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_get_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint32_t *reg_data); - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_dump_reg_info() - Function to get qdma reg info in a buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @reg_addr: Register Address - * @num_regs: Number of Registers - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_reg_info(void *dev_hndl, enum qdma_ip_type ip_type, - enum qdma_device_type device_type, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_dump_queue_context() - Function to dump qdma queue context data in a - * buffer where context information is already available in 'ctxt_data' - * structure pointer buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @st: ST or MM - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type:QDMA DEVICE Type - * @qid_hw: queue id - * @st: ST or MM - * @q_type: Queue Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_read_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @device_type: QDMA DEVICE Type - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_acc_dump_config_reg_list(void *dev_hndl, - enum qdma_ip_type ip_type, - enum qdma_device_type device_type, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_get_error_code() - function to get the qdma access mapped - * error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_error_code(int acc_err_code); - -/*****************************************************************************/ -/** - * qdma_fetch_version_details() - Function to fetch the version details from the - * version register value - * - * @is_vf : Whether PF or VF - * @version_reg_val : Value of the version register - * @version_info : Pointer to store the version details. - * - * Return: Nothing - *****************************************************************************/ -void qdma_fetch_version_details(void *dev_hndl, uint8_t is_vf, - uint32_t version_reg_val, struct qdma_hw_version_info *version_info); - -#ifdef __cplusplus -} -#endif - -#endif /* QDMA_ACCESS_COMMON_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_errors.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_errors.h deleted file mode 100755 index c8b28c9..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_errors.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_ACCESS_ERRORS_H_ -#define __QDMA_ACCESS_ERRORS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library error codes definitions - * - * Header file *qdma_access_errors.h* defines error codes for common library - */ - -struct err_code_map { - int acc_err_code; - int err_code; -}; - -#define QDMA_HW_ERR_NOT_DETECTED 1 - -enum qdma_access_error_codes { - QDMA_SUCCESS = 0, - QDMA_ERR_INV_PARAM, - QDMA_ERR_NO_MEM, - QDMA_ERR_HWACC_BUSY_TIMEOUT, - QDMA_ERR_HWACC_INV_CONFIG_BAR, - QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR, - QDMA_ERR_HWACC_BAR_NOT_FOUND, - QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED, /* 7 */ - - QDMA_ERR_RM_RES_EXISTS, /* 8 */ - QDMA_ERR_RM_RES_NOT_EXISTS, - QDMA_ERR_RM_DEV_EXISTS, - QDMA_ERR_RM_DEV_NOT_EXISTS, - QDMA_ERR_RM_NO_QUEUES_LEFT, - QDMA_ERR_RM_QMAX_CONF_REJECTED, /* 13 */ - - QDMA_ERR_MBOX_FMAP_WR_FAILED, /* 14 */ - QDMA_ERR_MBOX_NUM_QUEUES, - QDMA_ERR_MBOX_INV_QID, - QDMA_ERR_MBOX_INV_RINGSZ, - QDMA_ERR_MBOX_INV_BUFSZ, - QDMA_ERR_MBOX_INV_CNTR_TH, - QDMA_ERR_MBOX_INV_TMR_TH, - QDMA_ERR_MBOX_INV_MSG, - QDMA_ERR_MBOX_SEND_BUSY, - QDMA_ERR_MBOX_NO_MSG_IN, - QDMA_ERR_MBOX_REG_READ_FAILED, - QDMA_ERR_MBOX_ALL_ZERO_MSG, /* 25 */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_ACCESS_ERRORS_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_export.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_export.h deleted file mode 100755 index 66eaa32..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_export.h +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_ACCESS_EXPORT_H_ -#define __QDMA_ACCESS_EXPORT_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform_env.h" - -/** QDMA Global CSR array size */ -#define QDMA_GLOBAL_CSR_ARRAY_SZ 16 - -/** - * struct qdma_dev_attributes - QDMA device attributes - */ -struct qdma_dev_attributes { - /** @num_pfs - Num of PFs*/ - uint8_t num_pfs; - /** @num_qs - Num of Queues */ - uint16_t num_qs; - /** @flr_present - FLR resent or not? */ - uint8_t flr_present:1; - /** @st_en - ST mode supported or not? */ - uint8_t st_en:1; - /** @mm_en - MM mode supported or not? */ - uint8_t mm_en:1; - /** @mm_cmpt_en - MM with Completions supported or not? */ - uint8_t mm_cmpt_en:1; - /** @mailbox_en - Mailbox supported or not? */ - uint8_t mailbox_en:1; - /** @debug_mode - Debug mode is enabled/disabled for IP */ - uint8_t debug_mode:1; - /** @desc_eng_mode - Descriptor Engine mode: - * Internal only/Bypass only/Internal & Bypass - */ - uint8_t desc_eng_mode:2; - /** @mm_channel_max - Num of MM channels */ - uint8_t mm_channel_max; - - /** Below are the list of HW features which are populated by qdma_access - * based on RTL version - */ - /** @qid2vec_ctx - To indicate support of qid2vec context */ - uint8_t qid2vec_ctx:1; - /** @cmpt_ovf_chk_dis - To indicate support of overflow check - * disable in CMPT ring - */ - uint8_t cmpt_ovf_chk_dis:1; - /** @mailbox_intr - To indicate support of mailbox interrupt */ - uint8_t mailbox_intr:1; - /** @sw_desc_64b - To indicate support of 64 bytes C2H/H2C - * descriptor format - */ - uint8_t sw_desc_64b:1; - /** @cmpt_desc_64b - To indicate support of 64 bytes CMPT - * descriptor format - */ - uint8_t cmpt_desc_64b:1; - /** @dynamic_bar - To indicate support of dynamic bar detection */ - uint8_t dynamic_bar:1; - /** @legacy_intr - To indicate support of legacy interrupt */ - uint8_t legacy_intr:1; - /** @cmpt_trig_count_timer - To indicate support of counter + timer - * trigger mode - */ - uint8_t cmpt_trig_count_timer:1; -}; - -/** qdma_dev_attributes structure size */ -#define QDMA_DEV_ATTR_STRUCT_SIZE (sizeof(struct qdma_dev_attributes)) - -/** global_csr_conf structure size */ -#define QDMA_DEV_GLOBAL_CSR_STRUCT_SIZE (sizeof(struct global_csr_conf)) - -/** - * enum qdma_dev_type - To hold qdma device type - */ -enum qdma_dev_type { - QDMA_DEV_PF, - QDMA_DEV_VF -}; - -/** - * enum qdma_dev_q_type: Q type - */ -enum qdma_dev_q_type { - /** @QDMA_DEV_Q_TYPE_H2C: H2C Q */ - QDMA_DEV_Q_TYPE_H2C, - /** @QDMA_DEV_Q_TYPE_C2H: C2H Q */ - QDMA_DEV_Q_TYPE_C2H, - /** @QDMA_DEV_Q_TYPE_CMPT: CMPT Q */ - QDMA_DEV_Q_TYPE_CMPT, - /** @QDMA_DEV_Q_TYPE_MAX: Total Q types */ - QDMA_DEV_Q_TYPE_MAX -}; - -/** - * @enum qdma_desc_size - QDMA queue descriptor size - */ -enum qdma_desc_size { - /** @QDMA_DESC_SIZE_8B - 8 byte descriptor */ - QDMA_DESC_SIZE_8B, - /** @QDMA_DESC_SIZE_16B - 16 byte descriptor */ - QDMA_DESC_SIZE_16B, - /** @QDMA_DESC_SIZE_32B - 32 byte descriptor */ - QDMA_DESC_SIZE_32B, - /** @QDMA_DESC_SIZE_64B - 64 byte descriptor */ - QDMA_DESC_SIZE_64B -}; - -/** - * @enum qdma_cmpt_update_trig_mode - Interrupt and Completion status write - * trigger mode - */ -enum qdma_cmpt_update_trig_mode { - /** @QDMA_CMPT_UPDATE_TRIG_MODE_DIS - disabled */ - QDMA_CMPT_UPDATE_TRIG_MODE_DIS, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_EVERY - every */ - QDMA_CMPT_UPDATE_TRIG_MODE_EVERY, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR_CNT - user counter */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR_CNT, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR - user */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR_TMR - user timer */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR_TMR, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR - timer + counter combo */ - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR -}; - - -/** - * @enum qdma_indirect_intr_ring_size - Indirect interrupt ring size - */ -enum qdma_indirect_intr_ring_size { - /** @QDMA_INDIRECT_INTR_RING_SIZE_4KB - Accommodates 512 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_4KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_8KB - Accommodates 1024 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_8KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_12KB - Accommodates 1536 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_12KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_16KB - Accommodates 2048 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_16KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_20KB - Accommodates 2560 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_20KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_24KB - Accommodates 3072 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_24KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_28KB - Accommodates 3584 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_28KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_32KB - Accommodates 4096 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_32KB -}; - -/** - * @enum qdma_wrb_interval - writeback update interval - */ -enum qdma_wrb_interval { - /** @QDMA_WRB_INTERVAL_4 - writeback update interval of 4 */ - QDMA_WRB_INTERVAL_4, - /** @QDMA_WRB_INTERVAL_8 - writeback update interval of 8 */ - QDMA_WRB_INTERVAL_8, - /** @QDMA_WRB_INTERVAL_16 - writeback update interval of 16 */ - QDMA_WRB_INTERVAL_16, - /** @QDMA_WRB_INTERVAL_32 - writeback update interval of 32 */ - QDMA_WRB_INTERVAL_32, - /** @QDMA_WRB_INTERVAL_64 - writeback update interval of 64 */ - QDMA_WRB_INTERVAL_64, - /** @QDMA_WRB_INTERVAL_128 - writeback update interval of 128 */ - QDMA_WRB_INTERVAL_128, - /** @QDMA_WRB_INTERVAL_256 - writeback update interval of 256 */ - QDMA_WRB_INTERVAL_256, - /** @QDMA_WRB_INTERVAL_512 - writeback update interval of 512 */ - QDMA_WRB_INTERVAL_512, - /** @QDMA_NUM_WRB_INTERVALS - total number of writeback intervals */ - QDMA_NUM_WRB_INTERVALS -}; - -enum qdma_rtl_version { - /** @QDMA_RTL_BASE - RTL Base */ - QDMA_RTL_BASE, - /** @QDMA_RTL_PATCH - RTL Patch */ - QDMA_RTL_PATCH, - /** @QDMA_RTL_NONE - Not a valid RTL version */ - QDMA_RTL_NONE, -}; - -enum qdma_vivado_release_id { - /** @QDMA_VIVADO_2018_3 - Vivado version 2018.3 */ - QDMA_VIVADO_2018_3, - /** @QDMA_VIVADO_2019_1 - Vivado version 2019.1 */ - QDMA_VIVADO_2019_1, - /** @QDMA_VIVADO_2019_2 - Vivado version 2019.2 */ - QDMA_VIVADO_2019_2, - /** @QDMA_VIVADO_2020_1 - Vivado version 2020.1 */ - QDMA_VIVADO_2020_1, - /** @QDMA_VIVADO_2020_2 - Vivado version 2020.2 */ - QDMA_VIVADO_2020_2, - /** @QDMA_VIVADO_2021_1 - Vivado version 2021.1 */ - QDMA_VIVADO_2021_1, - /** @QDMA_VIVADO_2022_1 - Vivado version 2022.1 */ - QDMA_VIVADO_2022_1, - /** @QDMA_VIVADO_NONE - Not a valid Vivado version*/ - QDMA_VIVADO_NONE -}; - -enum qdma_ip_type { - /** @QDMA_VERSAL_HARD_IP - Hard IP */ - QDMA_VERSAL_HARD_IP, - /** @QDMA_VERSAL_SOFT_IP - Soft IP */ - QDMA_VERSAL_SOFT_IP, - /** @QDMA_SOFT_IP - Hard IP */ - QDMA_SOFT_IP, - /** @EQDMA_SOFT_IP - Soft IP */ - EQDMA_SOFT_IP, - /** @QDMA_VERSAL_NONE - Not versal device */ - QDMA_NONE_IP -}; - - -enum qdma_device_type { - /** @QDMA_DEVICE_SOFT - UltraScale+ IP's */ - QDMA_DEVICE_SOFT, - /** @QDMA_DEVICE_VERSAL_CPM4 -VERSAL IP */ - QDMA_DEVICE_VERSAL_CPM4, - /** @QDMA_DEVICE_VERSAL_CPM5 -VERSAL IP */ - QDMA_DEVICE_VERSAL_CPM5, - /** @QDMA_DEVICE_NONE - Not a valid device */ - QDMA_DEVICE_NONE -}; - -enum qdma_desc_eng_mode { - /** @QDMA_DESC_ENG_INTERNAL_BYPASS - Internal and Bypass mode */ - QDMA_DESC_ENG_INTERNAL_BYPASS, - /** @QDMA_DESC_ENG_BYPASS_ONLY - Only Bypass mode */ - QDMA_DESC_ENG_BYPASS_ONLY, - /** @QDMA_DESC_ENG_INTERNAL_ONLY - Only Internal mode */ - QDMA_DESC_ENG_INTERNAL_ONLY, - /** @QDMA_DESC_ENG_MODE_MAX - Max of desc engine modes */ - QDMA_DESC_ENG_MODE_MAX -}; - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_ACCESS_EXPORT_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_version.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_version.h deleted file mode 100755 index f655918..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_access_version.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_ACCESS_VERSION_H_ -#define __QDMA_ACCESS_VERSION_H_ - - -#define QDMA_VERSION_MAJOR 2023 -#define QDMA_VERSION_MINOR 2 -#define QDMA_VERSION_PATCH 1 - -#define QDMA_VERSION_STR \ - __stringify(QDMA_VERSION_MAJOR) "." \ - __stringify(QDMA_VERSION_MINOR) "." \ - __stringify(QDMA_VERSION_PATCH) - -#define QDMA_VERSION \ - ((QDMA_VERSION_MAJOR)*1000 + \ - (QDMA_VERSION_MINOR)*100 + \ - QDMA_VERSION_PATCH) - - -#endif /* __QDMA_ACCESS_VERSION_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.c deleted file mode 100755 index 33c45ff..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.c +++ /dev/null @@ -1,6055 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "qdma_cpm4_access.h" -#include "qdma_cpm4_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_cpm4_access.tmh" -#endif - -/** QDMA CPM4 Hard Context array size */ -#define QDMA_CPM4_SW_CONTEXT_NUM_WORDS 4 -#define QDMA_CPM4_CMPT_CONTEXT_NUM_WORDS 4 -#define QDMA_CPM4_QID2VEC_CONTEXT_NUM_WORDS 1 -#define QDMA_CPM4_HW_CONTEXT_NUM_WORDS 2 -#define QDMA_CPM4_CR_CONTEXT_NUM_WORDS 1 -#define QDMA_CPM4_IND_INTR_CONTEXT_NUM_WORDS 3 -#define QDMA_CPM4_PFETCH_CONTEXT_NUM_WORDS 2 - -#define QDMA_CPM4_VF_USER_BAR_ID 2 - -#define QDMA_CPM4_REG_GROUP_1_START_ADDR 0x000 -#define QDMA_CPM4_REG_GROUP_2_START_ADDR 0x400 -#define QDMA_CPM4_REG_GROUP_3_START_ADDR 0xB00 -#define QDMA_CPM4_REG_GROUP_4_START_ADDR 0x1014 - -#define QDMA_CPM4_REG_TRQ_SEL_FMAP_STEP 4 - -#define QDMA_CPM4_IND_CTXT_DATA_NUM_REGS 4 - -#define QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS 7 -#define QDMA_CPM4_GLBL_TRQ_ERR_ALL_MASK 0XB3 -#define QDMA_CPM4_GLBL_DSC_ERR_ALL_MASK 0X1F9037E -#define QDMA_CPM4_C2H_ERR_ALL_MASK 0X3F6DF -#define QDMA_CPM4_C2H_FATAL_ERR_ALL_MASK 0X1FDF1B -#define QDMA_CPM4_H2C_ERR_ALL_MASK 0X3F -#define QDMA_CPM4_SBE_ERR_ALL_MASK 0XFFFFFFFF -#define QDMA_CPM4_DBE_ERR_ALL_MASK 0XFFFFFFFF - -#define QDMA_CPM4_OFFSET_DMAP_SEL_INT_CIDX 0x6400 -#define QDMA_CPM4_OFFSET_DMAP_SEL_H2C_DSC_PIDX 0x6404 -#define QDMA_CPM4_OFFSET_DMAP_SEL_C2H_DSC_PIDX 0x6408 -#define QDMA_CPM4_OFFSET_DMAP_SEL_CMPT_CIDX 0x640C - -#define QDMA_CPM4_OFFSET_VF_DMAP_SEL_INT_CIDX 0x3000 -#define QDMA_CPM4_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX 0x3004 -#define QDMA_CPM4_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX 0x3008 -#define QDMA_CPM4_OFFSET_VF_DMAP_SEL_CMPT_CIDX 0x300C - -#define QDMA_CPM4_DMA_SEL_INT_SW_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_DMA_SEL_INT_RING_IDX_MASK GENMASK(23, 16) -#define QDMA_CPM4_DMA_SEL_DESC_PIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_DMA_SEL_IRQ_EN_MASK BIT(16) -#define QDMA_CPM4_DMAP_SEL_CMPT_IRQ_EN_MASK BIT(28) -#define QDMA_CPM4_DMAP_SEL_CMPT_STS_DESC_EN_MASK BIT(27) -#define QDMA_CPM4_DMAP_SEL_CMPT_TRG_MODE_MASK GENMASK(26, 24) -#define QDMA_CPM4_DMAP_SEL_CMPT_TMR_CNT_MASK GENMASK(23, 20) -#define QDMA_CPM4_DMAP_SEL_CMPT_CNT_THRESH_MASK GENMASK(19, 16) -#define QDMA_CPM4_DMAP_SEL_CMPT_WRB_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_INTR_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 35) -#define QDMA_CPM4_INTR_CTXT_BADDR_GET_L_MASK GENMASK_ULL(34, 12) -#define QDMA_CPM4_COMPL_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 42) -#define QDMA_CPM4_COMPL_CTXT_BADDR_GET_M_MASK GENMASK_ULL(41, 10) -#define QDMA_CPM4_COMPL_CTXT_BADDR_GET_L_MASK GENMASK_ULL(9, 6) -#define QDMA_CPM4_COMPL_CTXT_PIDX_GET_H_MASK GENMASK(15, 8) -#define QDMA_CPM4_COMPL_CTXT_PIDX_GET_L_MASK GENMASK(7, 0) -#define QDMA_CPM4_QID2VEC_H2C_VECTOR GENMASK(16, 9) -#define QDMA_CPM4_QID2VEC_H2C_COAL_EN BIT(17) - -#define QDMA_CPM4_DEFAULT_PFCH_STOP_THRESH 256 - -static void qdma_cpm4_hw_st_h2c_err_process(void *dev_hndl); -static void qdma_cpm4_hw_st_c2h_err_process(void *dev_hndl); -static void qdma_cpm4_hw_desc_err_process(void *dev_hndl); -static void qdma_cpm4_hw_trq_err_process(void *dev_hndl); -static void qdma_cpm4_hw_ram_sbe_err_process(void *dev_hndl); -static void qdma_cpm4_hw_ram_dbe_err_process(void *dev_hndl); - -static struct qdma_cpm4_hw_err_info - qdma_cpm4_err_info[QDMA_CPM4_ERRS_ALL] = { - /* Descriptor errors */ - { - QDMA_CPM4_DSC_ERR_POISON, - "Poison error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_UR_CA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_PARAM, - "Parameter mismatch error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PARAM_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_ADDR, - "Address mismatch error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_ADDR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_TAG, - "Unexpected tag error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TAG_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_FLR, - "FLR error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_TIMEOUT, - "Timed out error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_DAT_POISON, - "Poison data error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DAT_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_DMA, - "DMA engine error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DMA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_DSC, - "Invalid PIDX update error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DSC_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_SBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - { - QDMA_CPM4_DSC_ERR_ALL, - "All Descriptor errors", - QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - QDMA_CPM4_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_cpm4_hw_desc_err_process - }, - - /* TRQ errors */ - { - QDMA_CPM4_TRQ_ERR_UNMAPPED, - "Access targeted unmapped register space via CSR pathway error", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - { - QDMA_CPM4_TRQ_ERR_QID_RANGE, - "Qid range error", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QID_RANGE_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - { - QDMA_CPM4_TRQ_ERR_VF_ACCESS_ERR, - "VF attempted to access Global register space or Function map", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - { - QDMA_CPM4_TRQ_ERR_TCP_TIMEOUT, - "Timeout on request to dma internal csr register", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - { - QDMA_CPM4_TRQ_ERR_ALL, - "All TRQ errors", - QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_cpm4_hw_trq_err_process - }, - - /* C2H Errors*/ - { - QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_DESC_RSP_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MSI_INT_FAIL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ERR_DESC_CNT_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - "Port id in packet and bypass in mismatch error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_WRB_INV_Q_ERR, - "Writeback on invalid queue error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_WRB_QFULL_ERR, - "Completion queue gets full error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_QFULL_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_WRB_CIDX_ERR, - "Bad CIDX update by the software error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_CIDX_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_WRB_PRTY_ERR, - "C2H completion Parity error", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PRTY_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_C2H_ERR_ALL, - "All C2h errors", - QDMA_CPM4_C2H_ERR_MASK_ADDR, - QDMA_CPM4_C2H_ERR_STAT_ADDR, - QDMA_CPM4_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - QDMA_CPM4_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_WRB_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_INT_QID2VEC_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_WRB_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_WPL_DATA_PAR_ERR, - "RAM double bit fatal error", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - { - QDMA_CPM4_ST_FATAL_ERR_ALL, - "All fatal errors", - QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_cpm4_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - QDMA_CPM4_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - "Zero length descriptor error", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_ZERO_LEN_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_SDI_MRKR_REQ_MOP_ERR, - "A non-EOP descriptor received", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_NO_DMA_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_DBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - { - QDMA_CPM4_ST_H2C_ERR_ALL, - "All H2C errors", - QDMA_CPM4_H2C_ERR_MASK_ADDR, - QDMA_CPM4_H2C_ERR_STAT_ADDR, - QDMA_CPM4_H2C_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_cpm4_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - QDMA_CPM4_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_PASID_CTXT_RAM, - "Pasid ctxt FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PASID_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PLD_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - { - QDMA_CPM4_SBE_ERR_ALL, - "All SBE errors", - QDMA_CPM4_RAM_SBE_MSK_A_ADDR, - QDMA_CPM4_RAM_SBE_STS_A_ADDR, - QDMA_CPM4_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_cpm4_hw_ram_sbe_err_process - }, - - - /* DBE errors */ - { - QDMA_CPM4_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_PASID_CTXT_RAM, - "PASID CTXT RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PASID_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_PAYLOAD_FIFO_RAM, - "Payload fifo RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PLD_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_INT_QID2VEC_RAM, - "QID2VEC RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - }, - { - QDMA_CPM4_DBE_ERR_ALL, - "All DBE errors", - QDMA_CPM4_RAM_DBE_MSK_A_ADDR, - QDMA_CPM4_RAM_DBE_STS_A_ADDR, - QDMA_CPM4_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_cpm4_hw_ram_dbe_err_process - } -}; - -static int32_t all_qdma_cpm4_hw_errs[ - QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS] = { - - QDMA_CPM4_DSC_ERR_ALL, - QDMA_CPM4_TRQ_ERR_ALL, - QDMA_CPM4_ST_C2H_ERR_ALL, - QDMA_CPM4_ST_FATAL_ERR_ALL, - QDMA_CPM4_ST_H2C_ERR_ALL, - QDMA_CPM4_SBE_ERR_ALL, - QDMA_CPM4_DBE_ERR_ALL -}; - - - -union qdma_cpm4_ind_ctxt_cmd { - uint32_t word; - struct { - uint32_t busy:1; - uint32_t sel:4; - uint32_t op:2; - uint32_t qid:11; - uint32_t rsvd:14; - } bits; -}; - -struct qdma_cpm4_indirect_ctxt_regs { - uint32_t qdma_ind_ctxt_data[QDMA_CPM4_IND_CTXT_DATA_NUM_REGS]; - uint32_t qdma_ind_ctxt_mask[QDMA_CPM4_IND_CTXT_DATA_NUM_REGS]; - union qdma_cpm4_ind_ctxt_cmd cmd; -}; - -static struct qctx_entry qdma_cpm4_sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Function Id", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, -}; - -static struct qctx_entry qdma_cpm4_hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry qdma_cpm4_credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry qdma_cpm4_fmap_ctxt_entries[] = { - {"Queue Base", 0}, - {"Queue Max", 0}, -}; - -static struct qctx_entry qdma_cpm4_cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Address (Low)", 0}, - {"Base Address (High)", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, -}; - -static struct qctx_entry qdma_cpm4_c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry qdma_cpm4_qid2vec_ctxt_entries[] = { - {"c2h_vector", 0}, - {"c2h_en_coal", 0}, - {"h2c_vector", 0}, - {"h2c_en_coal", 0}, -}; - -static struct qctx_entry qdma_cpm4_ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, -}; - -static int qdma_cpm4_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_cpm4_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_cpm4_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int qdma_cpm4_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - -uint32_t qdma_cpm4_get_config_num_regs(void) -{ - return qdma_cpm4_config_num_regs_get(); -} - -struct xreg_info *qdma_cpm4_get_config_regs(void) -{ - return qdma_cpm4_config_regs_get(); -} - -uint32_t qdma_cpm4_reg_dump_buf_len(void) -{ - uint32_t length = (qdma_cpm4_config_num_regs_get() + 1) - * REG_DUMP_SIZE_PER_LINE; - return length; -} - -int qdma_cpm4_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *req_buflen) -{ - uint32_t len = 0; - int rv = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(qdma_cpm4_cmpt_ctxt_entries) / - sizeof(qdma_cpm4_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(qdma_cpm4_sw_ctxt_entries) / - sizeof(qdma_cpm4_sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_cpm4_hw_ctxt_entries) / - sizeof(qdma_cpm4_hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_cpm4_credit_ctxt_entries) / - sizeof(qdma_cpm4_credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_cpm4_fmap_ctxt_entries) / - sizeof(qdma_cpm4_fmap_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(qdma_cpm4_cmpt_ctxt_entries) / - sizeof(qdma_cpm4_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_cpm4_c2h_pftch_ctxt_entries) / - sizeof(qdma_cpm4_c2h_pftch_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } - } - - *req_buflen = len; - return rv; -} - -static uint32_t qdma_cpm4_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(qdma_cpm4_ind_intr_ctxt_entries) / - sizeof(qdma_cpm4_ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * qdma_acc_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void qdma_cpm4_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - qdma_cpm4_sw_ctxt_entries[0].value = sw_ctxt->pidx; - qdma_cpm4_sw_ctxt_entries[1].value = sw_ctxt->irq_arm; - qdma_cpm4_sw_ctxt_entries[2].value = sw_ctxt->qen; - qdma_cpm4_sw_ctxt_entries[3].value = sw_ctxt->frcd_en; - qdma_cpm4_sw_ctxt_entries[4].value = sw_ctxt->wbi_chk; - qdma_cpm4_sw_ctxt_entries[5].value = sw_ctxt->wbi_intvl_en; - qdma_cpm4_sw_ctxt_entries[6].value = sw_ctxt->fnc_id; - qdma_cpm4_sw_ctxt_entries[7].value = sw_ctxt->rngsz_idx; - qdma_cpm4_sw_ctxt_entries[8].value = sw_ctxt->desc_sz; - qdma_cpm4_sw_ctxt_entries[9].value = sw_ctxt->bypass; - qdma_cpm4_sw_ctxt_entries[10].value = sw_ctxt->mm_chn; - qdma_cpm4_sw_ctxt_entries[11].value = sw_ctxt->wbk_en; - qdma_cpm4_sw_ctxt_entries[12].value = sw_ctxt->irq_en; - qdma_cpm4_sw_ctxt_entries[13].value = sw_ctxt->port_id; - qdma_cpm4_sw_ctxt_entries[14].value = sw_ctxt->irq_no_last; - qdma_cpm4_sw_ctxt_entries[15].value = sw_ctxt->err; - qdma_cpm4_sw_ctxt_entries[16].value = sw_ctxt->err_wb_sent; - qdma_cpm4_sw_ctxt_entries[17].value = sw_ctxt->irq_req; - qdma_cpm4_sw_ctxt_entries[18].value = sw_ctxt->mrkr_dis; - qdma_cpm4_sw_ctxt_entries[19].value = sw_ctxt->is_mm; - qdma_cpm4_sw_ctxt_entries[20].value = - sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - qdma_cpm4_sw_ctxt_entries[21].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; -} - -/* - * qdma_acc_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void qdma_cpm4_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - qdma_cpm4_cmpt_ctxt_entries[0].value = cmpt_ctxt->en_stat_desc; - qdma_cpm4_cmpt_ctxt_entries[1].value = cmpt_ctxt->en_int; - qdma_cpm4_cmpt_ctxt_entries[2].value = cmpt_ctxt->trig_mode; - qdma_cpm4_cmpt_ctxt_entries[3].value = cmpt_ctxt->fnc_id; - qdma_cpm4_cmpt_ctxt_entries[4].value = cmpt_ctxt->counter_idx; - qdma_cpm4_cmpt_ctxt_entries[5].value = cmpt_ctxt->timer_idx; - qdma_cpm4_cmpt_ctxt_entries[6].value = cmpt_ctxt->in_st; - qdma_cpm4_cmpt_ctxt_entries[7].value = cmpt_ctxt->color; - qdma_cpm4_cmpt_ctxt_entries[8].value = cmpt_ctxt->ringsz_idx; - qdma_cpm4_cmpt_ctxt_entries[9].value = - cmpt_ctxt->bs_addr & 0xFFFFFFFF; - qdma_cpm4_cmpt_ctxt_entries[10].value = - (cmpt_ctxt->bs_addr >> 32) & 0xFFFFFFFF; - qdma_cpm4_cmpt_ctxt_entries[11].value = cmpt_ctxt->desc_sz; - qdma_cpm4_cmpt_ctxt_entries[12].value = cmpt_ctxt->pidx; - qdma_cpm4_cmpt_ctxt_entries[13].value = cmpt_ctxt->cidx; - qdma_cpm4_cmpt_ctxt_entries[14].value = cmpt_ctxt->valid; - qdma_cpm4_cmpt_ctxt_entries[15].value = cmpt_ctxt->err; - qdma_cpm4_cmpt_ctxt_entries[16].value = cmpt_ctxt->user_trig_pend; - qdma_cpm4_cmpt_ctxt_entries[17].value = cmpt_ctxt->timer_running; - qdma_cpm4_cmpt_ctxt_entries[18].value = cmpt_ctxt->full_upd; - -} - -/* - * qdma_acc_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void qdma_cpm4_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - qdma_cpm4_hw_ctxt_entries[0].value = hw_ctxt->cidx; - qdma_cpm4_hw_ctxt_entries[1].value = hw_ctxt->crd_use; - qdma_cpm4_hw_ctxt_entries[2].value = hw_ctxt->dsc_pend; - qdma_cpm4_hw_ctxt_entries[3].value = hw_ctxt->idl_stp_b; - qdma_cpm4_hw_ctxt_entries[4].value = hw_ctxt->evt_pnd; - qdma_cpm4_hw_ctxt_entries[5].value = hw_ctxt->fetch_pnd; -} - -/* - * qdma_acc_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void qdma_cpm4_fill_credit_ctxt( - struct qdma_descq_credit_ctxt *cr_ctxt) -{ - qdma_cpm4_credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * qdma_acc_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void qdma_cpm4_fill_pfetch_ctxt( - struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - qdma_cpm4_c2h_pftch_ctxt_entries[0].value = pfetch_ctxt->bypass; - qdma_cpm4_c2h_pftch_ctxt_entries[1].value = pfetch_ctxt->bufsz_idx; - qdma_cpm4_c2h_pftch_ctxt_entries[2].value = pfetch_ctxt->port_id; - qdma_cpm4_c2h_pftch_ctxt_entries[3].value = pfetch_ctxt->err; - qdma_cpm4_c2h_pftch_ctxt_entries[4].value = pfetch_ctxt->pfch_en; - qdma_cpm4_c2h_pftch_ctxt_entries[5].value = pfetch_ctxt->pfch; - qdma_cpm4_c2h_pftch_ctxt_entries[6].value = pfetch_ctxt->sw_crdt; - qdma_cpm4_c2h_pftch_ctxt_entries[7].value = pfetch_ctxt->valid; -} - -/* - * qdma_cpm4_fill_fmap_ctxt() - Helper function to fill fmap context - * into structure - * - */ -static void qdma_cpm4_fill_fmap_ctxt(struct qdma_fmap_cfg *fmap_ctxt) -{ - qdma_cpm4_fmap_ctxt_entries[0].value = fmap_ctxt->qbase; - qdma_cpm4_fmap_ctxt_entries[1].value = fmap_ctxt->qmax; -} - -static void qdma_cpm4_fill_qid2vec_ctxt(struct qdma_qid2vec *qid2vec_ctxt) -{ - qdma_cpm4_qid2vec_ctxt_entries[0].value = qid2vec_ctxt->c2h_vector; - qdma_cpm4_qid2vec_ctxt_entries[1].value = qid2vec_ctxt->c2h_en_coal; - qdma_cpm4_qid2vec_ctxt_entries[2].value = qid2vec_ctxt->h2c_vector; - qdma_cpm4_qid2vec_ctxt_entries[3].value = qid2vec_ctxt->h2c_en_coal; -} - -static void qdma_cpm4_fill_intr_ctxt( - struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - qdma_cpm4_ind_intr_ctxt_entries[0].value = intr_ctxt->valid; - qdma_cpm4_ind_intr_ctxt_entries[1].value = intr_ctxt->vec; - qdma_cpm4_ind_intr_ctxt_entries[2].value = intr_ctxt->int_st; - qdma_cpm4_ind_intr_ctxt_entries[3].value = intr_ctxt->color; - qdma_cpm4_ind_intr_ctxt_entries[4].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - qdma_cpm4_ind_intr_ctxt_entries[5].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - qdma_cpm4_ind_intr_ctxt_entries[6].value = intr_ctxt->page_size; - qdma_cpm4_ind_intr_ctxt_entries[7].value = intr_ctxt->pidx; -} - -/* - * dump_cpm4_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_cpm4_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_CMPT) { - qdma_log_error("%s: Invalid queue type(%d), err:%d\n", - __func__, - q_type, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_cpm4_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_cpm4_fill_credit_ctxt(&queue_context->cr_ctxt); - qdma_cpm4_fill_qid2vec_ctxt(&queue_context->qid2vec); - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - qdma_cpm4_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - qdma_cpm4_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - - qdma_cpm4_fill_fmap_ctxt(&queue_context->fmap); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* SW context dump */ - n = sizeof(qdma_cpm4_sw_ctxt_entries) / - sizeof((qdma_cpm4_sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_sw_ctxt_entries[i].name, - qdma_cpm4_sw_ctxt_entries[i].value, - qdma_cpm4_sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(qdma_cpm4_hw_ctxt_entries) / - sizeof((qdma_cpm4_hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_hw_ctxt_entries[i].name, - qdma_cpm4_hw_ctxt_entries[i].value, - qdma_cpm4_hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(qdma_cpm4_credit_ctxt_entries) / - sizeof((qdma_cpm4_credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_credit_ctxt_entries[i].name, - qdma_cpm4_credit_ctxt_entries[i].value, - qdma_cpm4_credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* SW context dump */ - n = sizeof(qdma_cpm4_qid2vec_ctxt_entries) / - sizeof((qdma_cpm4_qid2vec_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "QID2VEC Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_qid2vec_ctxt_entries[i].name, - qdma_cpm4_qid2vec_ctxt_entries[i].value, - qdma_cpm4_qid2vec_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(qdma_cpm4_cmpt_ctxt_entries) / - sizeof((qdma_cpm4_cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_cmpt_ctxt_entries[i].name, - qdma_cpm4_cmpt_ctxt_entries[i].value, - qdma_cpm4_cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(qdma_cpm4_c2h_pftch_ctxt_entries) / - sizeof(qdma_cpm4_c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_c2h_pftch_ctxt_entries[i].name, - qdma_cpm4_c2h_pftch_ctxt_entries[i].value, - qdma_cpm4_c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* Fmap context dump */ - n = sizeof(qdma_cpm4_fmap_ctxt_entries) / - sizeof(qdma_cpm4_fmap_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Fmap Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_fmap_ctxt_entries[i].name, - qdma_cpm4_fmap_ctxt_entries[i].value, - qdma_cpm4_fmap_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -static int dump_cpm4_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ] = ""; - - qdma_cpm4_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(qdma_cpm4_ind_intr_ctxt_entries) / - sizeof((qdma_cpm4_ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_cpm4_ind_intr_ctxt_entries[i].name, - qdma_cpm4_ind_intr_ctxt_entries[i].value, - qdma_cpm4_ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial intr context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * qdma_cpm4_indirect_reg_invalidate() - helper function to invalidate - * indirect context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_cpm4_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_cpm4_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_cpm4_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_cpm4_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_cpm4_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - - qdma_reg_write(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_cpm4_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_cpm4_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = QDMA_CPM4_IND_CTXT_DATA_3_ADDR; - union qdma_cpm4_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_cpm4_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_cpm4_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_cpm4_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_CPM4_IND_CTXT_DATA_NUM_REGS; - index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = QDMA_CPM4_IND_CTXT_DATA_3_ADDR; - - for (index = 0; - index < ((2 * QDMA_CPM4_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_CPM4_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_write() - create qid2vec context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_qid2vec_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_qid2vec *ctxt) -{ - uint32_t qid2vec = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - int rv = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p qid2vec=%p, err:%d\n", - __func__, dev_hndl, ctxt, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - 1, &qid2vec); - if (rv < 0) - return rv; - if (c2h) { - qid2vec = qid2vec & (QDMA_CPM4_QID2VEC_H2C_VECTOR | - QDMA_CPM4_QID2VEC_H2C_COAL_EN); - qid2vec |= FIELD_SET(C2H_QID2VEC_MAP_C2H_VECTOR_MASK, - ctxt->c2h_vector) | - FIELD_SET(C2H_QID2VEC_MAP_C2H_EN_COAL_MASK, - ctxt->c2h_en_coal); - } else { - qid2vec = qid2vec & (C2H_QID2VEC_MAP_C2H_VECTOR_MASK | - C2H_QID2VEC_MAP_C2H_EN_COAL_MASK); - qid2vec |= - FIELD_SET(QDMA_CPM4_QID2VEC_H2C_VECTOR, - ctxt->h2c_vector) | - FIELD_SET(QDMA_CPM4_QID2VEC_H2C_COAL_EN, - ctxt->h2c_en_coal); - } - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, hw_qid, - &qid2vec, QDMA_CPM4_QID2VEC_CONTEXT_NUM_WORDS); - -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_read() - read qid2vec context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_qid2vec_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_qid2vec *ctxt) -{ - int rv = 0; - uint32_t qid2vec[QDMA_CPM4_QID2VEC_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p qid2vec=%p, err:%d\n", - __func__, dev_hndl, ctxt, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_QID2VEC_CONTEXT_NUM_WORDS, qid2vec); - if (rv < 0) - return rv; - - if (c2h) { - ctxt->c2h_vector = FIELD_GET(C2H_QID2VEC_MAP_C2H_VECTOR_MASK, - qid2vec[0]); - ctxt->c2h_en_coal = - (uint8_t)(FIELD_GET(C2H_QID2VEC_MAP_C2H_EN_COAL_MASK, - qid2vec[0])); - } else { - ctxt->h2c_vector = - (uint8_t)(FIELD_GET(QDMA_CPM4_QID2VEC_H2C_VECTOR, - qid2vec[0])); - ctxt->h2c_en_coal = - (uint8_t)(FIELD_GET(QDMA_CPM4_QID2VEC_H2C_COAL_EN, - qid2vec[0])); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_clear() - clear qid2vec context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_qid2vec_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_invalidate() - invalidate qid2vec context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_qid2vec_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_qid2vec_conf() - configure qid2vector context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_qid2vec_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_qid2vec_read(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_qid2vec_write(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_qid2vec_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_qid2vec_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_fmap_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_fmap_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap = 0; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle or config is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - fmap = FIELD_SET(TRQ_SEL_FMAP_0_QID_BASE_MASK, config->qbase) | - FIELD_SET(TRQ_SEL_FMAP_0_QID_MAX_MASK, - config->qmax); - - qdma_reg_write(dev_hndl, QDMA_CPM4_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_CPM4_REG_TRQ_SEL_FMAP_STEP, - fmap); - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_fmap_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_fmap_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - uint32_t fmap = 0; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - fmap = qdma_reg_read(dev_hndl, QDMA_CPM4_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_CPM4_REG_TRQ_SEL_FMAP_STEP); - - config->qbase = FIELD_GET(TRQ_SEL_FMAP_0_QID_BASE_MASK, fmap); - config->qmax = - (uint16_t)(FIELD_GET(TRQ_SEL_FMAP_0_QID_MAX_MASK, - fmap)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_fmap_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_fmap_clear(void *dev_hndl, uint16_t func_id) -{ - uint32_t fmap = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_reg_write(dev_hndl, QDMA_CPM4_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_CPM4_REG_TRQ_SEL_FMAP_STEP, - fmap); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE unsupported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_fmap_read(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_fmap_write(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_fmap_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[QDMA_CPM4_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl or ctxt is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((ctxt->desc_sz > QDMA_DESC_SIZE_64B) || - (ctxt->rngsz_idx >= QDMA_NUM_RING_SIZES)) { - qdma_log_error("%s: Invalid desc_sz(%d)/rngidx(%d), err:%d\n", - __func__, - ctxt->desc_sz, - ctxt->rngsz_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W0_PIDX_MASK, ctxt->pidx) | - FIELD_SET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, ctxt->irq_arm); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - ctxt->wbi_intvl_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - ctxt->irq_no_last) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_MASK, ctxt->err) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - ctxt->err_wb_sent) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = 0; - uint32_t sw_ctxt[QDMA_CPM4_SW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - struct qdma_qid2vec qid2vec_ctxt = {0}; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p sw_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(SW_IND_CTXT_DATA_W0_PIDX_MASK, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, - sw_ctxt[0])); - - ctxt->qen = FIELD_GET(SW_IND_CTXT_DATA_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, - sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, - sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - sw_ctxt[1]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_FNC_ID_MASK, - sw_ctxt[1])); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, - sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, - sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, - sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, - sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, - sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, - sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, - sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, - sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, - sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, - sw_ctxt[1])); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - /** Read the QID2VEC Context Data */ - rv = qdma_cpm4_qid2vec_read(dev_hndl, c2h, hw_qid, &qid2vec_ctxt); - if (rv < 0) - return rv; - - if (c2h) { - ctxt->vec = qid2vec_ctxt.c2h_vector; - ctxt->intr_aggr = qid2vec_ctxt.c2h_en_coal; - } else { - ctxt->vec = qid2vec_ctxt.h2c_vector; - ctxt->intr_aggr = qid2vec_ctxt.h2c_en_coal; - } - - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_sw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_sw_context_write(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_sw_context_invalidate(dev_hndl, - c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[QDMA_CPM4_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p pfetch_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_ERR_MASK, ctxt->err) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, ctxt->pfch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, sw_crdt_l); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(PREFETCH_CTXT_DATA_W1_VALID_MASK, ctxt->valid); - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = 0; - uint32_t pfetch_ctxt[QDMA_CPM4_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p pfetch_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, - pfetch_ctxt[0])); - ctxt->bufsz_idx = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK, - pfetch_ctxt[0])); - ctxt->port_id = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, - pfetch_ctxt[0])); - ctxt->err = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - (uint32_t)FIELD_GET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, - pfetch_ctxt[0]); - - sw_crdt_h = - (uint32_t)FIELD_GET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, - pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - (uint16_t)(FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, - sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_pfetch_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_pfetch_context_read(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_pfetch_context_write(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_pfetch_context_invalidate(dev_hndl, - hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[QDMA_CPM4_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h, baddr_m, pidx_l, pidx_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p cmpt_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((ctxt->desc_sz > QDMA_DESC_SIZE_32B) || - (ctxt->ringsz_idx >= QDMA_NUM_RING_SIZES) || - (ctxt->counter_idx >= QDMA_NUM_C2H_COUNTERS) || - (ctxt->timer_idx >= QDMA_NUM_C2H_TIMERS) || - (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR)) { - qdma_log_error - ("%s Inv dsz(%d)/ridx(%d)/cntr(%d)/tmr(%d)/tm(%d), err:%d\n", - __func__, - ctxt->desc_sz, - ctxt->ringsz_idx, - ctxt->counter_idx, - ctxt->timer_idx, - ctxt->trig_mode, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = - (uint32_t)FIELD_GET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_L_MASK, - ctxt->bs_addr); - baddr_m = - (uint32_t)FIELD_GET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_M_MASK, - ctxt->bs_addr); - baddr_h = - (uint32_t)FIELD_GET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_H_MASK, - ctxt->bs_addr); - - pidx_l = FIELD_GET(QDMA_CPM4_COMPL_CTXT_PIDX_GET_L_MASK, - ctxt->pidx); - pidx_h = FIELD_GET(QDMA_CPM4_COMPL_CTXT_PIDX_GET_H_MASK, - ctxt->pidx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(CMPL_CTXT_DATA_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(CMPL_CTXT_DATA_W0_CNTER_IDX_MASK, - ctxt->counter_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_TIMER_IDX_MASK, - ctxt->timer_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - ctxt->in_st) | - FIELD_SET(CMPL_CTXT_DATA_W0_COLOR_MASK, - ctxt->color) | - FIELD_SET(CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK, - ctxt->ringsz_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_BADDR_64_L_MASK, - baddr_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W1_BADDR_64_M_MASK, - baddr_m); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W2_BADDR_64_H_MASK, - baddr_h) | - FIELD_SET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - ctxt->desc_sz) | - FIELD_SET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, - pidx_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, - pidx_h) | - FIELD_SET(CMPL_CTXT_DATA_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(CMPL_CTXT_DATA_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(CMPL_CTXT_DATA_W3_ERR_MASK, ctxt->err) | - FIELD_SET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - ctxt->user_trig_pend) | - FIELD_SET(CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK, - ctxt->timer_running) | - FIELD_SET(CMPL_CTXT_DATA_W3_FULL_UPD_MASK, - ctxt->full_upd); - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); - -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = 0; - uint32_t cmpt_ctxt[QDMA_CPM4_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr_l, baddr_h, baddr_m, - pidx_l, pidx_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p cmpt_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(CMPL_CTXT_DATA_W0_EN_INT_MASK, - cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET( - CMPL_CTXT_DATA_W0_CNTER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_TIMER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK, - cmpt_ctxt[0])); - - baddr_l = - FIELD_GET(CMPL_CTXT_DATA_W0_BADDR_64_L_MASK, - cmpt_ctxt[0]); - baddr_m = - FIELD_GET(CMPL_CTXT_DATA_W1_BADDR_64_M_MASK, - cmpt_ctxt[1]); - baddr_h = - FIELD_GET(CMPL_CTXT_DATA_W2_BADDR_64_H_MASK, - cmpt_ctxt[2]); - - ctxt->desc_sz = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, - cmpt_ctxt[2]); - - pidx_h = FIELD_GET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, - cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(CMPL_CTXT_DATA_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_ERR_MASK, - cmpt_ctxt[3])); - ctxt->user_trig_pend = - (uint8_t)(FIELD_GET( - CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, cmpt_ctxt[3])); - - ctxt->timer_running = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK, - cmpt_ctxt[3])); - ctxt->full_upd = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_FULL_UPD_MASK, - cmpt_ctxt[3])); - - ctxt->bs_addr = - FIELD_SET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_L_MASK, - (uint64_t)baddr_l) | - FIELD_SET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_M_MASK, - (uint64_t)baddr_m) | - FIELD_SET(QDMA_CPM4_COMPL_CTXT_BADDR_GET_H_MASK, - (uint64_t)baddr_h); - - ctxt->pidx = - (uint16_t)(FIELD_SET(QDMA_CPM4_COMPL_CTXT_PIDX_GET_L_MASK, - pidx_l) | - FIELD_SET(QDMA_CPM4_COMPL_CTXT_PIDX_GET_H_MASK, - pidx_h)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_cmpt_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_cmpt_context_read(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_cmpt_context_write(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_cmpt_context_invalidate(dev_hndl, - hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = 0; - uint32_t hw_ctxt[QDMA_CPM4_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p hw_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(HW_IND_CTXT_DATA_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(HW_IND_CTXT_DATA_W0_CRD_USE_MASK, - hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, - hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_FETCH_PND_MASK, - hw_ctxt[1])); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE unsupported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_hw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_hw_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_indirect_intr_context_write() - create indirect - * interrupt context and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_indirect_intr_context_write(void *dev_hndl, - uint16_t ring_index, const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[QDMA_CPM4_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->page_size > QDMA_INDIRECT_INTR_RING_SIZE_32KB) { - qdma_log_error("%s: ctxt->page_size=%u is too big, err:%d\n", - __func__, ctxt->page_size, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = - (uint32_t)FIELD_GET(QDMA_CPM4_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_h = - (uint32_t)FIELD_GET(QDMA_CPM4_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(INTR_CTXT_DATA_W0_VEC_MASK, ctxt->vec) | - FIELD_SET(INTR_CTXT_DATA_W0_INT_ST_MASK, - ctxt->int_st) | - FIELD_SET(INTR_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W1_BADDR_4K_H_MASK, baddr_h) | - FIELD_SET(INTR_CTXT_DATA_W1_PAGE_SIZE_MASK, - ctxt->page_size); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W2_PIDX_MASK, ctxt->pidx); - - return qdma_cpm4_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_indirect_intr_context_read(void *dev_hndl, - uint16_t ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = 0; - uint32_t intr_ctxt[QDMA_CPM4_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, ring_index, - QDMA_CPM4_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(INTR_CTXT_DATA_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(INTR_CTXT_DATA_W0_VEC_MASK, - intr_ctxt[0]); - ctxt->int_st = FIELD_GET(INTR_CTXT_DATA_W0_INT_ST_MASK, - intr_ctxt[0]); - ctxt->color = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_COLOR_MASK, - intr_ctxt[0])); - baddr_l = FIELD_GET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, - intr_ctxt[0]); - - baddr_h = FIELD_GET(INTR_CTXT_DATA_W1_BADDR_4K_H_MASK, - intr_ctxt[1]); - ctxt->page_size = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W1_PAGE_SIZE_MASK, - intr_ctxt[1])); - ctxt->pidx = FIELD_GET(INTR_CTXT_DATA_W2_PIDX_MASK, - intr_ctxt[2]); - - ctxt->baddr_4k = - FIELD_SET(QDMA_CPM4_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_CPM4_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_indirect_intr_context_clear() - clear indirect - * interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_indirect_intr_context_clear(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_indirect_intr_context_invalidate() - invalidate - * indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_cpm4_indirect_intr_context_read(dev_hndl, - ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_cpm4_indirect_intr_context_write(dev_hndl, - ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_cpm4_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_cpm4_indirect_intr_context_invalidate( - dev_hndl, ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_set_default_global_csr() - function to set the global - * CSR register to default values. The value can be modified later by using - * the set/get csr functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, - 385, 513, 769, 1025, 1537, 3073, 4097, 6145, - 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, - 32, 48, 64, 80, 96, 112, 128, 144, - 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, - 4096, 8192, 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, QDMA_CPM4_GLBL_RNG_SZ_1_ADDR, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_CNT_TH_1_ADDR, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_TIMER_CNT_1_ADDR, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_DSC_CFG_ADDR, reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_BUF_SZ_0_ADDR, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - reg_val = - FIELD_SET(C2H_PFCH_CFG_FL_TH_MASK, - QDMA_CPM4_DEFAULT_PFCH_STOP_THRESH) | - FIELD_SET(C2H_PFCH_CFG_NUM_MASK, - DEFAULT_PFCH_NUM_ENTRIES_PER_Q) | - FIELD_SET(C2H_PFCH_CFG_QCNT_MASK, - DEFAULT_PFCH_MAX_Q_CNT) | - FIELD_SET(C2H_PFCH_CFG_EVT_QCNT_TH_MASK, - DEFAULT_C2H_INTR_TIMER_TICK); - qdma_reg_write(dev_hndl, - QDMA_CPM4_C2H_PFCH_CFG_ADDR, reg_val); - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, QDMA_CPM4_C2H_INT_TIMER_TICK_ADDR, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - reg_val = - FIELD_SET(C2H_WRB_COAL_CFG_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(C2H_WRB_COAL_CFG_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK, - DEFAULT_CMPT_COAL_MAX_BUF_SZ); - qdma_reg_write(dev_hndl, - QDMA_CPM4_C2H_WRB_COAL_CFG_ADDR, reg_val); - -#if 0 - /* H2C throttle Configuration*/ - reg_val = - FIELD_SET(QDMA_H2C_DATA_THRESH_MASK, - DEFAULT_H2C_THROT_DATA_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_DATA_MASK, - DEFAULT_THROT_EN_DATA); - qdma_reg_write(dev_hndl, QDMA_OFFSET_H2C_REQ_THROT, reg_val); -#endif - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_queue_pidx_update() - function to update the desc PIDX - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @reg_info: data needed for the PIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info) -{ - uint32_t reg_addr = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!is_vf) { - reg_addr = (is_c2h) ? - QDMA_CPM4_OFFSET_DMAP_SEL_C2H_DSC_PIDX : - QDMA_CPM4_OFFSET_DMAP_SEL_H2C_DSC_PIDX; - } else { - reg_addr = (is_c2h) ? - QDMA_CPM4_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX : - QDMA_CPM4_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX; - } - - reg_addr += (qid * QDMA_PIDX_STEP); - - reg_val = FIELD_SET(QDMA_CPM4_DMA_SEL_DESC_PIDX_MASK, - reg_info->pidx) | - FIELD_SET(QDMA_CPM4_DMA_SEL_IRQ_EN_MASK, - reg_info->irq_en); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_queue_cmpt_cidx_update() - function to update the CMPT - * CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? - QDMA_CPM4_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_CPM4_OFFSET_DMAP_SEL_CMPT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += (qid * QDMA_CMPT_CIDX_STEP); - - reg_val = - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_WRB_CIDX_MASK, - reg_info->wrb_cidx) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_info->counter_idx) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_TMR_CNT_MASK, - reg_info->timer_idx) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_TRG_MODE_MASK, - reg_info->trig_mode) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_info->wrb_en) | - FIELD_SET(QDMA_CPM4_DMAP_SEL_CMPT_IRQ_EN_MASK, - reg_info->irq_en); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_queue_intr_cidx_update() - function to update the - * CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? - QDMA_CPM4_OFFSET_VF_DMAP_SEL_INT_CIDX : - QDMA_CPM4_OFFSET_DMAP_SEL_INT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += qid * QDMA_INT_CIDX_STEP; - - reg_val = - FIELD_SET(QDMA_CPM4_DMA_SEL_INT_SW_CIDX_MASK, - reg_info->sw_cidx) | - FIELD_SET(QDMA_CPM4_DMA_SEL_INT_RING_IDX_MASK, - reg_info->rng_idx); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cmp_get_user_bar() - Function to get the - * AXI Master Lite(user bar) number - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite(user bar) number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cmp_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: user_bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr = (is_vf) ? QDMA_CPM4_GLBL2_PF_VF_BARLITE_EXT_ADDR : - QDMA_CPM4_GLBL2_PF_BARLITE_EXT_ADDR; - - if (!is_vf) { - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - } else { - *user_bar = QDMA_CPM4_VF_USER_BAR_ID; - return QDMA_SUCCESS; - } - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_ram_sbe_err_process() -Function to dump SBE err debug info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_ram_sbe_err_process(void *dev_hndl) -{ - qdma_cpm4_dump_reg_info(dev_hndl, QDMA_CPM4_RAM_SBE_STS_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_ram_dbe_err_process() -Function to dump DBE err debug info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_ram_dbe_err_process(void *dev_hndl) -{ - qdma_cpm4_dump_reg_info(dev_hndl, QDMA_CPM4_RAM_DBE_STS_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_desc_err_process() -Function to dump Descriptor Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_LOG0_ADDR, - QDMA_CPM4_GLBL_DSC_ERR_LOG1_ADDR, - QDMA_CPM4_GLBL_DSC_DBG_DAT0_ADDR, - QDMA_CPM4_GLBL_DSC_DBG_DAT1_ADDR - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - qdma_cpm4_dump_reg_info(dev_hndl, - desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_trq_err_process() -Function to dump Target Access Err info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR, - QDMA_CPM4_GLBL_TRQ_ERR_LOG_ADDR - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - qdma_cpm4_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } - - -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_st_h2c_err_process() - Function to dump MM H2C Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - QDMA_CPM4_H2C_ERR_STAT_ADDR, - QDMA_CPM4_H2C_FIRST_ERR_QID_ADDR, - QDMA_CPM4_H2C_DBG_REG0_ADDR, - QDMA_CPM4_H2C_DBG_REG1_ADDR, - QDMA_CPM4_H2C_DBG_REG2_ADDR, - QDMA_CPM4_H2C_DBG_REG3_ADDR, - QDMA_CPM4_H2C_DBG_REG4_ADDR - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - qdma_cpm4_dump_reg_info(dev_hndl, - st_h2c_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_st_c2h_err_process() - Function to dump MM H2C Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_cpm4_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - QDMA_CPM4_C2H_ERR_STAT_ADDR, - QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR, - QDMA_CPM4_C2H_FIRST_ERR_QID_ADDR, - QDMA_CPM4_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR, - QDMA_CPM4_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR, - QDMA_CPM4_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR, - QDMA_CPM4_C2H_STAT_AXIS_PKG_CMP_ADDR, - QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_0_ADDR, - QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_1_ADDR, - QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_2_ADDR, - QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_3_ADDR, - QDMA_CPM4_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR, - QDMA_CPM4_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - qdma_cpm4_dump_reg_info(dev_hndl, - st_c2h_err_reg_list[i], - 1, NULL, 0); - } -} - - - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_get_error_name() - Function to get the error in str format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *qdma_cpm4_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= QDMA_CPM4_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, - (enum qdma_cpm4_error_idx)err_idx); - return NULL; - } - - return qdma_cpm4_err_info[ - (enum qdma_cpm4_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t i = 0, j = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS] = { - QDMA_CPM4_DSC_ERR_POISON, - QDMA_CPM4_TRQ_ERR_UNMAPPED, - QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH, - QDMA_CPM4_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_CPM4_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - QDMA_CPM4_SBE_ERR_MI_H2C0_DAT, - QDMA_CPM4_DBE_ERR_MI_H2C0_DAT - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_ERR_STAT_ADDR); - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - qdma_log_info("%s: Global Err Reg(0x%x) = 0x%x\n", - __func__, QDMA_CPM4_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - for (i = 0; i < QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - j = hw_err_position[i]; - - if ((!dev_cap.st_en) && - (j == QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH || - j == QDMA_CPM4_ST_FATAL_ERR_MTY_MISMATCH || - j == QDMA_CPM4_ST_H2C_ERR_ZERO_LEN_DESC_ERR)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - qdma_cpm4_err_info[j].stat_reg_addr); - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - qdma_cpm4_err_info[j].stat_reg_addr, - err_stat); - - qdma_cpm4_err_info[j].qdma_cpm4_hw_err_process( - dev_hndl); - for (idx = j; - idx < all_qdma_cpm4_hw_errs[i]; - idx++) { - /* call the platform specific handler */ - if (err_stat & - qdma_cpm4_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s\n", - __func__, - qdma_cpm4_hw_get_error_name( - idx)); - } - qdma_reg_write(dev_hndl, - qdma_cpm4_err_info[j].stat_reg_addr, - err_stat); - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_ERR_STAT_ADDR, glbl_err_stat); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > QDMA_CPM4_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, (enum qdma_cpm4_error_idx)err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == QDMA_CPM4_ERRS_ALL) { - for (i = 0; - i < QDMA_CPM4_TOTAL_LEAF_ERROR_AGGREGATORS; - i++) { - - idx = all_qdma_cpm4_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == QDMA_CPM4_ST_C2H_ERR_ALL || - idx == QDMA_CPM4_ST_FATAL_ERR_ALL || - idx == QDMA_CPM4_ST_H2C_ERR_ALL) - continue; - } - - reg_val = qdma_cpm4_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - qdma_cpm4_err_info[idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_ERR_MASK_ADDR); - reg_val |= FIELD_SET( - qdma_cpm4_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_ERR_MASK_ADDR, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= QDMA_CPM4_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - qdma_cpm4_err_info[err_idx].mask_reg_addr); - reg_val |= - FIELD_SET(qdma_cpm4_err_info[err_idx].leaf_err_mask, - 1); - qdma_reg_write(dev_hndl, - qdma_cpm4_err_info[err_idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_ERR_MASK_ADDR); - reg_val |= - FIELD_SET( - qdma_cpm4_err_info[err_idx].global_err_mask, - 1); - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_ERR_MASK_ADDR, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_get_device_attributes() - Function to get the qdma - * device attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL2_PF_BARLITE_INT_ADDR); - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_CPM4_GLBL2_CHANNEL_CAP_ADDR); - dev_info->num_qs = (FIELD_GET(GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK, - reg_val)); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, QDMA_CPM4_GLBL2_MISC_CAP_ADDR); - dev_info->mailbox_en = FIELD_GET(QDMA_GLBL2_MAILBOX_EN_MASK, reg_val); - dev_info->flr_present = FIELD_GET(QDMA_GLBL2_FLR_PRESENT_MASK, reg_val); - dev_info->mm_cmpt_en = 0; - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL2_CHANNEL_MDMA_ADDR); - dev_info->mm_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ENG_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ENG_MASK, reg_val)) ? 1 : 0; - dev_info->st_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ST_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ST_MASK, - reg_val)) ? 1 : 0; - - /* num of mm channels for Versal Hard is 2 */ - dev_info->mm_channel_max = 2; - - dev_info->debug_mode = 0; - dev_info->desc_eng_mode = 0; - dev_info->qid2vec_ctx = 1; - dev_info->cmpt_ovf_chk_dis = 0; - dev_info->mailbox_intr = 0; - dev_info->sw_desc_64b = 0; - dev_info->cmpt_desc_64b = 0; - dev_info->dynamic_bar = 0; - dev_info->legacy_intr = 0; - dev_info->cmpt_trig_count_timer = 0; - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_cpm4_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * @ctxt : pointer to the context data - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[QDMA_CPM4_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CPM4_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(CRED_CTXT_DATA_W0_CREDT_MASK, - cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_cpm4_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cpm4_credit_ctx_conf() - configure credit context - * - * @dev_hndl : device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * @ctxt : pointer to the context data - * @access_type : HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cpm4_credit_context_read(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_cpm4_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_cpm4_credit_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_cpm4_dump_config_regs() - Function to get qdma config register - * dump in a buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = qdma_cpm4_config_num_regs_get(); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < qdma_cpm4_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = qdma_cpm4_config_regs_get(); - - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", reg_info[i].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm4_queue_context() - Function to get qdma queue context dump - * in a buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_cpm4_context(ctxt_data, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm4_intr_context() - Function to get qdma interrupt - * context dump in a buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - req_buflen = qdma_cpm4_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_cpm4_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @func_id: function id - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_CMPT) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_cpm4_context_buf_len(st, q_type, &req_buflen); - - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = qdma_cpm4_sw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.sw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read sw context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_cpm4_hw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.hw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read hw context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_cpm4_qid2vec_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.qid2vec), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read qid2vec context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_cpm4_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read credit context, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = qdma_cpm4_pfetch_ctx_conf(dev_hndl, - qid_hw, - &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read pftech context, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = qdma_cpm4_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read cmpt context, err = %d", - __func__, rv); - return rv; - } - } - - rv = qdma_cpm4_fmap_conf(dev_hndl, func_id, - &(context.fmap), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read fmap context, err = %d", - __func__, rv); - return rv; - } - - rv = dump_cpm4_context(&context, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_init_ctxt_memory() - Initialize the context for all queues - * - * @dev_hndl : device handle - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ - -int qdma_cpm4_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - qdma_cpm4_get_device_attributes(dev_hndl, &dev_info); - qdma_log_info("%s: clearing the context for all qs", - __func__); - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - -#ifdef TANDEM_BOOT_SUPPORTED - for (; sel <= QDMA_CTXT_SEL_CR_H2C; sel++) { - rv = qdma_cpm4_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } -#else - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - (sel == QDMA_CTXT_SEL_PFTCH || - sel == QDMA_CTXT_SEL_CMPT)) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug(" sel = %d", sel); - continue; - } - - rv = qdma_cpm4_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } -#endif - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - qdma_cpm4_fmap_clear(dev_hndl, i); -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return 0; -} - -#ifdef TANDEM_BOOT_SUPPORTED -/*****************************************************************************/ -/** - * qdma_cpm4_init_st_ctxt() - Initialize the ST context - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_cpm4_init_st_ctxt(void *dev_hndl) -{ - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - qdma_cpm4_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_CMPT; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = qdma_cpm4_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - return QDMA_SUCCESS; - -} -#endif - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = qdma_cpm4_config_num_regs_get(); - - reg_info = qdma_cpm4_config_regs_get(); - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_cpm4_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = qdma_cpm4_config_regs_get(); - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (reg_count = 0; - (reg_count < total_regs);) { - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; - -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_cpm4_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_slot, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - uint32_t num_regs = qdma_cpm4_config_num_regs_get(); - struct xreg_info *reg_info = qdma_cpm4_config_regs_get(); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_slot) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = QDMA_CPM4_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = QDMA_CPM4_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = QDMA_CPM4_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = QDMA_CPM4_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid slot received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_write_global_ring_sizes() - set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_global_ring_sizes() - function to get the - * global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, - QDMA_CPM4_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_TIMER_CNT_1_ADDR, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_CPM4_C2H_TIMER_CNT_1_ADDR, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_write_global_counter_threshold(void *dev_hndl, - uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_CNT_TH_1_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_global_counter_threshold() - get the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_read_global_counter_threshold(void *dev_hndl, - uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_CPM4_C2H_CNT_TH_1_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_write_global_buffer_sizes(void *dev_hndl, - uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, - QDMA_CPM4_C2H_BUF_SZ_0_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, - QDMA_CPM4_C2H_BUF_SZ_0_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cpm4_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_cpm4_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cpm4_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_cpm4_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_cpm4_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_cpm4_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_cpm4_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_cpm4_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_global_writeback_interval_write() - function to set the - * writeback interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_DSC_CFG_ADDR); - reg_val |= FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - - qdma_reg_write(dev_hndl, - QDMA_CPM4_GLBL_DSC_CFG_ADDR, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_global_writeback_interval_read() - function to get the - * writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cpm4_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - QDMA_CPM4_GLBL_DSC_CFG_ADDR); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cpm4_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_cpm4_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_cpm4_global_writeback_interval_write(dev_hndl, - *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_cpm4_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cpm4_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? QDMA_CPM4_C2H_CHANNEL_CTL_ADDR : - QDMA_CPM4_H2C_CHANNEL_CTL_ADDR; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_cpm4_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) { - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - } - - return QDMA_SUCCESS; -} - -int qdma_cpm4_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = qdma_cpm4_config_num_regs_get(); - struct xreg_info *config_regs = qdma_cpm4_config_regs_get(); - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; - -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.h deleted file mode 100755 index cecb0d7..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_CPM4_ACCESS_H_ -#define __QDMA_CPM4_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum qdma_cpm4_error_idx { - /* Descriptor errors */ - QDMA_CPM4_DSC_ERR_POISON, - QDMA_CPM4_DSC_ERR_UR_CA, - QDMA_CPM4_DSC_ERR_PARAM, - QDMA_CPM4_DSC_ERR_ADDR, - QDMA_CPM4_DSC_ERR_TAG, - QDMA_CPM4_DSC_ERR_FLR, - QDMA_CPM4_DSC_ERR_TIMEOUT, - QDMA_CPM4_DSC_ERR_DAT_POISON, - QDMA_CPM4_DSC_ERR_FLR_CANCEL, - QDMA_CPM4_DSC_ERR_DMA, - QDMA_CPM4_DSC_ERR_DSC, - QDMA_CPM4_DSC_ERR_RQ_CANCEL, - QDMA_CPM4_DSC_ERR_DBE, - QDMA_CPM4_DSC_ERR_SBE, - QDMA_CPM4_DSC_ERR_ALL, - - /* TRQ Errors */ - QDMA_CPM4_TRQ_ERR_UNMAPPED, - QDMA_CPM4_TRQ_ERR_QID_RANGE, - QDMA_CPM4_TRQ_ERR_VF_ACCESS_ERR, - QDMA_CPM4_TRQ_ERR_TCP_TIMEOUT, - QDMA_CPM4_TRQ_ERR_ALL, - - /* C2H Errors */ - QDMA_CPM4_ST_C2H_ERR_MTY_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_LEN_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_QID_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_DESC_RSP_ERR, - QDMA_CPM4_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - QDMA_CPM4_ST_C2H_ERR_MSI_INT_FAIL, - QDMA_CPM4_ST_C2H_ERR_ERR_DESC_CNT, - QDMA_CPM4_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - QDMA_CPM4_ST_C2H_ERR_WRB_INV_Q_ERR, - QDMA_CPM4_ST_C2H_ERR_WRB_QFULL_ERR, - QDMA_CPM4_ST_C2H_ERR_WRB_CIDX_ERR, - QDMA_CPM4_ST_C2H_ERR_WRB_PRTY_ERR, - QDMA_CPM4_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - QDMA_CPM4_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_CPM4_ST_FATAL_ERR_LEN_MISMATCH, - QDMA_CPM4_ST_FATAL_ERR_QID_MISMATCH, - QDMA_CPM4_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_WRB_CTXT_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_INT_QID2VEC_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_WRB_COAL_DATA_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - QDMA_CPM4_ST_FATAL_ERR_WPL_DATA_PAR_ERR, - QDMA_CPM4_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - QDMA_CPM4_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - QDMA_CPM4_ST_H2C_ERR_SDI_MRKR_REQ_MOP_ERR, - QDMA_CPM4_ST_H2C_ERR_NO_DMA_DSC, - QDMA_CPM4_ST_H2C_ERR_DBE, - QDMA_CPM4_ST_H2C_ERR_SBE, - QDMA_CPM4_ST_H2C_ERR_ALL, - - /* Single bit errors */ - QDMA_CPM4_SBE_ERR_MI_H2C0_DAT, - QDMA_CPM4_SBE_ERR_MI_C2H0_DAT, - QDMA_CPM4_SBE_ERR_H2C_RD_BRG_DAT, - QDMA_CPM4_SBE_ERR_H2C_WR_BRG_DAT, - QDMA_CPM4_SBE_ERR_C2H_RD_BRG_DAT, - QDMA_CPM4_SBE_ERR_C2H_WR_BRG_DAT, - QDMA_CPM4_SBE_ERR_FUNC_MAP, - QDMA_CPM4_SBE_ERR_DSC_HW_CTXT, - QDMA_CPM4_SBE_ERR_DSC_CRD_RCV, - QDMA_CPM4_SBE_ERR_DSC_SW_CTXT, - QDMA_CPM4_SBE_ERR_DSC_CPLI, - QDMA_CPM4_SBE_ERR_DSC_CPLD, - QDMA_CPM4_SBE_ERR_PASID_CTXT_RAM, - QDMA_CPM4_SBE_ERR_TIMER_FIFO_RAM, - QDMA_CPM4_SBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_CPM4_SBE_ERR_QID_FIFO_RAM, - QDMA_CPM4_SBE_ERR_TUSER_FIFO_RAM, - QDMA_CPM4_SBE_ERR_WRB_COAL_DATA_RAM, - QDMA_CPM4_SBE_ERR_INT_QID2VEC_RAM, - QDMA_CPM4_SBE_ERR_INT_CTXT_RAM, - QDMA_CPM4_SBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_CPM4_SBE_ERR_PFCH_CTXT_RAM, - QDMA_CPM4_SBE_ERR_WRB_CTXT_RAM, - QDMA_CPM4_SBE_ERR_PFCH_LL_RAM, - QDMA_CPM4_SBE_ERR_ALL, - - /* Double bit Errors */ - QDMA_CPM4_DBE_ERR_MI_H2C0_DAT, - QDMA_CPM4_DBE_ERR_MI_C2H0_DAT, - QDMA_CPM4_DBE_ERR_H2C_RD_BRG_DAT, - QDMA_CPM4_DBE_ERR_H2C_WR_BRG_DAT, - QDMA_CPM4_DBE_ERR_C2H_RD_BRG_DAT, - QDMA_CPM4_DBE_ERR_C2H_WR_BRG_DAT, - QDMA_CPM4_DBE_ERR_FUNC_MAP, - QDMA_CPM4_DBE_ERR_DSC_HW_CTXT, - QDMA_CPM4_DBE_ERR_DSC_CRD_RCV, - QDMA_CPM4_DBE_ERR_DSC_SW_CTXT, - QDMA_CPM4_DBE_ERR_DSC_CPLI, - QDMA_CPM4_DBE_ERR_DSC_CPLD, - QDMA_CPM4_DBE_ERR_PASID_CTXT_RAM, - QDMA_CPM4_DBE_ERR_TIMER_FIFO_RAM, - QDMA_CPM4_DBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_CPM4_DBE_ERR_QID_FIFO_RAM, - QDMA_CPM4_DBE_ERR_WRB_COAL_DATA_RAM, - QDMA_CPM4_DBE_ERR_INT_QID2VEC_RAM, - QDMA_CPM4_DBE_ERR_INT_CTXT_RAM, - QDMA_CPM4_DBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_CPM4_DBE_ERR_PFCH_CTXT_RAM, - QDMA_CPM4_DBE_ERR_WRB_CTXT_RAM, - QDMA_CPM4_DBE_ERR_PFCH_LL_RAM, - QDMA_CPM4_DBE_ERR_ALL, - - QDMA_CPM4_ERRS_ALL -}; - -struct qdma_cpm4_hw_err_info { - enum qdma_cpm4_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*qdma_cpm4_hw_err_process)(void *dev_hndl); -}; - - -int qdma_cpm4_init_ctxt_memory(void *dev_hndl); - -#ifdef TANDEM_BOOT_SUPPORTED -int qdma_cpm4_init_st_ctxt(void *dev_hndl); -#endif - -int qdma_cpm4_qid2vec_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_set_default_global_csr(void *dev_hndl); - -int qdma_cpm4_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info); - -int qdma_cpm4_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info); - -int qdma_cpm4_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info); - -int qdma_cmp_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - -int qdma_cpm4_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -uint32_t qdma_cpm4_reg_dump_buf_len(void); - -int qdma_cpm4_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *req_buflen); - -int qdma_cpm4_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int qdma_cpm4_hw_error_process(void *dev_hndl); -const char *qdma_cpm4_hw_get_error_name(uint32_t err_idx); -int qdma_cpm4_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int qdma_cpm4_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -int qdma_cpm4_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -int qdma_cpm4_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int qdma_cpm4_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int qdma_cpm4_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_slot, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int qdma_cpm4_global_csr_conf(void *dev_hndl, uint8_t index, - uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int qdma_cpm4_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, - uint8_t enable); - -int qdma_cpm4_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -uint32_t qdma_cpm4_get_config_num_regs(void); - -struct xreg_info *qdma_cpm4_get_config_regs(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_CPM4_ACCESS_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg.h deleted file mode 100755 index dee28b4..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg.h +++ /dev/null @@ -1,2046 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_CPM4_REG_H -#define __QDMA_CPM4_REG_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - -#define DEBGFS_LINE_SZ (81) - -#ifdef ARRAY_SIZE -#undef ARRAY_SIZE -#endif -#define ARRAY_SIZE(arr) (sizeof(arr) / \ - sizeof(arr[0])) - - -uint32_t qdma_cpm4_config_num_regs_get(void); -struct xreg_info *qdma_cpm4_config_regs_get(void); -#define QDMA_CPM4_CFG_BLK_IDENTIFIER_ADDR 0x00 -#define CFG_BLK_IDENTIFIER_MASK GENMASK(31, 20) -#define CFG_BLK_IDENTIFIER_1_MASK GENMASK(19, 16) -#define CFG_BLK_IDENTIFIER_RSVD_1_MASK GENMASK(15, 8) -#define CFG_BLK_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define QDMA_CPM4_CFG_BLK_BUSDEV_ADDR 0x04 -#define CFG_BLK_BUSDEV_BDF_MASK GENMASK(15, 0) -#define QDMA_CPM4_CFG_BLK_PCIE_MAX_PLD_SIZE_ADDR 0x08 -#define CFG_BLK_PCIE_MAX_PLD_SIZE_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ADDR 0x0C -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_BLK_SYSTEM_ID_ADDR 0x10 -#define CFG_BLK_SYSTEM_ID_MASK GENMASK(15, 0) -#define QDMA_CPM4_CFG_BLK_MSI_ENABLE_ADDR 0x014 -#define CFG_BLK_MSI_ENABLE_3_MASK BIT(17) -#define CFG_BLK_MSI_ENABLE_MSIX3_MASK BIT(16) -#define CFG_BLK_MSI_ENABLE_2_MASK BIT(13) -#define CFG_BLK_MSI_ENABLE_MSIX2_MASK BIT(12) -#define CFG_BLK_MSI_ENABLE_1_MASK BIT(9) -#define CFG_BLK_MSI_ENABLE_MSIX1_MASK BIT(8) -#define CFG_BLK_MSI_ENABLE_0_MASK BIT(1) -#define CFG_BLK_MSI_ENABLE_MSIX0_MASK BIT(0) -#define QDMA_CPM4_CFG_PCIE_DATA_WIDTH_ADDR 0x18 -#define CFG_PCIE_DATA_WIDTH_DATAPATH_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_PCIE_CTL_ADDR 0x1C -#define CFG_PCIE_CTL_RRQ_DISABLE_MASK BIT(1) -#define CFG_PCIE_CTL_RELAXED_ORDERING_MASK BIT(0) -#define QDMA_CPM4_CFG_AXI_USER_MAX_PLD_SIZE_ADDR 0x40 -#define CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_AXI_USER_MAX_READ_REQ_SIZE_ADDR 0x44 -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK GENMASK(2, 0) -#define QDMA_CPM4_CFG_BLK_MISC_CTL_ADDR 0x4C -#define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) -#define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_0_ADDR 0x80 -#define CFG_BLK_SCRATCH_0_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_1_ADDR 0x84 -#define CFG_BLK_SCRATCH_1_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_2_ADDR 0x88 -#define CFG_BLK_SCRATCH_2_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_3_ADDR 0x8C -#define CFG_BLK_SCRATCH_3_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_4_ADDR 0x90 -#define CFG_BLK_SCRATCH_4_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_5_ADDR 0x94 -#define CFG_BLK_SCRATCH_5_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_6_ADDR 0x98 -#define CFG_BLK_SCRATCH_6_MASK GENMASK(31, 0) -#define QDMA_CPM4_CFG_BLK_SCRATCH_7_ADDR 0x9C -#define CFG_BLK_SCRATCH_7_MASK GENMASK(31, 0) -#define QDMA_CPM4_RAM_SBE_MSK_A_ADDR 0xF0 -#define RAM_SBE_MSK_A_MASK GENMASK(31, 0) -#define QDMA_CPM4_RAM_SBE_STS_A_ADDR 0xF4 -#define RAM_SBE_STS_A_RSVD_1_MASK BIT(31) -#define RAM_SBE_STS_A_PFCH_LL_RAM_MASK BIT(30) -#define RAM_SBE_STS_A_WRB_CTXT_RAM_MASK BIT(29) -#define RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK BIT(28) -#define RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define RAM_SBE_STS_A_INT_CTXT_RAM_MASK BIT(26) -#define RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK BIT(25) -#define RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK BIT(23) -#define RAM_SBE_STS_A_QID_FIFO_RAM_MASK BIT(22) -#define RAM_SBE_STS_A_PLD_FIFO_RAM_MASK BIT(21) -#define RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK BIT(20) -#define RAM_SBE_STS_A_PASID_CTXT_RAM_MASK BIT(19) -#define RAM_SBE_STS_A_DSC_CPLD_MASK BIT(18) -#define RAM_SBE_STS_A_DSC_CPLI_MASK BIT(17) -#define RAM_SBE_STS_A_DSC_SW_CTXT_MASK BIT(16) -#define RAM_SBE_STS_A_DSC_CRD_RCV_MASK BIT(15) -#define RAM_SBE_STS_A_DSC_HW_CTXT_MASK BIT(14) -#define RAM_SBE_STS_A_FUNC_MAP_MASK BIT(13) -#define RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(12) -#define RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(11) -#define RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(10) -#define RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(9) -#define RAM_SBE_STS_A_RSVD_2_MASK GENMASK(8, 5) -#define RAM_SBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_SBE_STS_A_RSVD_3_MASK GENMASK(3, 1) -#define RAM_SBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_CPM4_RAM_DBE_MSK_A_ADDR 0xF8 -#define RAM_DBE_MSK_A_MASK GENMASK(31, 0) -#define QDMA_CPM4_RAM_DBE_STS_A_ADDR 0xFC -#define RAM_DBE_STS_A_RSVD_1_MASK BIT(31) -#define RAM_DBE_STS_A_PFCH_LL_RAM_MASK BIT(30) -#define RAM_DBE_STS_A_WRB_CTXT_RAM_MASK BIT(29) -#define RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK BIT(28) -#define RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define RAM_DBE_STS_A_INT_CTXT_RAM_MASK BIT(26) -#define RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK BIT(25) -#define RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_DBE_STS_A_TUSER_FIFO_RAM_MASK BIT(23) -#define RAM_DBE_STS_A_QID_FIFO_RAM_MASK BIT(22) -#define RAM_DBE_STS_A_PLD_FIFO_RAM_MASK BIT(21) -#define RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK BIT(20) -#define RAM_DBE_STS_A_PASID_CTXT_RAM_MASK BIT(19) -#define RAM_DBE_STS_A_DSC_CPLD_MASK BIT(18) -#define RAM_DBE_STS_A_DSC_CPLI_MASK BIT(17) -#define RAM_DBE_STS_A_DSC_SW_CTXT_MASK BIT(16) -#define RAM_DBE_STS_A_DSC_CRD_RCV_MASK BIT(15) -#define RAM_DBE_STS_A_DSC_HW_CTXT_MASK BIT(14) -#define RAM_DBE_STS_A_FUNC_MAP_MASK BIT(13) -#define RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(12) -#define RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(11) -#define RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(10) -#define RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(9) -#define RAM_DBE_STS_A_RSVD_2_MASK GENMASK(8, 5) -#define RAM_DBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_DBE_STS_A_RSVD_3_MASK GENMASK(3, 1) -#define RAM_DBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_CPM4_GLBL2_IDENTIFIER_ADDR 0x100 -#define GLBL2_IDENTIFIER_MASK GENMASK(31, 8) -#define GLBL2_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define QDMA_CPM4_GLBL2_PF_BARLITE_INT_ADDR 0x104 -#define GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_PF_VF_BARLITE_INT_ADDR 0x108 -#define GLBL2_PF_VF_BARLITE_INT_PF3_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_VF_BARLITE_INT_PF2_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_VF_BARLITE_INT_PF1_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_VF_BARLITE_INT_PF0_MAP_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_PF_BARLITE_EXT_ADDR 0x10C -#define GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_PF_VF_BARLITE_EXT_ADDR 0x110 -#define GLBL2_PF_VF_BARLITE_EXT_PF3_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_VF_BARLITE_EXT_PF2_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_VF_BARLITE_EXT_PF1_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_VF_BARLITE_EXT_PF0_MAP_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_CHANNEL_INST_ADDR 0x114 -#define GLBL2_CHANNEL_INST_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_INST_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_INST_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_INST_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_INST_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_INST_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_INST_H2C_ENG_MASK BIT(0) -#define QDMA_CPM4_GLBL2_CHANNEL_MDMA_ADDR 0x118 -#define GLBL2_CHANNEL_MDMA_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_MDMA_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_MDMA_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_MDMA_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_MDMA_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_MDMA_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_MDMA_H2C_ENG_MASK BIT(0) -#define QDMA_CPM4_GLBL2_CHANNEL_STRM_ADDR 0x11C -#define GLBL2_CHANNEL_STRM_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_STRM_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_STRM_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_STRM_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_STRM_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_STRM_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_STRM_H2C_ENG_MASK BIT(0) -#define QDMA_CPM4_GLBL2_CHANNEL_CAP_ADDR 0x120 -#define GLBL2_CHANNEL_CAP_RSVD_1_MASK GENMASK(31, 12) -#define GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK GENMASK(11, 0) -#define QDMA_CPM4_GLBL2_CHANNEL_PASID_CAP_ADDR 0x128 -#define GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET_MASK GENMASK(15, 4) -#define GLBL2_CHANNEL_PASID_CAP_RSVD_2_MASK GENMASK(3, 2) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK BIT(1) -#define GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK BIT(0) -#define QDMA_CPM4_GLBL2_CHANNEL_FUNC_RET_ADDR 0x12C -#define GLBL2_CHANNEL_FUNC_RET_RSVD_1_MASK GENMASK(31, 8) -#define GLBL2_CHANNEL_FUNC_RET_FUNC_MASK GENMASK(7, 0) -#define QDMA_CPM4_GLBL2_SYSTEM_ID_ADDR 0x130 -#define GLBL2_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_SYSTEM_ID_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL2_MISC_CAP_ADDR 0x134 -#define GLBL2_MISC_CAP_RSVD_1_MASK GENMASK(31, 0) -#define QDMA_CPM4_GLBL2_DBG_PCIE_RQ0_ADDR 0x1B8 -#define GLBL2_PCIE_RQ0_NPH_AVL_MASK GENMASK(31, 20) -#define GLBL2_PCIE_RQ0_RCB_AVL_MASK GENMASK(19, 10) -#define GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK GENMASK(9, 4) -#define GLBL2_PCIE_RQ0_TAG_EP_MASK GENMASK(3, 2) -#define GLBL2_PCIE_RQ0_TAG_FL_MASK GENMASK(1, 0) -#define QDMA_CPM4_GLBL2_DBG_PCIE_RQ1_ADDR 0x1BC -#define GLBL2_PCIE_RQ1_RSVD_1_MASK GENMASK(31, 17) -#define GLBL2_PCIE_RQ1_WTLP_REQ_MASK BIT(16) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK BIT(15) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK BIT(14) -#define GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK BIT(13) -#define GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK BIT(12) -#define GLBL2_PCIE_RQ1_TLPSM_MASK GENMASK(11, 9) -#define GLBL2_PCIE_RQ1_TLPSM512_MASK GENMASK(8, 6) -#define GLBL2_PCIE_RQ1_RREQ0_RCB_OK_MASK BIT(5) -#define GLBL2_PCIE_RQ1_RREQ0_SLV_MASK BIT(4) -#define GLBL2_PCIE_RQ1_RREQ0_VLD_MASK BIT(3) -#define GLBL2_PCIE_RQ1_RREQ1_RCB_OK_MASK BIT(2) -#define GLBL2_PCIE_RQ1_RREQ1_SLV_MASK BIT(1) -#define GLBL2_PCIE_RQ1_RREQ1_VLD_MASK BIT(0) -#define QDMA_CPM4_GLBL2_DBG_AXIMM_WR0_ADDR 0x1C0 -#define GLBL2_AXIMM_WR0_RSVD_1_MASK GENMASK(31, 27) -#define GLBL2_AXIMM_WR0_WR_REQ_MASK BIT(26) -#define GLBL2_AXIMM_WR0_WR_CHN_MASK GENMASK(25, 23) -#define GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK BIT(22) -#define GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK BIT(21) -#define GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK GENMASK(20, 18) -#define GLBL2_AXIMM_WR0_WRREQ_CNT_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR0_BID_MASK GENMASK(11, 9) -#define GLBL2_AXIMM_WR0_BVALID_MASK BIT(8) -#define GLBL2_AXIMM_WR0_BREADY_MASK BIT(7) -#define GLBL2_AXIMM_WR0_WVALID_MASK BIT(6) -#define GLBL2_AXIMM_WR0_WREADY_MASK BIT(5) -#define GLBL2_AXIMM_WR0_AWID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_WR0_AWVALID_MASK BIT(1) -#define GLBL2_AXIMM_WR0_AWREADY_MASK BIT(0) -#define QDMA_CPM4_GLBL2_DBG_AXIMM_WR1_ADDR 0x1C4 -#define GLBL2_AXIMM_WR1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_WR1_BRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_WR1_BRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_WR1_BRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR1_BRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_WR1_BRSP_CNT0_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL2_DBG_AXIMM_RD0_ADDR 0x1C8 -#define GLBL2_AXIMM_RD0_RSVD_1_MASK GENMASK(31, 23) -#define GLBL2_AXIMM_RD0_PND_CNT_MASK GENMASK(22, 17) -#define GLBL2_AXIMM_RD0_RD_CHNL_MASK GENMASK(16, 14) -#define GLBL2_AXIMM_RD0_RD_REQ_MASK BIT(13) -#define GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK GENMASK(12, 10) -#define GLBL2_AXIMM_RD0_RID_MASK GENMASK(9, 7) -#define GLBL2_AXIMM_RD0_RVALID_MASK BIT(6) -#define GLBL2_AXIMM_RD0_RREADY_MASK BIT(5) -#define GLBL2_AXIMM_RD0_ARID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_RD0_ARVALID_MASK BIT(1) -#define GLBL2_AXIMM_RD0_ARREADY_MASK BIT(0) -#define QDMA_CPM4_GLBL2_DBG_AXIMM_RD1_ADDR 0x1CC -#define GLBL2_AXIMM_RD1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_RD1_RRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_RD1_RRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_RD1_RRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_RD1_RRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_RD1_RRSP_CNT0_MASK GENMASK(5, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_1_ADDR 0x204 -#define GLBL_RNG_SZ_1_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_1_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_2_ADDR 0x208 -#define GLBL_RNG_SZ_2_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_2_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_3_ADDR 0x20C -#define GLBL_RNG_SZ_3_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_3_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_4_ADDR 0x210 -#define GLBL_RNG_SZ_4_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_4_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_5_ADDR 0x214 -#define GLBL_RNG_SZ_5_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_5_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_6_ADDR 0x218 -#define GLBL_RNG_SZ_6_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_6_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_7_ADDR 0x21C -#define GLBL_RNG_SZ_7_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_7_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_8_ADDR 0x220 -#define GLBL_RNG_SZ_8_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_8_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_9_ADDR 0x224 -#define GLBL_RNG_SZ_9_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_9_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_A_ADDR 0x228 -#define GLBL_RNG_SZ_A_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_A_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_B_ADDR 0x22C -#define GLBL_RNG_SZ_B_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_B_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_C_ADDR 0x230 -#define GLBL_RNG_SZ_C_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_C_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_D_ADDR 0x234 -#define GLBL_RNG_SZ_D_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_D_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_E_ADDR 0x238 -#define GLBL_RNG_SZ_E_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_E_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_F_ADDR 0x23C -#define GLBL_RNG_SZ_F_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_F_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_RNG_SZ_10_ADDR 0x240 -#define GLBL_RNG_SZ_10_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_10_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_ERR_STAT_ADDR 0x248 -#define GLBL_ERR_STAT_RSVD_1_MASK GENMASK(31, 12) -#define GLBL_ERR_STAT_ERR_H2C_ST_MASK BIT(11) -#define GLBL_ERR_STAT_ERR_BDG_MASK BIT(10) -#define GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK BIT(9) -#define GLBL_ERR_STAT_ERR_C2H_ST_MASK BIT(8) -#define GLBL_ERR_STAT_ERR_C2H_MM_1_MASK BIT(7) -#define GLBL_ERR_STAT_ERR_C2H_MM_0_MASK BIT(6) -#define GLBL_ERR_STAT_ERR_H2C_MM_1_MASK BIT(5) -#define GLBL_ERR_STAT_ERR_H2C_MM_0_MASK BIT(4) -#define GLBL_ERR_STAT_ERR_TRQ_MASK BIT(3) -#define GLBL_ERR_STAT_ERR_DSC_MASK BIT(2) -#define GLBL_ERR_STAT_ERR_RAM_DBE_MASK BIT(1) -#define GLBL_ERR_STAT_ERR_RAM_SBE_MASK BIT(0) -#define QDMA_CPM4_GLBL_ERR_MASK_ADDR 0x24C -#define GLBL_ERR_RSVD_1_MASK GENMASK(31, 9) -#define GLBL_ERR_MASK GENMASK(8, 0) -#define QDMA_CPM4_GLBL_DSC_CFG_ADDR 0x250 -#define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 10) -#define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) -#define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) -#define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) -#define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) -#define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define QDMA_CPM4_GLBL_DSC_ERR_STS_ADDR 0x254 -#define GLBL_DSC_ERR_STS_RSVD_1_MASK GENMASK(31, 25) -#define GLBL_DSC_ERR_STS_SBE_MASK BIT(24) -#define GLBL_DSC_ERR_STS_DBE_MASK BIT(23) -#define GLBL_DSC_ERR_STS_RQ_CANCEL_MASK BIT(22) -#define GLBL_DSC_ERR_STS_DSC_MASK BIT(21) -#define GLBL_DSC_ERR_STS_DMA_MASK BIT(20) -#define GLBL_DSC_ERR_STS_FLR_CANCEL_MASK BIT(19) -#define GLBL_DSC_ERR_STS_RSVD_2_MASK GENMASK(18, 17) -#define GLBL_DSC_ERR_STS_DAT_POISON_MASK BIT(16) -#define GLBL_DSC_ERR_STS_TIMEOUT_MASK BIT(9) -#define GLBL_DSC_ERR_STS_FLR_MASK BIT(5) -#define GLBL_DSC_ERR_STS_TAG_MASK BIT(4) -#define GLBL_DSC_ERR_STS_ADDR_MASK BIT(3) -#define GLBL_DSC_ERR_STS_PARAM_MASK BIT(2) -#define GLBL_DSC_ERR_STS_UR_CA_MASK BIT(1) -#define GLBL_DSC_ERR_STS_POISON_MASK BIT(0) -#define QDMA_CPM4_GLBL_DSC_ERR_MSK_ADDR 0x258 -#define GLBL_DSC_ERR_MSK_MASK GENMASK(8, 0) -#define QDMA_CPM4_GLBL_DSC_ERR_LOG0_ADDR 0x25C -#define GLBL_DSC_ERR_LOG0_VALID_MASK BIT(31) -#define GLBL_DSC_ERR_LOG0_RSVD_1_MASK GENMASK(30, 29) -#define GLBL_DSC_ERR_LOG0_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_ERR_LOG0_SEL_MASK BIT(16) -#define GLBL_DSC_ERR_LOG0_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_DSC_ERR_LOG1_ADDR 0x260 -#define GLBL_DSC_ERR_LOG1_RSVD_1_MASK GENMASK(31, 9) -#define GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK GENMASK(8, 5) -#define GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK GENMASK(4, 0) -#define QDMA_CPM4_GLBL_TRQ_ERR_STS_ADDR 0x264 -#define GLBL_TRQ_ERR_STS_RSVD_1_MASK GENMASK(31, 4) -#define GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK BIT(3) -#define GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK BIT(2) -#define GLBL_TRQ_ERR_STS_QID_RANGE_MASK BIT(1) -#define GLBL_TRQ_ERR_STS_UNMAPPED_MASK BIT(0) -#define QDMA_CPM4_GLBL_TRQ_ERR_MSK_ADDR 0x268 -#define GLBL_TRQ_ERR_MSK_MASK GENMASK(31, 0) -#define QDMA_CPM4_GLBL_TRQ_ERR_LOG_ADDR 0x26C -#define GLBL_TRQ_ERR_LOG_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_TRQ_ERR_LOG_TARGET_MASK GENMASK(27, 24) -#define GLBL_TRQ_ERR_LOG_FUNC_MASK GENMASK(23, 16) -#define GLBL_TRQ_ERR_LOG_ADDRESS_MASK GENMASK(15, 0) -#define QDMA_CPM4_GLBL_DSC_DBG_DAT0_ADDR 0x270 -#define GLBL_DSC_DAT0_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK BIT(29) -#define GLBL_DSC_DAT0_CTXT_ARB_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK GENMASK(16, 12) -#define GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK BIT(11) -#define GLBL_DSC_DAT0_TMSTALL_MASK BIT(10) -#define GLBL_DSC_DAT0_RRQ_STALL_MASK GENMASK(9, 8) -#define GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK GENMASK(7, 6) -#define GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK GENMASK(5, 4) -#define GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK GENMASK(3, 2) -#define GLBL_DSC_DAT0_DSC_OUT_STALL_MASK GENMASK(1, 0) -#define QDMA_CPM4_GLBL_DSC_DBG_DAT1_ADDR 0x274 -#define GLBL_DSC_DAT1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_DAT1_EVT_SPC_C2H_MASK GENMASK(27, 22) -#define GLBL_DSC_DAT1_EVT_SP_H2C_MASK GENMASK(21, 16) -#define GLBL_DSC_DAT1_DSC_SPC_C2H_MASK GENMASK(15, 8) -#define GLBL_DSC_DAT1_DSC_SPC_H2C_MASK GENMASK(7, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_0_ADDR 0x400 -#define TRQ_SEL_FMAP_0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1_ADDR 0x404 -#define TRQ_SEL_FMAP_1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2_ADDR 0x408 -#define TRQ_SEL_FMAP_2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3_ADDR 0x40C -#define TRQ_SEL_FMAP_3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4_ADDR 0x410 -#define TRQ_SEL_FMAP_4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5_ADDR 0x414 -#define TRQ_SEL_FMAP_5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6_ADDR 0x418 -#define TRQ_SEL_FMAP_6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7_ADDR 0x41C -#define TRQ_SEL_FMAP_7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8_ADDR 0x420 -#define TRQ_SEL_FMAP_8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9_ADDR 0x424 -#define TRQ_SEL_FMAP_9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A_ADDR 0x428 -#define TRQ_SEL_FMAP_A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B_ADDR 0x42C -#define TRQ_SEL_FMAP_B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D_ADDR 0x430 -#define TRQ_SEL_FMAP_D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E_ADDR 0x434 -#define TRQ_SEL_FMAP_E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_F_ADDR 0x438 -#define TRQ_SEL_FMAP_F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_10_ADDR 0x43C -#define TRQ_SEL_FMAP_10_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_10_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_10_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_11_ADDR 0x440 -#define TRQ_SEL_FMAP_11_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_11_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_11_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_12_ADDR 0x444 -#define TRQ_SEL_FMAP_12_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_12_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_12_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_13_ADDR 0x448 -#define TRQ_SEL_FMAP_13_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_13_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_13_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_14_ADDR 0x44C -#define TRQ_SEL_FMAP_14_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_14_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_14_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_15_ADDR 0x450 -#define TRQ_SEL_FMAP_15_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_15_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_15_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_16_ADDR 0x454 -#define TRQ_SEL_FMAP_16_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_16_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_16_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_17_ADDR 0x458 -#define TRQ_SEL_FMAP_17_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_17_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_17_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_18_ADDR 0x45C -#define TRQ_SEL_FMAP_18_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_18_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_18_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_19_ADDR 0x460 -#define TRQ_SEL_FMAP_19_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_19_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_19_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1A_ADDR 0x464 -#define TRQ_SEL_FMAP_1A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1B_ADDR 0x468 -#define TRQ_SEL_FMAP_1B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1C_ADDR 0x46C -#define TRQ_SEL_FMAP_1C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1D_ADDR 0x470 -#define TRQ_SEL_FMAP_1D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1E_ADDR 0x474 -#define TRQ_SEL_FMAP_1E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_1F_ADDR 0x478 -#define TRQ_SEL_FMAP_1F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_20_ADDR 0x47C -#define TRQ_SEL_FMAP_20_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_20_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_20_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_21_ADDR 0x480 -#define TRQ_SEL_FMAP_21_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_21_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_21_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_22_ADDR 0x484 -#define TRQ_SEL_FMAP_22_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_22_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_22_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_23_ADDR 0x488 -#define TRQ_SEL_FMAP_23_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_23_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_23_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_24_ADDR 0x48C -#define TRQ_SEL_FMAP_24_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_24_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_24_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_25_ADDR 0x490 -#define TRQ_SEL_FMAP_25_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_25_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_25_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_26_ADDR 0x494 -#define TRQ_SEL_FMAP_26_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_26_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_26_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_27_ADDR 0x498 -#define TRQ_SEL_FMAP_27_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_27_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_27_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_28_ADDR 0x49C -#define TRQ_SEL_FMAP_28_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_28_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_28_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_29_ADDR 0x4A0 -#define TRQ_SEL_FMAP_29_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_29_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_29_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2A_ADDR 0x4A4 -#define TRQ_SEL_FMAP_2A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2B_ADDR 0x4A8 -#define TRQ_SEL_FMAP_2B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2C_ADDR 0x4AC -#define TRQ_SEL_FMAP_2C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2D_ADDR 0x4B0 -#define TRQ_SEL_FMAP_2D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2E_ADDR 0x4B4 -#define TRQ_SEL_FMAP_2E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_2F_ADDR 0x4B8 -#define TRQ_SEL_FMAP_2F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_30_ADDR 0x4BC -#define TRQ_SEL_FMAP_30_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_30_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_30_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_31_ADDR 0x4D0 -#define TRQ_SEL_FMAP_31_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_31_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_31_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_32_ADDR 0x4D4 -#define TRQ_SEL_FMAP_32_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_32_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_32_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_33_ADDR 0x4D8 -#define TRQ_SEL_FMAP_33_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_33_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_33_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_34_ADDR 0x4DC -#define TRQ_SEL_FMAP_34_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_34_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_34_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_35_ADDR 0x4E0 -#define TRQ_SEL_FMAP_35_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_35_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_35_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_36_ADDR 0x4E4 -#define TRQ_SEL_FMAP_36_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_36_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_36_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_37_ADDR 0x4E8 -#define TRQ_SEL_FMAP_37_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_37_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_37_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_38_ADDR 0x4EC -#define TRQ_SEL_FMAP_38_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_38_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_38_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_39_ADDR 0x4F0 -#define TRQ_SEL_FMAP_39_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_39_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_39_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3A_ADDR 0x4F4 -#define TRQ_SEL_FMAP_3A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3B_ADDR 0x4F8 -#define TRQ_SEL_FMAP_3B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3C_ADDR 0x4FC -#define TRQ_SEL_FMAP_3C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3D_ADDR 0x500 -#define TRQ_SEL_FMAP_3D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3E_ADDR 0x504 -#define TRQ_SEL_FMAP_3E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_3F_ADDR 0x508 -#define TRQ_SEL_FMAP_3F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_40_ADDR 0x50C -#define TRQ_SEL_FMAP_40_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_40_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_40_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_41_ADDR 0x510 -#define TRQ_SEL_FMAP_41_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_41_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_41_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_42_ADDR 0x514 -#define TRQ_SEL_FMAP_42_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_42_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_42_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_43_ADDR 0x518 -#define TRQ_SEL_FMAP_43_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_43_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_43_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_44_ADDR 0x51C -#define TRQ_SEL_FMAP_44_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_44_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_44_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_45_ADDR 0x520 -#define TRQ_SEL_FMAP_45_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_45_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_45_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_46_ADDR 0x524 -#define TRQ_SEL_FMAP_46_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_46_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_46_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_47_ADDR 0x528 -#define TRQ_SEL_FMAP_47_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_47_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_47_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_48_ADDR 0x52C -#define TRQ_SEL_FMAP_48_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_48_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_48_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_49_ADDR 0x530 -#define TRQ_SEL_FMAP_49_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_49_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_49_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4A_ADDR 0x534 -#define TRQ_SEL_FMAP_4A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4B_ADDR 0x538 -#define TRQ_SEL_FMAP_4B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4C_ADDR 0x53C -#define TRQ_SEL_FMAP_4C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4D_ADDR 0x540 -#define TRQ_SEL_FMAP_4D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4E_ADDR 0x544 -#define TRQ_SEL_FMAP_4E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_4F_ADDR 0x548 -#define TRQ_SEL_FMAP_4F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_50_ADDR 0x54C -#define TRQ_SEL_FMAP_50_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_50_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_50_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_51_ADDR 0x550 -#define TRQ_SEL_FMAP_51_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_51_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_51_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_52_ADDR 0x554 -#define TRQ_SEL_FMAP_52_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_52_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_52_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_53_ADDR 0x558 -#define TRQ_SEL_FMAP_53_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_53_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_53_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_54_ADDR 0x55C -#define TRQ_SEL_FMAP_54_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_54_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_54_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_55_ADDR 0x560 -#define TRQ_SEL_FMAP_55_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_55_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_55_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_56_ADDR 0x564 -#define TRQ_SEL_FMAP_56_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_56_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_56_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_57_ADDR 0x568 -#define TRQ_SEL_FMAP_57_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_57_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_57_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_58_ADDR 0x56C -#define TRQ_SEL_FMAP_58_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_58_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_58_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_59_ADDR 0x570 -#define TRQ_SEL_FMAP_59_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_59_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_59_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5A_ADDR 0x574 -#define TRQ_SEL_FMAP_5A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5B_ADDR 0x578 -#define TRQ_SEL_FMAP_5B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5C_ADDR 0x57C -#define TRQ_SEL_FMAP_5C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5D_ADDR 0x580 -#define TRQ_SEL_FMAP_5D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5E_ADDR 0x584 -#define TRQ_SEL_FMAP_5E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_5F_ADDR 0x588 -#define TRQ_SEL_FMAP_5F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_60_ADDR 0x58C -#define TRQ_SEL_FMAP_60_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_60_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_60_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_61_ADDR 0x590 -#define TRQ_SEL_FMAP_61_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_61_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_61_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_62_ADDR 0x594 -#define TRQ_SEL_FMAP_62_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_62_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_62_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_63_ADDR 0x598 -#define TRQ_SEL_FMAP_63_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_63_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_63_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_64_ADDR 0x59C -#define TRQ_SEL_FMAP_64_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_64_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_64_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_65_ADDR 0x5A0 -#define TRQ_SEL_FMAP_65_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_65_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_65_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_66_ADDR 0x5A4 -#define TRQ_SEL_FMAP_66_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_66_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_66_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_67_ADDR 0x5A8 -#define TRQ_SEL_FMAP_67_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_67_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_67_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_68_ADDR 0x5AC -#define TRQ_SEL_FMAP_68_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_68_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_68_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_69_ADDR 0x5B0 -#define TRQ_SEL_FMAP_69_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_69_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_69_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6A_ADDR 0x5B4 -#define TRQ_SEL_FMAP_6A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6B_ADDR 0x5B8 -#define TRQ_SEL_FMAP_6B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6C_ADDR 0x5BC -#define TRQ_SEL_FMAP_6C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6D_ADDR 0x5C0 -#define TRQ_SEL_FMAP_6D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6E_ADDR 0x5C4 -#define TRQ_SEL_FMAP_6E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_6F_ADDR 0x5C8 -#define TRQ_SEL_FMAP_6F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_70_ADDR 0x5CC -#define TRQ_SEL_FMAP_70_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_70_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_70_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_71_ADDR 0x5D0 -#define TRQ_SEL_FMAP_71_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_71_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_71_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_72_ADDR 0x5D4 -#define TRQ_SEL_FMAP_72_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_72_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_72_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_73_ADDR 0x5D8 -#define TRQ_SEL_FMAP_73_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_73_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_73_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_74_ADDR 0x5DC -#define TRQ_SEL_FMAP_74_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_74_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_74_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_75_ADDR 0x5E0 -#define TRQ_SEL_FMAP_75_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_75_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_75_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_76_ADDR 0x5E4 -#define TRQ_SEL_FMAP_76_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_76_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_76_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_77_ADDR 0x5E8 -#define TRQ_SEL_FMAP_77_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_77_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_77_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_78_ADDR 0x5EC -#define TRQ_SEL_FMAP_78_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_78_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_78_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_79_ADDR 0x5F0 -#define TRQ_SEL_FMAP_79_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_79_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_79_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7A_ADDR 0x5F4 -#define TRQ_SEL_FMAP_7A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7B_ADDR 0x5F8 -#define TRQ_SEL_FMAP_7B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7C_ADDR 0x5FC -#define TRQ_SEL_FMAP_7C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7D_ADDR 0x600 -#define TRQ_SEL_FMAP_7D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7E_ADDR 0x604 -#define TRQ_SEL_FMAP_7E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_7F_ADDR 0x608 -#define TRQ_SEL_FMAP_7F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_80_ADDR 0x60C -#define TRQ_SEL_FMAP_80_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_80_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_80_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_81_ADDR 0x610 -#define TRQ_SEL_FMAP_81_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_81_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_81_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_82_ADDR 0x614 -#define TRQ_SEL_FMAP_82_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_82_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_82_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_83_ADDR 0x618 -#define TRQ_SEL_FMAP_83_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_83_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_83_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_84_ADDR 0x61C -#define TRQ_SEL_FMAP_84_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_84_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_84_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_85_ADDR 0x620 -#define TRQ_SEL_FMAP_85_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_85_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_85_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_86_ADDR 0x624 -#define TRQ_SEL_FMAP_86_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_86_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_86_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_87_ADDR 0x628 -#define TRQ_SEL_FMAP_87_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_87_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_87_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_88_ADDR 0x62C -#define TRQ_SEL_FMAP_88_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_88_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_88_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_89_ADDR 0x630 -#define TRQ_SEL_FMAP_89_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_89_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_89_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8A_ADDR 0x634 -#define TRQ_SEL_FMAP_8A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8B_ADDR 0x638 -#define TRQ_SEL_FMAP_8B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8C_ADDR 0x63C -#define TRQ_SEL_FMAP_8C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8D_ADDR 0x640 -#define TRQ_SEL_FMAP_8D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8E_ADDR 0x644 -#define TRQ_SEL_FMAP_8E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_8F_ADDR 0x648 -#define TRQ_SEL_FMAP_8F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_90_ADDR 0x64C -#define TRQ_SEL_FMAP_90_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_90_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_90_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_91_ADDR 0x650 -#define TRQ_SEL_FMAP_91_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_91_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_91_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_92_ADDR 0x654 -#define TRQ_SEL_FMAP_92_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_92_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_92_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_93_ADDR 0x658 -#define TRQ_SEL_FMAP_93_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_93_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_93_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_94_ADDR 0x65C -#define TRQ_SEL_FMAP_94_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_94_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_94_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_95_ADDR 0x660 -#define TRQ_SEL_FMAP_95_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_95_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_95_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_96_ADDR 0x664 -#define TRQ_SEL_FMAP_96_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_96_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_96_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_97_ADDR 0x668 -#define TRQ_SEL_FMAP_97_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_97_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_97_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_98_ADDR 0x66C -#define TRQ_SEL_FMAP_98_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_98_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_98_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_99_ADDR 0x670 -#define TRQ_SEL_FMAP_99_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_99_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_99_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9A_ADDR 0x674 -#define TRQ_SEL_FMAP_9A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9B_ADDR 0x678 -#define TRQ_SEL_FMAP_9B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9C_ADDR 0x67C -#define TRQ_SEL_FMAP_9C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9D_ADDR 0x680 -#define TRQ_SEL_FMAP_9D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9E_ADDR 0x684 -#define TRQ_SEL_FMAP_9E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_9F_ADDR 0x688 -#define TRQ_SEL_FMAP_9F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A0_ADDR 0x68C -#define TRQ_SEL_FMAP_A0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A1_ADDR 0x690 -#define TRQ_SEL_FMAP_A1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A2_ADDR 0x694 -#define TRQ_SEL_FMAP_A2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A3_ADDR 0x698 -#define TRQ_SEL_FMAP_A3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A4_ADDR 0x69C -#define TRQ_SEL_FMAP_A4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A5_ADDR 0x6A0 -#define TRQ_SEL_FMAP_A5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A6_ADDR 0x6A4 -#define TRQ_SEL_FMAP_A6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A7_ADDR 0x6A8 -#define TRQ_SEL_FMAP_A7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A8_ADDR 0x6AC -#define TRQ_SEL_FMAP_A8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_A9_ADDR 0x6B0 -#define TRQ_SEL_FMAP_A9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AA_ADDR 0x6B4 -#define TRQ_SEL_FMAP_AA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AB_ADDR 0x6B8 -#define TRQ_SEL_FMAP_AB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AC_ADDR 0x6BC -#define TRQ_SEL_FMAP_AC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AD_ADDR 0x6D0 -#define TRQ_SEL_FMAP_AD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AE_ADDR 0x6D4 -#define TRQ_SEL_FMAP_AE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_AF_ADDR 0x6D8 -#define TRQ_SEL_FMAP_AF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B0_ADDR 0x6DC -#define TRQ_SEL_FMAP_B0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B1_ADDR 0x6E0 -#define TRQ_SEL_FMAP_B1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B2_ADDR 0x6E4 -#define TRQ_SEL_FMAP_B2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B3_ADDR 0x6E8 -#define TRQ_SEL_FMAP_B3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B4_ADDR 0x6EC -#define TRQ_SEL_FMAP_B4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B5_ADDR 0x6F0 -#define TRQ_SEL_FMAP_B5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B6_ADDR 0x6F4 -#define TRQ_SEL_FMAP_B6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B7_ADDR 0x6F8 -#define TRQ_SEL_FMAP_B7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B8_ADDR 0x6FC -#define TRQ_SEL_FMAP_B8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_B9_ADDR 0x700 -#define TRQ_SEL_FMAP_B9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BA_ADDR 0x704 -#define TRQ_SEL_FMAP_BA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BB_ADDR 0x708 -#define TRQ_SEL_FMAP_BB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BC_ADDR 0x70C -#define TRQ_SEL_FMAP_BC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BD_ADDR 0x710 -#define TRQ_SEL_FMAP_BD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BE_ADDR 0x714 -#define TRQ_SEL_FMAP_BE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_BF_ADDR 0x718 -#define TRQ_SEL_FMAP_BF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C0_ADDR 0x71C -#define TRQ_SEL_FMAP_C0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C1_ADDR 0x720 -#define TRQ_SEL_FMAP_C1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C2_ADDR 0x734 -#define TRQ_SEL_FMAP_C2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C3_ADDR 0x748 -#define TRQ_SEL_FMAP_C3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C4_ADDR 0x74C -#define TRQ_SEL_FMAP_C4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C5_ADDR 0x750 -#define TRQ_SEL_FMAP_C5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C6_ADDR 0x754 -#define TRQ_SEL_FMAP_C6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C7_ADDR 0x758 -#define TRQ_SEL_FMAP_C7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C8_ADDR 0x75C -#define TRQ_SEL_FMAP_C8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_C9_ADDR 0x760 -#define TRQ_SEL_FMAP_C9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CA_ADDR 0x764 -#define TRQ_SEL_FMAP_CA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CB_ADDR 0x768 -#define TRQ_SEL_FMAP_CB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CC_ADDR 0x76C -#define TRQ_SEL_FMAP_CC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CD_ADDR 0x770 -#define TRQ_SEL_FMAP_CD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CE_ADDR 0x774 -#define TRQ_SEL_FMAP_CE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_CF_ADDR 0x778 -#define TRQ_SEL_FMAP_CF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D0_ADDR 0x77C -#define TRQ_SEL_FMAP_D0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D1_ADDR 0x780 -#define TRQ_SEL_FMAP_D1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D2_ADDR 0x784 -#define TRQ_SEL_FMAP_D2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D3_ADDR 0x788 -#define TRQ_SEL_FMAP_D3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D4_ADDR 0x78C -#define TRQ_SEL_FMAP_D4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D5_ADDR 0x790 -#define TRQ_SEL_FMAP_D5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D6_ADDR 0x794 -#define TRQ_SEL_FMAP_D6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D7_ADDR 0x798 -#define TRQ_SEL_FMAP_D7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D8_ADDR 0x79C -#define TRQ_SEL_FMAP_D8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_D9_ADDR 0x7A0 -#define TRQ_SEL_FMAP_D9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DA_ADDR 0x7A4 -#define TRQ_SEL_FMAP_DA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DB_ADDR 0x7A8 -#define TRQ_SEL_FMAP_DB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DC_ADDR 0x7AC -#define TRQ_SEL_FMAP_DC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DD_ADDR 0x7B0 -#define TRQ_SEL_FMAP_DD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DE_ADDR 0x7B4 -#define TRQ_SEL_FMAP_DE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_DF_ADDR 0x7B8 -#define TRQ_SEL_FMAP_DF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E0_ADDR 0x7BC -#define TRQ_SEL_FMAP_E0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E1_ADDR 0x7C0 -#define TRQ_SEL_FMAP_E1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E2_ADDR 0x7C4 -#define TRQ_SEL_FMAP_E2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E3_ADDR 0x7C8 -#define TRQ_SEL_FMAP_E3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E4_ADDR 0x7CC -#define TRQ_SEL_FMAP_E4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E5_ADDR 0x7D0 -#define TRQ_SEL_FMAP_E5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E6_ADDR 0x7D4 -#define TRQ_SEL_FMAP_E6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E7_ADDR 0x7D8 -#define TRQ_SEL_FMAP_E7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E8_ADDR 0x7DC -#define TRQ_SEL_FMAP_E8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_E9_ADDR 0x7E0 -#define TRQ_SEL_FMAP_E9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EA_ADDR 0x7E4 -#define TRQ_SEL_FMAP_EA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EB_ADDR 0x7E8 -#define TRQ_SEL_FMAP_EB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EC_ADDR 0x7EC -#define TRQ_SEL_FMAP_EC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_ED_ADDR 0x7F0 -#define TRQ_SEL_FMAP_ED_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_ED_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_ED_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EE_ADDR 0x7F4 -#define TRQ_SEL_FMAP_EE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_EF_ADDR 0x7F8 -#define TRQ_SEL_FMAP_EF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_TRQ_SEL_FMAP_F0_ADDR 0x7FC -#define TRQ_SEL_FMAP_F0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_F0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_F0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_CPM4_IND_CTXT_DATA_3_ADDR 0x804 -#define IND_CTXT_DATA_3_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT_DATA_2_ADDR 0x808 -#define IND_CTXT_DATA_2_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT_DATA_1_ADDR 0x80C -#define IND_CTXT_DATA_1_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT_DATA_0_ADDR 0x810 -#define IND_CTXT_DATA_0_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT3_ADDR 0x814 -#define IND_CTXT3_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT2_ADDR 0x818 -#define IND_CTXT2_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT1_ADDR 0x81C -#define IND_CTXT1_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT0_ADDR 0x820 -#define IND_CTXT0_MASK GENMASK(31, 0) -#define QDMA_CPM4_IND_CTXT_CMD_ADDR 0x824 -#define IND_CTXT_CMD_RSVD_1_MASK GENMASK(31, 18) -#define IND_CTXT_CMD_QID_MASK GENMASK(17, 7) -#define IND_CTXT_CMD_OP_MASK GENMASK(6, 5) -#define IND_CTXT_CMD_SET_MASK GENMASK(4, 1) -#define IND_CTXT_CMD_BUSY_MASK BIT(0) -#define QDMA_CPM4_C2H_TIMER_CNT_1_ADDR 0xA00 -#define C2H_TIMER_CNT_1_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_1_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_2_ADDR 0xA04 -#define C2H_TIMER_CNT_2_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_2_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_3_ADDR 0xA08 -#define C2H_TIMER_CNT_3_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_3_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_4_ADDR 0xA0C -#define C2H_TIMER_CNT_4_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_4_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_5_ADDR 0xA10 -#define C2H_TIMER_CNT_5_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_5_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_6_ADDR 0xA14 -#define C2H_TIMER_CNT_6_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_6_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_7_ADDR 0xA18 -#define C2H_TIMER_CNT_7_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_7_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_8_ADDR 0xA1C -#define C2H_TIMER_CNT_8_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_8_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_9_ADDR 0xA20 -#define C2H_TIMER_CNT_9_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_9_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_A_ADDR 0xA24 -#define C2H_TIMER_CNT_A_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_A_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_B_ADDR 0xA28 -#define C2H_TIMER_CNT_B_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_B_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_C_ADDR 0xA2C -#define C2H_TIMER_CNT_C_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_C_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_D_ADDR 0xA30 -#define C2H_TIMER_CNT_D_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_D_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_E_ADDR 0xA34 -#define C2H_TIMER_CNT_E_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_E_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_F_ADDR 0xA38 -#define C2H_TIMER_CNT_F_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_F_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_TIMER_CNT_10_ADDR 0xA3C -#define C2H_TIMER_CNT_10_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_10_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_1_ADDR 0xA40 -#define C2H_CNT_TH_1_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_1_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_2_ADDR 0xA44 -#define C2H_CNT_TH_2_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_2_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_3_ADDR 0xA48 -#define C2H_CNT_TH_3_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_3_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_4_ADDR 0xA4C -#define C2H_CNT_TH_4_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_4_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_5_ADDR 0xA50 -#define C2H_CNT_TH_5_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_5_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_6_ADDR 0xA54 -#define C2H_CNT_TH_6_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_6_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_7_ADDR 0xA58 -#define C2H_CNT_TH_7_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_7_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_8_ADDR 0xA5C -#define C2H_CNT_TH_8_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_8_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_9_ADDR 0xA60 -#define C2H_CNT_TH_9_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_9_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_A_ADDR 0xA64 -#define C2H_CNT_TH_A_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_A_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_B_ADDR 0xA68 -#define C2H_CNT_TH_B_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_B_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_C_ADDR 0xA6C -#define C2H_CNT_TH_C_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_C_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_D_ADDR 0xA70 -#define C2H_CNT_TH_D_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_D_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_E_ADDR 0xA74 -#define C2H_CNT_TH_E_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_E_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_F_ADDR 0xA78 -#define C2H_CNT_TH_F_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_F_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_CNT_TH_10_ADDR 0xA7C -#define C2H_CNT_TH_10_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_10_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_QID2VEC_MAP_QID_ADDR 0xA80 -#define C2H_QID2VEC_MAP_QID_RSVD_1_MASK GENMASK(31, 11) -#define C2H_QID2VEC_MAP_QID_QID_MASK GENMASK(10, 0) -#define QDMA_CPM4_C2H_QID2VEC_MAP_ADDR 0xA84 -#define C2H_QID2VEC_MAP_RSVD_1_MASK GENMASK(31, 19) -#define C2H_QID2VEC_MAP_H2C_EN_COAL_MASK BIT(18) -#define C2H_QID2VEC_MAP_H2C_VECTOR_MASK GENMASK(17, 9) -#define C2H_QID2VEC_MAP_C2H_EN_COAL_MASK BIT(8) -#define C2H_QID2VEC_MAP_C2H_VECTOR_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR 0xA88 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR 0xA8C -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR 0xA90 -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_AXIS_PKG_CMP_ADDR 0xA94 -#define C2H_STAT_AXIS_PKG_CMP_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_ACCEPTED_ADDR 0xA98 -#define C2H_STAT_DESC_RSP_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_CMP_ADDR 0xA9C -#define C2H_STAT_DESC_RSP_CMP_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_WRQ_OUT_ADDR 0xAA0 -#define C2H_STAT_WRQ_OUT_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_WPL_REN_ACCEPTED_ADDR 0xAA4 -#define C2H_STAT_WPL_REN_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_TOTAL_WRQ_LEN_ADDR 0xAA8 -#define C2H_STAT_TOTAL_WRQ_LEN_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_TOTAL_WPL_LEN_ADDR 0xAAC -#define C2H_STAT_TOTAL_WPL_LEN_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_0_ADDR 0xAB0 -#define C2H_BUF_SZ_0_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_1_ADDR 0xAB4 -#define C2H_BUF_SZ_1_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_2_ADDR 0xAB8 -#define C2H_BUF_SZ_2_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_3_ADDR 0xABC -#define C2H_BUF_SZ_3_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_4_ADDR 0xAC0 -#define C2H_BUF_SZ_4_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_5_ADDR 0xAC4 -#define C2H_BUF_SZ_5_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_7_ADDR 0XAC8 -#define C2H_BUF_SZ_7_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_8_ADDR 0XACC -#define C2H_BUF_SZ_8_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_9_ADDR 0xAD0 -#define C2H_BUF_SZ_9_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_10_ADDR 0xAD4 -#define C2H_BUF_SZ_10_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_11_ADDR 0xAD8 -#define C2H_BUF_SZ_11_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_12_ADDR 0xAE0 -#define C2H_BUF_SZ_12_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_13_ADDR 0xAE4 -#define C2H_BUF_SZ_13_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_14_ADDR 0xAE8 -#define C2H_BUF_SZ_14_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_BUF_SZ_15_ADDR 0XAEC -#define C2H_BUF_SZ_15_SIZE_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_ERR_STAT_ADDR 0xAF0 -#define C2H_ERR_STAT_RSVD_1_MASK GENMASK(31, 16) -#define C2H_ERR_STAT_WRB_PRTY_ERR_MASK BIT(15) -#define C2H_ERR_STAT_WRB_CIDX_ERR_MASK BIT(14) -#define C2H_ERR_STAT_WRB_QFULL_ERR_MASK BIT(13) -#define C2H_ERR_STAT_WRB_INV_Q_ERR_MASK BIT(12) -#define C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH_MASK BIT(11) -#define C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK BIT(10) -#define C2H_ERR_STAT_ERR_DESC_CNT_MASK BIT(9) -#define C2H_ERR_STAT_RSVD_2_MASK BIT(8) -#define C2H_ERR_STAT_MSI_INT_FAIL_MASK BIT(7) -#define C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define C2H_ERR_STAT_RSVD_3_MASK BIT(5) -#define C2H_ERR_STAT_DESC_RSP_ERR_MASK BIT(4) -#define C2H_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_ERR_STAT_RSVD_4_MASK BIT(2) -#define C2H_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define QDMA_CPM4_C2H_ERR_MASK_ADDR 0xAF4 -#define C2H_ERR_EN_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_FATAL_ERR_STAT_ADDR 0xAF8 -#define C2H_FATAL_ERR_STAT_RSVD_1_MASK GENMASK(31, 19) -#define C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK BIT(18) -#define C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK BIT(17) -#define C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK BIT(15) -#define C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK BIT(13) -#define C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK BIT(9) -#define C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK BIT(8) -#define C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK GENMASK(7, 4) -#define C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_FATAL_ERR_STAT_RSVD_2_MASK BIT(2) -#define C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define QDMA_CPM4_C2H_FATAL_ERR_MASK_ADDR 0xAFC -#define C2H_FATAL_ERR_C2HEN_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_FATAL_ERR_ENABLE_ADDR 0xB00 -#define C2H_FATAL_ERR_ENABLE_RSVD_1_MASK GENMASK(31, 2) -#define C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK BIT(1) -#define C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK BIT(0) -#define QDMA_CPM4_GLBL_ERR_INT_ADDR 0xB04 -#define GLBL_ERR_INT_RSVD_1_MASK GENMASK(31, 18) -#define GLBL_ERR_INT_ARM_MASK BIT(17) -#define GLBL_ERR_INT_EN_COAL_MASK BIT(16) -#define GLBL_ERR_INT_VEC_MASK GENMASK(15, 8) -#define GLBL_ERR_INT_FUNC_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_PFCH_CFG_ADDR 0xB08 -#define C2H_PFCH_CFG_EVT_QCNT_TH_MASK GENMASK(31, 25) -#define C2H_PFCH_CFG_QCNT_MASK GENMASK(24, 16) -#define C2H_PFCH_CFG_NUM_MASK GENMASK(15, 8) -#define C2H_PFCH_CFG_FL_TH_MASK GENMASK(7, 0) -#define QDMA_CPM4_C2H_INT_TIMER_TICK_ADDR 0xB0C -#define C2H_INT_TIMER_TICK_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR 0xB10 -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR 0xB14 -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DESC_REQ_ADDR 0xB18 -#define C2H_STAT_DESC_REQ_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_0_ADDR 0xB1C -#define C2H_STAT_DMA_ENG_0_RSVD_1_MASK BIT(31) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK GENMASK(30, 28) -#define C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT_MASK GENMASK(27, 18) -#define C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 8) -#define C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT_MASK GENMASK(7, 5) -#define C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK BIT(4) -#define C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK GENMASK(3, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_1_ADDR 0xB20 -#define C2H_STAT_DMA_ENG_1_RSVD_1_MASK BIT(31) -#define C2H_STAT_DMA_ENG_1_DESC_RSP_LAST_MASK BIT(30) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_2_ADDR 0xB24 -#define C2H_STAT_DMA_ENG_2_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_3_ADDR 0xB28 -#define C2H_STAT_DMA_ENG_3_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_DBG_PFCH_ERR_CTXT_ADDR 0xB2C -#define C2H_PFCH_ERR_CTXT_RSVD_1_MASK GENMASK(31, 14) -#define C2H_PFCH_ERR_CTXT_ERR_STAT_MASK BIT(13) -#define C2H_PFCH_ERR_CTXT_CMD_WR_MASK BIT(12) -#define C2H_PFCH_ERR_CTXT_QID_MASK GENMASK(11, 1) -#define C2H_PFCH_ERR_CTXT_DONE_MASK BIT(0) -#define QDMA_CPM4_C2H_FIRST_ERR_QID_ADDR 0xB30 -#define C2H_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FIRST_ERR_QID_ERR_STAT_MASK GENMASK(20, 16) -#define C2H_FIRST_ERR_QID_CMD_WR_MASK GENMASK(15, 12) -#define C2H_FIRST_ERR_QID_QID_MASK GENMASK(11, 0) -#define QDMA_CPM4_STAT_NUM_WRB_IN_ADDR 0xB34 -#define STAT_NUM_WRB_IN_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_IN_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_WRB_OUT_ADDR 0xB38 -#define STAT_NUM_WRB_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_OUT_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_WRB_DRP_ADDR 0xB3C -#define STAT_NUM_WRB_DRP_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_DRP_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_STAT_DESC_OUT_ADDR 0xB40 -#define STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_STAT_DESC_OUT_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_DSC_CRDT_SENT_ADDR 0xB44 -#define STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_DSC_CRDT_SENT_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_FCH_DSC_RCVD_ADDR 0xB48 -#define STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK GENMASK(15, 0) -#define QDMA_CPM4_STAT_NUM_BYP_DSC_RCVD_ADDR 0xB4C -#define STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK GENMASK(31, 11) -#define STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK GENMASK(10, 0) -#define QDMA_CPM4_C2H_WRB_COAL_CFG_ADDR 0xB50 -#define C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define C2H_WRB_COAL_CFG_TICK_VAL_MASK GENMASK(25, 14) -#define C2H_WRB_COAL_CFG_TICK_CNT_MASK GENMASK(13, 2) -#define C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK BIT(1) -#define C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK BIT(0) -#define QDMA_CPM4_C2H_INTR_H2C_REQ_ADDR 0xB54 -#define C2H_INTR_H2C_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_MM_REQ_ADDR 0xB58 -#define C2H_INTR_C2H_MM_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_MM_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_ERR_INT_REQ_ADDR 0xB5C -#define C2H_INTR_ERR_INT_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_ERR_INT_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_REQ_ADDR 0xB60 -#define C2H_INTR_C2H_ST_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_ADDR 0xB64 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_ADDR 0xB68 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_ADDR 0xB6C -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_ADDR 0xB70 -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_MSIX_ACK_ADDR 0xB74 -#define C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_MSIX_FAIL_ADDR 0xB78 -#define C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_NO_MSIX_ADDR 0xB7C -#define C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_INTR_C2H_ST_CTXT_INVAL_ADDR 0xB80 -#define C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_STAT_WR_CMP_ADDR 0xB84 -#define C2H_STAT_WR_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WR_CMP_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_4_ADDR 0xB88 -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD_MASK BIT(31) -#define C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY_MASK BIT(30) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_STAT_DBG_DMA_ENG_5_ADDR 0xB8C -#define C2H_STAT_DMA_ENG_5_RSVD_1_MASK GENMASK(31, 25) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD_MASK BIT(24) -#define C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY_MASK BIT(23) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT_MASK GENMASK(22, 13) -#define C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT_MASK GENMASK(12, 3) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT_MASK GENMASK(2, 0) -#define QDMA_CPM4_C2H_DBG_PFCH_QID_ADDR 0xB90 -#define C2H_PFCH_QID_RSVD_1_MASK GENMASK(31, 15) -#define C2H_PFCH_QID_ERR_CTXT_MASK BIT(14) -#define C2H_PFCH_QID_TARGET_MASK GENMASK(13, 11) -#define C2H_PFCH_QID_QID_OR_TAG_MASK GENMASK(10, 0) -#define QDMA_CPM4_C2H_DBG_PFCH_ADDR 0xB94 -#define C2H_PFCH_DATA_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_INT_DBG_ADDR 0xB98 -#define C2H_INT_RSVD_1_MASK GENMASK(31, 8) -#define C2H_INT_INT_COAL_SM_MASK GENMASK(7, 4) -#define C2H_INT_INT_SM_MASK GENMASK(3, 0) -#define QDMA_CPM4_C2H_STAT_IMM_ACCEPTED_ADDR 0xB9C -#define C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_IMM_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_STAT_MARKER_ACCEPTED_ADDR 0xBA0 -#define C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_MARKER_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_STAT_DISABLE_CMP_ACCEPTED_ADDR 0xBA4 -#define C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_C2H_PLD_FIFO_CRDT_CNT_ADDR 0xBA8 -#define C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_PLD_FIFO_CRDT_CNT_CNT_MASK GENMASK(17, 0) -#define QDMA_CPM4_H2C_ERR_STAT_ADDR 0xE00 -#define H2C_ERR_STAT_RSVD_1_MASK GENMASK(31, 5) -#define H2C_ERR_STAT_SBE_MASK BIT(4) -#define H2C_ERR_STAT_DBE_MASK BIT(3) -#define H2C_ERR_STAT_NO_DMA_DS_MASK BIT(2) -#define H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK BIT(1) -#define H2C_ERR_STAT_ZERO_LEN_DS_MASK BIT(0) -#define QDMA_CPM4_H2C_ERR_MASK_ADDR 0xE04 -#define H2C_ERR_EN_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_FIRST_ERR_QID_ADDR 0xE08 -#define H2C_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 20) -#define H2C_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(19, 16) -#define H2C_FIRST_ERR_QID_RSVD_2_MASK GENMASK(15, 12) -#define H2C_FIRST_ERR_QID_QID_MASK GENMASK(11, 0) -#define QDMA_CPM4_H2C_DBG_REG0_ADDR 0xE0C -#define H2C_REG0_NUM_DSC_RCVD_MASK GENMASK(31, 16) -#define H2C_REG0_NUM_WRB_SENT_MASK GENMASK(15, 0) -#define QDMA_CPM4_H2C_DBG_REG1_ADDR 0xE10 -#define H2C_REG1_NUM_REQ_SENT_MASK GENMASK(31, 16) -#define H2C_REG1_NUM_CMP_SENT_MASK GENMASK(15, 0) -#define QDMA_CPM4_H2C_DBG_REG2_ADDR 0xE14 -#define H2C_REG2_RSVD_1_MASK GENMASK(31, 16) -#define H2C_REG2_NUM_ERR_DSC_RCVD_MASK GENMASK(15, 0) -#define QDMA_CPM4_H2C_DBG_REG3_ADDR 0xE18 -#define H2C_REG3_MASK BIT(31) -#define H2C_REG3_DSCO_FIFO_EMPTY_MASK BIT(30) -#define H2C_REG3_DSCO_FIFO_FULL_MASK BIT(29) -#define H2C_REG3_CUR_RC_STATE_MASK GENMASK(28, 26) -#define H2C_REG3_RDREQ_LINES_MASK GENMASK(25, 16) -#define H2C_REG3_RDATA_LINES_AVAIL_MASK GENMASK(15, 6) -#define H2C_REG3_PEND_FIFO_EMPTY_MASK BIT(5) -#define H2C_REG3_PEND_FIFO_FULL_MASK BIT(4) -#define H2C_REG3_CUR_RQ_STATE_MASK GENMASK(3, 2) -#define H2C_REG3_DSCI_FIFO_FULL_MASK BIT(1) -#define H2C_REG3_DSCI_FIFO_EMPTY_MASK BIT(0) -#define QDMA_CPM4_H2C_DBG_REG4_ADDR 0xE1C -#define H2C_REG4_RDREQ_ADDR_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_FATAL_ERR_EN_ADDR 0xE20 -#define H2C_FATAL_ERR_EN_RSVD_1_MASK GENMASK(31, 1) -#define H2C_FATAL_ERR_EN_H2C_MASK BIT(0) -#define QDMA_CPM4_C2H_CHANNEL_CTL_ADDR 0x1004 -#define C2H_CHANNEL_CTL_RSVD_1_MASK GENMASK(31, 1) -#define C2H_CHANNEL_CTL_RUN_MASK BIT(0) -#define QDMA_CPM4_C2H_CHANNEL_CTL_1_ADDR 0x1008 -#define C2H_CHANNEL_CTL_1_RUN_MASK GENMASK(31, 1) -#define C2H_CHANNEL_CTL_1_RUN_1_MASK BIT(0) -#define QDMA_CPM4_C2H_MM_STATUS_ADDR 0x1040 -#define C2H_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define C2H_MM_STATUS_RUN_MASK BIT(0) -#define QDMA_CPM4_C2H_CHANNEL_CMPL_DESC_CNT_ADDR 0x1048 -#define C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1054 -#define C2H_MM_ERR_CODE_ENABLE_RSVD_1_MASK BIT(31) -#define C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK BIT(30) -#define C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK BIT(29) -#define C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK BIT(28) -#define C2H_MM_ERR_CODE_ENABLE_RSVD_2_MASK GENMASK(27, 2) -#define C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK BIT(1) -#define C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(0) -#define QDMA_CPM4_C2H_MM_ERR_CODE_ADDR 0x1058 -#define C2H_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 18) -#define C2H_MM_ERR_CODE_VALID_MASK BIT(17) -#define C2H_MM_ERR_CODE_RDWR_MASK BIT(16) -#define C2H_MM_ERR_CODE_MASK GENMASK(4, 0) -#define QDMA_CPM4_C2H_MM_ERR_INFO_ADDR 0x105C -#define C2H_MM_ERR_INFO_RSVD_1_MASK GENMASK(31, 29) -#define C2H_MM_ERR_INFO_QID_MASK GENMASK(28, 17) -#define C2H_MM_ERR_INFO_DIR_MASK BIT(16) -#define C2H_MM_ERR_INFO_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_C2H_MM_PERF_MON_CTL_ADDR 0x10C0 -#define C2H_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define C2H_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define C2H_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define QDMA_CPM4_C2H_MM_PERF_MON_CYCLE_CNT0_ADDR 0x10C4 -#define C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_MM_PERF_MON_CYCLE_CNT1_ADDR 0x10C8 -#define C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_MM_PERF_MON_DATA_CNT0_ADDR 0x10CC -#define C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define QDMA_CPM4_C2H_MM_PERF_MON_DATA_CNT1_ADDR 0x10D0 -#define C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_C2H_MM_DBG_ADDR 0x10E8 -#define C2H_MM_RSVD_1_MASK GENMASK(31, 24) -#define C2H_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define C2H_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define C2H_MM_RD_STALL_MASK BIT(6) -#define C2H_MM_RRQ_FIFO_FI_MASK BIT(5) -#define C2H_MM_WR_STALL_MASK BIT(4) -#define C2H_MM_WRQ_FIFO_FI_MASK BIT(3) -#define C2H_MM_WBK_STALL_MASK BIT(2) -#define C2H_MM_DSC_FIFO_EP_MASK BIT(1) -#define C2H_MM_DSC_FIFO_FL_MASK BIT(0) -#define QDMA_CPM4_H2C_CHANNEL_CTL_ADDR 0x1204 -#define H2C_CHANNEL_CTL_RSVD_1_MASK GENMASK(31, 1) -#define H2C_CHANNEL_CTL_RUN_MASK BIT(0) -#define QDMA_CPM4_H2C_CHANNEL_CTL_1_ADDR 0x1208 -#define H2C_CHANNEL_CTL_1_RUN_MASK BIT(0) -#define QDMA_CPM4_H2C_CHANNEL_CTL_2_ADDR 0x120C -#define H2C_CHANNEL_CTL_2_RUN_MASK BIT(0) -#define QDMA_CPM4_H2C_MM_STATUS_ADDR 0x1240 -#define H2C_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define H2C_MM_STATUS_RUN_MASK BIT(0) -#define QDMA_CPM4_H2C_CHANNEL_CMPL_DESC_CNT_ADDR 0x1248 -#define H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1254 -#define H2C_MM_ERR_CODE_ENABLE_RSVD_1_MASK GENMASK(31, 30) -#define H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(29) -#define H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK BIT(28) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_2_MASK GENMASK(27, 23) -#define H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK BIT(22) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_3_MASK GENMASK(21, 17) -#define H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK BIT(16) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_4_MASK GENMASK(15, 9) -#define H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK BIT(8) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_5_MASK GENMASK(7, 6) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK BIT(5) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK BIT(4) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK BIT(3) -#define H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK BIT(2) -#define H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK BIT(1) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_6_MASK BIT(0) -#define QDMA_CPM4_H2C_MM_ERR_CODE_ADDR 0x1258 -#define H2C_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 18) -#define H2C_MM_ERR_CODE_VALID_MASK BIT(17) -#define H2C_MM_ERR_CODE_RDWR_MASK BIT(16) -#define H2C_MM_ERR_CODE_MASK GENMASK(4, 0) -#define QDMA_CPM4_H2C_MM_ERR_INFO_ADDR 0x125C -#define H2C_MM_ERR_INFO_RSVD_1_MASK GENMASK(31, 29) -#define H2C_MM_ERR_INFO_QID_MASK GENMASK(28, 17) -#define H2C_MM_ERR_INFO_DIR_MASK BIT(16) -#define H2C_MM_ERR_INFO_CIDX_MASK GENMASK(15, 0) -#define QDMA_CPM4_H2C_MM_PERF_MON_CTL_ADDR 0x12C0 -#define H2C_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define H2C_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define H2C_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define QDMA_CPM4_H2C_MM_PERF_MON_CYCLE_CNT0_ADDR 0x12C4 -#define H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_MM_PERF_MON_CYCLE_CNT1_ADDR 0x12C8 -#define H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_H2C_MM_PERF_MON_DATA_CNT0_ADDR 0x12CC -#define H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define QDMA_CPM4_H2C_MM_PERF_MON_DATA_CNT1_ADDR 0x12D0 -#define H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define QDMA_CPM4_H2C_MM_DBG_ADDR 0x12E8 -#define H2C_MM_RSVD_1_MASK GENMASK(31, 24) -#define H2C_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define H2C_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define H2C_MM_RD_STALL_MASK BIT(6) -#define H2C_MM_RRQ_FIFO_FI_MASK BIT(5) -#define H2C_MM_WR_STALL_MASK BIT(4) -#define H2C_MM_WRQ_FIFO_FI_MASK BIT(3) -#define H2C_MM_WBK_STALL_MASK BIT(2) -#define H2C_MM_DSC_FIFO_EP_MASK BIT(1) -#define H2C_MM_DSC_FIFO_FL_MASK BIT(0) -#define QDMA_CPM4_FUNC_STATUS_REG_ADDR 0x2400 -#define FUNC_STATUS_REG_RSVD_1_MASK GENMASK(31, 12) -#define FUNC_STATUS_REG_CUR_SRC_FN_MASK GENMASK(11, 4) -#define FUNC_STATUS_REG_ACK_MASK BIT(2) -#define FUNC_STATUS_REG_O_MSG_MASK BIT(1) -#define FUNC_STATUS_REG_I_MSG_MASK BIT(0) -#define QDMA_CPM4_FUNC_CMD_REG_ADDR 0x2404 -#define FUNC_CMD_REG_RSVD_1_MASK GENMASK(31, 3) -#define FUNC_CMD_REG_RSVD_2_MASK BIT(2) -#define FUNC_CMD_REG_MSG_RCV_MASK BIT(1) -#define FUNC_CMD_REG_MSG_SENT_MASK BIT(0) -#define QDMA_CPM4_FUNC_INTERRUPT_VECTOR_REG_ADDR 0x2408 -#define FUNC_INTERRUPT_VECTOR_REG_RSVD_1_MASK GENMASK(31, 5) -#define FUNC_INTERRUPT_VECTOR_REG_IN_MASK GENMASK(4, 0) -#define QDMA_CPM4_TARGET_FUNC_REG_ADDR 0x240C -#define TARGET_FUNC_REG_RSVD_1_MASK GENMASK(31, 8) -#define TARGET_FUNC_REG_N_ID_MASK GENMASK(7, 0) -#define QDMA_CPM4_FUNC_INTERRUPT_CTL_REG_ADDR 0x2410 -#define FUNC_INTERRUPT_CTL_REG_RSVD_1_MASK GENMASK(31, 1) -#define FUNC_INTERRUPT_CTL_REG_INT_EN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W3_DSC_BASE_H_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W2_DSC_BASE_L_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W1_IS_MM_MASK BIT(31) -#define SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK BIT(30) -#define SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK BIT(29) -#define SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK BIT(28) -#define SW_IND_CTXT_DATA_W1_ERR_MASK GENMASK(27, 26) -#define SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK BIT(25) -#define SW_IND_CTXT_DATA_W1_PORT_ID_MASK GENMASK(24, 22) -#define SW_IND_CTXT_DATA_W1_IRQ_EN_MASK BIT(21) -#define SW_IND_CTXT_DATA_W1_WBK_EN_MASK BIT(20) -#define SW_IND_CTXT_DATA_W1_MM_CHN_MASK BIT(19) -#define SW_IND_CTXT_DATA_W1_BYPASS_MASK BIT(18) -#define SW_IND_CTXT_DATA_W1_DSC_SZ_MASK GENMASK(17, 16) -#define SW_IND_CTXT_DATA_W1_RNG_SZ_MASK GENMASK(15, 12) -#define SW_IND_CTXT_DATA_W1_FNC_ID_MASK GENMASK(11, 4) -#define SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK BIT(3) -#define SW_IND_CTXT_DATA_W1_WBI_CHK_MASK BIT(2) -#define SW_IND_CTXT_DATA_W1_FCRD_EN_MASK BIT(1) -#define SW_IND_CTXT_DATA_W1_QEN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W0_RSV_MASK GENMASK(31, 17) -#define SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK BIT(16) -#define SW_IND_CTXT_DATA_W0_PIDX_MASK GENMASK(15, 0) -#define HW_IND_CTXT_DATA_W1_RSVD_MASK GENMASK(15, 11) -#define HW_IND_CTXT_DATA_W1_FETCH_PND_MASK BIT(10) -#define HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK BIT(9) -#define HW_IND_CTXT_DATA_W1_DSC_PND_MASK BIT(8) -#define HW_IND_CTXT_DATA_W1_RSVD_1_MASK GENMASK(7, 0) -#define HW_IND_CTXT_DATA_W0_CRD_USE_MASK GENMASK(31, 16) -#define HW_IND_CTXT_DATA_W0_CIDX_MASK GENMASK(15, 0) -#define CRED_CTXT_DATA_W0_RSVD_1_MASK GENMASK(31, 16) -#define CRED_CTXT_DATA_W0_CREDT_MASK GENMASK(15, 0) -#define PREFETCH_CTXT_DATA_W1_VALID_MASK BIT(13) -#define PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define PREFETCH_CTXT_DATA_W0_PFCH_MASK BIT(28) -#define PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK BIT(27) -#define PREFETCH_CTXT_DATA_W0_ERR_MASK BIT(26) -#define PREFETCH_CTXT_DATA_W0_RSVD_MASK GENMASK(25, 8) -#define PREFETCH_CTXT_DATA_W0_PORT_ID_MASK GENMASK(7, 5) -#define PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK GENMASK(4, 1) -#define PREFETCH_CTXT_DATA_W0_BYPASS_MASK BIT(0) -#define CMPL_CTXT_DATA_W3_RSVD_MASK GENMASK(31, 30) -#define CMPL_CTXT_DATA_W3_FULL_UPD_MASK BIT(29) -#define CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK BIT(28) -#define CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK BIT(27) -#define CMPL_CTXT_DATA_W3_ERR_MASK GENMASK(26, 25) -#define CMPL_CTXT_DATA_W3_VALID_MASK BIT(24) -#define CMPL_CTXT_DATA_W3_CIDX_MASK GENMASK(23, 8) -#define CMPL_CTXT_DATA_W3_PIDX_H_MASK GENMASK(7, 0) -#define CMPL_CTXT_DATA_W2_PIDX_L_MASK GENMASK(31, 24) -#define CMPL_CTXT_DATA_W2_DESC_SIZE_MASK GENMASK(23, 22) -#define CMPL_CTXT_DATA_W2_BADDR_64_H_MASK GENMASK(21, 0) -#define CMPL_CTXT_DATA_W1_BADDR_64_M_MASK GENMASK(31, 0) -#define CMPL_CTXT_DATA_W0_BADDR_64_L_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK GENMASK(27, 24) -#define CMPL_CTXT_DATA_W0_COLOR_MASK BIT(23) -#define CMPL_CTXT_DATA_W0_INT_ST_MASK GENMASK(22, 21) -#define CMPL_CTXT_DATA_W0_TIMER_IDX_MASK GENMASK(20, 17) -#define CMPL_CTXT_DATA_W0_CNTER_IDX_MASK GENMASK(16, 13) -#define CMPL_CTXT_DATA_W0_FNC_ID_MASK GENMASK(12, 5) -#define CMPL_CTXT_DATA_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define CMPL_CTXT_DATA_W0_EN_INT_MASK BIT(1) -#define CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK BIT(0) -#define INTR_CTXT_DATA_W2_PIDX_MASK GENMASK(11, 0) -#define INTR_CTXT_DATA_W1_PAGE_SIZE_MASK GENMASK(31, 29) -#define INTR_CTXT_DATA_W1_BADDR_4K_H_MASK GENMASK(28, 0) -#define INTR_CTXT_DATA_W0_BADDR_4K_L_MASK GENMASK(31, 9) -#define INTR_CTXT_DATA_W0_COLOR_MASK BIT(8) -#define INTR_CTXT_DATA_W0_INT_ST_MASK BIT(7) -#define INTR_CTXT_DATA_W0_RSVD_MASK BIT(6) -#define INTR_CTXT_DATA_W0_VEC_MASK GENMASK(5, 1) -#define INTR_CTXT_DATA_W0_VALID_MASK BIT(0) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c deleted file mode 100755 index dcfb94f..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.c +++ /dev/null @@ -1,8013 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "qdma_cpm4_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_cpm4_reg_dump.tmh" -#endif - - -static struct regfield_info - cfg_blk_identifier_field_info[] = { - {"CFG_BLK_IDENTIFIER", - CFG_BLK_IDENTIFIER_MASK}, - {"CFG_BLK_IDENTIFIER_1", - CFG_BLK_IDENTIFIER_1_MASK}, - {"CFG_BLK_IDENTIFIER_RSVD_1", - CFG_BLK_IDENTIFIER_RSVD_1_MASK}, - {"CFG_BLK_IDENTIFIER_VERSION", - CFG_BLK_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - cfg_blk_busdev_field_info[] = { - {"CFG_BLK_BUSDEV_BDF", - CFG_BLK_BUSDEV_BDF_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_pld_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_PLD_SIZE", - CFG_BLK_PCIE_MAX_PLD_SIZE_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_read_req_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_MASK}, -}; - - -static struct regfield_info - cfg_blk_system_id_field_info[] = { - {"CFG_BLK_SYSTEM_ID", - CFG_BLK_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - cfg_blk_msi_enable_field_info[] = { - {"CFG_BLK_MSI_ENABLE_3", - CFG_BLK_MSI_ENABLE_3_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX3", - CFG_BLK_MSI_ENABLE_MSIX3_MASK}, - {"CFG_BLK_MSI_ENABLE_2", - CFG_BLK_MSI_ENABLE_2_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX2", - CFG_BLK_MSI_ENABLE_MSIX2_MASK}, - {"CFG_BLK_MSI_ENABLE_1", - CFG_BLK_MSI_ENABLE_1_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX1", - CFG_BLK_MSI_ENABLE_MSIX1_MASK}, - {"CFG_BLK_MSI_ENABLE_0", - CFG_BLK_MSI_ENABLE_0_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX0", - CFG_BLK_MSI_ENABLE_MSIX0_MASK}, -}; - - -static struct regfield_info - cfg_pcie_data_width_field_info[] = { - {"CFG_PCIE_DATA_WIDTH_DATAPATH", - CFG_PCIE_DATA_WIDTH_DATAPATH_MASK}, -}; - - -static struct regfield_info - cfg_pcie_ctl_field_info[] = { - {"CFG_PCIE_CTL_RRQ_DISABLE", - CFG_PCIE_CTL_RRQ_DISABLE_MASK}, - {"CFG_PCIE_CTL_RELAXED_ORDERING", - CFG_PCIE_CTL_RELAXED_ORDERING_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_pld_size_field_info[] = { - {"CFG_AXI_USER_MAX_PLD_SIZE_ISSUED", - CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_PROG", - CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_read_req_size_field_info[] = { - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK}, -}; - - -static struct regfield_info - cfg_blk_misc_ctl_field_info[] = { - {"CFG_BLK_MISC_CTL_NUM_TAG", - CFG_BLK_MISC_CTL_NUM_TAG_MASK}, - {"CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER", - CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_0_field_info[] = { - {"CFG_BLK_SCRATCH_0", - CFG_BLK_SCRATCH_0_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_1_field_info[] = { - {"CFG_BLK_SCRATCH_1", - CFG_BLK_SCRATCH_1_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_2_field_info[] = { - {"CFG_BLK_SCRATCH_2", - CFG_BLK_SCRATCH_2_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_3_field_info[] = { - {"CFG_BLK_SCRATCH_3", - CFG_BLK_SCRATCH_3_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_4_field_info[] = { - {"CFG_BLK_SCRATCH_4", - CFG_BLK_SCRATCH_4_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_5_field_info[] = { - {"CFG_BLK_SCRATCH_5", - CFG_BLK_SCRATCH_5_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_6_field_info[] = { - {"CFG_BLK_SCRATCH_6", - CFG_BLK_SCRATCH_6_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_7_field_info[] = { - {"CFG_BLK_SCRATCH_7", - CFG_BLK_SCRATCH_7_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_a_field_info[] = { - {"RAM_SBE_MSK_A", - RAM_SBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_a_field_info[] = { - {"RAM_SBE_STS_A_RSVD_1", - RAM_SBE_STS_A_RSVD_1_MASK}, - {"RAM_SBE_STS_A_PFCH_LL_RAM", - RAM_SBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_CTXT_RAM", - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_CTXT_RAM", - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_INT_CTXT_RAM", - RAM_SBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_INT_QID2VEC_RAM", - RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_COAL_DATA_RAM", - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_SBE_STS_A_TUSER_FIFO_RAM", - RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_QID_FIFO_RAM", - RAM_SBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PLD_FIFO_RAM", - RAM_SBE_STS_A_PLD_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_TIMER_FIFO_RAM", - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PASID_CTXT_RAM", - RAM_SBE_STS_A_PASID_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DSC_CPLD", - RAM_SBE_STS_A_DSC_CPLD_MASK}, - {"RAM_SBE_STS_A_DSC_CPLI", - RAM_SBE_STS_A_DSC_CPLI_MASK}, - {"RAM_SBE_STS_A_DSC_SW_CTXT", - RAM_SBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_SBE_STS_A_DSC_CRD_RCV", - RAM_SBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_SBE_STS_A_DSC_HW_CTXT", - RAM_SBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_SBE_STS_A_FUNC_MAP", - RAM_SBE_STS_A_FUNC_MAP_MASK}, - {"RAM_SBE_STS_A_C2H_WR_BRG_DAT", - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_C2H_RD_BRG_DAT", - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_WR_BRG_DAT", - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_RD_BRG_DAT", - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_RSVD_2", - RAM_SBE_STS_A_RSVD_2_MASK}, - {"RAM_SBE_STS_A_MI_C2H0_DAT", - RAM_SBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_SBE_STS_A_RSVD_3", - RAM_SBE_STS_A_RSVD_3_MASK}, - {"RAM_SBE_STS_A_MI_H2C0_DAT", - RAM_SBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_a_field_info[] = { - {"RAM_DBE_MSK_A", - RAM_DBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_a_field_info[] = { - {"RAM_DBE_STS_A_RSVD_1", - RAM_DBE_STS_A_RSVD_1_MASK}, - {"RAM_DBE_STS_A_PFCH_LL_RAM", - RAM_DBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_CTXT_RAM", - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_CTXT_RAM", - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_INT_CTXT_RAM", - RAM_DBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_INT_QID2VEC_RAM", - RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_COAL_DATA_RAM", - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_DBE_STS_A_TUSER_FIFO_RAM", - RAM_DBE_STS_A_TUSER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_QID_FIFO_RAM", - RAM_DBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PLD_FIFO_RAM", - RAM_DBE_STS_A_PLD_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_TIMER_FIFO_RAM", - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PASID_CTXT_RAM", - RAM_DBE_STS_A_PASID_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DSC_CPLD", - RAM_DBE_STS_A_DSC_CPLD_MASK}, - {"RAM_DBE_STS_A_DSC_CPLI", - RAM_DBE_STS_A_DSC_CPLI_MASK}, - {"RAM_DBE_STS_A_DSC_SW_CTXT", - RAM_DBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_DBE_STS_A_DSC_CRD_RCV", - RAM_DBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_DBE_STS_A_DSC_HW_CTXT", - RAM_DBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_DBE_STS_A_FUNC_MAP", - RAM_DBE_STS_A_FUNC_MAP_MASK}, - {"RAM_DBE_STS_A_C2H_WR_BRG_DAT", - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_C2H_RD_BRG_DAT", - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_WR_BRG_DAT", - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_RD_BRG_DAT", - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_RSVD_2", - RAM_DBE_STS_A_RSVD_2_MASK}, - {"RAM_DBE_STS_A_MI_C2H0_DAT", - RAM_DBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_DBE_STS_A_RSVD_3", - RAM_DBE_STS_A_RSVD_3_MASK}, - {"RAM_DBE_STS_A_MI_H2C0_DAT", - RAM_DBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_identifier_field_info[] = { - {"GLBL2_IDENTIFIER", - GLBL2_IDENTIFIER_MASK}, - {"GLBL2_IDENTIFIER_VERSION", - GLBL2_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - glbl2_pf_barlite_int_field_info[] = { - {"GLBL2_PF_BARLITE_INT_PF3_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF2_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF1_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF0_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_vf_barlite_int_field_info[] = { - {"GLBL2_PF_VF_BARLITE_INT_PF3_MAP", - GLBL2_PF_VF_BARLITE_INT_PF3_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF2_MAP", - GLBL2_PF_VF_BARLITE_INT_PF2_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF1_MAP", - GLBL2_PF_VF_BARLITE_INT_PF1_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF0_MAP", - GLBL2_PF_VF_BARLITE_INT_PF0_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_barlite_ext_field_info[] = { - {"GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_vf_barlite_ext_field_info[] = { - {"GLBL2_PF_VF_BARLITE_EXT_PF3_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF3_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF2_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF2_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF1_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF1_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF0_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF0_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_channel_inst_field_info[] = { - {"GLBL2_CHANNEL_INST_RSVD_1", - GLBL2_CHANNEL_INST_RSVD_1_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ST", - GLBL2_CHANNEL_INST_C2H_ST_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ST", - GLBL2_CHANNEL_INST_H2C_ST_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_2", - GLBL2_CHANNEL_INST_RSVD_2_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ENG", - GLBL2_CHANNEL_INST_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_3", - GLBL2_CHANNEL_INST_RSVD_3_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ENG", - GLBL2_CHANNEL_INST_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_mdma_field_info[] = { - {"GLBL2_CHANNEL_MDMA_RSVD_1", - GLBL2_CHANNEL_MDMA_RSVD_1_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ST", - GLBL2_CHANNEL_MDMA_C2H_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ST", - GLBL2_CHANNEL_MDMA_H2C_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_2", - GLBL2_CHANNEL_MDMA_RSVD_2_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ENG", - GLBL2_CHANNEL_MDMA_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_3", - GLBL2_CHANNEL_MDMA_RSVD_3_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ENG", - GLBL2_CHANNEL_MDMA_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_strm_field_info[] = { - {"GLBL2_CHANNEL_STRM_RSVD_1", - GLBL2_CHANNEL_STRM_RSVD_1_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ST", - GLBL2_CHANNEL_STRM_C2H_ST_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ST", - GLBL2_CHANNEL_STRM_H2C_ST_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_2", - GLBL2_CHANNEL_STRM_RSVD_2_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ENG", - GLBL2_CHANNEL_STRM_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_3", - GLBL2_CHANNEL_STRM_RSVD_3_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ENG", - GLBL2_CHANNEL_STRM_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_cap_field_info[] = { - {"GLBL2_CHANNEL_CAP_RSVD_1", - GLBL2_CHANNEL_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_CAP_MULTIQ_MAX", - GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK}, -}; - - -static struct regfield_info - glbl2_channel_pasid_cap_field_info[] = { - {"GLBL2_CHANNEL_PASID_CAP_RSVD_1", - GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET", - GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_RSVD_2", - GLBL2_CHANNEL_PASID_CAP_RSVD_2_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEEN", - GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_DMAEN", - GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK}, -}; - - -static struct regfield_info - glbl2_channel_func_ret_field_info[] = { - {"GLBL2_CHANNEL_FUNC_RET_RSVD_1", - GLBL2_CHANNEL_FUNC_RET_RSVD_1_MASK}, - {"GLBL2_CHANNEL_FUNC_RET_FUNC", - GLBL2_CHANNEL_FUNC_RET_FUNC_MASK}, -}; - - -static struct regfield_info - glbl2_system_id_field_info[] = { - {"GLBL2_SYSTEM_ID_RSVD_1", - GLBL2_SYSTEM_ID_RSVD_1_MASK}, - {"GLBL2_SYSTEM_ID", - GLBL2_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - glbl2_misc_cap_field_info[] = { - {"GLBL2_MISC_CAP_RSVD_1", - GLBL2_MISC_CAP_RSVD_1_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq0_field_info[] = { - {"GLBL2_PCIE_RQ0_NPH_AVL", - GLBL2_PCIE_RQ0_NPH_AVL_MASK}, - {"GLBL2_PCIE_RQ0_RCB_AVL", - GLBL2_PCIE_RQ0_RCB_AVL_MASK}, - {"GLBL2_PCIE_RQ0_SLV_RD_CREDS", - GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK}, - {"GLBL2_PCIE_RQ0_TAG_EP", - GLBL2_PCIE_RQ0_TAG_EP_MASK}, - {"GLBL2_PCIE_RQ0_TAG_FL", - GLBL2_PCIE_RQ0_TAG_FL_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq1_field_info[] = { - {"GLBL2_PCIE_RQ1_RSVD_1", - GLBL2_PCIE_RQ1_RSVD_1_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_REQ", - GLBL2_PCIE_RQ1_WTLP_REQ_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_EP", - GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_FL", - GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM", - GLBL2_PCIE_RQ1_TLPSM_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM512", - GLBL2_PCIE_RQ1_TLPSM512_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_RCB_OK", - GLBL2_PCIE_RQ1_RREQ0_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_SLV", - GLBL2_PCIE_RQ1_RREQ0_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_VLD", - GLBL2_PCIE_RQ1_RREQ0_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_RCB_OK", - GLBL2_PCIE_RQ1_RREQ1_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_SLV", - GLBL2_PCIE_RQ1_RREQ1_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_VLD", - GLBL2_PCIE_RQ1_RREQ1_VLD_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr0_field_info[] = { - {"GLBL2_AXIMM_WR0_RSVD_1", - GLBL2_AXIMM_WR0_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR0_WR_REQ", - GLBL2_AXIMM_WR0_WR_REQ_MASK}, - {"GLBL2_AXIMM_WR0_WR_CHN", - GLBL2_AXIMM_WR0_WR_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP", - GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_WPL_FIFO_EP", - GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN", - GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WRREQ_CNT", - GLBL2_AXIMM_WR0_WRREQ_CNT_MASK}, - {"GLBL2_AXIMM_WR0_BID", - GLBL2_AXIMM_WR0_BID_MASK}, - {"GLBL2_AXIMM_WR0_BVALID", - GLBL2_AXIMM_WR0_BVALID_MASK}, - {"GLBL2_AXIMM_WR0_BREADY", - GLBL2_AXIMM_WR0_BREADY_MASK}, - {"GLBL2_AXIMM_WR0_WVALID", - GLBL2_AXIMM_WR0_WVALID_MASK}, - {"GLBL2_AXIMM_WR0_WREADY", - GLBL2_AXIMM_WR0_WREADY_MASK}, - {"GLBL2_AXIMM_WR0_AWID", - GLBL2_AXIMM_WR0_AWID_MASK}, - {"GLBL2_AXIMM_WR0_AWVALID", - GLBL2_AXIMM_WR0_AWVALID_MASK}, - {"GLBL2_AXIMM_WR0_AWREADY", - GLBL2_AXIMM_WR0_AWREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr1_field_info[] = { - {"GLBL2_AXIMM_WR1_RSVD_1", - GLBL2_AXIMM_WR1_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT4", - GLBL2_AXIMM_WR1_BRSP_CNT4_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT3", - GLBL2_AXIMM_WR1_BRSP_CNT3_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT2", - GLBL2_AXIMM_WR1_BRSP_CNT2_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT1", - GLBL2_AXIMM_WR1_BRSP_CNT1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT0", - GLBL2_AXIMM_WR1_BRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd0_field_info[] = { - {"GLBL2_AXIMM_RD0_RSVD_1", - GLBL2_AXIMM_RD0_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD0_PND_CNT", - GLBL2_AXIMM_RD0_PND_CNT_MASK}, - {"GLBL2_AXIMM_RD0_RD_CHNL", - GLBL2_AXIMM_RD0_RD_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RD_REQ", - GLBL2_AXIMM_RD0_RD_REQ_MASK}, - {"GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL", - GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RID", - GLBL2_AXIMM_RD0_RID_MASK}, - {"GLBL2_AXIMM_RD0_RVALID", - GLBL2_AXIMM_RD0_RVALID_MASK}, - {"GLBL2_AXIMM_RD0_RREADY", - GLBL2_AXIMM_RD0_RREADY_MASK}, - {"GLBL2_AXIMM_RD0_ARID", - GLBL2_AXIMM_RD0_ARID_MASK}, - {"GLBL2_AXIMM_RD0_ARVALID", - GLBL2_AXIMM_RD0_ARVALID_MASK}, - {"GLBL2_AXIMM_RD0_ARREADY", - GLBL2_AXIMM_RD0_ARREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd1_field_info[] = { - {"GLBL2_AXIMM_RD1_RSVD_1", - GLBL2_AXIMM_RD1_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT4", - GLBL2_AXIMM_RD1_RRSP_CNT4_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT3", - GLBL2_AXIMM_RD1_RRSP_CNT3_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT2", - GLBL2_AXIMM_RD1_RRSP_CNT2_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT1", - GLBL2_AXIMM_RD1_RRSP_CNT1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT0", - GLBL2_AXIMM_RD1_RRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_1_field_info[] = { - {"GLBL_RNG_SZ_1_RSVD_1", - GLBL_RNG_SZ_1_RSVD_1_MASK}, - {"GLBL_RNG_SZ_1_RING_SIZE", - GLBL_RNG_SZ_1_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_2_field_info[] = { - {"GLBL_RNG_SZ_2_RSVD_1", - GLBL_RNG_SZ_2_RSVD_1_MASK}, - {"GLBL_RNG_SZ_2_RING_SIZE", - GLBL_RNG_SZ_2_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_3_field_info[] = { - {"GLBL_RNG_SZ_3_RSVD_1", - GLBL_RNG_SZ_3_RSVD_1_MASK}, - {"GLBL_RNG_SZ_3_RING_SIZE", - GLBL_RNG_SZ_3_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_4_field_info[] = { - {"GLBL_RNG_SZ_4_RSVD_1", - GLBL_RNG_SZ_4_RSVD_1_MASK}, - {"GLBL_RNG_SZ_4_RING_SIZE", - GLBL_RNG_SZ_4_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_5_field_info[] = { - {"GLBL_RNG_SZ_5_RSVD_1", - GLBL_RNG_SZ_5_RSVD_1_MASK}, - {"GLBL_RNG_SZ_5_RING_SIZE", - GLBL_RNG_SZ_5_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_6_field_info[] = { - {"GLBL_RNG_SZ_6_RSVD_1", - GLBL_RNG_SZ_6_RSVD_1_MASK}, - {"GLBL_RNG_SZ_6_RING_SIZE", - GLBL_RNG_SZ_6_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_7_field_info[] = { - {"GLBL_RNG_SZ_7_RSVD_1", - GLBL_RNG_SZ_7_RSVD_1_MASK}, - {"GLBL_RNG_SZ_7_RING_SIZE", - GLBL_RNG_SZ_7_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_8_field_info[] = { - {"GLBL_RNG_SZ_8_RSVD_1", - GLBL_RNG_SZ_8_RSVD_1_MASK}, - {"GLBL_RNG_SZ_8_RING_SIZE", - GLBL_RNG_SZ_8_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_9_field_info[] = { - {"GLBL_RNG_SZ_9_RSVD_1", - GLBL_RNG_SZ_9_RSVD_1_MASK}, - {"GLBL_RNG_SZ_9_RING_SIZE", - GLBL_RNG_SZ_9_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_a_field_info[] = { - {"GLBL_RNG_SZ_A_RSVD_1", - GLBL_RNG_SZ_A_RSVD_1_MASK}, - {"GLBL_RNG_SZ_A_RING_SIZE", - GLBL_RNG_SZ_A_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_b_field_info[] = { - {"GLBL_RNG_SZ_B_RSVD_1", - GLBL_RNG_SZ_B_RSVD_1_MASK}, - {"GLBL_RNG_SZ_B_RING_SIZE", - GLBL_RNG_SZ_B_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_c_field_info[] = { - {"GLBL_RNG_SZ_C_RSVD_1", - GLBL_RNG_SZ_C_RSVD_1_MASK}, - {"GLBL_RNG_SZ_C_RING_SIZE", - GLBL_RNG_SZ_C_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_d_field_info[] = { - {"GLBL_RNG_SZ_D_RSVD_1", - GLBL_RNG_SZ_D_RSVD_1_MASK}, - {"GLBL_RNG_SZ_D_RING_SIZE", - GLBL_RNG_SZ_D_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_e_field_info[] = { - {"GLBL_RNG_SZ_E_RSVD_1", - GLBL_RNG_SZ_E_RSVD_1_MASK}, - {"GLBL_RNG_SZ_E_RING_SIZE", - GLBL_RNG_SZ_E_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_f_field_info[] = { - {"GLBL_RNG_SZ_F_RSVD_1", - GLBL_RNG_SZ_F_RSVD_1_MASK}, - {"GLBL_RNG_SZ_F_RING_SIZE", - GLBL_RNG_SZ_F_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_10_field_info[] = { - {"GLBL_RNG_SZ_10_RSVD_1", - GLBL_RNG_SZ_10_RSVD_1_MASK}, - {"GLBL_RNG_SZ_10_RING_SIZE", - GLBL_RNG_SZ_10_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_err_stat_field_info[] = { - {"GLBL_ERR_STAT_RSVD_1", - GLBL_ERR_STAT_RSVD_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_ST", - GLBL_ERR_STAT_ERR_H2C_ST_MASK}, - {"GLBL_ERR_STAT_ERR_BDG", - GLBL_ERR_STAT_ERR_BDG_MASK}, - {"GLBL_ERR_STAT_IND_CTXT_CMD_ERR", - GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_ST", - GLBL_ERR_STAT_ERR_C2H_ST_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_1", - GLBL_ERR_STAT_ERR_C2H_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_0", - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_1", - GLBL_ERR_STAT_ERR_H2C_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_0", - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_TRQ", - GLBL_ERR_STAT_ERR_TRQ_MASK}, - {"GLBL_ERR_STAT_ERR_DSC", - GLBL_ERR_STAT_ERR_DSC_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_DBE", - GLBL_ERR_STAT_ERR_RAM_DBE_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_SBE", - GLBL_ERR_STAT_ERR_RAM_SBE_MASK}, -}; - - -static struct regfield_info - glbl_err_mask_field_info[] = { - {"GLBL_ERR_RSVD_1", - GLBL_ERR_RSVD_1_MASK}, - {"GLBL_ERR", - GLBL_ERR_MASK}, -}; - - -static struct regfield_info - glbl_dsc_cfg_field_info[] = { - {"GLBL_DSC_CFG_RSVD_1", - GLBL_DSC_CFG_RSVD_1_MASK}, - {"GLBL_DSC_CFG_UNC_OVR_COR", - GLBL_DSC_CFG_UNC_OVR_COR_MASK}, - {"GLBL_DSC_CFG_CTXT_FER_DIS", - GLBL_DSC_CFG_CTXT_FER_DIS_MASK}, - {"GLBL_DSC_CFG_RSVD_2", - GLBL_DSC_CFG_RSVD_2_MASK}, - {"GLBL_DSC_CFG_MAXFETCH", - GLBL_DSC_CFG_MAXFETCH_MASK}, - {"GLBL_DSC_CFG_WB_ACC_INT", - GLBL_DSC_CFG_WB_ACC_INT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_sts_field_info[] = { - {"GLBL_DSC_ERR_STS_RSVD_1", - GLBL_DSC_ERR_STS_RSVD_1_MASK}, - {"GLBL_DSC_ERR_STS_SBE", - GLBL_DSC_ERR_STS_SBE_MASK}, - {"GLBL_DSC_ERR_STS_DBE", - GLBL_DSC_ERR_STS_DBE_MASK}, - {"GLBL_DSC_ERR_STS_RQ_CANCEL", - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_DSC", - GLBL_DSC_ERR_STS_DSC_MASK}, - {"GLBL_DSC_ERR_STS_DMA", - GLBL_DSC_ERR_STS_DMA_MASK}, - {"GLBL_DSC_ERR_STS_FLR_CANCEL", - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_RSVD_2", - GLBL_DSC_ERR_STS_RSVD_2_MASK}, - {"GLBL_DSC_ERR_STS_DAT_POISON", - GLBL_DSC_ERR_STS_DAT_POISON_MASK}, - {"GLBL_DSC_ERR_STS_TIMEOUT", - GLBL_DSC_ERR_STS_TIMEOUT_MASK}, - {"GLBL_DSC_ERR_STS_FLR", - GLBL_DSC_ERR_STS_FLR_MASK}, - {"GLBL_DSC_ERR_STS_TAG", - GLBL_DSC_ERR_STS_TAG_MASK}, - {"GLBL_DSC_ERR_STS_ADDR", - GLBL_DSC_ERR_STS_ADDR_MASK}, - {"GLBL_DSC_ERR_STS_PARAM", - GLBL_DSC_ERR_STS_PARAM_MASK}, - {"GLBL_DSC_ERR_STS_UR_CA", - GLBL_DSC_ERR_STS_UR_CA_MASK}, - {"GLBL_DSC_ERR_STS_POISON", - GLBL_DSC_ERR_STS_POISON_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_msk_field_info[] = { - {"GLBL_DSC_ERR_MSK", - GLBL_DSC_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log0_field_info[] = { - {"GLBL_DSC_ERR_LOG0_VALID", - GLBL_DSC_ERR_LOG0_VALID_MASK}, - {"GLBL_DSC_ERR_LOG0_RSVD_1", - GLBL_DSC_ERR_LOG0_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG0_QID", - GLBL_DSC_ERR_LOG0_QID_MASK}, - {"GLBL_DSC_ERR_LOG0_SEL", - GLBL_DSC_ERR_LOG0_SEL_MASK}, - {"GLBL_DSC_ERR_LOG0_CIDX", - GLBL_DSC_ERR_LOG0_CIDX_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log1_field_info[] = { - {"GLBL_DSC_ERR_LOG1_RSVD_1", - GLBL_DSC_ERR_LOG1_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG1_SUB_TYPE", - GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK}, - {"GLBL_DSC_ERR_LOG1_ERR_TYPE", - GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_sts_field_info[] = { - {"GLBL_TRQ_ERR_STS_RSVD_1", - GLBL_TRQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_VF_ACCESS_ERR", - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK}, - {"GLBL_TRQ_ERR_STS_QID_RANGE", - GLBL_TRQ_ERR_STS_QID_RANGE_MASK}, - {"GLBL_TRQ_ERR_STS_UNMAPPED", - GLBL_TRQ_ERR_STS_UNMAPPED_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_msk_field_info[] = { - {"GLBL_TRQ_ERR_MSK", - GLBL_TRQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_log_field_info[] = { - {"GLBL_TRQ_ERR_LOG_RSVD_1", - GLBL_TRQ_ERR_LOG_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_LOG_TARGET", - GLBL_TRQ_ERR_LOG_TARGET_MASK}, - {"GLBL_TRQ_ERR_LOG_FUNC", - GLBL_TRQ_ERR_LOG_FUNC_MASK}, - {"GLBL_TRQ_ERR_LOG_ADDRESS", - GLBL_TRQ_ERR_LOG_ADDRESS_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat0_field_info[] = { - {"GLBL_DSC_DAT0_RSVD_1", - GLBL_DSC_DAT0_RSVD_1_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_DIR", - GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_QID", - GLBL_DSC_DAT0_CTXT_ARB_QID_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_REQ", - GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK}, - {"GLBL_DSC_DAT0_IRQ_FIFO_FL", - GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK}, - {"GLBL_DSC_DAT0_TMSTALL", - GLBL_DSC_DAT0_TMSTALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_STALL", - GLBL_DSC_DAT0_RRQ_STALL_MASK}, - {"GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL", - GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK}, - {"GLBL_DSC_DAT0_DSC_OUT_STALL", - GLBL_DSC_DAT0_DSC_OUT_STALL_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat1_field_info[] = { - {"GLBL_DSC_DAT1_RSVD_1", - GLBL_DSC_DAT1_RSVD_1_MASK}, - {"GLBL_DSC_DAT1_EVT_SPC_C2H", - GLBL_DSC_DAT1_EVT_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_EVT_SP_H2C", - GLBL_DSC_DAT1_EVT_SP_H2C_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_C2H", - GLBL_DSC_DAT1_DSC_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_H2C", - GLBL_DSC_DAT1_DSC_SPC_H2C_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_0_field_info[] = { - {"TRQ_SEL_FMAP_0_RSVD_1", - TRQ_SEL_FMAP_0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_0_QID_MAX", - TRQ_SEL_FMAP_0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_0_QID_BASE", - TRQ_SEL_FMAP_0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1_field_info[] = { - {"TRQ_SEL_FMAP_1_RSVD_1", - TRQ_SEL_FMAP_1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1_QID_MAX", - TRQ_SEL_FMAP_1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1_QID_BASE", - TRQ_SEL_FMAP_1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2_field_info[] = { - {"TRQ_SEL_FMAP_2_RSVD_1", - TRQ_SEL_FMAP_2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2_QID_MAX", - TRQ_SEL_FMAP_2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2_QID_BASE", - TRQ_SEL_FMAP_2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3_field_info[] = { - {"TRQ_SEL_FMAP_3_RSVD_1", - TRQ_SEL_FMAP_3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3_QID_MAX", - TRQ_SEL_FMAP_3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3_QID_BASE", - TRQ_SEL_FMAP_3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4_field_info[] = { - {"TRQ_SEL_FMAP_4_RSVD_1", - TRQ_SEL_FMAP_4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4_QID_MAX", - TRQ_SEL_FMAP_4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4_QID_BASE", - TRQ_SEL_FMAP_4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5_field_info[] = { - {"TRQ_SEL_FMAP_5_RSVD_1", - TRQ_SEL_FMAP_5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5_QID_MAX", - TRQ_SEL_FMAP_5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5_QID_BASE", - TRQ_SEL_FMAP_5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6_field_info[] = { - {"TRQ_SEL_FMAP_6_RSVD_1", - TRQ_SEL_FMAP_6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6_QID_MAX", - TRQ_SEL_FMAP_6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6_QID_BASE", - TRQ_SEL_FMAP_6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7_field_info[] = { - {"TRQ_SEL_FMAP_7_RSVD_1", - TRQ_SEL_FMAP_7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7_QID_MAX", - TRQ_SEL_FMAP_7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7_QID_BASE", - TRQ_SEL_FMAP_7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8_field_info[] = { - {"TRQ_SEL_FMAP_8_RSVD_1", - TRQ_SEL_FMAP_8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8_QID_MAX", - TRQ_SEL_FMAP_8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8_QID_BASE", - TRQ_SEL_FMAP_8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9_field_info[] = { - {"TRQ_SEL_FMAP_9_RSVD_1", - TRQ_SEL_FMAP_9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9_QID_MAX", - TRQ_SEL_FMAP_9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9_QID_BASE", - TRQ_SEL_FMAP_9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a_field_info[] = { - {"TRQ_SEL_FMAP_A_RSVD_1", - TRQ_SEL_FMAP_A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A_QID_MAX", - TRQ_SEL_FMAP_A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A_QID_BASE", - TRQ_SEL_FMAP_A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b_field_info[] = { - {"TRQ_SEL_FMAP_B_RSVD_1", - TRQ_SEL_FMAP_B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B_QID_MAX", - TRQ_SEL_FMAP_B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B_QID_BASE", - TRQ_SEL_FMAP_B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d_field_info[] = { - {"TRQ_SEL_FMAP_D_RSVD_1", - TRQ_SEL_FMAP_D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D_QID_MAX", - TRQ_SEL_FMAP_D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D_QID_BASE", - TRQ_SEL_FMAP_D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e_field_info[] = { - {"TRQ_SEL_FMAP_E_RSVD_1", - TRQ_SEL_FMAP_E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E_QID_MAX", - TRQ_SEL_FMAP_E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E_QID_BASE", - TRQ_SEL_FMAP_E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_f_field_info[] = { - {"TRQ_SEL_FMAP_F_RSVD_1", - TRQ_SEL_FMAP_F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_F_QID_MAX", - TRQ_SEL_FMAP_F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_F_QID_BASE", - TRQ_SEL_FMAP_F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_10_field_info[] = { - {"TRQ_SEL_FMAP_10_RSVD_1", - TRQ_SEL_FMAP_10_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_10_QID_MAX", - TRQ_SEL_FMAP_10_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_10_QID_BASE", - TRQ_SEL_FMAP_10_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_11_field_info[] = { - {"TRQ_SEL_FMAP_11_RSVD_1", - TRQ_SEL_FMAP_11_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_11_QID_MAX", - TRQ_SEL_FMAP_11_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_11_QID_BASE", - TRQ_SEL_FMAP_11_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_12_field_info[] = { - {"TRQ_SEL_FMAP_12_RSVD_1", - TRQ_SEL_FMAP_12_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_12_QID_MAX", - TRQ_SEL_FMAP_12_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_12_QID_BASE", - TRQ_SEL_FMAP_12_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_13_field_info[] = { - {"TRQ_SEL_FMAP_13_RSVD_1", - TRQ_SEL_FMAP_13_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_13_QID_MAX", - TRQ_SEL_FMAP_13_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_13_QID_BASE", - TRQ_SEL_FMAP_13_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_14_field_info[] = { - {"TRQ_SEL_FMAP_14_RSVD_1", - TRQ_SEL_FMAP_14_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_14_QID_MAX", - TRQ_SEL_FMAP_14_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_14_QID_BASE", - TRQ_SEL_FMAP_14_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_15_field_info[] = { - {"TRQ_SEL_FMAP_15_RSVD_1", - TRQ_SEL_FMAP_15_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_15_QID_MAX", - TRQ_SEL_FMAP_15_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_15_QID_BASE", - TRQ_SEL_FMAP_15_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_16_field_info[] = { - {"TRQ_SEL_FMAP_16_RSVD_1", - TRQ_SEL_FMAP_16_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_16_QID_MAX", - TRQ_SEL_FMAP_16_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_16_QID_BASE", - TRQ_SEL_FMAP_16_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_17_field_info[] = { - {"TRQ_SEL_FMAP_17_RSVD_1", - TRQ_SEL_FMAP_17_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_17_QID_MAX", - TRQ_SEL_FMAP_17_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_17_QID_BASE", - TRQ_SEL_FMAP_17_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_18_field_info[] = { - {"TRQ_SEL_FMAP_18_RSVD_1", - TRQ_SEL_FMAP_18_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_18_QID_MAX", - TRQ_SEL_FMAP_18_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_18_QID_BASE", - TRQ_SEL_FMAP_18_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_19_field_info[] = { - {"TRQ_SEL_FMAP_19_RSVD_1", - TRQ_SEL_FMAP_19_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_19_QID_MAX", - TRQ_SEL_FMAP_19_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_19_QID_BASE", - TRQ_SEL_FMAP_19_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1a_field_info[] = { - {"TRQ_SEL_FMAP_1A_RSVD_1", - TRQ_SEL_FMAP_1A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1A_QID_MAX", - TRQ_SEL_FMAP_1A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1A_QID_BASE", - TRQ_SEL_FMAP_1A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1b_field_info[] = { - {"TRQ_SEL_FMAP_1B_RSVD_1", - TRQ_SEL_FMAP_1B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1B_QID_MAX", - TRQ_SEL_FMAP_1B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1B_QID_BASE", - TRQ_SEL_FMAP_1B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1c_field_info[] = { - {"TRQ_SEL_FMAP_1C_RSVD_1", - TRQ_SEL_FMAP_1C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1C_QID_MAX", - TRQ_SEL_FMAP_1C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1C_QID_BASE", - TRQ_SEL_FMAP_1C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1d_field_info[] = { - {"TRQ_SEL_FMAP_1D_RSVD_1", - TRQ_SEL_FMAP_1D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1D_QID_MAX", - TRQ_SEL_FMAP_1D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1D_QID_BASE", - TRQ_SEL_FMAP_1D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1e_field_info[] = { - {"TRQ_SEL_FMAP_1E_RSVD_1", - TRQ_SEL_FMAP_1E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1E_QID_MAX", - TRQ_SEL_FMAP_1E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1E_QID_BASE", - TRQ_SEL_FMAP_1E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1f_field_info[] = { - {"TRQ_SEL_FMAP_1F_RSVD_1", - TRQ_SEL_FMAP_1F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1F_QID_MAX", - TRQ_SEL_FMAP_1F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1F_QID_BASE", - TRQ_SEL_FMAP_1F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_20_field_info[] = { - {"TRQ_SEL_FMAP_20_RSVD_1", - TRQ_SEL_FMAP_20_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_20_QID_MAX", - TRQ_SEL_FMAP_20_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_20_QID_BASE", - TRQ_SEL_FMAP_20_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_21_field_info[] = { - {"TRQ_SEL_FMAP_21_RSVD_1", - TRQ_SEL_FMAP_21_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_21_QID_MAX", - TRQ_SEL_FMAP_21_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_21_QID_BASE", - TRQ_SEL_FMAP_21_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_22_field_info[] = { - {"TRQ_SEL_FMAP_22_RSVD_1", - TRQ_SEL_FMAP_22_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_22_QID_MAX", - TRQ_SEL_FMAP_22_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_22_QID_BASE", - TRQ_SEL_FMAP_22_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_23_field_info[] = { - {"TRQ_SEL_FMAP_23_RSVD_1", - TRQ_SEL_FMAP_23_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_23_QID_MAX", - TRQ_SEL_FMAP_23_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_23_QID_BASE", - TRQ_SEL_FMAP_23_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_24_field_info[] = { - {"TRQ_SEL_FMAP_24_RSVD_1", - TRQ_SEL_FMAP_24_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_24_QID_MAX", - TRQ_SEL_FMAP_24_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_24_QID_BASE", - TRQ_SEL_FMAP_24_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_25_field_info[] = { - {"TRQ_SEL_FMAP_25_RSVD_1", - TRQ_SEL_FMAP_25_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_25_QID_MAX", - TRQ_SEL_FMAP_25_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_25_QID_BASE", - TRQ_SEL_FMAP_25_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_26_field_info[] = { - {"TRQ_SEL_FMAP_26_RSVD_1", - TRQ_SEL_FMAP_26_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_26_QID_MAX", - TRQ_SEL_FMAP_26_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_26_QID_BASE", - TRQ_SEL_FMAP_26_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_27_field_info[] = { - {"TRQ_SEL_FMAP_27_RSVD_1", - TRQ_SEL_FMAP_27_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_27_QID_MAX", - TRQ_SEL_FMAP_27_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_27_QID_BASE", - TRQ_SEL_FMAP_27_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_28_field_info[] = { - {"TRQ_SEL_FMAP_28_RSVD_1", - TRQ_SEL_FMAP_28_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_28_QID_MAX", - TRQ_SEL_FMAP_28_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_28_QID_BASE", - TRQ_SEL_FMAP_28_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_29_field_info[] = { - {"TRQ_SEL_FMAP_29_RSVD_1", - TRQ_SEL_FMAP_29_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_29_QID_MAX", - TRQ_SEL_FMAP_29_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_29_QID_BASE", - TRQ_SEL_FMAP_29_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2a_field_info[] = { - {"TRQ_SEL_FMAP_2A_RSVD_1", - TRQ_SEL_FMAP_2A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2A_QID_MAX", - TRQ_SEL_FMAP_2A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2A_QID_BASE", - TRQ_SEL_FMAP_2A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2b_field_info[] = { - {"TRQ_SEL_FMAP_2B_RSVD_1", - TRQ_SEL_FMAP_2B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2B_QID_MAX", - TRQ_SEL_FMAP_2B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2B_QID_BASE", - TRQ_SEL_FMAP_2B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2c_field_info[] = { - {"TRQ_SEL_FMAP_2C_RSVD_1", - TRQ_SEL_FMAP_2C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2C_QID_MAX", - TRQ_SEL_FMAP_2C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2C_QID_BASE", - TRQ_SEL_FMAP_2C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2d_field_info[] = { - {"TRQ_SEL_FMAP_2D_RSVD_1", - TRQ_SEL_FMAP_2D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2D_QID_MAX", - TRQ_SEL_FMAP_2D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2D_QID_BASE", - TRQ_SEL_FMAP_2D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2e_field_info[] = { - {"TRQ_SEL_FMAP_2E_RSVD_1", - TRQ_SEL_FMAP_2E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2E_QID_MAX", - TRQ_SEL_FMAP_2E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2E_QID_BASE", - TRQ_SEL_FMAP_2E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2f_field_info[] = { - {"TRQ_SEL_FMAP_2F_RSVD_1", - TRQ_SEL_FMAP_2F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2F_QID_MAX", - TRQ_SEL_FMAP_2F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2F_QID_BASE", - TRQ_SEL_FMAP_2F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_30_field_info[] = { - {"TRQ_SEL_FMAP_30_RSVD_1", - TRQ_SEL_FMAP_30_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_30_QID_MAX", - TRQ_SEL_FMAP_30_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_30_QID_BASE", - TRQ_SEL_FMAP_30_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_31_field_info[] = { - {"TRQ_SEL_FMAP_31_RSVD_1", - TRQ_SEL_FMAP_31_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_31_QID_MAX", - TRQ_SEL_FMAP_31_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_31_QID_BASE", - TRQ_SEL_FMAP_31_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_32_field_info[] = { - {"TRQ_SEL_FMAP_32_RSVD_1", - TRQ_SEL_FMAP_32_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_32_QID_MAX", - TRQ_SEL_FMAP_32_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_32_QID_BASE", - TRQ_SEL_FMAP_32_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_33_field_info[] = { - {"TRQ_SEL_FMAP_33_RSVD_1", - TRQ_SEL_FMAP_33_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_33_QID_MAX", - TRQ_SEL_FMAP_33_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_33_QID_BASE", - TRQ_SEL_FMAP_33_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_34_field_info[] = { - {"TRQ_SEL_FMAP_34_RSVD_1", - TRQ_SEL_FMAP_34_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_34_QID_MAX", - TRQ_SEL_FMAP_34_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_34_QID_BASE", - TRQ_SEL_FMAP_34_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_35_field_info[] = { - {"TRQ_SEL_FMAP_35_RSVD_1", - TRQ_SEL_FMAP_35_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_35_QID_MAX", - TRQ_SEL_FMAP_35_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_35_QID_BASE", - TRQ_SEL_FMAP_35_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_36_field_info[] = { - {"TRQ_SEL_FMAP_36_RSVD_1", - TRQ_SEL_FMAP_36_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_36_QID_MAX", - TRQ_SEL_FMAP_36_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_36_QID_BASE", - TRQ_SEL_FMAP_36_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_37_field_info[] = { - {"TRQ_SEL_FMAP_37_RSVD_1", - TRQ_SEL_FMAP_37_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_37_QID_MAX", - TRQ_SEL_FMAP_37_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_37_QID_BASE", - TRQ_SEL_FMAP_37_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_38_field_info[] = { - {"TRQ_SEL_FMAP_38_RSVD_1", - TRQ_SEL_FMAP_38_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_38_QID_MAX", - TRQ_SEL_FMAP_38_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_38_QID_BASE", - TRQ_SEL_FMAP_38_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_39_field_info[] = { - {"TRQ_SEL_FMAP_39_RSVD_1", - TRQ_SEL_FMAP_39_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_39_QID_MAX", - TRQ_SEL_FMAP_39_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_39_QID_BASE", - TRQ_SEL_FMAP_39_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3a_field_info[] = { - {"TRQ_SEL_FMAP_3A_RSVD_1", - TRQ_SEL_FMAP_3A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3A_QID_MAX", - TRQ_SEL_FMAP_3A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3A_QID_BASE", - TRQ_SEL_FMAP_3A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3b_field_info[] = { - {"TRQ_SEL_FMAP_3B_RSVD_1", - TRQ_SEL_FMAP_3B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3B_QID_MAX", - TRQ_SEL_FMAP_3B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3B_QID_BASE", - TRQ_SEL_FMAP_3B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3c_field_info[] = { - {"TRQ_SEL_FMAP_3C_RSVD_1", - TRQ_SEL_FMAP_3C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3C_QID_MAX", - TRQ_SEL_FMAP_3C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3C_QID_BASE", - TRQ_SEL_FMAP_3C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3d_field_info[] = { - {"TRQ_SEL_FMAP_3D_RSVD_1", - TRQ_SEL_FMAP_3D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3D_QID_MAX", - TRQ_SEL_FMAP_3D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3D_QID_BASE", - TRQ_SEL_FMAP_3D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3e_field_info[] = { - {"TRQ_SEL_FMAP_3E_RSVD_1", - TRQ_SEL_FMAP_3E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3E_QID_MAX", - TRQ_SEL_FMAP_3E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3E_QID_BASE", - TRQ_SEL_FMAP_3E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3f_field_info[] = { - {"TRQ_SEL_FMAP_3F_RSVD_1", - TRQ_SEL_FMAP_3F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3F_QID_MAX", - TRQ_SEL_FMAP_3F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3F_QID_BASE", - TRQ_SEL_FMAP_3F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_40_field_info[] = { - {"TRQ_SEL_FMAP_40_RSVD_1", - TRQ_SEL_FMAP_40_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_40_QID_MAX", - TRQ_SEL_FMAP_40_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_40_QID_BASE", - TRQ_SEL_FMAP_40_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_41_field_info[] = { - {"TRQ_SEL_FMAP_41_RSVD_1", - TRQ_SEL_FMAP_41_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_41_QID_MAX", - TRQ_SEL_FMAP_41_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_41_QID_BASE", - TRQ_SEL_FMAP_41_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_42_field_info[] = { - {"TRQ_SEL_FMAP_42_RSVD_1", - TRQ_SEL_FMAP_42_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_42_QID_MAX", - TRQ_SEL_FMAP_42_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_42_QID_BASE", - TRQ_SEL_FMAP_42_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_43_field_info[] = { - {"TRQ_SEL_FMAP_43_RSVD_1", - TRQ_SEL_FMAP_43_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_43_QID_MAX", - TRQ_SEL_FMAP_43_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_43_QID_BASE", - TRQ_SEL_FMAP_43_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_44_field_info[] = { - {"TRQ_SEL_FMAP_44_RSVD_1", - TRQ_SEL_FMAP_44_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_44_QID_MAX", - TRQ_SEL_FMAP_44_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_44_QID_BASE", - TRQ_SEL_FMAP_44_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_45_field_info[] = { - {"TRQ_SEL_FMAP_45_RSVD_1", - TRQ_SEL_FMAP_45_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_45_QID_MAX", - TRQ_SEL_FMAP_45_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_45_QID_BASE", - TRQ_SEL_FMAP_45_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_46_field_info[] = { - {"TRQ_SEL_FMAP_46_RSVD_1", - TRQ_SEL_FMAP_46_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_46_QID_MAX", - TRQ_SEL_FMAP_46_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_46_QID_BASE", - TRQ_SEL_FMAP_46_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_47_field_info[] = { - {"TRQ_SEL_FMAP_47_RSVD_1", - TRQ_SEL_FMAP_47_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_47_QID_MAX", - TRQ_SEL_FMAP_47_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_47_QID_BASE", - TRQ_SEL_FMAP_47_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_48_field_info[] = { - {"TRQ_SEL_FMAP_48_RSVD_1", - TRQ_SEL_FMAP_48_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_48_QID_MAX", - TRQ_SEL_FMAP_48_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_48_QID_BASE", - TRQ_SEL_FMAP_48_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_49_field_info[] = { - {"TRQ_SEL_FMAP_49_RSVD_1", - TRQ_SEL_FMAP_49_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_49_QID_MAX", - TRQ_SEL_FMAP_49_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_49_QID_BASE", - TRQ_SEL_FMAP_49_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4a_field_info[] = { - {"TRQ_SEL_FMAP_4A_RSVD_1", - TRQ_SEL_FMAP_4A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4A_QID_MAX", - TRQ_SEL_FMAP_4A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4A_QID_BASE", - TRQ_SEL_FMAP_4A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4b_field_info[] = { - {"TRQ_SEL_FMAP_4B_RSVD_1", - TRQ_SEL_FMAP_4B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4B_QID_MAX", - TRQ_SEL_FMAP_4B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4B_QID_BASE", - TRQ_SEL_FMAP_4B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4c_field_info[] = { - {"TRQ_SEL_FMAP_4C_RSVD_1", - TRQ_SEL_FMAP_4C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4C_QID_MAX", - TRQ_SEL_FMAP_4C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4C_QID_BASE", - TRQ_SEL_FMAP_4C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4d_field_info[] = { - {"TRQ_SEL_FMAP_4D_RSVD_1", - TRQ_SEL_FMAP_4D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4D_QID_MAX", - TRQ_SEL_FMAP_4D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4D_QID_BASE", - TRQ_SEL_FMAP_4D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4e_field_info[] = { - {"TRQ_SEL_FMAP_4E_RSVD_1", - TRQ_SEL_FMAP_4E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4E_QID_MAX", - TRQ_SEL_FMAP_4E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4E_QID_BASE", - TRQ_SEL_FMAP_4E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4f_field_info[] = { - {"TRQ_SEL_FMAP_4F_RSVD_1", - TRQ_SEL_FMAP_4F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4F_QID_MAX", - TRQ_SEL_FMAP_4F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4F_QID_BASE", - TRQ_SEL_FMAP_4F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_50_field_info[] = { - {"TRQ_SEL_FMAP_50_RSVD_1", - TRQ_SEL_FMAP_50_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_50_QID_MAX", - TRQ_SEL_FMAP_50_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_50_QID_BASE", - TRQ_SEL_FMAP_50_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_51_field_info[] = { - {"TRQ_SEL_FMAP_51_RSVD_1", - TRQ_SEL_FMAP_51_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_51_QID_MAX", - TRQ_SEL_FMAP_51_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_51_QID_BASE", - TRQ_SEL_FMAP_51_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_52_field_info[] = { - {"TRQ_SEL_FMAP_52_RSVD_1", - TRQ_SEL_FMAP_52_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_52_QID_MAX", - TRQ_SEL_FMAP_52_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_52_QID_BASE", - TRQ_SEL_FMAP_52_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_53_field_info[] = { - {"TRQ_SEL_FMAP_53_RSVD_1", - TRQ_SEL_FMAP_53_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_53_QID_MAX", - TRQ_SEL_FMAP_53_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_53_QID_BASE", - TRQ_SEL_FMAP_53_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_54_field_info[] = { - {"TRQ_SEL_FMAP_54_RSVD_1", - TRQ_SEL_FMAP_54_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_54_QID_MAX", - TRQ_SEL_FMAP_54_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_54_QID_BASE", - TRQ_SEL_FMAP_54_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_55_field_info[] = { - {"TRQ_SEL_FMAP_55_RSVD_1", - TRQ_SEL_FMAP_55_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_55_QID_MAX", - TRQ_SEL_FMAP_55_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_55_QID_BASE", - TRQ_SEL_FMAP_55_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_56_field_info[] = { - {"TRQ_SEL_FMAP_56_RSVD_1", - TRQ_SEL_FMAP_56_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_56_QID_MAX", - TRQ_SEL_FMAP_56_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_56_QID_BASE", - TRQ_SEL_FMAP_56_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_57_field_info[] = { - {"TRQ_SEL_FMAP_57_RSVD_1", - TRQ_SEL_FMAP_57_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_57_QID_MAX", - TRQ_SEL_FMAP_57_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_57_QID_BASE", - TRQ_SEL_FMAP_57_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_58_field_info[] = { - {"TRQ_SEL_FMAP_58_RSVD_1", - TRQ_SEL_FMAP_58_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_58_QID_MAX", - TRQ_SEL_FMAP_58_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_58_QID_BASE", - TRQ_SEL_FMAP_58_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_59_field_info[] = { - {"TRQ_SEL_FMAP_59_RSVD_1", - TRQ_SEL_FMAP_59_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_59_QID_MAX", - TRQ_SEL_FMAP_59_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_59_QID_BASE", - TRQ_SEL_FMAP_59_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5a_field_info[] = { - {"TRQ_SEL_FMAP_5A_RSVD_1", - TRQ_SEL_FMAP_5A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5A_QID_MAX", - TRQ_SEL_FMAP_5A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5A_QID_BASE", - TRQ_SEL_FMAP_5A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5b_field_info[] = { - {"TRQ_SEL_FMAP_5B_RSVD_1", - TRQ_SEL_FMAP_5B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5B_QID_MAX", - TRQ_SEL_FMAP_5B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5B_QID_BASE", - TRQ_SEL_FMAP_5B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5c_field_info[] = { - {"TRQ_SEL_FMAP_5C_RSVD_1", - TRQ_SEL_FMAP_5C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5C_QID_MAX", - TRQ_SEL_FMAP_5C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5C_QID_BASE", - TRQ_SEL_FMAP_5C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5d_field_info[] = { - {"TRQ_SEL_FMAP_5D_RSVD_1", - TRQ_SEL_FMAP_5D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5D_QID_MAX", - TRQ_SEL_FMAP_5D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5D_QID_BASE", - TRQ_SEL_FMAP_5D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5e_field_info[] = { - {"TRQ_SEL_FMAP_5E_RSVD_1", - TRQ_SEL_FMAP_5E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5E_QID_MAX", - TRQ_SEL_FMAP_5E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5E_QID_BASE", - TRQ_SEL_FMAP_5E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5f_field_info[] = { - {"TRQ_SEL_FMAP_5F_RSVD_1", - TRQ_SEL_FMAP_5F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5F_QID_MAX", - TRQ_SEL_FMAP_5F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5F_QID_BASE", - TRQ_SEL_FMAP_5F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_60_field_info[] = { - {"TRQ_SEL_FMAP_60_RSVD_1", - TRQ_SEL_FMAP_60_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_60_QID_MAX", - TRQ_SEL_FMAP_60_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_60_QID_BASE", - TRQ_SEL_FMAP_60_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_61_field_info[] = { - {"TRQ_SEL_FMAP_61_RSVD_1", - TRQ_SEL_FMAP_61_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_61_QID_MAX", - TRQ_SEL_FMAP_61_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_61_QID_BASE", - TRQ_SEL_FMAP_61_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_62_field_info[] = { - {"TRQ_SEL_FMAP_62_RSVD_1", - TRQ_SEL_FMAP_62_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_62_QID_MAX", - TRQ_SEL_FMAP_62_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_62_QID_BASE", - TRQ_SEL_FMAP_62_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_63_field_info[] = { - {"TRQ_SEL_FMAP_63_RSVD_1", - TRQ_SEL_FMAP_63_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_63_QID_MAX", - TRQ_SEL_FMAP_63_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_63_QID_BASE", - TRQ_SEL_FMAP_63_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_64_field_info[] = { - {"TRQ_SEL_FMAP_64_RSVD_1", - TRQ_SEL_FMAP_64_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_64_QID_MAX", - TRQ_SEL_FMAP_64_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_64_QID_BASE", - TRQ_SEL_FMAP_64_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_65_field_info[] = { - {"TRQ_SEL_FMAP_65_RSVD_1", - TRQ_SEL_FMAP_65_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_65_QID_MAX", - TRQ_SEL_FMAP_65_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_65_QID_BASE", - TRQ_SEL_FMAP_65_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_66_field_info[] = { - {"TRQ_SEL_FMAP_66_RSVD_1", - TRQ_SEL_FMAP_66_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_66_QID_MAX", - TRQ_SEL_FMAP_66_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_66_QID_BASE", - TRQ_SEL_FMAP_66_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_67_field_info[] = { - {"TRQ_SEL_FMAP_67_RSVD_1", - TRQ_SEL_FMAP_67_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_67_QID_MAX", - TRQ_SEL_FMAP_67_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_67_QID_BASE", - TRQ_SEL_FMAP_67_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_68_field_info[] = { - {"TRQ_SEL_FMAP_68_RSVD_1", - TRQ_SEL_FMAP_68_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_68_QID_MAX", - TRQ_SEL_FMAP_68_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_68_QID_BASE", - TRQ_SEL_FMAP_68_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_69_field_info[] = { - {"TRQ_SEL_FMAP_69_RSVD_1", - TRQ_SEL_FMAP_69_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_69_QID_MAX", - TRQ_SEL_FMAP_69_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_69_QID_BASE", - TRQ_SEL_FMAP_69_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6a_field_info[] = { - {"TRQ_SEL_FMAP_6A_RSVD_1", - TRQ_SEL_FMAP_6A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6A_QID_MAX", - TRQ_SEL_FMAP_6A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6A_QID_BASE", - TRQ_SEL_FMAP_6A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6b_field_info[] = { - {"TRQ_SEL_FMAP_6B_RSVD_1", - TRQ_SEL_FMAP_6B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6B_QID_MAX", - TRQ_SEL_FMAP_6B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6B_QID_BASE", - TRQ_SEL_FMAP_6B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6c_field_info[] = { - {"TRQ_SEL_FMAP_6C_RSVD_1", - TRQ_SEL_FMAP_6C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6C_QID_MAX", - TRQ_SEL_FMAP_6C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6C_QID_BASE", - TRQ_SEL_FMAP_6C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6d_field_info[] = { - {"TRQ_SEL_FMAP_6D_RSVD_1", - TRQ_SEL_FMAP_6D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6D_QID_MAX", - TRQ_SEL_FMAP_6D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6D_QID_BASE", - TRQ_SEL_FMAP_6D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6e_field_info[] = { - {"TRQ_SEL_FMAP_6E_RSVD_1", - TRQ_SEL_FMAP_6E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6E_QID_MAX", - TRQ_SEL_FMAP_6E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6E_QID_BASE", - TRQ_SEL_FMAP_6E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6f_field_info[] = { - {"TRQ_SEL_FMAP_6F_RSVD_1", - TRQ_SEL_FMAP_6F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6F_QID_MAX", - TRQ_SEL_FMAP_6F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6F_QID_BASE", - TRQ_SEL_FMAP_6F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_70_field_info[] = { - {"TRQ_SEL_FMAP_70_RSVD_1", - TRQ_SEL_FMAP_70_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_70_QID_MAX", - TRQ_SEL_FMAP_70_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_70_QID_BASE", - TRQ_SEL_FMAP_70_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_71_field_info[] = { - {"TRQ_SEL_FMAP_71_RSVD_1", - TRQ_SEL_FMAP_71_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_71_QID_MAX", - TRQ_SEL_FMAP_71_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_71_QID_BASE", - TRQ_SEL_FMAP_71_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_72_field_info[] = { - {"TRQ_SEL_FMAP_72_RSVD_1", - TRQ_SEL_FMAP_72_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_72_QID_MAX", - TRQ_SEL_FMAP_72_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_72_QID_BASE", - TRQ_SEL_FMAP_72_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_73_field_info[] = { - {"TRQ_SEL_FMAP_73_RSVD_1", - TRQ_SEL_FMAP_73_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_73_QID_MAX", - TRQ_SEL_FMAP_73_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_73_QID_BASE", - TRQ_SEL_FMAP_73_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_74_field_info[] = { - {"TRQ_SEL_FMAP_74_RSVD_1", - TRQ_SEL_FMAP_74_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_74_QID_MAX", - TRQ_SEL_FMAP_74_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_74_QID_BASE", - TRQ_SEL_FMAP_74_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_75_field_info[] = { - {"TRQ_SEL_FMAP_75_RSVD_1", - TRQ_SEL_FMAP_75_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_75_QID_MAX", - TRQ_SEL_FMAP_75_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_75_QID_BASE", - TRQ_SEL_FMAP_75_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_76_field_info[] = { - {"TRQ_SEL_FMAP_76_RSVD_1", - TRQ_SEL_FMAP_76_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_76_QID_MAX", - TRQ_SEL_FMAP_76_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_76_QID_BASE", - TRQ_SEL_FMAP_76_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_77_field_info[] = { - {"TRQ_SEL_FMAP_77_RSVD_1", - TRQ_SEL_FMAP_77_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_77_QID_MAX", - TRQ_SEL_FMAP_77_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_77_QID_BASE", - TRQ_SEL_FMAP_77_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_78_field_info[] = { - {"TRQ_SEL_FMAP_78_RSVD_1", - TRQ_SEL_FMAP_78_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_78_QID_MAX", - TRQ_SEL_FMAP_78_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_78_QID_BASE", - TRQ_SEL_FMAP_78_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_79_field_info[] = { - {"TRQ_SEL_FMAP_79_RSVD_1", - TRQ_SEL_FMAP_79_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_79_QID_MAX", - TRQ_SEL_FMAP_79_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_79_QID_BASE", - TRQ_SEL_FMAP_79_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7a_field_info[] = { - {"TRQ_SEL_FMAP_7A_RSVD_1", - TRQ_SEL_FMAP_7A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7A_QID_MAX", - TRQ_SEL_FMAP_7A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7A_QID_BASE", - TRQ_SEL_FMAP_7A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7b_field_info[] = { - {"TRQ_SEL_FMAP_7B_RSVD_1", - TRQ_SEL_FMAP_7B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7B_QID_MAX", - TRQ_SEL_FMAP_7B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7B_QID_BASE", - TRQ_SEL_FMAP_7B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7c_field_info[] = { - {"TRQ_SEL_FMAP_7C_RSVD_1", - TRQ_SEL_FMAP_7C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7C_QID_MAX", - TRQ_SEL_FMAP_7C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7C_QID_BASE", - TRQ_SEL_FMAP_7C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7d_field_info[] = { - {"TRQ_SEL_FMAP_7D_RSVD_1", - TRQ_SEL_FMAP_7D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7D_QID_MAX", - TRQ_SEL_FMAP_7D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7D_QID_BASE", - TRQ_SEL_FMAP_7D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7e_field_info[] = { - {"TRQ_SEL_FMAP_7E_RSVD_1", - TRQ_SEL_FMAP_7E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7E_QID_MAX", - TRQ_SEL_FMAP_7E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7E_QID_BASE", - TRQ_SEL_FMAP_7E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7f_field_info[] = { - {"TRQ_SEL_FMAP_7F_RSVD_1", - TRQ_SEL_FMAP_7F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7F_QID_MAX", - TRQ_SEL_FMAP_7F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7F_QID_BASE", - TRQ_SEL_FMAP_7F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_80_field_info[] = { - {"TRQ_SEL_FMAP_80_RSVD_1", - TRQ_SEL_FMAP_80_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_80_QID_MAX", - TRQ_SEL_FMAP_80_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_80_QID_BASE", - TRQ_SEL_FMAP_80_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_81_field_info[] = { - {"TRQ_SEL_FMAP_81_RSVD_1", - TRQ_SEL_FMAP_81_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_81_QID_MAX", - TRQ_SEL_FMAP_81_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_81_QID_BASE", - TRQ_SEL_FMAP_81_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_82_field_info[] = { - {"TRQ_SEL_FMAP_82_RSVD_1", - TRQ_SEL_FMAP_82_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_82_QID_MAX", - TRQ_SEL_FMAP_82_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_82_QID_BASE", - TRQ_SEL_FMAP_82_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_83_field_info[] = { - {"TRQ_SEL_FMAP_83_RSVD_1", - TRQ_SEL_FMAP_83_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_83_QID_MAX", - TRQ_SEL_FMAP_83_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_83_QID_BASE", - TRQ_SEL_FMAP_83_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_84_field_info[] = { - {"TRQ_SEL_FMAP_84_RSVD_1", - TRQ_SEL_FMAP_84_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_84_QID_MAX", - TRQ_SEL_FMAP_84_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_84_QID_BASE", - TRQ_SEL_FMAP_84_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_85_field_info[] = { - {"TRQ_SEL_FMAP_85_RSVD_1", - TRQ_SEL_FMAP_85_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_85_QID_MAX", - TRQ_SEL_FMAP_85_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_85_QID_BASE", - TRQ_SEL_FMAP_85_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_86_field_info[] = { - {"TRQ_SEL_FMAP_86_RSVD_1", - TRQ_SEL_FMAP_86_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_86_QID_MAX", - TRQ_SEL_FMAP_86_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_86_QID_BASE", - TRQ_SEL_FMAP_86_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_87_field_info[] = { - {"TRQ_SEL_FMAP_87_RSVD_1", - TRQ_SEL_FMAP_87_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_87_QID_MAX", - TRQ_SEL_FMAP_87_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_87_QID_BASE", - TRQ_SEL_FMAP_87_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_88_field_info[] = { - {"TRQ_SEL_FMAP_88_RSVD_1", - TRQ_SEL_FMAP_88_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_88_QID_MAX", - TRQ_SEL_FMAP_88_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_88_QID_BASE", - TRQ_SEL_FMAP_88_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_89_field_info[] = { - {"TRQ_SEL_FMAP_89_RSVD_1", - TRQ_SEL_FMAP_89_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_89_QID_MAX", - TRQ_SEL_FMAP_89_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_89_QID_BASE", - TRQ_SEL_FMAP_89_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8a_field_info[] = { - {"TRQ_SEL_FMAP_8A_RSVD_1", - TRQ_SEL_FMAP_8A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8A_QID_MAX", - TRQ_SEL_FMAP_8A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8A_QID_BASE", - TRQ_SEL_FMAP_8A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8b_field_info[] = { - {"TRQ_SEL_FMAP_8B_RSVD_1", - TRQ_SEL_FMAP_8B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8B_QID_MAX", - TRQ_SEL_FMAP_8B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8B_QID_BASE", - TRQ_SEL_FMAP_8B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8c_field_info[] = { - {"TRQ_SEL_FMAP_8C_RSVD_1", - TRQ_SEL_FMAP_8C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8C_QID_MAX", - TRQ_SEL_FMAP_8C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8C_QID_BASE", - TRQ_SEL_FMAP_8C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8d_field_info[] = { - {"TRQ_SEL_FMAP_8D_RSVD_1", - TRQ_SEL_FMAP_8D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8D_QID_MAX", - TRQ_SEL_FMAP_8D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8D_QID_BASE", - TRQ_SEL_FMAP_8D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8e_field_info[] = { - {"TRQ_SEL_FMAP_8E_RSVD_1", - TRQ_SEL_FMAP_8E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8E_QID_MAX", - TRQ_SEL_FMAP_8E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8E_QID_BASE", - TRQ_SEL_FMAP_8E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8f_field_info[] = { - {"TRQ_SEL_FMAP_8F_RSVD_1", - TRQ_SEL_FMAP_8F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8F_QID_MAX", - TRQ_SEL_FMAP_8F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8F_QID_BASE", - TRQ_SEL_FMAP_8F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_90_field_info[] = { - {"TRQ_SEL_FMAP_90_RSVD_1", - TRQ_SEL_FMAP_90_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_90_QID_MAX", - TRQ_SEL_FMAP_90_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_90_QID_BASE", - TRQ_SEL_FMAP_90_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_91_field_info[] = { - {"TRQ_SEL_FMAP_91_RSVD_1", - TRQ_SEL_FMAP_91_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_91_QID_MAX", - TRQ_SEL_FMAP_91_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_91_QID_BASE", - TRQ_SEL_FMAP_91_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_92_field_info[] = { - {"TRQ_SEL_FMAP_92_RSVD_1", - TRQ_SEL_FMAP_92_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_92_QID_MAX", - TRQ_SEL_FMAP_92_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_92_QID_BASE", - TRQ_SEL_FMAP_92_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_93_field_info[] = { - {"TRQ_SEL_FMAP_93_RSVD_1", - TRQ_SEL_FMAP_93_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_93_QID_MAX", - TRQ_SEL_FMAP_93_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_93_QID_BASE", - TRQ_SEL_FMAP_93_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_94_field_info[] = { - {"TRQ_SEL_FMAP_94_RSVD_1", - TRQ_SEL_FMAP_94_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_94_QID_MAX", - TRQ_SEL_FMAP_94_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_94_QID_BASE", - TRQ_SEL_FMAP_94_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_95_field_info[] = { - {"TRQ_SEL_FMAP_95_RSVD_1", - TRQ_SEL_FMAP_95_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_95_QID_MAX", - TRQ_SEL_FMAP_95_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_95_QID_BASE", - TRQ_SEL_FMAP_95_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_96_field_info[] = { - {"TRQ_SEL_FMAP_96_RSVD_1", - TRQ_SEL_FMAP_96_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_96_QID_MAX", - TRQ_SEL_FMAP_96_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_96_QID_BASE", - TRQ_SEL_FMAP_96_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_97_field_info[] = { - {"TRQ_SEL_FMAP_97_RSVD_1", - TRQ_SEL_FMAP_97_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_97_QID_MAX", - TRQ_SEL_FMAP_97_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_97_QID_BASE", - TRQ_SEL_FMAP_97_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_98_field_info[] = { - {"TRQ_SEL_FMAP_98_RSVD_1", - TRQ_SEL_FMAP_98_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_98_QID_MAX", - TRQ_SEL_FMAP_98_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_98_QID_BASE", - TRQ_SEL_FMAP_98_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_99_field_info[] = { - {"TRQ_SEL_FMAP_99_RSVD_1", - TRQ_SEL_FMAP_99_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_99_QID_MAX", - TRQ_SEL_FMAP_99_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_99_QID_BASE", - TRQ_SEL_FMAP_99_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9a_field_info[] = { - {"TRQ_SEL_FMAP_9A_RSVD_1", - TRQ_SEL_FMAP_9A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9A_QID_MAX", - TRQ_SEL_FMAP_9A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9A_QID_BASE", - TRQ_SEL_FMAP_9A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9b_field_info[] = { - {"TRQ_SEL_FMAP_9B_RSVD_1", - TRQ_SEL_FMAP_9B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9B_QID_MAX", - TRQ_SEL_FMAP_9B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9B_QID_BASE", - TRQ_SEL_FMAP_9B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9c_field_info[] = { - {"TRQ_SEL_FMAP_9C_RSVD_1", - TRQ_SEL_FMAP_9C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9C_QID_MAX", - TRQ_SEL_FMAP_9C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9C_QID_BASE", - TRQ_SEL_FMAP_9C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9d_field_info[] = { - {"TRQ_SEL_FMAP_9D_RSVD_1", - TRQ_SEL_FMAP_9D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9D_QID_MAX", - TRQ_SEL_FMAP_9D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9D_QID_BASE", - TRQ_SEL_FMAP_9D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9e_field_info[] = { - {"TRQ_SEL_FMAP_9E_RSVD_1", - TRQ_SEL_FMAP_9E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9E_QID_MAX", - TRQ_SEL_FMAP_9E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9E_QID_BASE", - TRQ_SEL_FMAP_9E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9f_field_info[] = { - {"TRQ_SEL_FMAP_9F_RSVD_1", - TRQ_SEL_FMAP_9F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9F_QID_MAX", - TRQ_SEL_FMAP_9F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9F_QID_BASE", - TRQ_SEL_FMAP_9F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a0_field_info[] = { - {"TRQ_SEL_FMAP_A0_RSVD_1", - TRQ_SEL_FMAP_A0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A0_QID_MAX", - TRQ_SEL_FMAP_A0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A0_QID_BASE", - TRQ_SEL_FMAP_A0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a1_field_info[] = { - {"TRQ_SEL_FMAP_A1_RSVD_1", - TRQ_SEL_FMAP_A1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A1_QID_MAX", - TRQ_SEL_FMAP_A1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A1_QID_BASE", - TRQ_SEL_FMAP_A1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a2_field_info[] = { - {"TRQ_SEL_FMAP_A2_RSVD_1", - TRQ_SEL_FMAP_A2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A2_QID_MAX", - TRQ_SEL_FMAP_A2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A2_QID_BASE", - TRQ_SEL_FMAP_A2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a3_field_info[] = { - {"TRQ_SEL_FMAP_A3_RSVD_1", - TRQ_SEL_FMAP_A3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A3_QID_MAX", - TRQ_SEL_FMAP_A3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A3_QID_BASE", - TRQ_SEL_FMAP_A3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a4_field_info[] = { - {"TRQ_SEL_FMAP_A4_RSVD_1", - TRQ_SEL_FMAP_A4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A4_QID_MAX", - TRQ_SEL_FMAP_A4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A4_QID_BASE", - TRQ_SEL_FMAP_A4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a5_field_info[] = { - {"TRQ_SEL_FMAP_A5_RSVD_1", - TRQ_SEL_FMAP_A5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A5_QID_MAX", - TRQ_SEL_FMAP_A5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A5_QID_BASE", - TRQ_SEL_FMAP_A5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a6_field_info[] = { - {"TRQ_SEL_FMAP_A6_RSVD_1", - TRQ_SEL_FMAP_A6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A6_QID_MAX", - TRQ_SEL_FMAP_A6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A6_QID_BASE", - TRQ_SEL_FMAP_A6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a7_field_info[] = { - {"TRQ_SEL_FMAP_A7_RSVD_1", - TRQ_SEL_FMAP_A7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A7_QID_MAX", - TRQ_SEL_FMAP_A7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A7_QID_BASE", - TRQ_SEL_FMAP_A7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a8_field_info[] = { - {"TRQ_SEL_FMAP_A8_RSVD_1", - TRQ_SEL_FMAP_A8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A8_QID_MAX", - TRQ_SEL_FMAP_A8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A8_QID_BASE", - TRQ_SEL_FMAP_A8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a9_field_info[] = { - {"TRQ_SEL_FMAP_A9_RSVD_1", - TRQ_SEL_FMAP_A9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A9_QID_MAX", - TRQ_SEL_FMAP_A9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A9_QID_BASE", - TRQ_SEL_FMAP_A9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_aa_field_info[] = { - {"TRQ_SEL_FMAP_AA_RSVD_1", - TRQ_SEL_FMAP_AA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AA_QID_MAX", - TRQ_SEL_FMAP_AA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AA_QID_BASE", - TRQ_SEL_FMAP_AA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ab_field_info[] = { - {"TRQ_SEL_FMAP_AB_RSVD_1", - TRQ_SEL_FMAP_AB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AB_QID_MAX", - TRQ_SEL_FMAP_AB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AB_QID_BASE", - TRQ_SEL_FMAP_AB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ac_field_info[] = { - {"TRQ_SEL_FMAP_AC_RSVD_1", - TRQ_SEL_FMAP_AC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AC_QID_MAX", - TRQ_SEL_FMAP_AC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AC_QID_BASE", - TRQ_SEL_FMAP_AC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ad_field_info[] = { - {"TRQ_SEL_FMAP_AD_RSVD_1", - TRQ_SEL_FMAP_AD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AD_QID_MAX", - TRQ_SEL_FMAP_AD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AD_QID_BASE", - TRQ_SEL_FMAP_AD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ae_field_info[] = { - {"TRQ_SEL_FMAP_AE_RSVD_1", - TRQ_SEL_FMAP_AE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AE_QID_MAX", - TRQ_SEL_FMAP_AE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AE_QID_BASE", - TRQ_SEL_FMAP_AE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_af_field_info[] = { - {"TRQ_SEL_FMAP_AF_RSVD_1", - TRQ_SEL_FMAP_AF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AF_QID_MAX", - TRQ_SEL_FMAP_AF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AF_QID_BASE", - TRQ_SEL_FMAP_AF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b0_field_info[] = { - {"TRQ_SEL_FMAP_B0_RSVD_1", - TRQ_SEL_FMAP_B0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B0_QID_MAX", - TRQ_SEL_FMAP_B0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B0_QID_BASE", - TRQ_SEL_FMAP_B0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b1_field_info[] = { - {"TRQ_SEL_FMAP_B1_RSVD_1", - TRQ_SEL_FMAP_B1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B1_QID_MAX", - TRQ_SEL_FMAP_B1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B1_QID_BASE", - TRQ_SEL_FMAP_B1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b2_field_info[] = { - {"TRQ_SEL_FMAP_B2_RSVD_1", - TRQ_SEL_FMAP_B2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B2_QID_MAX", - TRQ_SEL_FMAP_B2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B2_QID_BASE", - TRQ_SEL_FMAP_B2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b3_field_info[] = { - {"TRQ_SEL_FMAP_B3_RSVD_1", - TRQ_SEL_FMAP_B3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B3_QID_MAX", - TRQ_SEL_FMAP_B3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B3_QID_BASE", - TRQ_SEL_FMAP_B3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b4_field_info[] = { - {"TRQ_SEL_FMAP_B4_RSVD_1", - TRQ_SEL_FMAP_B4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B4_QID_MAX", - TRQ_SEL_FMAP_B4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B4_QID_BASE", - TRQ_SEL_FMAP_B4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b5_field_info[] = { - {"TRQ_SEL_FMAP_B5_RSVD_1", - TRQ_SEL_FMAP_B5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B5_QID_MAX", - TRQ_SEL_FMAP_B5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B5_QID_BASE", - TRQ_SEL_FMAP_B5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b6_field_info[] = { - {"TRQ_SEL_FMAP_B6_RSVD_1", - TRQ_SEL_FMAP_B6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B6_QID_MAX", - TRQ_SEL_FMAP_B6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B6_QID_BASE", - TRQ_SEL_FMAP_B6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b7_field_info[] = { - {"TRQ_SEL_FMAP_B7_RSVD_1", - TRQ_SEL_FMAP_B7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B7_QID_MAX", - TRQ_SEL_FMAP_B7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B7_QID_BASE", - TRQ_SEL_FMAP_B7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b8_field_info[] = { - {"TRQ_SEL_FMAP_B8_RSVD_1", - TRQ_SEL_FMAP_B8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B8_QID_MAX", - TRQ_SEL_FMAP_B8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B8_QID_BASE", - TRQ_SEL_FMAP_B8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b9_field_info[] = { - {"TRQ_SEL_FMAP_B9_RSVD_1", - TRQ_SEL_FMAP_B9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B9_QID_MAX", - TRQ_SEL_FMAP_B9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B9_QID_BASE", - TRQ_SEL_FMAP_B9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ba_field_info[] = { - {"TRQ_SEL_FMAP_BA_RSVD_1", - TRQ_SEL_FMAP_BA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BA_QID_MAX", - TRQ_SEL_FMAP_BA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BA_QID_BASE", - TRQ_SEL_FMAP_BA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bb_field_info[] = { - {"TRQ_SEL_FMAP_BB_RSVD_1", - TRQ_SEL_FMAP_BB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BB_QID_MAX", - TRQ_SEL_FMAP_BB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BB_QID_BASE", - TRQ_SEL_FMAP_BB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bc_field_info[] = { - {"TRQ_SEL_FMAP_BC_RSVD_1", - TRQ_SEL_FMAP_BC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BC_QID_MAX", - TRQ_SEL_FMAP_BC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BC_QID_BASE", - TRQ_SEL_FMAP_BC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bd_field_info[] = { - {"TRQ_SEL_FMAP_BD_RSVD_1", - TRQ_SEL_FMAP_BD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BD_QID_MAX", - TRQ_SEL_FMAP_BD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BD_QID_BASE", - TRQ_SEL_FMAP_BD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_be_field_info[] = { - {"TRQ_SEL_FMAP_BE_RSVD_1", - TRQ_SEL_FMAP_BE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BE_QID_MAX", - TRQ_SEL_FMAP_BE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BE_QID_BASE", - TRQ_SEL_FMAP_BE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bf_field_info[] = { - {"TRQ_SEL_FMAP_BF_RSVD_1", - TRQ_SEL_FMAP_BF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BF_QID_MAX", - TRQ_SEL_FMAP_BF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BF_QID_BASE", - TRQ_SEL_FMAP_BF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c0_field_info[] = { - {"TRQ_SEL_FMAP_C0_RSVD_1", - TRQ_SEL_FMAP_C0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C0_QID_MAX", - TRQ_SEL_FMAP_C0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C0_QID_BASE", - TRQ_SEL_FMAP_C0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c1_field_info[] = { - {"TRQ_SEL_FMAP_C1_RSVD_1", - TRQ_SEL_FMAP_C1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C1_QID_MAX", - TRQ_SEL_FMAP_C1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C1_QID_BASE", - TRQ_SEL_FMAP_C1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c2_field_info[] = { - {"TRQ_SEL_FMAP_C2_RSVD_1", - TRQ_SEL_FMAP_C2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C2_QID_MAX", - TRQ_SEL_FMAP_C2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C2_QID_BASE", - TRQ_SEL_FMAP_C2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c3_field_info[] = { - {"TRQ_SEL_FMAP_C3_RSVD_1", - TRQ_SEL_FMAP_C3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C3_QID_MAX", - TRQ_SEL_FMAP_C3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C3_QID_BASE", - TRQ_SEL_FMAP_C3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c4_field_info[] = { - {"TRQ_SEL_FMAP_C4_RSVD_1", - TRQ_SEL_FMAP_C4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C4_QID_MAX", - TRQ_SEL_FMAP_C4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C4_QID_BASE", - TRQ_SEL_FMAP_C4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c5_field_info[] = { - {"TRQ_SEL_FMAP_C5_RSVD_1", - TRQ_SEL_FMAP_C5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C5_QID_MAX", - TRQ_SEL_FMAP_C5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C5_QID_BASE", - TRQ_SEL_FMAP_C5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c6_field_info[] = { - {"TRQ_SEL_FMAP_C6_RSVD_1", - TRQ_SEL_FMAP_C6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C6_QID_MAX", - TRQ_SEL_FMAP_C6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C6_QID_BASE", - TRQ_SEL_FMAP_C6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c7_field_info[] = { - {"TRQ_SEL_FMAP_C7_RSVD_1", - TRQ_SEL_FMAP_C7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C7_QID_MAX", - TRQ_SEL_FMAP_C7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C7_QID_BASE", - TRQ_SEL_FMAP_C7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c8_field_info[] = { - {"TRQ_SEL_FMAP_C8_RSVD_1", - TRQ_SEL_FMAP_C8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C8_QID_MAX", - TRQ_SEL_FMAP_C8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C8_QID_BASE", - TRQ_SEL_FMAP_C8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c9_field_info[] = { - {"TRQ_SEL_FMAP_C9_RSVD_1", - TRQ_SEL_FMAP_C9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C9_QID_MAX", - TRQ_SEL_FMAP_C9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C9_QID_BASE", - TRQ_SEL_FMAP_C9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ca_field_info[] = { - {"TRQ_SEL_FMAP_CA_RSVD_1", - TRQ_SEL_FMAP_CA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CA_QID_MAX", - TRQ_SEL_FMAP_CA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CA_QID_BASE", - TRQ_SEL_FMAP_CA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cb_field_info[] = { - {"TRQ_SEL_FMAP_CB_RSVD_1", - TRQ_SEL_FMAP_CB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CB_QID_MAX", - TRQ_SEL_FMAP_CB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CB_QID_BASE", - TRQ_SEL_FMAP_CB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cc_field_info[] = { - {"TRQ_SEL_FMAP_CC_RSVD_1", - TRQ_SEL_FMAP_CC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CC_QID_MAX", - TRQ_SEL_FMAP_CC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CC_QID_BASE", - TRQ_SEL_FMAP_CC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cd_field_info[] = { - {"TRQ_SEL_FMAP_CD_RSVD_1", - TRQ_SEL_FMAP_CD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CD_QID_MAX", - TRQ_SEL_FMAP_CD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CD_QID_BASE", - TRQ_SEL_FMAP_CD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ce_field_info[] = { - {"TRQ_SEL_FMAP_CE_RSVD_1", - TRQ_SEL_FMAP_CE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CE_QID_MAX", - TRQ_SEL_FMAP_CE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CE_QID_BASE", - TRQ_SEL_FMAP_CE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cf_field_info[] = { - {"TRQ_SEL_FMAP_CF_RSVD_1", - TRQ_SEL_FMAP_CF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CF_QID_MAX", - TRQ_SEL_FMAP_CF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CF_QID_BASE", - TRQ_SEL_FMAP_CF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d0_field_info[] = { - {"TRQ_SEL_FMAP_D0_RSVD_1", - TRQ_SEL_FMAP_D0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D0_QID_MAX", - TRQ_SEL_FMAP_D0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D0_QID_BASE", - TRQ_SEL_FMAP_D0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d1_field_info[] = { - {"TRQ_SEL_FMAP_D1_RSVD_1", - TRQ_SEL_FMAP_D1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D1_QID_MAX", - TRQ_SEL_FMAP_D1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D1_QID_BASE", - TRQ_SEL_FMAP_D1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d2_field_info[] = { - {"TRQ_SEL_FMAP_D2_RSVD_1", - TRQ_SEL_FMAP_D2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D2_QID_MAX", - TRQ_SEL_FMAP_D2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D2_QID_BASE", - TRQ_SEL_FMAP_D2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d3_field_info[] = { - {"TRQ_SEL_FMAP_D3_RSVD_1", - TRQ_SEL_FMAP_D3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D3_QID_MAX", - TRQ_SEL_FMAP_D3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D3_QID_BASE", - TRQ_SEL_FMAP_D3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d4_field_info[] = { - {"TRQ_SEL_FMAP_D4_RSVD_1", - TRQ_SEL_FMAP_D4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D4_QID_MAX", - TRQ_SEL_FMAP_D4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D4_QID_BASE", - TRQ_SEL_FMAP_D4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d5_field_info[] = { - {"TRQ_SEL_FMAP_D5_RSVD_1", - TRQ_SEL_FMAP_D5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D5_QID_MAX", - TRQ_SEL_FMAP_D5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D5_QID_BASE", - TRQ_SEL_FMAP_D5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d6_field_info[] = { - {"TRQ_SEL_FMAP_D6_RSVD_1", - TRQ_SEL_FMAP_D6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D6_QID_MAX", - TRQ_SEL_FMAP_D6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D6_QID_BASE", - TRQ_SEL_FMAP_D6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d7_field_info[] = { - {"TRQ_SEL_FMAP_D7_RSVD_1", - TRQ_SEL_FMAP_D7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D7_QID_MAX", - TRQ_SEL_FMAP_D7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D7_QID_BASE", - TRQ_SEL_FMAP_D7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d8_field_info[] = { - {"TRQ_SEL_FMAP_D8_RSVD_1", - TRQ_SEL_FMAP_D8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D8_QID_MAX", - TRQ_SEL_FMAP_D8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D8_QID_BASE", - TRQ_SEL_FMAP_D8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d9_field_info[] = { - {"TRQ_SEL_FMAP_D9_RSVD_1", - TRQ_SEL_FMAP_D9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D9_QID_MAX", - TRQ_SEL_FMAP_D9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D9_QID_BASE", - TRQ_SEL_FMAP_D9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_da_field_info[] = { - {"TRQ_SEL_FMAP_DA_RSVD_1", - TRQ_SEL_FMAP_DA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DA_QID_MAX", - TRQ_SEL_FMAP_DA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DA_QID_BASE", - TRQ_SEL_FMAP_DA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_db_field_info[] = { - {"TRQ_SEL_FMAP_DB_RSVD_1", - TRQ_SEL_FMAP_DB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DB_QID_MAX", - TRQ_SEL_FMAP_DB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DB_QID_BASE", - TRQ_SEL_FMAP_DB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_dc_field_info[] = { - {"TRQ_SEL_FMAP_DC_RSVD_1", - TRQ_SEL_FMAP_DC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DC_QID_MAX", - TRQ_SEL_FMAP_DC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DC_QID_BASE", - TRQ_SEL_FMAP_DC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_dd_field_info[] = { - {"TRQ_SEL_FMAP_DD_RSVD_1", - TRQ_SEL_FMAP_DD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DD_QID_MAX", - TRQ_SEL_FMAP_DD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DD_QID_BASE", - TRQ_SEL_FMAP_DD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_de_field_info[] = { - {"TRQ_SEL_FMAP_DE_RSVD_1", - TRQ_SEL_FMAP_DE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DE_QID_MAX", - TRQ_SEL_FMAP_DE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DE_QID_BASE", - TRQ_SEL_FMAP_DE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_df_field_info[] = { - {"TRQ_SEL_FMAP_DF_RSVD_1", - TRQ_SEL_FMAP_DF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DF_QID_MAX", - TRQ_SEL_FMAP_DF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DF_QID_BASE", - TRQ_SEL_FMAP_DF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e0_field_info[] = { - {"TRQ_SEL_FMAP_E0_RSVD_1", - TRQ_SEL_FMAP_E0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E0_QID_MAX", - TRQ_SEL_FMAP_E0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E0_QID_BASE", - TRQ_SEL_FMAP_E0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e1_field_info[] = { - {"TRQ_SEL_FMAP_E1_RSVD_1", - TRQ_SEL_FMAP_E1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E1_QID_MAX", - TRQ_SEL_FMAP_E1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E1_QID_BASE", - TRQ_SEL_FMAP_E1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e2_field_info[] = { - {"TRQ_SEL_FMAP_E2_RSVD_1", - TRQ_SEL_FMAP_E2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E2_QID_MAX", - TRQ_SEL_FMAP_E2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E2_QID_BASE", - TRQ_SEL_FMAP_E2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e3_field_info[] = { - {"TRQ_SEL_FMAP_E3_RSVD_1", - TRQ_SEL_FMAP_E3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E3_QID_MAX", - TRQ_SEL_FMAP_E3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E3_QID_BASE", - TRQ_SEL_FMAP_E3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e4_field_info[] = { - {"TRQ_SEL_FMAP_E4_RSVD_1", - TRQ_SEL_FMAP_E4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E4_QID_MAX", - TRQ_SEL_FMAP_E4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E4_QID_BASE", - TRQ_SEL_FMAP_E4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e5_field_info[] = { - {"TRQ_SEL_FMAP_E5_RSVD_1", - TRQ_SEL_FMAP_E5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E5_QID_MAX", - TRQ_SEL_FMAP_E5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E5_QID_BASE", - TRQ_SEL_FMAP_E5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e6_field_info[] = { - {"TRQ_SEL_FMAP_E6_RSVD_1", - TRQ_SEL_FMAP_E6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E6_QID_MAX", - TRQ_SEL_FMAP_E6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E6_QID_BASE", - TRQ_SEL_FMAP_E6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e7_field_info[] = { - {"TRQ_SEL_FMAP_E7_RSVD_1", - TRQ_SEL_FMAP_E7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E7_QID_MAX", - TRQ_SEL_FMAP_E7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E7_QID_BASE", - TRQ_SEL_FMAP_E7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e8_field_info[] = { - {"TRQ_SEL_FMAP_E8_RSVD_1", - TRQ_SEL_FMAP_E8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E8_QID_MAX", - TRQ_SEL_FMAP_E8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E8_QID_BASE", - TRQ_SEL_FMAP_E8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e9_field_info[] = { - {"TRQ_SEL_FMAP_E9_RSVD_1", - TRQ_SEL_FMAP_E9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E9_QID_MAX", - TRQ_SEL_FMAP_E9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E9_QID_BASE", - TRQ_SEL_FMAP_E9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ea_field_info[] = { - {"TRQ_SEL_FMAP_EA_RSVD_1", - TRQ_SEL_FMAP_EA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EA_QID_MAX", - TRQ_SEL_FMAP_EA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EA_QID_BASE", - TRQ_SEL_FMAP_EA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_eb_field_info[] = { - {"TRQ_SEL_FMAP_EB_RSVD_1", - TRQ_SEL_FMAP_EB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EB_QID_MAX", - TRQ_SEL_FMAP_EB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EB_QID_BASE", - TRQ_SEL_FMAP_EB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ec_field_info[] = { - {"TRQ_SEL_FMAP_EC_RSVD_1", - TRQ_SEL_FMAP_EC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EC_QID_MAX", - TRQ_SEL_FMAP_EC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EC_QID_BASE", - TRQ_SEL_FMAP_EC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ed_field_info[] = { - {"TRQ_SEL_FMAP_ED_RSVD_1", - TRQ_SEL_FMAP_ED_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_ED_QID_MAX", - TRQ_SEL_FMAP_ED_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_ED_QID_BASE", - TRQ_SEL_FMAP_ED_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ee_field_info[] = { - {"TRQ_SEL_FMAP_EE_RSVD_1", - TRQ_SEL_FMAP_EE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EE_QID_MAX", - TRQ_SEL_FMAP_EE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EE_QID_BASE", - TRQ_SEL_FMAP_EE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ef_field_info[] = { - {"TRQ_SEL_FMAP_EF_RSVD_1", - TRQ_SEL_FMAP_EF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EF_QID_MAX", - TRQ_SEL_FMAP_EF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EF_QID_BASE", - TRQ_SEL_FMAP_EF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_f0_field_info[] = { - {"TRQ_SEL_FMAP_F0_RSVD_1", - TRQ_SEL_FMAP_F0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_F0_QID_MAX", - TRQ_SEL_FMAP_F0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_F0_QID_BASE", - TRQ_SEL_FMAP_F0_QID_BASE_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_3_field_info[] = { - {"IND_CTXT_DATA_3_DATA", - IND_CTXT_DATA_3_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_2_field_info[] = { - {"IND_CTXT_DATA_2_DATA", - IND_CTXT_DATA_2_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_1_field_info[] = { - {"IND_CTXT_DATA_1_DATA", - IND_CTXT_DATA_1_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_0_field_info[] = { - {"IND_CTXT_DATA_0_DATA", - IND_CTXT_DATA_0_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt3_field_info[] = { - {"IND_CTXT3", - IND_CTXT3_MASK}, -}; - - -static struct regfield_info - ind_ctxt2_field_info[] = { - {"IND_CTXT2", - IND_CTXT2_MASK}, -}; - - -static struct regfield_info - ind_ctxt1_field_info[] = { - {"IND_CTXT1", - IND_CTXT1_MASK}, -}; - - -static struct regfield_info - ind_ctxt0_field_info[] = { - {"IND_CTXT0", - IND_CTXT0_MASK}, -}; - - -static struct regfield_info - ind_ctxt_cmd_field_info[] = { - {"IND_CTXT_CMD_RSVD_1", - IND_CTXT_CMD_RSVD_1_MASK}, - {"IND_CTXT_CMD_QID", - IND_CTXT_CMD_QID_MASK}, - {"IND_CTXT_CMD_OP", - IND_CTXT_CMD_OP_MASK}, - {"IND_CTXT_CMD_SET", - IND_CTXT_CMD_SET_MASK}, - {"IND_CTXT_CMD_BUSY", - IND_CTXT_CMD_BUSY_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_1_field_info[] = { - {"C2H_TIMER_CNT_1_RSVD_1", - C2H_TIMER_CNT_1_RSVD_1_MASK}, - {"C2H_TIMER_CNT_1", - C2H_TIMER_CNT_1_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_2_field_info[] = { - {"C2H_TIMER_CNT_2_RSVD_1", - C2H_TIMER_CNT_2_RSVD_1_MASK}, - {"C2H_TIMER_CNT_2", - C2H_TIMER_CNT_2_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_3_field_info[] = { - {"C2H_TIMER_CNT_3_RSVD_1", - C2H_TIMER_CNT_3_RSVD_1_MASK}, - {"C2H_TIMER_CNT_3", - C2H_TIMER_CNT_3_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_4_field_info[] = { - {"C2H_TIMER_CNT_4_RSVD_1", - C2H_TIMER_CNT_4_RSVD_1_MASK}, - {"C2H_TIMER_CNT_4", - C2H_TIMER_CNT_4_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_5_field_info[] = { - {"C2H_TIMER_CNT_5_RSVD_1", - C2H_TIMER_CNT_5_RSVD_1_MASK}, - {"C2H_TIMER_CNT_5", - C2H_TIMER_CNT_5_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_6_field_info[] = { - {"C2H_TIMER_CNT_6_RSVD_1", - C2H_TIMER_CNT_6_RSVD_1_MASK}, - {"C2H_TIMER_CNT_6", - C2H_TIMER_CNT_6_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_7_field_info[] = { - {"C2H_TIMER_CNT_7_RSVD_1", - C2H_TIMER_CNT_7_RSVD_1_MASK}, - {"C2H_TIMER_CNT_7", - C2H_TIMER_CNT_7_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_8_field_info[] = { - {"C2H_TIMER_CNT_8_RSVD_1", - C2H_TIMER_CNT_8_RSVD_1_MASK}, - {"C2H_TIMER_CNT_8", - C2H_TIMER_CNT_8_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_9_field_info[] = { - {"C2H_TIMER_CNT_9_RSVD_1", - C2H_TIMER_CNT_9_RSVD_1_MASK}, - {"C2H_TIMER_CNT_9", - C2H_TIMER_CNT_9_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_a_field_info[] = { - {"C2H_TIMER_CNT_A_RSVD_1", - C2H_TIMER_CNT_A_RSVD_1_MASK}, - {"C2H_TIMER_CNT_A", - C2H_TIMER_CNT_A_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_b_field_info[] = { - {"C2H_TIMER_CNT_B_RSVD_1", - C2H_TIMER_CNT_B_RSVD_1_MASK}, - {"C2H_TIMER_CNT_B", - C2H_TIMER_CNT_B_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_c_field_info[] = { - {"C2H_TIMER_CNT_C_RSVD_1", - C2H_TIMER_CNT_C_RSVD_1_MASK}, - {"C2H_TIMER_CNT_C", - C2H_TIMER_CNT_C_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_d_field_info[] = { - {"C2H_TIMER_CNT_D_RSVD_1", - C2H_TIMER_CNT_D_RSVD_1_MASK}, - {"C2H_TIMER_CNT_D", - C2H_TIMER_CNT_D_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_e_field_info[] = { - {"C2H_TIMER_CNT_E_RSVD_1", - C2H_TIMER_CNT_E_RSVD_1_MASK}, - {"C2H_TIMER_CNT_E", - C2H_TIMER_CNT_E_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_f_field_info[] = { - {"C2H_TIMER_CNT_F_RSVD_1", - C2H_TIMER_CNT_F_RSVD_1_MASK}, - {"C2H_TIMER_CNT_F", - C2H_TIMER_CNT_F_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_10_field_info[] = { - {"C2H_TIMER_CNT_10_RSVD_1", - C2H_TIMER_CNT_10_RSVD_1_MASK}, - {"C2H_TIMER_CNT_10", - C2H_TIMER_CNT_10_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_1_field_info[] = { - {"C2H_CNT_TH_1_RSVD_1", - C2H_CNT_TH_1_RSVD_1_MASK}, - {"C2H_CNT_TH_1_THESHOLD_CNT", - C2H_CNT_TH_1_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_2_field_info[] = { - {"C2H_CNT_TH_2_RSVD_1", - C2H_CNT_TH_2_RSVD_1_MASK}, - {"C2H_CNT_TH_2_THESHOLD_CNT", - C2H_CNT_TH_2_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_3_field_info[] = { - {"C2H_CNT_TH_3_RSVD_1", - C2H_CNT_TH_3_RSVD_1_MASK}, - {"C2H_CNT_TH_3_THESHOLD_CNT", - C2H_CNT_TH_3_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_4_field_info[] = { - {"C2H_CNT_TH_4_RSVD_1", - C2H_CNT_TH_4_RSVD_1_MASK}, - {"C2H_CNT_TH_4_THESHOLD_CNT", - C2H_CNT_TH_4_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_5_field_info[] = { - {"C2H_CNT_TH_5_RSVD_1", - C2H_CNT_TH_5_RSVD_1_MASK}, - {"C2H_CNT_TH_5_THESHOLD_CNT", - C2H_CNT_TH_5_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_6_field_info[] = { - {"C2H_CNT_TH_6_RSVD_1", - C2H_CNT_TH_6_RSVD_1_MASK}, - {"C2H_CNT_TH_6_THESHOLD_CNT", - C2H_CNT_TH_6_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_7_field_info[] = { - {"C2H_CNT_TH_7_RSVD_1", - C2H_CNT_TH_7_RSVD_1_MASK}, - {"C2H_CNT_TH_7_THESHOLD_CNT", - C2H_CNT_TH_7_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_8_field_info[] = { - {"C2H_CNT_TH_8_RSVD_1", - C2H_CNT_TH_8_RSVD_1_MASK}, - {"C2H_CNT_TH_8_THESHOLD_CNT", - C2H_CNT_TH_8_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_9_field_info[] = { - {"C2H_CNT_TH_9_RSVD_1", - C2H_CNT_TH_9_RSVD_1_MASK}, - {"C2H_CNT_TH_9_THESHOLD_CNT", - C2H_CNT_TH_9_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_a_field_info[] = { - {"C2H_CNT_TH_A_RSVD_1", - C2H_CNT_TH_A_RSVD_1_MASK}, - {"C2H_CNT_TH_A_THESHOLD_CNT", - C2H_CNT_TH_A_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_b_field_info[] = { - {"C2H_CNT_TH_B_RSVD_1", - C2H_CNT_TH_B_RSVD_1_MASK}, - {"C2H_CNT_TH_B_THESHOLD_CNT", - C2H_CNT_TH_B_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_c_field_info[] = { - {"C2H_CNT_TH_C_RSVD_1", - C2H_CNT_TH_C_RSVD_1_MASK}, - {"C2H_CNT_TH_C_THESHOLD_CNT", - C2H_CNT_TH_C_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_d_field_info[] = { - {"C2H_CNT_TH_D_RSVD_1", - C2H_CNT_TH_D_RSVD_1_MASK}, - {"C2H_CNT_TH_D_THESHOLD_CNT", - C2H_CNT_TH_D_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_e_field_info[] = { - {"C2H_CNT_TH_E_RSVD_1", - C2H_CNT_TH_E_RSVD_1_MASK}, - {"C2H_CNT_TH_E_THESHOLD_CNT", - C2H_CNT_TH_E_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_f_field_info[] = { - {"C2H_CNT_TH_F_RSVD_1", - C2H_CNT_TH_F_RSVD_1_MASK}, - {"C2H_CNT_TH_F_THESHOLD_CNT", - C2H_CNT_TH_F_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_10_field_info[] = { - {"C2H_CNT_TH_10_RSVD_1", - C2H_CNT_TH_10_RSVD_1_MASK}, - {"C2H_CNT_TH_10_THESHOLD_CNT", - C2H_CNT_TH_10_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_qid2vec_map_qid_field_info[] = { - {"C2H_QID2VEC_MAP_QID_RSVD_1", - C2H_QID2VEC_MAP_QID_RSVD_1_MASK}, - {"C2H_QID2VEC_MAP_QID_QID", - C2H_QID2VEC_MAP_QID_QID_MASK}, -}; - - -static struct regfield_info - c2h_qid2vec_map_field_info[] = { - {"C2H_QID2VEC_MAP_RSVD_1", - C2H_QID2VEC_MAP_RSVD_1_MASK}, - {"C2H_QID2VEC_MAP_H2C_EN_COAL", - C2H_QID2VEC_MAP_H2C_EN_COAL_MASK}, - {"C2H_QID2VEC_MAP_H2C_VECTOR", - C2H_QID2VEC_MAP_H2C_VECTOR_MASK}, - {"C2H_QID2VEC_MAP_C2H_EN_COAL", - C2H_QID2VEC_MAP_C2H_EN_COAL_MASK}, - {"C2H_QID2VEC_MAP_C2H_VECTOR", - C2H_QID2VEC_MAP_C2H_VECTOR_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED", - C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP", - C2H_STAT_AXIS_PKG_CMP_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ACCEPTED_D", - C2H_STAT_DESC_RSP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_cmp_field_info[] = { - {"C2H_STAT_DESC_RSP_CMP_D", - C2H_STAT_DESC_RSP_CMP_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_wrq_out_field_info[] = { - {"C2H_STAT_WRQ_OUT", - C2H_STAT_WRQ_OUT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wpl_ren_accepted_field_info[] = { - {"C2H_STAT_WPL_REN_ACCEPTED", - C2H_STAT_WPL_REN_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wrq_len_field_info[] = { - {"C2H_STAT_TOTAL_WRQ_LEN", - C2H_STAT_TOTAL_WRQ_LEN_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wpl_len_field_info[] = { - {"C2H_STAT_TOTAL_WPL_LEN", - C2H_STAT_TOTAL_WPL_LEN_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_0_field_info[] = { - {"C2H_BUF_SZ_0_SIZE", - C2H_BUF_SZ_0_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_1_field_info[] = { - {"C2H_BUF_SZ_1_SIZE", - C2H_BUF_SZ_1_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_2_field_info[] = { - {"C2H_BUF_SZ_2_SIZE", - C2H_BUF_SZ_2_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_3_field_info[] = { - {"C2H_BUF_SZ_3_SIZE", - C2H_BUF_SZ_3_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_4_field_info[] = { - {"C2H_BUF_SZ_4_SIZE", - C2H_BUF_SZ_4_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_5_field_info[] = { - {"C2H_BUF_SZ_5_SIZE", - C2H_BUF_SZ_5_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_7_field_info[] = { - {"C2H_BUF_SZ_7_SIZE", - C2H_BUF_SZ_7_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_8_field_info[] = { - {"C2H_BUF_SZ_8_SIZE", - C2H_BUF_SZ_8_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_9_field_info[] = { - {"C2H_BUF_SZ_9_SIZE", - C2H_BUF_SZ_9_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_10_field_info[] = { - {"C2H_BUF_SZ_10_SIZE", - C2H_BUF_SZ_10_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_11_field_info[] = { - {"C2H_BUF_SZ_11_SIZE", - C2H_BUF_SZ_11_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_12_field_info[] = { - {"C2H_BUF_SZ_12_SIZE", - C2H_BUF_SZ_12_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_13_field_info[] = { - {"C2H_BUF_SZ_13_SIZE", - C2H_BUF_SZ_13_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_14_field_info[] = { - {"C2H_BUF_SZ_14_SIZE", - C2H_BUF_SZ_14_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_15_field_info[] = { - {"C2H_BUF_SZ_15_SIZE", - C2H_BUF_SZ_15_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_err_stat_field_info[] = { - {"C2H_ERR_STAT_RSVD_1", - C2H_ERR_STAT_RSVD_1_MASK}, - {"C2H_ERR_STAT_WRB_PRTY_ERR", - C2H_ERR_STAT_WRB_PRTY_ERR_MASK}, - {"C2H_ERR_STAT_WRB_CIDX_ERR", - C2H_ERR_STAT_WRB_CIDX_ERR_MASK}, - {"C2H_ERR_STAT_WRB_QFULL_ERR", - C2H_ERR_STAT_WRB_QFULL_ERR_MASK}, - {"C2H_ERR_STAT_WRB_INV_Q_ERR", - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK}, - {"C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH", - C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH_MASK}, - {"C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH", - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK}, - {"C2H_ERR_STAT_ERR_DESC_CNT", - C2H_ERR_STAT_ERR_DESC_CNT_MASK}, - {"C2H_ERR_STAT_RSVD_2", - C2H_ERR_STAT_RSVD_2_MASK}, - {"C2H_ERR_STAT_MSI_INT_FAIL", - C2H_ERR_STAT_MSI_INT_FAIL_MASK}, - {"C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR", - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_3", - C2H_ERR_STAT_RSVD_3_MASK}, - {"C2H_ERR_STAT_DESC_RSP_ERR", - C2H_ERR_STAT_DESC_RSP_ERR_MASK}, - {"C2H_ERR_STAT_QID_MISMATCH", - C2H_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_ERR_STAT_RSVD_4", - C2H_ERR_STAT_RSVD_4_MASK}, - {"C2H_ERR_STAT_LEN_MISMATCH", - C2H_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_ERR_STAT_MTY_MISMATCH", - C2H_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_err_mask_field_info[] = { - {"C2H_ERR_EN", - C2H_ERR_EN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_stat_field_info[] = { - {"C2H_FATAL_ERR_STAT_RSVD_1", - C2H_FATAL_ERR_STAT_RSVD_1_MASK}, - {"C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR", - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_MISMATCH", - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_RSVD_2", - C2H_FATAL_ERR_STAT_RSVD_2_MASK}, - {"C2H_FATAL_ERR_STAT_LEN_MISMATCH", - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_MTY_MISMATCH", - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_mask_field_info[] = { - {"C2H_FATAL_ERR_C2HEN", - C2H_FATAL_ERR_C2HEN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_enable_field_info[] = { - {"C2H_FATAL_ERR_ENABLE_RSVD_1", - C2H_FATAL_ERR_ENABLE_RSVD_1_MASK}, - {"C2H_FATAL_ERR_ENABLE_WPL_PAR_INV", - C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK}, - {"C2H_FATAL_ERR_ENABLE_WRQ_DIS", - C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK}, -}; - - -static struct regfield_info - glbl_err_int_field_info[] = { - {"GLBL_ERR_INT_RSVD_1", - GLBL_ERR_INT_RSVD_1_MASK}, - {"GLBL_ERR_INT_ARM", - GLBL_ERR_INT_ARM_MASK}, - {"GLBL_ERR_INT_EN_COAL", - GLBL_ERR_INT_EN_COAL_MASK}, - {"GLBL_ERR_INT_VEC", - GLBL_ERR_INT_VEC_MASK}, - {"GLBL_ERR_INT_FUNC", - GLBL_ERR_INT_FUNC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_field_info[] = { - {"C2H_PFCH_CFG_EVT_QCNT_TH", - C2H_PFCH_CFG_EVT_QCNT_TH_MASK}, - {"C2H_PFCH_CFG_QCNT", - C2H_PFCH_CFG_QCNT_MASK}, - {"C2H_PFCH_CFG_NUM", - C2H_PFCH_CFG_NUM_MASK}, - {"C2H_PFCH_CFG_FL_TH", - C2H_PFCH_CFG_FL_TH_MASK}, -}; - - -static struct regfield_info - c2h_int_timer_tick_field_info[] = { - {"C2H_INT_TIMER_TICK", - C2H_INT_TIMER_TICK_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_drop_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_D", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_err_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_D", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_req_field_info[] = { - {"C2H_STAT_DESC_REQ", - C2H_STAT_DESC_REQ_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_0_field_info[] = { - {"C2H_STAT_DMA_ENG_0_RSVD_1", - C2H_STAT_DMA_ENG_0_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_SM_CS", - C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK}, - {"C2H_STAT_DMA_ENG_0_MAIN_SM_CS", - C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_1_field_info[] = { - {"C2H_STAT_DMA_ENG_1_RSVD_1", - C2H_STAT_DMA_ENG_1_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_1_DESC_RSP_LAST", - C2H_STAT_DMA_ENG_1_DESC_RSP_LAST_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_2_field_info[] = { - {"C2H_STAT_DMA_ENG_2_RSVD_1", - C2H_STAT_DMA_ENG_2_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_3_field_info[] = { - {"C2H_STAT_DMA_ENG_3_RSVD_1", - C2H_STAT_DMA_ENG_3_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT", - C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_err_ctxt_field_info[] = { - {"C2H_PFCH_ERR_CTXT_RSVD_1", - C2H_PFCH_ERR_CTXT_RSVD_1_MASK}, - {"C2H_PFCH_ERR_CTXT_ERR_STAT", - C2H_PFCH_ERR_CTXT_ERR_STAT_MASK}, - {"C2H_PFCH_ERR_CTXT_CMD_WR", - C2H_PFCH_ERR_CTXT_CMD_WR_MASK}, - {"C2H_PFCH_ERR_CTXT_QID", - C2H_PFCH_ERR_CTXT_QID_MASK}, - {"C2H_PFCH_ERR_CTXT_DONE", - C2H_PFCH_ERR_CTXT_DONE_MASK}, -}; - - -static struct regfield_info - c2h_first_err_qid_field_info[] = { - {"C2H_FIRST_ERR_QID_RSVD_1", - C2H_FIRST_ERR_QID_RSVD_1_MASK}, - {"C2H_FIRST_ERR_QID_ERR_STAT", - C2H_FIRST_ERR_QID_ERR_STAT_MASK}, - {"C2H_FIRST_ERR_QID_CMD_WR", - C2H_FIRST_ERR_QID_CMD_WR_MASK}, - {"C2H_FIRST_ERR_QID_QID", - C2H_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_in_field_info[] = { - {"STAT_NUM_WRB_IN_RSVD_1", - STAT_NUM_WRB_IN_RSVD_1_MASK}, - {"STAT_NUM_WRB_IN_WRB_CNT", - STAT_NUM_WRB_IN_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_out_field_info[] = { - {"STAT_NUM_WRB_OUT_RSVD_1", - STAT_NUM_WRB_OUT_RSVD_1_MASK}, - {"STAT_NUM_WRB_OUT_WRB_CNT", - STAT_NUM_WRB_OUT_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_drp_field_info[] = { - {"STAT_NUM_WRB_DRP_RSVD_1", - STAT_NUM_WRB_DRP_RSVD_1_MASK}, - {"STAT_NUM_WRB_DRP_WRB_CNT", - STAT_NUM_WRB_DRP_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_stat_desc_out_field_info[] = { - {"STAT_NUM_STAT_DESC_OUT_RSVD_1", - STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK}, - {"STAT_NUM_STAT_DESC_OUT_CNT", - STAT_NUM_STAT_DESC_OUT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_dsc_crdt_sent_field_info[] = { - {"STAT_NUM_DSC_CRDT_SENT_RSVD_1", - STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK}, - {"STAT_NUM_DSC_CRDT_SENT_CNT", - STAT_NUM_DSC_CRDT_SENT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_fch_dsc_rcvd_field_info[] = { - {"STAT_NUM_FCH_DSC_RCVD_RSVD_1", - STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_FCH_DSC_RCVD_DSC_CNT", - STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_byp_dsc_rcvd_field_info[] = { - {"STAT_NUM_BYP_DSC_RCVD_RSVD_1", - STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_BYP_DSC_RCVD_DSC_CNT", - STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_cfg_field_info[] = { - {"C2H_WRB_COAL_CFG_MAX_BUF_SZ", - C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK}, - {"C2H_WRB_COAL_CFG_TICK_VAL", - C2H_WRB_COAL_CFG_TICK_VAL_MASK}, - {"C2H_WRB_COAL_CFG_TICK_CNT", - C2H_WRB_COAL_CFG_TICK_CNT_MASK}, - {"C2H_WRB_COAL_CFG_SET_GLB_FLUSH", - C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK}, - {"C2H_WRB_COAL_CFG_DONE_GLB_FLUSH", - C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_req_field_info[] = { - {"C2H_INTR_H2C_REQ_RSVD_1", - C2H_INTR_H2C_REQ_RSVD_1_MASK}, - {"C2H_INTR_H2C_REQ_CNT", - C2H_INTR_H2C_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_mm_req_field_info[] = { - {"C2H_INTR_C2H_MM_REQ_RSVD_1", - C2H_INTR_C2H_MM_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_MM_REQ_CNT", - C2H_INTR_C2H_MM_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_err_int_req_field_info[] = { - {"C2H_INTR_ERR_INT_REQ_RSVD_1", - C2H_INTR_ERR_INT_REQ_RSVD_1_MASK}, - {"C2H_INTR_ERR_INT_REQ_CNT", - C2H_INTR_ERR_INT_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_req_field_info[] = { - {"C2H_INTR_C2H_ST_REQ_RSVD_1", - C2H_INTR_C2H_ST_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_REQ_CNT", - C2H_INTR_C2H_ST_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_ack_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1", - C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_ACK_CNT", - C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_fail_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1", - C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_FAIL_CNT", - C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_no_msix_field_info[] = { - {"C2H_INTR_C2H_ST_NO_MSIX_RSVD_1", - C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_NO_MSIX_CNT", - C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_ctxt_inval_field_info[] = { - {"C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1", - C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_CTXT_INVAL_CNT", - C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wr_cmp_field_info[] = { - {"C2H_STAT_WR_CMP_RSVD_1", - C2H_STAT_WR_CMP_RSVD_1_MASK}, - {"C2H_STAT_WR_CMP_CNT", - C2H_STAT_WR_CMP_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_4_field_info[] = { - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_5_field_info[] = { - {"C2H_STAT_DMA_ENG_5_RSVD_1", - C2H_STAT_DMA_ENG_5_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD", - C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT", - C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT", - C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT", - C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_qid_field_info[] = { - {"C2H_PFCH_QID_RSVD_1", - C2H_PFCH_QID_RSVD_1_MASK}, - {"C2H_PFCH_QID_ERR_CTXT", - C2H_PFCH_QID_ERR_CTXT_MASK}, - {"C2H_PFCH_QID_TARGET", - C2H_PFCH_QID_TARGET_MASK}, - {"C2H_PFCH_QID_QID_OR_TAG", - C2H_PFCH_QID_QID_OR_TAG_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_field_info[] = { - {"C2H_PFCH_DATA", - C2H_PFCH_DATA_MASK}, -}; - - -static struct regfield_info - c2h_int_dbg_field_info[] = { - {"C2H_INT_RSVD_1", - C2H_INT_RSVD_1_MASK}, - {"C2H_INT_INT_COAL_SM", - C2H_INT_INT_COAL_SM_MASK}, - {"C2H_INT_INT_SM", - C2H_INT_INT_SM_MASK}, -}; - - -static struct regfield_info - c2h_stat_imm_accepted_field_info[] = { - {"C2H_STAT_IMM_ACCEPTED_RSVD_1", - C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_IMM_ACCEPTED_CNT", - C2H_STAT_IMM_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_marker_accepted_field_info[] = { - {"C2H_STAT_MARKER_ACCEPTED_RSVD_1", - C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_MARKER_ACCEPTED_CNT", - C2H_STAT_MARKER_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_disable_cmp_accepted_field_info[] = { - {"C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1", - C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED_CNT", - C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_crdt_cnt_field_info[] = { - {"C2H_PLD_FIFO_CRDT_CNT_RSVD_1", - C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK}, - {"C2H_PLD_FIFO_CRDT_CNT_CNT", - C2H_PLD_FIFO_CRDT_CNT_CNT_MASK}, -}; - - -static struct regfield_info - h2c_err_stat_field_info[] = { - {"H2C_ERR_STAT_RSVD_1", - H2C_ERR_STAT_RSVD_1_MASK}, - {"H2C_ERR_STAT_SBE", - H2C_ERR_STAT_SBE_MASK}, - {"H2C_ERR_STAT_DBE", - H2C_ERR_STAT_DBE_MASK}, - {"H2C_ERR_STAT_NO_DMA_DS", - H2C_ERR_STAT_NO_DMA_DS_MASK}, - {"H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR", - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK}, - {"H2C_ERR_STAT_ZERO_LEN_DS", - H2C_ERR_STAT_ZERO_LEN_DS_MASK}, -}; - - -static struct regfield_info - h2c_err_mask_field_info[] = { - {"H2C_ERR_EN", - H2C_ERR_EN_MASK}, -}; - - -static struct regfield_info - h2c_first_err_qid_field_info[] = { - {"H2C_FIRST_ERR_QID_RSVD_1", - H2C_FIRST_ERR_QID_RSVD_1_MASK}, - {"H2C_FIRST_ERR_QID_ERR_TYPE", - H2C_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"H2C_FIRST_ERR_QID_RSVD_2", - H2C_FIRST_ERR_QID_RSVD_2_MASK}, - {"H2C_FIRST_ERR_QID_QID", - H2C_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg0_field_info[] = { - {"H2C_REG0_NUM_DSC_RCVD", - H2C_REG0_NUM_DSC_RCVD_MASK}, - {"H2C_REG0_NUM_WRB_SENT", - H2C_REG0_NUM_WRB_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg1_field_info[] = { - {"H2C_REG1_NUM_REQ_SENT", - H2C_REG1_NUM_REQ_SENT_MASK}, - {"H2C_REG1_NUM_CMP_SENT", - H2C_REG1_NUM_CMP_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg2_field_info[] = { - {"H2C_REG2_RSVD_1", - H2C_REG2_RSVD_1_MASK}, - {"H2C_REG2_NUM_ERR_DSC_RCVD", - H2C_REG2_NUM_ERR_DSC_RCVD_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg3_field_info[] = { - {"H2C_REG3", - H2C_REG3_MASK}, - {"H2C_REG3_DSCO_FIFO_EMPTY", - H2C_REG3_DSCO_FIFO_EMPTY_MASK}, - {"H2C_REG3_DSCO_FIFO_FULL", - H2C_REG3_DSCO_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RC_STATE", - H2C_REG3_CUR_RC_STATE_MASK}, - {"H2C_REG3_RDREQ_LINES", - H2C_REG3_RDREQ_LINES_MASK}, - {"H2C_REG3_RDATA_LINES_AVAIL", - H2C_REG3_RDATA_LINES_AVAIL_MASK}, - {"H2C_REG3_PEND_FIFO_EMPTY", - H2C_REG3_PEND_FIFO_EMPTY_MASK}, - {"H2C_REG3_PEND_FIFO_FULL", - H2C_REG3_PEND_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RQ_STATE", - H2C_REG3_CUR_RQ_STATE_MASK}, - {"H2C_REG3_DSCI_FIFO_FULL", - H2C_REG3_DSCI_FIFO_FULL_MASK}, - {"H2C_REG3_DSCI_FIFO_EMPTY", - H2C_REG3_DSCI_FIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg4_field_info[] = { - {"H2C_REG4_RDREQ_ADDR", - H2C_REG4_RDREQ_ADDR_MASK}, -}; - - -static struct regfield_info - h2c_fatal_err_en_field_info[] = { - {"H2C_FATAL_ERR_EN_RSVD_1", - H2C_FATAL_ERR_EN_RSVD_1_MASK}, - {"H2C_FATAL_ERR_EN_H2C", - H2C_FATAL_ERR_EN_H2C_MASK}, -}; - - -static struct regfield_info - c2h_channel_ctl_field_info[] = { - {"C2H_CHANNEL_CTL_RSVD_1", - C2H_CHANNEL_CTL_RSVD_1_MASK}, - {"C2H_CHANNEL_CTL_RUN", - C2H_CHANNEL_CTL_RUN_MASK}, -}; - - -static struct regfield_info - c2h_channel_ctl_1_field_info[] = { - {"C2H_CHANNEL_CTL_1_RUN", - C2H_CHANNEL_CTL_1_RUN_MASK}, - {"C2H_CHANNEL_CTL_1_RUN_1", - C2H_CHANNEL_CTL_1_RUN_1_MASK}, -}; - - -static struct regfield_info - c2h_mm_status_field_info[] = { - {"C2H_MM_STATUS_RSVD_1", - C2H_MM_STATUS_RSVD_1_MASK}, - {"C2H_MM_STATUS_RUN", - C2H_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - c2h_channel_cmpl_desc_cnt_field_info[] = { - {"C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO", - C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_enable_mask_field_info[] = { - {"C2H_MM_ERR_CODE_ENABLE_RSVD_1", - C2H_MM_ERR_CODE_ENABLE_RSVD_1_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM", - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UR", - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_FLR", - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RSVD_2", - C2H_MM_ERR_CODE_ENABLE_RSVD_2_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_field_info[] = { - {"C2H_MM_ERR_CODE_RSVD_1", - C2H_MM_ERR_CODE_RSVD_1_MASK}, - {"C2H_MM_ERR_CODE_VALID", - C2H_MM_ERR_CODE_VALID_MASK}, - {"C2H_MM_ERR_CODE_RDWR", - C2H_MM_ERR_CODE_RDWR_MASK}, - {"C2H_MM_ERR_CODE", - C2H_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_info_field_info[] = { - {"C2H_MM_ERR_INFO_RSVD_1", - C2H_MM_ERR_INFO_RSVD_1_MASK}, - {"C2H_MM_ERR_INFO_QID", - C2H_MM_ERR_INFO_QID_MASK}, - {"C2H_MM_ERR_INFO_DIR", - C2H_MM_ERR_INFO_DIR_MASK}, - {"C2H_MM_ERR_INFO_CIDX", - C2H_MM_ERR_INFO_CIDX_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_ctl_field_info[] = { - {"C2H_MM_PERF_MON_CTL_RSVD_1", - C2H_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_START", - C2H_MM_PERF_MON_CTL_IMM_START_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_START", - C2H_MM_PERF_MON_CTL_RUN_START_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_CLEAR", - C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_CLEAR", - C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT0_DCNT", - C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT1_RSVD_1", - C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_DATA_CNT1_DCNT", - C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_dbg_field_info[] = { - {"C2H_MM_RSVD_1", - C2H_MM_RSVD_1_MASK}, - {"C2H_MM_RRQ_ENTRIES", - C2H_MM_RRQ_ENTRIES_MASK}, - {"C2H_MM_DAT_FIFO_SPC", - C2H_MM_DAT_FIFO_SPC_MASK}, - {"C2H_MM_RD_STALL", - C2H_MM_RD_STALL_MASK}, - {"C2H_MM_RRQ_FIFO_FI", - C2H_MM_RRQ_FIFO_FI_MASK}, - {"C2H_MM_WR_STALL", - C2H_MM_WR_STALL_MASK}, - {"C2H_MM_WRQ_FIFO_FI", - C2H_MM_WRQ_FIFO_FI_MASK}, - {"C2H_MM_WBK_STALL", - C2H_MM_WBK_STALL_MASK}, - {"C2H_MM_DSC_FIFO_EP", - C2H_MM_DSC_FIFO_EP_MASK}, - {"C2H_MM_DSC_FIFO_FL", - C2H_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_field_info[] = { - {"H2C_CHANNEL_CTL_RSVD_1", - H2C_CHANNEL_CTL_RSVD_1_MASK}, - {"H2C_CHANNEL_CTL_RUN", - H2C_CHANNEL_CTL_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_1_field_info[] = { - {"H2C_CHANNEL_CTL_1_RUN", - H2C_CHANNEL_CTL_1_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_2_field_info[] = { - {"H2C_CHANNEL_CTL_2_RUN", - H2C_CHANNEL_CTL_2_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_status_field_info[] = { - {"H2C_MM_STATUS_RSVD_1", - H2C_MM_STATUS_RSVD_1_MASK}, - {"H2C_MM_STATUS_RUN", - H2C_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_cmpl_desc_cnt_field_info[] = { - {"H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO", - H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_enable_mask_field_info[] = { - {"H2C_MM_ERR_CODE_ENABLE_RSVD_1", - H2C_MM_ERR_CODE_ENABLE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_2", - H2C_MM_ERR_CODE_ENABLE_RSVD_2_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_3", - H2C_MM_ERR_CODE_ENABLE_RSVD_3_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_4", - H2C_MM_ERR_CODE_ENABLE_RSVD_4_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_5", - H2C_MM_ERR_CODE_ENABLE_RSVD_5_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_UR_CA", - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_6", - H2C_MM_ERR_CODE_ENABLE_RSVD_6_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_field_info[] = { - {"H2C_MM_ERR_CODE_RSVD_1", - H2C_MM_ERR_CODE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_VALID", - H2C_MM_ERR_CODE_VALID_MASK}, - {"H2C_MM_ERR_CODE_RDWR", - H2C_MM_ERR_CODE_RDWR_MASK}, - {"H2C_MM_ERR_CODE", - H2C_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_info_field_info[] = { - {"H2C_MM_ERR_INFO_RSVD_1", - H2C_MM_ERR_INFO_RSVD_1_MASK}, - {"H2C_MM_ERR_INFO_QID", - H2C_MM_ERR_INFO_QID_MASK}, - {"H2C_MM_ERR_INFO_DIR", - H2C_MM_ERR_INFO_DIR_MASK}, - {"H2C_MM_ERR_INFO_CIDX", - H2C_MM_ERR_INFO_CIDX_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_ctl_field_info[] = { - {"H2C_MM_PERF_MON_CTL_RSVD_1", - H2C_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_START", - H2C_MM_PERF_MON_CTL_IMM_START_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_START", - H2C_MM_PERF_MON_CTL_RUN_START_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_CLEAR", - H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_CLEAR", - H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT0_DCNT", - H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT1_RSVD_1", - H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_DATA_CNT1_DCNT", - H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_dbg_field_info[] = { - {"H2C_MM_RSVD_1", - H2C_MM_RSVD_1_MASK}, - {"H2C_MM_RRQ_ENTRIES", - H2C_MM_RRQ_ENTRIES_MASK}, - {"H2C_MM_DAT_FIFO_SPC", - H2C_MM_DAT_FIFO_SPC_MASK}, - {"H2C_MM_RD_STALL", - H2C_MM_RD_STALL_MASK}, - {"H2C_MM_RRQ_FIFO_FI", - H2C_MM_RRQ_FIFO_FI_MASK}, - {"H2C_MM_WR_STALL", - H2C_MM_WR_STALL_MASK}, - {"H2C_MM_WRQ_FIFO_FI", - H2C_MM_WRQ_FIFO_FI_MASK}, - {"H2C_MM_WBK_STALL", - H2C_MM_WBK_STALL_MASK}, - {"H2C_MM_DSC_FIFO_EP", - H2C_MM_DSC_FIFO_EP_MASK}, - {"H2C_MM_DSC_FIFO_FL", - H2C_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - func_status_reg_field_info[] = { - {"FUNC_STATUS_REG_RSVD_1", - FUNC_STATUS_REG_RSVD_1_MASK}, - {"FUNC_STATUS_REG_CUR_SRC_FN", - FUNC_STATUS_REG_CUR_SRC_FN_MASK}, - {"FUNC_STATUS_REG_ACK", - FUNC_STATUS_REG_ACK_MASK}, - {"FUNC_STATUS_REG_O_MSG", - FUNC_STATUS_REG_O_MSG_MASK}, - {"FUNC_STATUS_REG_I_MSG", - FUNC_STATUS_REG_I_MSG_MASK}, -}; - - -static struct regfield_info - func_cmd_reg_field_info[] = { - {"FUNC_CMD_REG_RSVD_1", - FUNC_CMD_REG_RSVD_1_MASK}, - {"FUNC_CMD_REG_RSVD_2", - FUNC_CMD_REG_RSVD_2_MASK}, - {"FUNC_CMD_REG_MSG_RCV", - FUNC_CMD_REG_MSG_RCV_MASK}, - {"FUNC_CMD_REG_MSG_SENT", - FUNC_CMD_REG_MSG_SENT_MASK}, -}; - - -static struct regfield_info - func_interrupt_vector_reg_field_info[] = { - {"FUNC_INTERRUPT_VECTOR_REG_RSVD_1", - FUNC_INTERRUPT_VECTOR_REG_RSVD_1_MASK}, - {"FUNC_INTERRUPT_VECTOR_REG_IN", - FUNC_INTERRUPT_VECTOR_REG_IN_MASK}, -}; - - -static struct regfield_info - target_func_reg_field_info[] = { - {"TARGET_FUNC_REG_RSVD_1", - TARGET_FUNC_REG_RSVD_1_MASK}, - {"TARGET_FUNC_REG_N_ID", - TARGET_FUNC_REG_N_ID_MASK}, -}; - - -static struct regfield_info - func_interrupt_ctl_reg_field_info[] = { - {"FUNC_INTERRUPT_CTL_REG_RSVD_1", - FUNC_INTERRUPT_CTL_REG_RSVD_1_MASK}, - {"FUNC_INTERRUPT_CTL_REG_INT_EN", - FUNC_INTERRUPT_CTL_REG_INT_EN_MASK}, -}; - -static struct xreg_info qdma_cpm4_config_regs[] = { -{"CFG_BLK_IDENTIFIER", 0x00, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_identifier_field_info), - cfg_blk_identifier_field_info -}, -{"CFG_BLK_BUSDEV", 0x04, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_busdev_field_info), - cfg_blk_busdev_field_info -}, -{"CFG_BLK_PCIE_MAX_PLD_SIZE", 0x08, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_pld_size_field_info), - cfg_blk_pcie_max_pld_size_field_info -}, -{"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", 0x0c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_read_req_size_field_info), - cfg_blk_pcie_max_read_req_size_field_info -}, -{"CFG_BLK_SYSTEM_ID", 0x10, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_system_id_field_info), - cfg_blk_system_id_field_info -}, -{"CFG_BLK_MSI_ENABLE", 0x014, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msi_enable_field_info), - cfg_blk_msi_enable_field_info -}, -{"CFG_PCIE_DATA_WIDTH", 0x18, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_data_width_field_info), - cfg_pcie_data_width_field_info -}, -{"CFG_PCIE_CTL", 0x1c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_ctl_field_info), - cfg_pcie_ctl_field_info -}, -{"CFG_AXI_USER_MAX_PLD_SIZE", 0x40, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_pld_size_field_info), - cfg_axi_user_max_pld_size_field_info -}, -{"CFG_AXI_USER_MAX_READ_REQ_SIZE", 0x44, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_read_req_size_field_info), - cfg_axi_user_max_read_req_size_field_info -}, -{"CFG_BLK_MISC_CTL", 0x4c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_misc_ctl_field_info), - cfg_blk_misc_ctl_field_info -}, -{"CFG_BLK_SCRATCH_0", 0x80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_0_field_info), - cfg_blk_scratch_0_field_info -}, -{"CFG_BLK_SCRATCH_1", 0x84, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_1_field_info), - cfg_blk_scratch_1_field_info -}, -{"CFG_BLK_SCRATCH_2", 0x88, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_2_field_info), - cfg_blk_scratch_2_field_info -}, -{"CFG_BLK_SCRATCH_3", 0x8c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_3_field_info), - cfg_blk_scratch_3_field_info -}, -{"CFG_BLK_SCRATCH_4", 0x90, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_4_field_info), - cfg_blk_scratch_4_field_info -}, -{"CFG_BLK_SCRATCH_5", 0x94, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_5_field_info), - cfg_blk_scratch_5_field_info -}, -{"CFG_BLK_SCRATCH_6", 0x98, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_6_field_info), - cfg_blk_scratch_6_field_info -}, -{"CFG_BLK_SCRATCH_7", 0x9c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_7_field_info), - cfg_blk_scratch_7_field_info -}, -{"RAM_SBE_MSK_A", 0xf0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_a_field_info), - ram_sbe_msk_a_field_info -}, -{"RAM_SBE_STS_A", 0xf4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_a_field_info), - ram_sbe_sts_a_field_info -}, -{"RAM_DBE_MSK_A", 0xf8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_a_field_info), - ram_dbe_msk_a_field_info -}, -{"RAM_DBE_STS_A", 0xfc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_a_field_info), - ram_dbe_sts_a_field_info -}, -{"GLBL2_IDENTIFIER", 0x100, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_identifier_field_info), - glbl2_identifier_field_info -}, -{"GLBL2_PF_BARLITE_INT", 0x104, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_barlite_int_field_info), - glbl2_pf_barlite_int_field_info -}, -{"GLBL2_PF_VF_BARLITE_INT", 0x108, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_vf_barlite_int_field_info), - glbl2_pf_vf_barlite_int_field_info -}, -{"GLBL2_PF_BARLITE_EXT", 0x10c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_barlite_ext_field_info), - glbl2_pf_barlite_ext_field_info -}, -{"GLBL2_PF_VF_BARLITE_EXT", 0x110, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_vf_barlite_ext_field_info), - glbl2_pf_vf_barlite_ext_field_info -}, -{"GLBL2_CHANNEL_INST", 0x114, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_inst_field_info), - glbl2_channel_inst_field_info -}, -{"GLBL2_CHANNEL_MDMA", 0x118, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_mdma_field_info), - glbl2_channel_mdma_field_info -}, -{"GLBL2_CHANNEL_STRM", 0x11c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_strm_field_info), - glbl2_channel_strm_field_info -}, -{"GLBL2_CHANNEL_CAP", 0x120, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_cap_field_info), - glbl2_channel_cap_field_info -}, -{"GLBL2_CHANNEL_PASID_CAP", 0x128, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_pasid_cap_field_info), - glbl2_channel_pasid_cap_field_info -}, -{"GLBL2_CHANNEL_FUNC_RET", 0x12c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_func_ret_field_info), - glbl2_channel_func_ret_field_info -}, -{"GLBL2_SYSTEM_ID", 0x130, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_system_id_field_info), - glbl2_system_id_field_info -}, -{"GLBL2_MISC_CAP", 0x134, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_misc_cap_field_info), - glbl2_misc_cap_field_info -}, -{"GLBL2_DBG_PCIE_RQ0", 0x1b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq0_field_info), - glbl2_dbg_pcie_rq0_field_info -}, -{"GLBL2_DBG_PCIE_RQ1", 0x1bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq1_field_info), - glbl2_dbg_pcie_rq1_field_info -}, -{"GLBL2_DBG_AXIMM_WR0", 0x1c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr0_field_info), - glbl2_dbg_aximm_wr0_field_info -}, -{"GLBL2_DBG_AXIMM_WR1", 0x1c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr1_field_info), - glbl2_dbg_aximm_wr1_field_info -}, -{"GLBL2_DBG_AXIMM_RD0", 0x1c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd0_field_info), - glbl2_dbg_aximm_rd0_field_info -}, -{"GLBL2_DBG_AXIMM_RD1", 0x1cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd1_field_info), - glbl2_dbg_aximm_rd1_field_info -}, -{"GLBL_RNG_SZ_1", 0x204, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_1_field_info), - glbl_rng_sz_1_field_info -}, -{"GLBL_RNG_SZ_2", 0x208, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_2_field_info), - glbl_rng_sz_2_field_info -}, -{"GLBL_RNG_SZ_3", 0x20c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_3_field_info), - glbl_rng_sz_3_field_info -}, -{"GLBL_RNG_SZ_4", 0x210, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_4_field_info), - glbl_rng_sz_4_field_info -}, -{"GLBL_RNG_SZ_5", 0x214, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_5_field_info), - glbl_rng_sz_5_field_info -}, -{"GLBL_RNG_SZ_6", 0x218, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_6_field_info), - glbl_rng_sz_6_field_info -}, -{"GLBL_RNG_SZ_7", 0x21c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_7_field_info), - glbl_rng_sz_7_field_info -}, -{"GLBL_RNG_SZ_8", 0x220, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_8_field_info), - glbl_rng_sz_8_field_info -}, -{"GLBL_RNG_SZ_9", 0x224, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_9_field_info), - glbl_rng_sz_9_field_info -}, -{"GLBL_RNG_SZ_A", 0x228, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_a_field_info), - glbl_rng_sz_a_field_info -}, -{"GLBL_RNG_SZ_B", 0x22c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_b_field_info), - glbl_rng_sz_b_field_info -}, -{"GLBL_RNG_SZ_C", 0x230, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_c_field_info), - glbl_rng_sz_c_field_info -}, -{"GLBL_RNG_SZ_D", 0x234, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_d_field_info), - glbl_rng_sz_d_field_info -}, -{"GLBL_RNG_SZ_E", 0x238, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_e_field_info), - glbl_rng_sz_e_field_info -}, -{"GLBL_RNG_SZ_F", 0x23c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_f_field_info), - glbl_rng_sz_f_field_info -}, -{"GLBL_RNG_SZ_10", 0x240, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_10_field_info), - glbl_rng_sz_10_field_info -}, -{"GLBL_ERR_STAT", 0x248, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_stat_field_info), - glbl_err_stat_field_info -}, -{"GLBL_ERR_MASK", 0x24c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_mask_field_info), - glbl_err_mask_field_info -}, -{"GLBL_DSC_CFG", 0x250, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_cfg_field_info), - glbl_dsc_cfg_field_info -}, -{"GLBL_DSC_ERR_STS", 0x254, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_sts_field_info), - glbl_dsc_err_sts_field_info -}, -{"GLBL_DSC_ERR_MSK", 0x258, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_msk_field_info), - glbl_dsc_err_msk_field_info -}, -{"GLBL_DSC_ERR_LOG0", 0x25c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log0_field_info), - glbl_dsc_err_log0_field_info -}, -{"GLBL_DSC_ERR_LOG1", 0x260, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log1_field_info), - glbl_dsc_err_log1_field_info -}, -{"GLBL_TRQ_ERR_STS", 0x264, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_sts_field_info), - glbl_trq_err_sts_field_info -}, -{"GLBL_TRQ_ERR_MSK", 0x268, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_msk_field_info), - glbl_trq_err_msk_field_info -}, -{"GLBL_TRQ_ERR_LOG", 0x26c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_log_field_info), - glbl_trq_err_log_field_info -}, -{"GLBL_DSC_DBG_DAT0", 0x270, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat0_field_info), - glbl_dsc_dbg_dat0_field_info -}, -{"GLBL_DSC_DBG_DAT1", 0x274, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat1_field_info), - glbl_dsc_dbg_dat1_field_info -}, -{"TRQ_SEL_FMAP_0", 0x400, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_0_field_info), - trq_sel_fmap_0_field_info -}, -{"TRQ_SEL_FMAP_1", 0x404, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1_field_info), - trq_sel_fmap_1_field_info -}, -{"TRQ_SEL_FMAP_2", 0x408, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2_field_info), - trq_sel_fmap_2_field_info -}, -{"TRQ_SEL_FMAP_3", 0x40c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3_field_info), - trq_sel_fmap_3_field_info -}, -{"TRQ_SEL_FMAP_4", 0x410, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4_field_info), - trq_sel_fmap_4_field_info -}, -{"TRQ_SEL_FMAP_5", 0x414, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5_field_info), - trq_sel_fmap_5_field_info -}, -{"TRQ_SEL_FMAP_6", 0x418, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6_field_info), - trq_sel_fmap_6_field_info -}, -{"TRQ_SEL_FMAP_7", 0x41c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7_field_info), - trq_sel_fmap_7_field_info -}, -{"TRQ_SEL_FMAP_8", 0x420, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8_field_info), - trq_sel_fmap_8_field_info -}, -{"TRQ_SEL_FMAP_9", 0x424, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9_field_info), - trq_sel_fmap_9_field_info -}, -{"TRQ_SEL_FMAP_A", 0x428, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a_field_info), - trq_sel_fmap_a_field_info -}, -{"TRQ_SEL_FMAP_B", 0x42c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b_field_info), - trq_sel_fmap_b_field_info -}, -{"TRQ_SEL_FMAP_D", 0x430, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d_field_info), - trq_sel_fmap_d_field_info -}, -{"TRQ_SEL_FMAP_E", 0x434, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e_field_info), - trq_sel_fmap_e_field_info -}, -{"TRQ_SEL_FMAP_F", 0x438, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_f_field_info), - trq_sel_fmap_f_field_info -}, -{"TRQ_SEL_FMAP_10", 0x43c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_10_field_info), - trq_sel_fmap_10_field_info -}, -{"TRQ_SEL_FMAP_11", 0x440, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_11_field_info), - trq_sel_fmap_11_field_info -}, -{"TRQ_SEL_FMAP_12", 0x444, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_12_field_info), - trq_sel_fmap_12_field_info -}, -{"TRQ_SEL_FMAP_13", 0x448, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_13_field_info), - trq_sel_fmap_13_field_info -}, -{"TRQ_SEL_FMAP_14", 0x44c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_14_field_info), - trq_sel_fmap_14_field_info -}, -{"TRQ_SEL_FMAP_15", 0x450, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_15_field_info), - trq_sel_fmap_15_field_info -}, -{"TRQ_SEL_FMAP_16", 0x454, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_16_field_info), - trq_sel_fmap_16_field_info -}, -{"TRQ_SEL_FMAP_17", 0x458, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_17_field_info), - trq_sel_fmap_17_field_info -}, -{"TRQ_SEL_FMAP_18", 0x45c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_18_field_info), - trq_sel_fmap_18_field_info -}, -{"TRQ_SEL_FMAP_19", 0x460, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_19_field_info), - trq_sel_fmap_19_field_info -}, -{"TRQ_SEL_FMAP_1A", 0x464, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1a_field_info), - trq_sel_fmap_1a_field_info -}, -{"TRQ_SEL_FMAP_1B", 0x468, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1b_field_info), - trq_sel_fmap_1b_field_info -}, -{"TRQ_SEL_FMAP_1C", 0x46c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1c_field_info), - trq_sel_fmap_1c_field_info -}, -{"TRQ_SEL_FMAP_1D", 0x470, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1d_field_info), - trq_sel_fmap_1d_field_info -}, -{"TRQ_SEL_FMAP_1E", 0x474, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1e_field_info), - trq_sel_fmap_1e_field_info -}, -{"TRQ_SEL_FMAP_1F", 0x478, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1f_field_info), - trq_sel_fmap_1f_field_info -}, -{"TRQ_SEL_FMAP_20", 0x47c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_20_field_info), - trq_sel_fmap_20_field_info -}, -{"TRQ_SEL_FMAP_21", 0x480, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_21_field_info), - trq_sel_fmap_21_field_info -}, -{"TRQ_SEL_FMAP_22", 0x484, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_22_field_info), - trq_sel_fmap_22_field_info -}, -{"TRQ_SEL_FMAP_23", 0x488, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_23_field_info), - trq_sel_fmap_23_field_info -}, -{"TRQ_SEL_FMAP_24", 0x48c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_24_field_info), - trq_sel_fmap_24_field_info -}, -{"TRQ_SEL_FMAP_25", 0x490, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_25_field_info), - trq_sel_fmap_25_field_info -}, -{"TRQ_SEL_FMAP_26", 0x494, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_26_field_info), - trq_sel_fmap_26_field_info -}, -{"TRQ_SEL_FMAP_27", 0x498, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_27_field_info), - trq_sel_fmap_27_field_info -}, -{"TRQ_SEL_FMAP_28", 0x49c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_28_field_info), - trq_sel_fmap_28_field_info -}, -{"TRQ_SEL_FMAP_29", 0x4a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_29_field_info), - trq_sel_fmap_29_field_info -}, -{"TRQ_SEL_FMAP_2A", 0x4a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2a_field_info), - trq_sel_fmap_2a_field_info -}, -{"TRQ_SEL_FMAP_2B", 0x4a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2b_field_info), - trq_sel_fmap_2b_field_info -}, -{"TRQ_SEL_FMAP_2C", 0x4ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2c_field_info), - trq_sel_fmap_2c_field_info -}, -{"TRQ_SEL_FMAP_2D", 0x4b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2d_field_info), - trq_sel_fmap_2d_field_info -}, -{"TRQ_SEL_FMAP_2E", 0x4b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2e_field_info), - trq_sel_fmap_2e_field_info -}, -{"TRQ_SEL_FMAP_2F", 0x4b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2f_field_info), - trq_sel_fmap_2f_field_info -}, -{"TRQ_SEL_FMAP_30", 0x4bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_30_field_info), - trq_sel_fmap_30_field_info -}, -{"TRQ_SEL_FMAP_31", 0x4d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_31_field_info), - trq_sel_fmap_31_field_info -}, -{"TRQ_SEL_FMAP_32", 0x4d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_32_field_info), - trq_sel_fmap_32_field_info -}, -{"TRQ_SEL_FMAP_33", 0x4d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_33_field_info), - trq_sel_fmap_33_field_info -}, -{"TRQ_SEL_FMAP_34", 0x4dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_34_field_info), - trq_sel_fmap_34_field_info -}, -{"TRQ_SEL_FMAP_35", 0x4e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_35_field_info), - trq_sel_fmap_35_field_info -}, -{"TRQ_SEL_FMAP_36", 0x4e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_36_field_info), - trq_sel_fmap_36_field_info -}, -{"TRQ_SEL_FMAP_37", 0x4e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_37_field_info), - trq_sel_fmap_37_field_info -}, -{"TRQ_SEL_FMAP_38", 0x4ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_38_field_info), - trq_sel_fmap_38_field_info -}, -{"TRQ_SEL_FMAP_39", 0x4f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_39_field_info), - trq_sel_fmap_39_field_info -}, -{"TRQ_SEL_FMAP_3A", 0x4f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3a_field_info), - trq_sel_fmap_3a_field_info -}, -{"TRQ_SEL_FMAP_3B", 0x4f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3b_field_info), - trq_sel_fmap_3b_field_info -}, -{"TRQ_SEL_FMAP_3C", 0x4fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3c_field_info), - trq_sel_fmap_3c_field_info -}, -{"TRQ_SEL_FMAP_3D", 0x500, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3d_field_info), - trq_sel_fmap_3d_field_info -}, -{"TRQ_SEL_FMAP_3E", 0x504, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3e_field_info), - trq_sel_fmap_3e_field_info -}, -{"TRQ_SEL_FMAP_3F", 0x508, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3f_field_info), - trq_sel_fmap_3f_field_info -}, -{"TRQ_SEL_FMAP_40", 0x50c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_40_field_info), - trq_sel_fmap_40_field_info -}, -{"TRQ_SEL_FMAP_41", 0x510, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_41_field_info), - trq_sel_fmap_41_field_info -}, -{"TRQ_SEL_FMAP_42", 0x514, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_42_field_info), - trq_sel_fmap_42_field_info -}, -{"TRQ_SEL_FMAP_43", 0x518, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_43_field_info), - trq_sel_fmap_43_field_info -}, -{"TRQ_SEL_FMAP_44", 0x51c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_44_field_info), - trq_sel_fmap_44_field_info -}, -{"TRQ_SEL_FMAP_45", 0x520, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_45_field_info), - trq_sel_fmap_45_field_info -}, -{"TRQ_SEL_FMAP_46", 0x524, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_46_field_info), - trq_sel_fmap_46_field_info -}, -{"TRQ_SEL_FMAP_47", 0x528, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_47_field_info), - trq_sel_fmap_47_field_info -}, -{"TRQ_SEL_FMAP_48", 0x52c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_48_field_info), - trq_sel_fmap_48_field_info -}, -{"TRQ_SEL_FMAP_49", 0x530, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_49_field_info), - trq_sel_fmap_49_field_info -}, -{"TRQ_SEL_FMAP_4A", 0x534, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4a_field_info), - trq_sel_fmap_4a_field_info -}, -{"TRQ_SEL_FMAP_4B", 0x538, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4b_field_info), - trq_sel_fmap_4b_field_info -}, -{"TRQ_SEL_FMAP_4C", 0x53c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4c_field_info), - trq_sel_fmap_4c_field_info -}, -{"TRQ_SEL_FMAP_4D", 0x540, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4d_field_info), - trq_sel_fmap_4d_field_info -}, -{"TRQ_SEL_FMAP_4E", 0x544, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4e_field_info), - trq_sel_fmap_4e_field_info -}, -{"TRQ_SEL_FMAP_4F", 0x548, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4f_field_info), - trq_sel_fmap_4f_field_info -}, -{"TRQ_SEL_FMAP_50", 0x54c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_50_field_info), - trq_sel_fmap_50_field_info -}, -{"TRQ_SEL_FMAP_51", 0x550, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_51_field_info), - trq_sel_fmap_51_field_info -}, -{"TRQ_SEL_FMAP_52", 0x554, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_52_field_info), - trq_sel_fmap_52_field_info -}, -{"TRQ_SEL_FMAP_53", 0x558, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_53_field_info), - trq_sel_fmap_53_field_info -}, -{"TRQ_SEL_FMAP_54", 0x55c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_54_field_info), - trq_sel_fmap_54_field_info -}, -{"TRQ_SEL_FMAP_55", 0x560, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_55_field_info), - trq_sel_fmap_55_field_info -}, -{"TRQ_SEL_FMAP_56", 0x564, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_56_field_info), - trq_sel_fmap_56_field_info -}, -{"TRQ_SEL_FMAP_57", 0x568, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_57_field_info), - trq_sel_fmap_57_field_info -}, -{"TRQ_SEL_FMAP_58", 0x56c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_58_field_info), - trq_sel_fmap_58_field_info -}, -{"TRQ_SEL_FMAP_59", 0x570, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_59_field_info), - trq_sel_fmap_59_field_info -}, -{"TRQ_SEL_FMAP_5A", 0x574, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5a_field_info), - trq_sel_fmap_5a_field_info -}, -{"TRQ_SEL_FMAP_5B", 0x578, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5b_field_info), - trq_sel_fmap_5b_field_info -}, -{"TRQ_SEL_FMAP_5C", 0x57c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5c_field_info), - trq_sel_fmap_5c_field_info -}, -{"TRQ_SEL_FMAP_5D", 0x580, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5d_field_info), - trq_sel_fmap_5d_field_info -}, -{"TRQ_SEL_FMAP_5E", 0x584, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5e_field_info), - trq_sel_fmap_5e_field_info -}, -{"TRQ_SEL_FMAP_5F", 0x588, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5f_field_info), - trq_sel_fmap_5f_field_info -}, -{"TRQ_SEL_FMAP_60", 0x58c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_60_field_info), - trq_sel_fmap_60_field_info -}, -{"TRQ_SEL_FMAP_61", 0x590, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_61_field_info), - trq_sel_fmap_61_field_info -}, -{"TRQ_SEL_FMAP_62", 0x594, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_62_field_info), - trq_sel_fmap_62_field_info -}, -{"TRQ_SEL_FMAP_63", 0x598, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_63_field_info), - trq_sel_fmap_63_field_info -}, -{"TRQ_SEL_FMAP_64", 0x59c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_64_field_info), - trq_sel_fmap_64_field_info -}, -{"TRQ_SEL_FMAP_65", 0x5a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_65_field_info), - trq_sel_fmap_65_field_info -}, -{"TRQ_SEL_FMAP_66", 0x5a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_66_field_info), - trq_sel_fmap_66_field_info -}, -{"TRQ_SEL_FMAP_67", 0x5a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_67_field_info), - trq_sel_fmap_67_field_info -}, -{"TRQ_SEL_FMAP_68", 0x5ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_68_field_info), - trq_sel_fmap_68_field_info -}, -{"TRQ_SEL_FMAP_69", 0x5b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_69_field_info), - trq_sel_fmap_69_field_info -}, -{"TRQ_SEL_FMAP_6A", 0x5b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6a_field_info), - trq_sel_fmap_6a_field_info -}, -{"TRQ_SEL_FMAP_6B", 0x5b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6b_field_info), - trq_sel_fmap_6b_field_info -}, -{"TRQ_SEL_FMAP_6C", 0x5bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6c_field_info), - trq_sel_fmap_6c_field_info -}, -{"TRQ_SEL_FMAP_6D", 0x5c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6d_field_info), - trq_sel_fmap_6d_field_info -}, -{"TRQ_SEL_FMAP_6E", 0x5c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6e_field_info), - trq_sel_fmap_6e_field_info -}, -{"TRQ_SEL_FMAP_6F", 0x5c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6f_field_info), - trq_sel_fmap_6f_field_info -}, -{"TRQ_SEL_FMAP_70", 0x5cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_70_field_info), - trq_sel_fmap_70_field_info -}, -{"TRQ_SEL_FMAP_71", 0x5d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_71_field_info), - trq_sel_fmap_71_field_info -}, -{"TRQ_SEL_FMAP_72", 0x5d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_72_field_info), - trq_sel_fmap_72_field_info -}, -{"TRQ_SEL_FMAP_73", 0x5d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_73_field_info), - trq_sel_fmap_73_field_info -}, -{"TRQ_SEL_FMAP_74", 0x5dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_74_field_info), - trq_sel_fmap_74_field_info -}, -{"TRQ_SEL_FMAP_75", 0x5e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_75_field_info), - trq_sel_fmap_75_field_info -}, -{"TRQ_SEL_FMAP_76", 0x5e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_76_field_info), - trq_sel_fmap_76_field_info -}, -{"TRQ_SEL_FMAP_77", 0x5e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_77_field_info), - trq_sel_fmap_77_field_info -}, -{"TRQ_SEL_FMAP_78", 0x5ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_78_field_info), - trq_sel_fmap_78_field_info -}, -{"TRQ_SEL_FMAP_79", 0x5f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_79_field_info), - trq_sel_fmap_79_field_info -}, -{"TRQ_SEL_FMAP_7A", 0x5f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7a_field_info), - trq_sel_fmap_7a_field_info -}, -{"TRQ_SEL_FMAP_7B", 0x5f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7b_field_info), - trq_sel_fmap_7b_field_info -}, -{"TRQ_SEL_FMAP_7C", 0x5fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7c_field_info), - trq_sel_fmap_7c_field_info -}, -{"TRQ_SEL_FMAP_7D", 0x600, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7d_field_info), - trq_sel_fmap_7d_field_info -}, -{"TRQ_SEL_FMAP_7E", 0x604, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7e_field_info), - trq_sel_fmap_7e_field_info -}, -{"TRQ_SEL_FMAP_7F", 0x608, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7f_field_info), - trq_sel_fmap_7f_field_info -}, -{"TRQ_SEL_FMAP_80", 0x60c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_80_field_info), - trq_sel_fmap_80_field_info -}, -{"TRQ_SEL_FMAP_81", 0x610, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_81_field_info), - trq_sel_fmap_81_field_info -}, -{"TRQ_SEL_FMAP_82", 0x614, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_82_field_info), - trq_sel_fmap_82_field_info -}, -{"TRQ_SEL_FMAP_83", 0x618, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_83_field_info), - trq_sel_fmap_83_field_info -}, -{"TRQ_SEL_FMAP_84", 0x61c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_84_field_info), - trq_sel_fmap_84_field_info -}, -{"TRQ_SEL_FMAP_85", 0x620, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_85_field_info), - trq_sel_fmap_85_field_info -}, -{"TRQ_SEL_FMAP_86", 0x624, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_86_field_info), - trq_sel_fmap_86_field_info -}, -{"TRQ_SEL_FMAP_87", 0x628, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_87_field_info), - trq_sel_fmap_87_field_info -}, -{"TRQ_SEL_FMAP_88", 0x62c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_88_field_info), - trq_sel_fmap_88_field_info -}, -{"TRQ_SEL_FMAP_89", 0x630, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_89_field_info), - trq_sel_fmap_89_field_info -}, -{"TRQ_SEL_FMAP_8A", 0x634, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8a_field_info), - trq_sel_fmap_8a_field_info -}, -{"TRQ_SEL_FMAP_8B", 0x638, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8b_field_info), - trq_sel_fmap_8b_field_info -}, -{"TRQ_SEL_FMAP_8C", 0x63c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8c_field_info), - trq_sel_fmap_8c_field_info -}, -{"TRQ_SEL_FMAP_8D", 0x640, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8d_field_info), - trq_sel_fmap_8d_field_info -}, -{"TRQ_SEL_FMAP_8E", 0x644, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8e_field_info), - trq_sel_fmap_8e_field_info -}, -{"TRQ_SEL_FMAP_8F", 0x648, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8f_field_info), - trq_sel_fmap_8f_field_info -}, -{"TRQ_SEL_FMAP_90", 0x64c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_90_field_info), - trq_sel_fmap_90_field_info -}, -{"TRQ_SEL_FMAP_91", 0x650, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_91_field_info), - trq_sel_fmap_91_field_info -}, -{"TRQ_SEL_FMAP_92", 0x654, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_92_field_info), - trq_sel_fmap_92_field_info -}, -{"TRQ_SEL_FMAP_93", 0x658, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_93_field_info), - trq_sel_fmap_93_field_info -}, -{"TRQ_SEL_FMAP_94", 0x65c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_94_field_info), - trq_sel_fmap_94_field_info -}, -{"TRQ_SEL_FMAP_95", 0x660, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_95_field_info), - trq_sel_fmap_95_field_info -}, -{"TRQ_SEL_FMAP_96", 0x664, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_96_field_info), - trq_sel_fmap_96_field_info -}, -{"TRQ_SEL_FMAP_97", 0x668, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_97_field_info), - trq_sel_fmap_97_field_info -}, -{"TRQ_SEL_FMAP_98", 0x66c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_98_field_info), - trq_sel_fmap_98_field_info -}, -{"TRQ_SEL_FMAP_99", 0x670, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_99_field_info), - trq_sel_fmap_99_field_info -}, -{"TRQ_SEL_FMAP_9A", 0x674, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9a_field_info), - trq_sel_fmap_9a_field_info -}, -{"TRQ_SEL_FMAP_9B", 0x678, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9b_field_info), - trq_sel_fmap_9b_field_info -}, -{"TRQ_SEL_FMAP_9C", 0x67c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9c_field_info), - trq_sel_fmap_9c_field_info -}, -{"TRQ_SEL_FMAP_9D", 0x680, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9d_field_info), - trq_sel_fmap_9d_field_info -}, -{"TRQ_SEL_FMAP_9E", 0x684, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9e_field_info), - trq_sel_fmap_9e_field_info -}, -{"TRQ_SEL_FMAP_9F", 0x688, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9f_field_info), - trq_sel_fmap_9f_field_info -}, -{"TRQ_SEL_FMAP_A0", 0x68c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a0_field_info), - trq_sel_fmap_a0_field_info -}, -{"TRQ_SEL_FMAP_A1", 0x690, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a1_field_info), - trq_sel_fmap_a1_field_info -}, -{"TRQ_SEL_FMAP_A2", 0x694, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a2_field_info), - trq_sel_fmap_a2_field_info -}, -{"TRQ_SEL_FMAP_A3", 0x698, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a3_field_info), - trq_sel_fmap_a3_field_info -}, -{"TRQ_SEL_FMAP_A4", 0x69c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a4_field_info), - trq_sel_fmap_a4_field_info -}, -{"TRQ_SEL_FMAP_A5", 0x6a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a5_field_info), - trq_sel_fmap_a5_field_info -}, -{"TRQ_SEL_FMAP_A6", 0x6a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a6_field_info), - trq_sel_fmap_a6_field_info -}, -{"TRQ_SEL_FMAP_A7", 0x6a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a7_field_info), - trq_sel_fmap_a7_field_info -}, -{"TRQ_SEL_FMAP_A8", 0x6ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a8_field_info), - trq_sel_fmap_a8_field_info -}, -{"TRQ_SEL_FMAP_A9", 0x6b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a9_field_info), - trq_sel_fmap_a9_field_info -}, -{"TRQ_SEL_FMAP_AA", 0x6b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_aa_field_info), - trq_sel_fmap_aa_field_info -}, -{"TRQ_SEL_FMAP_AB", 0x6b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ab_field_info), - trq_sel_fmap_ab_field_info -}, -{"TRQ_SEL_FMAP_AC", 0x6bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ac_field_info), - trq_sel_fmap_ac_field_info -}, -{"TRQ_SEL_FMAP_AD", 0x6d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ad_field_info), - trq_sel_fmap_ad_field_info -}, -{"TRQ_SEL_FMAP_AE", 0x6d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ae_field_info), - trq_sel_fmap_ae_field_info -}, -{"TRQ_SEL_FMAP_AF", 0x6d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_af_field_info), - trq_sel_fmap_af_field_info -}, -{"TRQ_SEL_FMAP_B0", 0x6dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b0_field_info), - trq_sel_fmap_b0_field_info -}, -{"TRQ_SEL_FMAP_B1", 0x6e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b1_field_info), - trq_sel_fmap_b1_field_info -}, -{"TRQ_SEL_FMAP_B2", 0x6e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b2_field_info), - trq_sel_fmap_b2_field_info -}, -{"TRQ_SEL_FMAP_B3", 0x6e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b3_field_info), - trq_sel_fmap_b3_field_info -}, -{"TRQ_SEL_FMAP_B4", 0x6ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b4_field_info), - trq_sel_fmap_b4_field_info -}, -{"TRQ_SEL_FMAP_B5", 0x6f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b5_field_info), - trq_sel_fmap_b5_field_info -}, -{"TRQ_SEL_FMAP_B6", 0x6f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b6_field_info), - trq_sel_fmap_b6_field_info -}, -{"TRQ_SEL_FMAP_B7", 0x6f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b7_field_info), - trq_sel_fmap_b7_field_info -}, -{"TRQ_SEL_FMAP_B8", 0x6fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b8_field_info), - trq_sel_fmap_b8_field_info -}, -{"TRQ_SEL_FMAP_B9", 0x700, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b9_field_info), - trq_sel_fmap_b9_field_info -}, -{"TRQ_SEL_FMAP_BA", 0x704, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ba_field_info), - trq_sel_fmap_ba_field_info -}, -{"TRQ_SEL_FMAP_BB", 0x708, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bb_field_info), - trq_sel_fmap_bb_field_info -}, -{"TRQ_SEL_FMAP_BC", 0x70c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bc_field_info), - trq_sel_fmap_bc_field_info -}, -{"TRQ_SEL_FMAP_BD", 0x710, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bd_field_info), - trq_sel_fmap_bd_field_info -}, -{"TRQ_SEL_FMAP_BE", 0x714, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_be_field_info), - trq_sel_fmap_be_field_info -}, -{"TRQ_SEL_FMAP_BF", 0x718, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bf_field_info), - trq_sel_fmap_bf_field_info -}, -{"TRQ_SEL_FMAP_C0", 0x71c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c0_field_info), - trq_sel_fmap_c0_field_info -}, -{"TRQ_SEL_FMAP_C1", 0x720, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c1_field_info), - trq_sel_fmap_c1_field_info -}, -{"TRQ_SEL_FMAP_C2", 0x734, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c2_field_info), - trq_sel_fmap_c2_field_info -}, -{"TRQ_SEL_FMAP_C3", 0x748, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c3_field_info), - trq_sel_fmap_c3_field_info -}, -{"TRQ_SEL_FMAP_C4", 0x74c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c4_field_info), - trq_sel_fmap_c4_field_info -}, -{"TRQ_SEL_FMAP_C5", 0x750, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c5_field_info), - trq_sel_fmap_c5_field_info -}, -{"TRQ_SEL_FMAP_C6", 0x754, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c6_field_info), - trq_sel_fmap_c6_field_info -}, -{"TRQ_SEL_FMAP_C7", 0x758, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c7_field_info), - trq_sel_fmap_c7_field_info -}, -{"TRQ_SEL_FMAP_C8", 0x75c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c8_field_info), - trq_sel_fmap_c8_field_info -}, -{"TRQ_SEL_FMAP_C9", 0x760, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c9_field_info), - trq_sel_fmap_c9_field_info -}, -{"TRQ_SEL_FMAP_CA", 0x764, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ca_field_info), - trq_sel_fmap_ca_field_info -}, -{"TRQ_SEL_FMAP_CB", 0x768, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cb_field_info), - trq_sel_fmap_cb_field_info -}, -{"TRQ_SEL_FMAP_CC", 0x76c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cc_field_info), - trq_sel_fmap_cc_field_info -}, -{"TRQ_SEL_FMAP_CD", 0x770, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cd_field_info), - trq_sel_fmap_cd_field_info -}, -{"TRQ_SEL_FMAP_CE", 0x774, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ce_field_info), - trq_sel_fmap_ce_field_info -}, -{"TRQ_SEL_FMAP_CF", 0x778, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cf_field_info), - trq_sel_fmap_cf_field_info -}, -{"TRQ_SEL_FMAP_D0", 0x77c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d0_field_info), - trq_sel_fmap_d0_field_info -}, -{"TRQ_SEL_FMAP_D1", 0x780, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d1_field_info), - trq_sel_fmap_d1_field_info -}, -{"TRQ_SEL_FMAP_D2", 0x784, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d2_field_info), - trq_sel_fmap_d2_field_info -}, -{"TRQ_SEL_FMAP_D3", 0x788, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d3_field_info), - trq_sel_fmap_d3_field_info -}, -{"TRQ_SEL_FMAP_D4", 0x78c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d4_field_info), - trq_sel_fmap_d4_field_info -}, -{"TRQ_SEL_FMAP_D5", 0x790, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d5_field_info), - trq_sel_fmap_d5_field_info -}, -{"TRQ_SEL_FMAP_D6", 0x794, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d6_field_info), - trq_sel_fmap_d6_field_info -}, -{"TRQ_SEL_FMAP_D7", 0x798, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d7_field_info), - trq_sel_fmap_d7_field_info -}, -{"TRQ_SEL_FMAP_D8", 0x79c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d8_field_info), - trq_sel_fmap_d8_field_info -}, -{"TRQ_SEL_FMAP_D9", 0x7a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d9_field_info), - trq_sel_fmap_d9_field_info -}, -{"TRQ_SEL_FMAP_DA", 0x7a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_da_field_info), - trq_sel_fmap_da_field_info -}, -{"TRQ_SEL_FMAP_DB", 0x7a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_db_field_info), - trq_sel_fmap_db_field_info -}, -{"TRQ_SEL_FMAP_DC", 0x7ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_dc_field_info), - trq_sel_fmap_dc_field_info -}, -{"TRQ_SEL_FMAP_DD", 0x7b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_dd_field_info), - trq_sel_fmap_dd_field_info -}, -{"TRQ_SEL_FMAP_DE", 0x7b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_de_field_info), - trq_sel_fmap_de_field_info -}, -{"TRQ_SEL_FMAP_DF", 0x7b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_df_field_info), - trq_sel_fmap_df_field_info -}, -{"TRQ_SEL_FMAP_E0", 0x7bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e0_field_info), - trq_sel_fmap_e0_field_info -}, -{"TRQ_SEL_FMAP_E1", 0x7c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e1_field_info), - trq_sel_fmap_e1_field_info -}, -{"TRQ_SEL_FMAP_E2", 0x7c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e2_field_info), - trq_sel_fmap_e2_field_info -}, -{"TRQ_SEL_FMAP_E3", 0x7c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e3_field_info), - trq_sel_fmap_e3_field_info -}, -{"TRQ_SEL_FMAP_E4", 0x7cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e4_field_info), - trq_sel_fmap_e4_field_info -}, -{"TRQ_SEL_FMAP_E5", 0x7d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e5_field_info), - trq_sel_fmap_e5_field_info -}, -{"TRQ_SEL_FMAP_E6", 0x7d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e6_field_info), - trq_sel_fmap_e6_field_info -}, -{"TRQ_SEL_FMAP_E7", 0x7d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e7_field_info), - trq_sel_fmap_e7_field_info -}, -{"TRQ_SEL_FMAP_E8", 0x7dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e8_field_info), - trq_sel_fmap_e8_field_info -}, -{"TRQ_SEL_FMAP_E9", 0x7e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e9_field_info), - trq_sel_fmap_e9_field_info -}, -{"TRQ_SEL_FMAP_EA", 0x7e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ea_field_info), - trq_sel_fmap_ea_field_info -}, -{"TRQ_SEL_FMAP_EB", 0x7e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_eb_field_info), - trq_sel_fmap_eb_field_info -}, -{"TRQ_SEL_FMAP_EC", 0x7ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ec_field_info), - trq_sel_fmap_ec_field_info -}, -{"TRQ_SEL_FMAP_ED", 0x7f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ed_field_info), - trq_sel_fmap_ed_field_info -}, -{"TRQ_SEL_FMAP_EE", 0x7f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ee_field_info), - trq_sel_fmap_ee_field_info -}, -{"TRQ_SEL_FMAP_EF", 0x7f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ef_field_info), - trq_sel_fmap_ef_field_info -}, -{"TRQ_SEL_FMAP_F0", 0x7fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_f0_field_info), - trq_sel_fmap_f0_field_info -}, -{"IND_CTXT_DATA_3", 0x804, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_3_field_info), - ind_ctxt_data_3_field_info -}, -{"IND_CTXT_DATA_2", 0x808, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_2_field_info), - ind_ctxt_data_2_field_info -}, -{"IND_CTXT_DATA_1", 0x80c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_1_field_info), - ind_ctxt_data_1_field_info -}, -{"IND_CTXT_DATA_0", 0x810, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_0_field_info), - ind_ctxt_data_0_field_info -}, -{"IND_CTXT3", 0x814, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt3_field_info), - ind_ctxt3_field_info -}, -{"IND_CTXT2", 0x818, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt2_field_info), - ind_ctxt2_field_info -}, -{"IND_CTXT1", 0x81c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt1_field_info), - ind_ctxt1_field_info -}, -{"IND_CTXT0", 0x820, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt0_field_info), - ind_ctxt0_field_info -}, -{"IND_CTXT_CMD", 0x824, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_cmd_field_info), - ind_ctxt_cmd_field_info -}, -{"C2H_TIMER_CNT_1", 0xa00, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_1_field_info), - c2h_timer_cnt_1_field_info -}, -{"C2H_TIMER_CNT_2", 0xa04, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_2_field_info), - c2h_timer_cnt_2_field_info -}, -{"C2H_TIMER_CNT_3", 0xa08, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_3_field_info), - c2h_timer_cnt_3_field_info -}, -{"C2H_TIMER_CNT_4", 0xa0c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_4_field_info), - c2h_timer_cnt_4_field_info -}, -{"C2H_TIMER_CNT_5", 0xa10, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_5_field_info), - c2h_timer_cnt_5_field_info -}, -{"C2H_TIMER_CNT_6", 0xa14, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_6_field_info), - c2h_timer_cnt_6_field_info -}, -{"C2H_TIMER_CNT_7", 0xa18, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_7_field_info), - c2h_timer_cnt_7_field_info -}, -{"C2H_TIMER_CNT_8", 0xa1c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_8_field_info), - c2h_timer_cnt_8_field_info -}, -{"C2H_TIMER_CNT_9", 0xa20, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_9_field_info), - c2h_timer_cnt_9_field_info -}, -{"C2H_TIMER_CNT_A", 0xa24, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_a_field_info), - c2h_timer_cnt_a_field_info -}, -{"C2H_TIMER_CNT_B", 0xa28, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_b_field_info), - c2h_timer_cnt_b_field_info -}, -{"C2H_TIMER_CNT_C", 0xa2c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_c_field_info), - c2h_timer_cnt_c_field_info -}, -{"C2H_TIMER_CNT_D", 0xa30, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_d_field_info), - c2h_timer_cnt_d_field_info -}, -{"C2H_TIMER_CNT_E", 0xa34, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_e_field_info), - c2h_timer_cnt_e_field_info -}, -{"C2H_TIMER_CNT_F", 0xa38, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_f_field_info), - c2h_timer_cnt_f_field_info -}, -{"C2H_TIMER_CNT_10", 0xa3c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_10_field_info), - c2h_timer_cnt_10_field_info -}, -{"C2H_CNT_TH_1", 0xa40, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_1_field_info), - c2h_cnt_th_1_field_info -}, -{"C2H_CNT_TH_2", 0xa44, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_2_field_info), - c2h_cnt_th_2_field_info -}, -{"C2H_CNT_TH_3", 0xa48, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_3_field_info), - c2h_cnt_th_3_field_info -}, -{"C2H_CNT_TH_4", 0xa4c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_4_field_info), - c2h_cnt_th_4_field_info -}, -{"C2H_CNT_TH_5", 0xa50, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_5_field_info), - c2h_cnt_th_5_field_info -}, -{"C2H_CNT_TH_6", 0xa54, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_6_field_info), - c2h_cnt_th_6_field_info -}, -{"C2H_CNT_TH_7", 0xa58, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_7_field_info), - c2h_cnt_th_7_field_info -}, -{"C2H_CNT_TH_8", 0xa5c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_8_field_info), - c2h_cnt_th_8_field_info -}, -{"C2H_CNT_TH_9", 0xa60, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_9_field_info), - c2h_cnt_th_9_field_info -}, -{"C2H_CNT_TH_A", 0xa64, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_a_field_info), - c2h_cnt_th_a_field_info -}, -{"C2H_CNT_TH_B", 0xa68, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_b_field_info), - c2h_cnt_th_b_field_info -}, -{"C2H_CNT_TH_C", 0xa6c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_c_field_info), - c2h_cnt_th_c_field_info -}, -{"C2H_CNT_TH_D", 0xa70, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_d_field_info), - c2h_cnt_th_d_field_info -}, -{"C2H_CNT_TH_E", 0xa74, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_e_field_info), - c2h_cnt_th_e_field_info -}, -{"C2H_CNT_TH_F", 0xa78, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_f_field_info), - c2h_cnt_th_f_field_info -}, -{"C2H_CNT_TH_10", 0xa7c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_10_field_info), - c2h_cnt_th_10_field_info -}, -{"C2H_QID2VEC_MAP_QID", 0xa80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_qid2vec_map_qid_field_info), - c2h_qid2vec_map_qid_field_info -}, -{"C2H_QID2VEC_MAP", 0xa84, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_qid2vec_map_field_info), - c2h_qid2vec_map_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xa88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_field_info), - c2h_stat_s_axis_c2h_accepted_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED", 0xa8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_field_info), - c2h_stat_s_axis_wrb_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xa90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_field_info), - c2h_stat_desc_rsp_pkt_accepted_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP", 0xa94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_field_info), - c2h_stat_axis_pkg_cmp_field_info -}, -{"C2H_STAT_DESC_RSP_ACCEPTED", 0xa98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_accepted_field_info), - c2h_stat_desc_rsp_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_CMP", 0xa9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_cmp_field_info), - c2h_stat_desc_rsp_cmp_field_info -}, -{"C2H_STAT_WRQ_OUT", 0xaa0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wrq_out_field_info), - c2h_stat_wrq_out_field_info -}, -{"C2H_STAT_WPL_REN_ACCEPTED", 0xaa4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wpl_ren_accepted_field_info), - c2h_stat_wpl_ren_accepted_field_info -}, -{"C2H_STAT_TOTAL_WRQ_LEN", 0xaa8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wrq_len_field_info), - c2h_stat_total_wrq_len_field_info -}, -{"C2H_STAT_TOTAL_WPL_LEN", 0xaac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wpl_len_field_info), - c2h_stat_total_wpl_len_field_info -}, -{"C2H_BUF_SZ_0", 0xab0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_0_field_info), - c2h_buf_sz_0_field_info -}, -{"C2H_BUF_SZ_1", 0xab4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_1_field_info), - c2h_buf_sz_1_field_info -}, -{"C2H_BUF_SZ_2", 0xab8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_2_field_info), - c2h_buf_sz_2_field_info -}, -{"C2H_BUF_SZ_3", 0xabc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_3_field_info), - c2h_buf_sz_3_field_info -}, -{"C2H_BUF_SZ_4", 0xac0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_4_field_info), - c2h_buf_sz_4_field_info -}, -{"C2H_BUF_SZ_5", 0xac4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_5_field_info), - c2h_buf_sz_5_field_info -}, -{"C2H_BUF_SZ_7", 0xac8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_7_field_info), - c2h_buf_sz_7_field_info -}, -{"C2H_BUF_SZ_8", 0xacc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_8_field_info), - c2h_buf_sz_8_field_info -}, -{"C2H_BUF_SZ_9", 0xad0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_9_field_info), - c2h_buf_sz_9_field_info -}, -{"C2H_BUF_SZ_10", 0xad4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_10_field_info), - c2h_buf_sz_10_field_info -}, -{"C2H_BUF_SZ_11", 0xad8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_11_field_info), - c2h_buf_sz_11_field_info -}, -{"C2H_BUF_SZ_12", 0xae0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_12_field_info), - c2h_buf_sz_12_field_info -}, -{"C2H_BUF_SZ_13", 0xae4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_13_field_info), - c2h_buf_sz_13_field_info -}, -{"C2H_BUF_SZ_14", 0xae8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_14_field_info), - c2h_buf_sz_14_field_info -}, -{"C2H_BUF_SZ_15", 0xaec, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_15_field_info), - c2h_buf_sz_15_field_info -}, -{"C2H_ERR_STAT", 0xaf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_stat_field_info), - c2h_err_stat_field_info -}, -{"C2H_ERR_MASK", 0xaf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_mask_field_info), - c2h_err_mask_field_info -}, -{"C2H_FATAL_ERR_STAT", 0xaf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_stat_field_info), - c2h_fatal_err_stat_field_info -}, -{"C2H_FATAL_ERR_MASK", 0xafc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_mask_field_info), - c2h_fatal_err_mask_field_info -}, -{"C2H_FATAL_ERR_ENABLE", 0xb00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_enable_field_info), - c2h_fatal_err_enable_field_info -}, -{"GLBL_ERR_INT", 0xb04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_int_field_info), - glbl_err_int_field_info -}, -{"C2H_PFCH_CFG", 0xb08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_field_info), - c2h_pfch_cfg_field_info -}, -{"C2H_INT_TIMER_TICK", 0xb0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_timer_tick_field_info), - c2h_int_timer_tick_field_info -}, -{"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xb10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_drop_accepted_field_info), - c2h_stat_desc_rsp_drop_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xb14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_err_accepted_field_info), - c2h_stat_desc_rsp_err_accepted_field_info -}, -{"C2H_STAT_DESC_REQ", 0xb18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_req_field_info), - c2h_stat_desc_req_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_0", 0xb1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_0_field_info), - c2h_stat_dbg_dma_eng_0_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_1", 0xb20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_1_field_info), - c2h_stat_dbg_dma_eng_1_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_2", 0xb24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_2_field_info), - c2h_stat_dbg_dma_eng_2_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_3", 0xb28, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_3_field_info), - c2h_stat_dbg_dma_eng_3_field_info -}, -{"C2H_DBG_PFCH_ERR_CTXT", 0xb2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_err_ctxt_field_info), - c2h_dbg_pfch_err_ctxt_field_info -}, -{"C2H_FIRST_ERR_QID", 0xb30, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_first_err_qid_field_info), - c2h_first_err_qid_field_info -}, -{"STAT_NUM_WRB_IN", 0xb34, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_in_field_info), - stat_num_wrb_in_field_info -}, -{"STAT_NUM_WRB_OUT", 0xb38, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_out_field_info), - stat_num_wrb_out_field_info -}, -{"STAT_NUM_WRB_DRP", 0xb3c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_drp_field_info), - stat_num_wrb_drp_field_info -}, -{"STAT_NUM_STAT_DESC_OUT", 0xb40, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_stat_desc_out_field_info), - stat_num_stat_desc_out_field_info -}, -{"STAT_NUM_DSC_CRDT_SENT", 0xb44, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_dsc_crdt_sent_field_info), - stat_num_dsc_crdt_sent_field_info -}, -{"STAT_NUM_FCH_DSC_RCVD", 0xb48, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_fch_dsc_rcvd_field_info), - stat_num_fch_dsc_rcvd_field_info -}, -{"STAT_NUM_BYP_DSC_RCVD", 0xb4c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_byp_dsc_rcvd_field_info), - stat_num_byp_dsc_rcvd_field_info -}, -{"C2H_WRB_COAL_CFG", 0xb50, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_cfg_field_info), - c2h_wrb_coal_cfg_field_info -}, -{"C2H_INTR_H2C_REQ", 0xb54, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_h2c_req_field_info), - c2h_intr_h2c_req_field_info -}, -{"C2H_INTR_C2H_MM_REQ", 0xb58, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_mm_req_field_info), - c2h_intr_c2h_mm_req_field_info -}, -{"C2H_INTR_ERR_INT_REQ", 0xb5c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_err_int_req_field_info), - c2h_intr_err_int_req_field_info -}, -{"C2H_INTR_C2H_ST_REQ", 0xb60, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_req_field_info), - c2h_intr_c2h_st_req_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK", 0xb64, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_ack_field_info), - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL", 0xb68, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_fail_field_info), - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX", 0xb6c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info), - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL", 0xb70, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info), - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_ACK", 0xb74, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_ack_field_info), - c2h_intr_c2h_st_msix_ack_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_FAIL", 0xb78, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_fail_field_info), - c2h_intr_c2h_st_msix_fail_field_info -}, -{"C2H_INTR_C2H_ST_NO_MSIX", 0xb7c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_no_msix_field_info), - c2h_intr_c2h_st_no_msix_field_info -}, -{"C2H_INTR_C2H_ST_CTXT_INVAL", 0xb80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_ctxt_inval_field_info), - c2h_intr_c2h_st_ctxt_inval_field_info -}, -{"C2H_STAT_WR_CMP", 0xb84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wr_cmp_field_info), - c2h_stat_wr_cmp_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_4", 0xb88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_4_field_info), - c2h_stat_dbg_dma_eng_4_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_5", 0xb8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_5_field_info), - c2h_stat_dbg_dma_eng_5_field_info -}, -{"C2H_DBG_PFCH_QID", 0xb90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_qid_field_info), - c2h_dbg_pfch_qid_field_info -}, -{"C2H_DBG_PFCH", 0xb94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_field_info), - c2h_dbg_pfch_field_info -}, -{"C2H_INT_DBG", 0xb98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_dbg_field_info), - c2h_int_dbg_field_info -}, -{"C2H_STAT_IMM_ACCEPTED", 0xb9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_imm_accepted_field_info), - c2h_stat_imm_accepted_field_info -}, -{"C2H_STAT_MARKER_ACCEPTED", 0xba0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_marker_accepted_field_info), - c2h_stat_marker_accepted_field_info -}, -{"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xba4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_disable_cmp_accepted_field_info), - c2h_stat_disable_cmp_accepted_field_info -}, -{"C2H_PLD_FIFO_CRDT_CNT", 0xba8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_crdt_cnt_field_info), - c2h_pld_fifo_crdt_cnt_field_info -}, -{"H2C_ERR_STAT", 0xe00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_stat_field_info), - h2c_err_stat_field_info -}, -{"H2C_ERR_MASK", 0xe04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_mask_field_info), - h2c_err_mask_field_info -}, -{"H2C_FIRST_ERR_QID", 0xe08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_first_err_qid_field_info), - h2c_first_err_qid_field_info -}, -{"H2C_DBG_REG0", 0xe0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg0_field_info), - h2c_dbg_reg0_field_info -}, -{"H2C_DBG_REG1", 0xe10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg1_field_info), - h2c_dbg_reg1_field_info -}, -{"H2C_DBG_REG2", 0xe14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg2_field_info), - h2c_dbg_reg2_field_info -}, -{"H2C_DBG_REG3", 0xe18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg3_field_info), - h2c_dbg_reg3_field_info -}, -{"H2C_DBG_REG4", 0xe1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg4_field_info), - h2c_dbg_reg4_field_info -}, -{"H2C_FATAL_ERR_EN", 0xe20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_fatal_err_en_field_info), - h2c_fatal_err_en_field_info -}, -{"C2H_CHANNEL_CTL", 0x1004, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_ctl_field_info), - c2h_channel_ctl_field_info -}, -{"C2H_CHANNEL_CTL_1", 0x1008, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_ctl_1_field_info), - c2h_channel_ctl_1_field_info -}, -{"C2H_MM_STATUS", 0x1040, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_status_field_info), - c2h_mm_status_field_info -}, -{"C2H_CHANNEL_CMPL_DESC_CNT", 0x1048, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_cmpl_desc_cnt_field_info), - c2h_channel_cmpl_desc_cnt_field_info -}, -{"C2H_MM_ERR_CODE_ENABLE_MASK", 0x1054, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_enable_mask_field_info), - c2h_mm_err_code_enable_mask_field_info -}, -{"C2H_MM_ERR_CODE", 0x1058, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_field_info), - c2h_mm_err_code_field_info -}, -{"C2H_MM_ERR_INFO", 0x105c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_info_field_info), - c2h_mm_err_info_field_info -}, -{"C2H_MM_PERF_MON_CTL", 0x10c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_ctl_field_info), - c2h_mm_perf_mon_ctl_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT0", 0x10c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt0_field_info), - c2h_mm_perf_mon_cycle_cnt0_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT1", 0x10c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt1_field_info), - c2h_mm_perf_mon_cycle_cnt1_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT0", 0x10cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt0_field_info), - c2h_mm_perf_mon_data_cnt0_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT1", 0x10d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt1_field_info), - c2h_mm_perf_mon_data_cnt1_field_info -}, -{"C2H_MM_DBG", 0x10e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_dbg_field_info), - c2h_mm_dbg_field_info -}, -{"H2C_CHANNEL_CTL", 0x1204, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_field_info), - h2c_channel_ctl_field_info -}, -{"H2C_CHANNEL_CTL_1", 0x1208, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_1_field_info), - h2c_channel_ctl_1_field_info -}, -{"H2C_CHANNEL_CTL_2", 0x120c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_2_field_info), - h2c_channel_ctl_2_field_info -}, -{"H2C_MM_STATUS", 0x1240, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_status_field_info), - h2c_mm_status_field_info -}, -{"H2C_CHANNEL_CMPL_DESC_CNT", 0x1248, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_cmpl_desc_cnt_field_info), - h2c_channel_cmpl_desc_cnt_field_info -}, -{"H2C_MM_ERR_CODE_ENABLE_MASK", 0x1254, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_enable_mask_field_info), - h2c_mm_err_code_enable_mask_field_info -}, -{"H2C_MM_ERR_CODE", 0x1258, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_field_info), - h2c_mm_err_code_field_info -}, -{"H2C_MM_ERR_INFO", 0x125c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_info_field_info), - h2c_mm_err_info_field_info -}, -{"H2C_MM_PERF_MON_CTL", 0x12c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_ctl_field_info), - h2c_mm_perf_mon_ctl_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT0", 0x12c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt0_field_info), - h2c_mm_perf_mon_cycle_cnt0_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT1", 0x12c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt1_field_info), - h2c_mm_perf_mon_cycle_cnt1_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT0", 0x12cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt0_field_info), - h2c_mm_perf_mon_data_cnt0_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT1", 0x12d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt1_field_info), - h2c_mm_perf_mon_data_cnt1_field_info -}, -{"H2C_MM_DBG", 0x12e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_dbg_field_info), - h2c_mm_dbg_field_info -}, -{"FUNC_STATUS_REG", 0x2400, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_status_reg_field_info), - func_status_reg_field_info -}, -{"FUNC_CMD_REG", 0x2404, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_cmd_reg_field_info), - func_cmd_reg_field_info -}, -{"FUNC_INTERRUPT_VECTOR_REG", 0x2408, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_interrupt_vector_reg_field_info), - func_interrupt_vector_reg_field_info -}, -{"TARGET_FUNC_REG", 0x240c, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(target_func_reg_field_info), - target_func_reg_field_info -}, -{"FUNC_INTERRUPT_CTL_REG", 0x2410, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_interrupt_ctl_reg_field_info), - func_interrupt_ctl_reg_field_info -}, - -}; - -uint32_t qdma_cpm4_config_num_regs_get(void) -{ - return (sizeof(qdma_cpm4_config_regs)/ - sizeof(qdma_cpm4_config_regs[0])); -} - -struct xreg_info *qdma_cpm4_config_regs_get(void) -{ - return qdma_cpm4_config_regs; -} - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_list.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_list.c deleted file mode 100755 index b7fabf7..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_list.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "qdma_list.h" - -void qdma_list_init_head(struct qdma_list_head *head) -{ - if (head) - head->prev = head->next = head; -} - -void qdma_list_add_tail(struct qdma_list_head *node, - struct qdma_list_head *head) -{ - head->prev->next = node; - node->next = head; - node->prev = head->prev; - head->prev = node; -} - -void qdma_list_insert_before(struct qdma_list_head *new_node, - struct qdma_list_head *node) -{ - node->prev->next = new_node; - new_node->prev = node->prev; - new_node->next = node; - node->prev = new_node; -} - -void qdma_list_insert_after(struct qdma_list_head *new_node, - struct qdma_list_head *node) -{ - new_node->prev = node; - new_node->next = node->next; - node->next->prev = new_node; - node->next = new_node; -} - - -void qdma_list_del(struct qdma_list_head *node) -{ - if (node) { - if (node->prev) - node->prev->next = node->next; - if (node->next) - node->next->prev = node->prev; - } -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_list.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_list.h deleted file mode 100755 index dd5f7d4..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_list.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_LIST_H_ -#define __QDMA_LIST_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library provided list implementation definitions - * - * Header file *qdma_list.h* defines APIs for creating and managing list. - */ - -/** - * struct qdma_list_head - data type for creating a list node - */ -struct qdma_list_head { - struct qdma_list_head *prev; - struct qdma_list_head *next; - void *priv; -}; - -#define QDMA_LIST_HEAD_INIT(name) { &(name), &(name), NULL } - -#define QDMA_LIST_HEAD(name) \ - struct qdma_list_head name = QDMA_LIST_HEAD_INIT(name) - -#define QDMA_LIST_GET_DATA(node) (node->priv) -#define QDMA_LIST_SET_DATA(node, data) ((node)->priv = data) - - -#define qdma_list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - - -#define qdma_list_is_last_entry(entry, head) ((entry)->next == (head)) - -#define qdma_list_is_empty(head) ((head)->next == (head)) - -/*****************************************************************************/ -/** - * qdma_list_init_head(): Init the list head - * - * @head: head of the list - * - * Return: None - *****************************************************************************/ -void qdma_list_init_head(struct qdma_list_head *head); - -/*****************************************************************************/ -/** - * qdma_list_add_tail(): add the given @node at the end of the list with @head - * - * @node: new entry which has to be added at the end of the list with @head - * @head: head of the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_add_tail(struct qdma_list_head *node, - struct qdma_list_head *head); - -/*****************************************************************************/ -/** - * qdma_list_insert_before(): add the given @node at the before a @node - * - * @new_node: new entry which has to be added before @node - * @node: reference node in the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_insert_before(struct qdma_list_head *new_node, - struct qdma_list_head *node); - -/*****************************************************************************/ -/** - * qdma_list_insert_after(): add the given @node at the after a @node - * - * @new_node: new entry which has to be added after @node - * @node: reference node in the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_insert_after(struct qdma_list_head *new_node, - struct qdma_list_head *node); - -/*****************************************************************************/ -/** - * qdma_list_del(): delete an node from the list - * - * @node: node in a list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_del(struct qdma_list_head *node); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_LIST_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_mbox_protocol.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_mbox_protocol.c deleted file mode 100755 index 67e7268..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_mbox_protocol.c +++ /dev/null @@ -1,2140 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "qdma_mbox_protocol.h" - -/** mailbox function status */ -#define MBOX_FN_STATUS 0x0 -/** shift value for mailbox function status in msg */ -#define S_MBOX_FN_STATUS_IN_MSG 0 -/** mask value for mailbox function status in msg*/ -#define M_MBOX_FN_STATUS_IN_MSG 0x1 -/** face value for mailbox function status in msg */ -#define F_MBOX_FN_STATUS_IN_MSG 0x1 - -/** shift value for out msg */ -#define S_MBOX_FN_STATUS_OUT_MSG 1 -/** mask value for out msg */ -#define M_MBOX_FN_STATUS_OUT_MSG 0x1 -/** face value for out msg */ -#define F_MBOX_FN_STATUS_OUT_MSG (1 << S_MBOX_FN_STATUS_OUT_MSG) -/** shift value for status ack */ -#define S_MBOX_FN_STATUS_ACK 2 /* PF only, ack status */ -/** mask value for status ack */ -#define M_MBOX_FN_STATUS_ACK 0x1 -/** face value for status ack */ -#define F_MBOX_FN_STATUS_ACK (1 << S_MBOX_FN_STATUS_ACK) -/** shift value for status src */ -#define S_MBOX_FN_STATUS_SRC 4 /* PF only, source func.*/ -/** mask value for status src */ -#define M_MBOX_FN_STATUS_SRC 0xFFF -/** face value for status src */ -#define G_MBOX_FN_STATUS_SRC(x) \ - (((x) >> S_MBOX_FN_STATUS_SRC) & M_MBOX_FN_STATUS_SRC) -/** face value for mailbox function status */ -#define MBOX_FN_STATUS_MASK \ - (F_MBOX_FN_STATUS_IN_MSG | \ - F_MBOX_FN_STATUS_OUT_MSG | \ - F_MBOX_FN_STATUS_ACK) - -/** mailbox function commands register */ -#define MBOX_FN_CMD 0x4 -/** shift value for send command */ -#define S_MBOX_FN_CMD_SND 0 -/** mask value for send command */ -#define M_MBOX_FN_CMD_SND 0x1 -/** face value for send command */ -#define F_MBOX_FN_CMD_SND (1 << S_MBOX_FN_CMD_SND) -/** shift value for receive command */ -#define S_MBOX_FN_CMD_RCV 1 -/** mask value for receive command */ -#define M_MBOX_FN_CMD_RCV 0x1 -/** face value for receive command */ -#define F_MBOX_FN_CMD_RCV (1 << S_MBOX_FN_CMD_RCV) -/** shift value for vf reset */ -#define S_MBOX_FN_CMD_VF_RESET 3 /* TBD PF only: reset VF */ -/** mask value for vf reset */ -#define M_MBOX_FN_CMD_VF_RESET 0x1 -/** mailbox isr vector register */ -#define MBOX_ISR_VEC 0x8 -/** shift value for isr vector */ -#define S_MBOX_ISR_VEC 0 -/** mask value for isr vector */ -#define M_MBOX_ISR_VEC 0x1F -/** face value for isr vector */ -#define V_MBOX_ISR_VEC(x) ((x) & M_MBOX_ISR_VEC) -/** mailbox FN target register */ -#define MBOX_FN_TARGET 0xC -/** shift value for FN target id */ -#define S_MBOX_FN_TARGET_ID 0 -/** mask value for FN target id */ -#define M_MBOX_FN_TARGET_ID 0xFFF -/** face value for FN target id */ -#define V_MBOX_FN_TARGET_ID(x) ((x) & M_MBOX_FN_TARGET_ID) -/** mailbox isr enable register */ -#define MBOX_ISR_EN 0x10 -/** shift value for isr enable */ -#define S_MBOX_ISR_EN 0 -/** mask value for isr enable */ -#define M_MBOX_ISR_EN 0x1 -/** face value for isr enable */ -#define F_MBOX_ISR_EN 0x1 -/** pf acknowledge base */ -#define MBOX_PF_ACK_BASE 0x20 -/** pf acknowledge step */ -#define MBOX_PF_ACK_STEP 4 -/** pf acknowledge count */ -#define MBOX_PF_ACK_COUNT 8 -/** mailbox incoming msg base */ -#define MBOX_IN_MSG_BASE 0x800 -/** mailbox outgoing msg base */ -#define MBOX_OUT_MSG_BASE 0xc00 -/** mailbox msg step */ -#define MBOX_MSG_STEP 4 -/** mailbox register max */ -#define MBOX_MSG_REG_MAX 32 - -/** - * enum mbox_msg_op - mailbox messages opcode - */ -#define MBOX_MSG_OP_RSP_OFFSET 0x80 -enum mbox_msg_op { - /** @MBOX_OP_BYE: vf offline, response not required*/ - MBOX_OP_VF_BYE, - /** @MBOX_OP_HELLO: vf online */ - MBOX_OP_HELLO, - /** @: FMAP programming request */ - MBOX_OP_FMAP, - /** @MBOX_OP_CSR: global CSR registers request */ - MBOX_OP_CSR, - /** @MBOX_OP_QREQ: request queues */ - MBOX_OP_QREQ, - /** @MBOX_OP_QADD: notify of queue addition */ - MBOX_OP_QNOTIFY_ADD, - /** @MBOX_OP_QNOTIFY_DEL: notify of queue deletion */ - MBOX_OP_QNOTIFY_DEL, - /** @MBOX_OP_QACTIVE_CNT: get active q count */ - MBOX_OP_GET_QACTIVE_CNT, - /** @MBOX_OP_QCTXT_WRT: queue context write */ - MBOX_OP_QCTXT_WRT, - /** @MBOX_OP_QCTXT_RD: queue context read */ - MBOX_OP_QCTXT_RD, - /** @MBOX_OP_QCTXT_CLR: queue context clear */ - MBOX_OP_QCTXT_CLR, - /** @MBOX_OP_QCTXT_INV: queue context invalidate */ - MBOX_OP_QCTXT_INV, - /** @MBOX_OP_INTR_CTXT_WRT: interrupt context write */ - MBOX_OP_INTR_CTXT_WRT, - /** @MBOX_OP_INTR_CTXT_RD: interrupt context read */ - MBOX_OP_INTR_CTXT_RD, - /** @MBOX_OP_INTR_CTXT_CLR: interrupt context clear */ - MBOX_OP_INTR_CTXT_CLR, - /** @MBOX_OP_INTR_CTXT_INV: interrupt context invalidate */ - MBOX_OP_INTR_CTXT_INV, - /** @MBOX_OP_RESET_PREPARE: PF to VF message for VF reset*/ - MBOX_OP_RESET_PREPARE, - /** @MBOX_OP_RESET_DONE: PF reset done */ - MBOX_OP_RESET_DONE, - /** @MBOX_OP_REG_LIST_READ: Read the register list */ - MBOX_OP_REG_LIST_READ, - /** @MBOX_OP_PF_BYE: pf offline, response required */ - MBOX_OP_PF_BYE, - /** @MBOX_OP_PF_RESET_VF_BYE: VF reset BYE, response required*/ - MBOX_OP_PF_RESET_VF_BYE, - - /** @MBOX_OP_HELLO_RESP: response to @MBOX_OP_HELLO */ - MBOX_OP_HELLO_RESP = 0x81, - /** @MBOX_OP_FMAP_RESP: response to @MBOX_OP_FMAP */ - MBOX_OP_FMAP_RESP, - /** @MBOX_OP_CSR_RESP: response to @MBOX_OP_CSR */ - MBOX_OP_CSR_RESP, - /** @MBOX_OP_QREQ_RESP: response to @MBOX_OP_QREQ */ - MBOX_OP_QREQ_RESP, - /** @MBOX_OP_QADD: notify of queue addition */ - MBOX_OP_QNOTIFY_ADD_RESP, - /** @MBOX_OP_QNOTIFY_DEL: notify of queue deletion */ - MBOX_OP_QNOTIFY_DEL_RESP, - /** @MBOX_OP_QACTIVE_CNT_RESP: get active q count */ - MBOX_OP_GET_QACTIVE_CNT_RESP, - /** @MBOX_OP_QCTXT_WRT_RESP: response to @MBOX_OP_QCTXT_WRT */ - MBOX_OP_QCTXT_WRT_RESP, - /** @MBOX_OP_QCTXT_RD_RESP: response to @MBOX_OP_QCTXT_RD */ - MBOX_OP_QCTXT_RD_RESP, - /** @MBOX_OP_QCTXT_CLR_RESP: response to @MBOX_OP_QCTXT_CLR */ - MBOX_OP_QCTXT_CLR_RESP, - /** @MBOX_OP_QCTXT_INV_RESP: response to @MBOX_OP_QCTXT_INV */ - MBOX_OP_QCTXT_INV_RESP, - /** @MBOX_OP_INTR_CTXT_WRT_RESP: response to @MBOX_OP_INTR_CTXT_WRT */ - MBOX_OP_INTR_CTXT_WRT_RESP, - /** @MBOX_OP_INTR_CTXT_RD_RESP: response to @MBOX_OP_INTR_CTXT_RD */ - MBOX_OP_INTR_CTXT_RD_RESP, - /** @MBOX_OP_INTR_CTXT_CLR_RESP: response to @MBOX_OP_INTR_CTXT_CLR */ - MBOX_OP_INTR_CTXT_CLR_RESP, - /** @MBOX_OP_INTR_CTXT_INV_RESP: response to @MBOX_OP_INTR_CTXT_INV */ - MBOX_OP_INTR_CTXT_INV_RESP, - /** @MBOX_OP_RESET_PREPARE_RESP: response to @MBOX_OP_RESET_PREPARE */ - MBOX_OP_RESET_PREPARE_RESP, - /** @MBOX_OP_RESET_DONE_RESP: response to @MBOX_OP_PF_VF_RESET */ - MBOX_OP_RESET_DONE_RESP, - /** @MBOX_OP_REG_LIST_READ_RESP: response to @MBOX_OP_REG_LIST_READ */ - MBOX_OP_REG_LIST_READ_RESP, - /** @MBOX_OP_PF_BYE_RESP: response to @MBOX_OP_PF_BYE */ - MBOX_OP_PF_BYE_RESP, - /** @MBOX_OP_PF_RESET_VF_BYE_RESP: - * response to @MBOX_OP_PF_RESET_VF_BYE - */ - MBOX_OP_PF_RESET_VF_BYE_RESP, - /** @MBOX_OP_MAX: total mbox opcodes*/ - MBOX_OP_MAX -}; - -/** - * struct mbox_msg_hdr - mailbox message header - */ -struct mbox_msg_hdr { - /** @op: opcode */ - uint8_t op; - /** @status: execution status */ - char status; - /** @src_func_id: src function */ - uint16_t src_func_id; - /** @dst_func_id: dst function */ - uint16_t dst_func_id; -}; - -/** - * struct mbox_msg_fmap - FMAP programming command - */ -struct mbox_msg_hello { - /** @hdr: mailbox message header */ - struct mbox_msg_hdr hdr; - /** @qbase: start queue number in the queue range */ - uint32_t qbase; - /** @qmax: max queue number in the queue range(0-2k) */ - uint32_t qmax; - /** @dev_cap: device capability */ - struct qdma_dev_attributes dev_cap; - /** @dma_device_index: dma_device_index */ - uint32_t dma_device_index; -}; - -/** - * struct mbox_msg_active_qcnt - get active queue count command - */ -struct mbox_msg_active_qcnt { - /** @hdr: mailbox message header */ - struct mbox_msg_hdr hdr; - /** @h2c_queues: number of h2c queues */ - uint32_t h2c_queues; - /** @c2h_queues: number of c2h queues */ - uint32_t c2h_queues; - /** @cmpt_queues: number of cmpt queues */ - uint32_t cmpt_queues; -}; - -/** - * struct mbox_msg_fmap - FMAP programming command - */ -struct mbox_msg_fmap { - /** @hdr: mailbox message header */ - struct mbox_msg_hdr hdr; - /** @qbase: start queue number in the queue range */ - int qbase; - /** @qmax: max queue number in the queue range(0-2k) */ - uint32_t qmax; -}; - -/** - * struct mbox_msg_csr - mailbox csr reading message - */ -struct mbox_msg_csr { - /** @hdr - mailbox message header */ - struct mbox_msg_hdr hdr; - /** @csr_info: csr info data strucutre */ - struct qdma_csr_info csr_info; -}; - -/** - * struct mbox_msg_q_nitfy - queue add/del notify message - */ -struct mbox_msg_q_nitfy { - /** @hdr - mailbox message header */ - struct mbox_msg_hdr hdr; - /** @qid_hw: queue ID */ - uint16_t qid_hw; - /** @q_type: type of q */ - enum qdma_dev_q_type q_type; -}; - -/** - * @struct - mbox_msg_qctxt - * @brief queue context mailbox message header - */ -struct mbox_msg_qctxt { - /** @hdr: mailbox message header*/ - struct mbox_msg_hdr hdr; - /** @qid_hw: queue ID */ - uint16_t qid_hw; - /** @st: streaming mode */ - uint8_t st:1; - /** @c2h: c2h direction */ - uint8_t c2h:1; - /** @cmpt_ctxt_type: completion context type */ - enum mbox_cmpt_ctxt_type cmpt_ctxt_type:2; - /** @rsvd: reserved */ - uint8_t rsvd:4; - /** union compiled_message - complete hw configuration */ - union { - /** @descq_conf: mailbox message for queue context write*/ - struct mbox_descq_conf descq_conf; - /** @descq_ctxt: mailbox message for queue context read*/ - struct qdma_descq_context descq_ctxt; - }; -}; - -/** - * @struct - mbox_intr_ctxt - * @brief queue context mailbox message header - */ -struct mbox_intr_ctxt { - /** @hdr: mailbox message header*/ - struct mbox_msg_hdr hdr; - /** interrupt context mailbox message */ - struct mbox_msg_intr_ctxt ctxt; -}; - -/** - * @struct - mbox_read_reg_list - * @brief read register mailbox message header - */ -struct mbox_read_reg_list { - /** @hdr: mailbox message header*/ - struct mbox_msg_hdr hdr; - /** @group_num: reg group to read */ - uint16_t group_num; - /** @num_regs: number of registers to read */ - uint16_t num_regs; - /** @reg_list: register list */ - struct qdma_reg_data reg_list[QDMA_MAX_REGISTER_DUMP]; -}; - -union qdma_mbox_txrx { - /** mailbox message header*/ - struct mbox_msg_hdr hdr; - /** hello mailbox message */ - struct mbox_msg_hello hello; - /** fmap mailbox message */ - struct mbox_msg_fmap fmap; - /** interrupt context mailbox message */ - struct mbox_intr_ctxt intr_ctxt; - /** queue context mailbox message*/ - struct mbox_msg_qctxt qctxt; - /** global csr mailbox message */ - struct mbox_msg_csr csr; - /** acive q count */ - struct mbox_msg_active_qcnt qcnt; - /** q add/del notify message */ - struct mbox_msg_q_nitfy q_notify; - /** reg list mailbox message */ - struct mbox_read_reg_list reg_read_list; - /** buffer to hold raw data between pf and vf */ - uint32_t raw[MBOX_MSG_REG_MAX]; -}; - - -static inline uint32_t get_mbox_offset(void *dev_hndl, uint8_t is_vf) -{ - uint32_t mbox_base; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - mbox_base = (is_vf) ? - hw->mbox_base_vf : hw->mbox_base_pf; - - return mbox_base; -} - -static inline void mbox_pf_hw_clear_func_ack(void *dev_hndl, uint16_t func_id) -{ - int idx = func_id / 32; /* bitmask, uint32_t reg */ - int bit = func_id % 32; - uint32_t mbox_base = get_mbox_offset(dev_hndl, 0); - - /* clear the function's ack status */ - qdma_reg_write(dev_hndl, - mbox_base + MBOX_PF_ACK_BASE + idx * MBOX_PF_ACK_STEP, - (1 << bit)); -} - -static void qdma_mbox_memcpy(void *to, void *from, uint8_t size) -{ - uint8_t i; - uint8_t *_to = (uint8_t *)to; - uint8_t *_from = (uint8_t *)from; - - for (i = 0; i < size; i++) - _to[i] = _from[i]; -} - -static void qdma_mbox_memset(void *to, uint8_t val, uint8_t size) -{ - uint8_t i; - uint8_t *_to = (uint8_t *)to; - - for (i = 0; i < size; i++) - _to[i] = val; -} - -static int get_ring_idx(void *dev_hndl, uint16_t ring_sz, uint16_t *rng_idx) -{ - uint32_t rng_sz[QDMA_GLOBAL_CSR_ARRAY_SZ] = { 0 }; - int i, rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, rng_sz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ); - - if (rv) - return rv; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (ring_sz == (rng_sz[i] - 1)) { - *rng_idx = i; - return QDMA_SUCCESS; - } - } - - qdma_log_error("%s: Ring size not found, err:%d\n", - __func__, -QDMA_ERR_MBOX_INV_RINGSZ); - return -QDMA_ERR_MBOX_INV_RINGSZ; -} - -static int get_buf_idx(void *dev_hndl, uint16_t buf_sz, uint16_t *buf_idx) -{ - uint32_t c2h_buf_sz[QDMA_GLOBAL_CSR_ARRAY_SZ] = { 0 }; - int i, rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, c2h_buf_sz, - QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_READ); - if (rv) - return rv; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (c2h_buf_sz[i] == buf_sz) { - *buf_idx = i; - return QDMA_SUCCESS; - } - } - - qdma_log_error("%s: Buf index not found, err:%d\n", - __func__, -QDMA_ERR_MBOX_INV_BUFSZ); - return -QDMA_ERR_MBOX_INV_BUFSZ; -} - -static int get_cntr_idx(void *dev_hndl, uint8_t cntr_val, uint8_t *cntr_idx) -{ - uint32_t cntr_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = { 0 }; - int i, rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, cntr_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_READ); - - if (rv) - return rv; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (cntr_th[i] == cntr_val) { - *cntr_idx = i; - return QDMA_SUCCESS; - } - } - - qdma_log_error("%s: Counter val not found, err:%d\n", - __func__, -QDMA_ERR_MBOX_INV_CNTR_TH); - return -QDMA_ERR_MBOX_INV_CNTR_TH; -} - -static int get_tmr_idx(void *dev_hndl, uint8_t tmr_val, uint8_t *tmr_idx) -{ - uint32_t tmr_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = { 0 }; - int i, rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, tmr_th, - QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_READ); - if (rv) - return rv; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (tmr_th[i] == tmr_val) { - *tmr_idx = i; - return QDMA_SUCCESS; - } - } - - qdma_log_error("%s: Timer val not found, err:%d\n", - __func__, -QDMA_ERR_MBOX_INV_TMR_TH); - return -QDMA_ERR_MBOX_INV_TMR_TH; -} - -static int mbox_compose_sw_context(void *dev_hndl, - struct mbox_msg_qctxt *qctxt, - struct qdma_descq_sw_ctxt *sw_ctxt) -{ - uint16_t rng_idx = 0; - int rv = QDMA_SUCCESS; - - if (!qctxt || !sw_ctxt) { - qdma_log_error("%s: qctxt=%p sw_ctxt=%p, err:%d\n", - __func__, - qctxt, sw_ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_ring_idx(dev_hndl, qctxt->descq_conf.ringsz, &rng_idx); - if (rv < 0) { - qdma_log_error("%s: failed to get ring index, err:%d\n", - __func__, rv); - return rv; - } - /* compose sw context */ - sw_ctxt->vec = qctxt->descq_conf.intr_id; - sw_ctxt->intr_aggr = qctxt->descq_conf.intr_aggr; - - sw_ctxt->ring_bs_addr = qctxt->descq_conf.ring_bs_addr; - sw_ctxt->wbi_chk = qctxt->descq_conf.wbi_chk; - sw_ctxt->wbi_intvl_en = qctxt->descq_conf.wbi_intvl_en; - sw_ctxt->rngsz_idx = rng_idx; - sw_ctxt->bypass = qctxt->descq_conf.en_bypass; - sw_ctxt->wbk_en = qctxt->descq_conf.wbk_en; - sw_ctxt->irq_en = qctxt->descq_conf.irq_en; - sw_ctxt->is_mm = ~qctxt->st; - sw_ctxt->mm_chn = 0; - sw_ctxt->qen = 1; - sw_ctxt->frcd_en = qctxt->descq_conf.forced_en; - - sw_ctxt->desc_sz = qctxt->descq_conf.desc_sz; - - /* pidx = 0; irq_ack = 0 */ - sw_ctxt->fnc_id = qctxt->descq_conf.func_id; - sw_ctxt->irq_arm = qctxt->descq_conf.irq_arm; - - if (qctxt->st && qctxt->c2h) { - sw_ctxt->irq_en = 0; - sw_ctxt->irq_arm = 0; - sw_ctxt->wbk_en = 0; - sw_ctxt->wbi_chk = 0; - } - - return QDMA_SUCCESS; -} - -static int mbox_compose_prefetch_context(void *dev_hndl, - struct mbox_msg_qctxt *qctxt, - struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - uint16_t buf_idx = 0; - int rv = QDMA_SUCCESS; - - if (!qctxt || !pfetch_ctxt) { - qdma_log_error("%s: qctxt=%p pfetch_ctxt=%p, err:%d\n", - __func__, - qctxt, - pfetch_ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - rv = get_buf_idx(dev_hndl, qctxt->descq_conf.bufsz, &buf_idx); - if (rv < 0) { - qdma_log_error("%s: failed to get buf index, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return rv; - } - /* prefetch context */ - pfetch_ctxt->valid = 1; - pfetch_ctxt->bypass = qctxt->descq_conf.en_bypass_prefetch; - pfetch_ctxt->bufsz_idx = buf_idx; - pfetch_ctxt->pfch_en = qctxt->descq_conf.pfch_en; - - return QDMA_SUCCESS; -} - - -static int mbox_compose_cmpt_context(void *dev_hndl, - struct mbox_msg_qctxt *qctxt, - struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - uint16_t rng_idx = 0; - uint8_t cntr_idx = 0, tmr_idx = 0; - int rv = QDMA_SUCCESS; - - if (!qctxt || !cmpt_ctxt) { - qdma_log_error("%s: qctxt=%p cmpt_ctxt=%p, err:%d\n", - __func__, qctxt, cmpt_ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - rv = get_cntr_idx(dev_hndl, qctxt->descq_conf.cnt_thres, &cntr_idx); - if (rv < 0) - return rv; - rv = get_tmr_idx(dev_hndl, qctxt->descq_conf.timer_thres, &tmr_idx); - if (rv < 0) - return rv; - rv = get_ring_idx(dev_hndl, qctxt->descq_conf.cmpt_ringsz, &rng_idx); - if (rv < 0) - return rv; - /* writeback context */ - - cmpt_ctxt->bs_addr = qctxt->descq_conf.cmpt_ring_bs_addr; - cmpt_ctxt->en_stat_desc = qctxt->descq_conf.cmpl_stat_en; - cmpt_ctxt->en_int = qctxt->descq_conf.cmpt_int_en; - cmpt_ctxt->trig_mode = qctxt->descq_conf.triggermode; - cmpt_ctxt->fnc_id = qctxt->descq_conf.func_id; - cmpt_ctxt->timer_idx = tmr_idx; - cmpt_ctxt->counter_idx = cntr_idx; - cmpt_ctxt->color = 1; - cmpt_ctxt->ringsz_idx = rng_idx; - - cmpt_ctxt->desc_sz = qctxt->descq_conf.cmpt_desc_sz; - - cmpt_ctxt->valid = 1; - - cmpt_ctxt->ovf_chk_dis = qctxt->descq_conf.dis_overflow_check; - cmpt_ctxt->vec = qctxt->descq_conf.intr_id; - cmpt_ctxt->int_aggr = qctxt->descq_conf.intr_aggr; - - return QDMA_SUCCESS; -} - -static int mbox_clear_queue_contexts(void *dev_hndl, uint8_t dma_device_index, - uint16_t func_id, uint16_t qid_hw, uint8_t st, - uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type) -{ - int rv; - int qbase; - uint32_t qmax; - enum qdma_dev_q_range q_range; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - if (cmpt_ctxt_type == QDMA_MBOX_CMPT_CTXT_ONLY) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } else { - rv = qdma_dev_qinfo_get(dma_device_index, - func_id, &qbase, &qmax); - if (rv < 0) { - qdma_log_error("%s: failed to get qinfo, err:%d\n", - __func__, rv); - return rv; - } - - q_range = qdma_dev_is_queue_in_range(dma_device_index, - func_id, qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) { - qdma_log_error("%s: q_range invalid, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_sw_ctx_conf(dev_hndl, c2h, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear sw_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_hw_ctx_conf(dev_hndl, c2h, qid_hw, NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear hw_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_credit_ctx_conf(dev_hndl, c2h, qid_hw, NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear cr_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - if (st && c2h) { - rv = hw->qdma_pfetch_ctx_conf(dev_hndl, qid_hw, - NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s:clear pfetch ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - if ((cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - } - - return QDMA_SUCCESS; -} - -static int mbox_invalidate_queue_contexts(void *dev_hndl, - uint8_t dma_device_index, uint16_t func_id, - uint16_t qid_hw, uint8_t st, - uint8_t c2h, enum mbox_cmpt_ctxt_type cmpt_ctxt_type) -{ - int rv; - int qbase; - uint32_t qmax; - enum qdma_dev_q_range q_range; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - if (cmpt_ctxt_type == QDMA_MBOX_CMPT_CTXT_ONLY) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: inv cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } else { - rv = qdma_dev_qinfo_get(dma_device_index, func_id, - &qbase, &qmax); - if (rv < 0) { - qdma_log_error("%s: failed to get qinfo, err:%d\n", - __func__, rv); - return rv; - } - - q_range = qdma_dev_is_queue_in_range(dma_device_index, - func_id, qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) { - qdma_log_error("%s: Invalid qrange, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_sw_ctx_conf(dev_hndl, c2h, qid_hw, - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: inv sw ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_hw_ctx_conf(dev_hndl, c2h, qid_hw, NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: clear hw_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_credit_ctx_conf(dev_hndl, c2h, qid_hw, NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: clear cr_ctxt, err:%d\n", - __func__, rv); - return rv; - } - - if (st && c2h) { - rv = hw->qdma_pfetch_ctx_conf(dev_hndl, qid_hw, - NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: inv pfetch ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - if ((cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - NULL, - QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - qdma_log_error("%s: inv cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - } - - return QDMA_SUCCESS; -} - -static int mbox_write_queue_contexts(void *dev_hndl, uint8_t dma_device_index, - struct mbox_msg_qctxt *qctxt) -{ - int rv; - int qbase; - uint32_t qmax; - enum qdma_dev_q_range q_range; - struct qdma_descq_context descq_ctxt; - uint16_t qid_hw = qctxt->qid_hw; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = qdma_dev_qinfo_get(dma_device_index, qctxt->descq_conf.func_id, - &qbase, &qmax); - if (rv < 0) - return rv; - - q_range = qdma_dev_is_queue_in_range(dma_device_index, - qctxt->descq_conf.func_id, - qctxt->qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) { - qdma_log_error("%s: Invalid qrange, err:%d\n", - __func__, rv); - return rv; - } - - qdma_mbox_memset(&descq_ctxt, 0, sizeof(struct qdma_descq_context)); - - if (qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_CTXT_ONLY) { - rv = mbox_compose_cmpt_context(dev_hndl, qctxt, - &descq_ctxt.cmpt_ctxt); - if (rv < 0) - return rv; - - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - qdma_log_error("%s: clear cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &descq_ctxt.cmpt_ctxt, QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s: write cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - - } else { - rv = mbox_compose_sw_context(dev_hndl, qctxt, - &descq_ctxt.sw_ctxt); - if (rv < 0) - return rv; - - if (qctxt->st && qctxt->c2h) { - rv = mbox_compose_prefetch_context(dev_hndl, qctxt, - &descq_ctxt.pfetch_ctxt); - if (rv < 0) - return rv; - } - - if ((qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = mbox_compose_cmpt_context(dev_hndl, qctxt, - &descq_ctxt.cmpt_ctxt); - if (rv < 0) - return rv; - } - - rv = mbox_clear_queue_contexts(dev_hndl, dma_device_index, - qctxt->descq_conf.func_id, - qctxt->qid_hw, - qctxt->st, - qctxt->c2h, - qctxt->cmpt_ctxt_type); - if (rv < 0) - return rv; - rv = hw->qdma_sw_ctx_conf(dev_hndl, qctxt->c2h, qid_hw, - &descq_ctxt.sw_ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s: write sw ctxt, err:%d\n", - __func__, rv); - return rv; - } - - if (qctxt->st && qctxt->c2h) { - rv = hw->qdma_pfetch_ctx_conf(dev_hndl, qid_hw, - &descq_ctxt.pfetch_ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s:write pfetch ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - if ((qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (qctxt->cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &descq_ctxt.cmpt_ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s: write cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - } - return QDMA_SUCCESS; -} - -static int mbox_read_queue_contexts(void *dev_hndl, uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - struct qdma_descq_context *ctxt) -{ - int rv; - struct qdma_hw_access *hw = NULL; - - qdma_get_hw_access(dev_hndl, &hw); - - rv = hw->qdma_sw_ctx_conf(dev_hndl, c2h, qid_hw, &ctxt->sw_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read sw ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_hw_ctx_conf(dev_hndl, c2h, qid_hw, &ctxt->hw_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read hw ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_credit_ctx_conf(dev_hndl, c2h, qid_hw, &ctxt->cr_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read credit ctxt, err:%d\n", - __func__, rv); - return rv; - } - - rv = hw->qdma_fmap_conf(dev_hndl, func_id, &ctxt->fmap, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read fmap ctxt, err:%d\n", - __func__, rv); - return rv; - } - - if (st && c2h) { - rv = hw->qdma_pfetch_ctx_conf(dev_hndl, - qid_hw, &ctxt->pfetch_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read pfetch ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - if ((cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_MM) || - (cmpt_ctxt_type == QDMA_MBOX_CMPT_WITH_ST)) { - rv = hw->qdma_cmpt_ctx_conf(dev_hndl, - qid_hw, &ctxt->cmpt_ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s: read cmpt ctxt, err:%d\n", - __func__, rv); - return rv; - } - } - - return QDMA_SUCCESS; -} - -int qdma_mbox_pf_rcv_msg_handler(void *dev_hndl, uint8_t dma_device_index, - uint16_t func_id, uint32_t *rcv_msg, - uint32_t *resp_msg) -{ - union qdma_mbox_txrx *rcv = (union qdma_mbox_txrx *)rcv_msg; - union qdma_mbox_txrx *resp = (union qdma_mbox_txrx *)resp_msg; - struct mbox_msg_hdr *hdr = &rcv->hdr; - struct qdma_hw_access *hw = NULL; - int rv = QDMA_SUCCESS; - int ret = 0; - - if (!rcv) { - qdma_log_error("%s: rcv_msg=%p failure:%d\n", - __func__, rcv, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - qdma_get_hw_access(dev_hndl, &hw); - - switch (rcv->hdr.op) { - case MBOX_OP_VF_BYE: - { - struct qdma_fmap_cfg fmap; - - fmap.qbase = 0; - fmap.qmax = 0; - rv = hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, &fmap, - QDMA_HW_ACCESS_WRITE); - - qdma_dev_entry_destroy(dma_device_index, hdr->src_func_id); - - ret = QDMA_MBOX_VF_OFFLINE; - } - break; - case MBOX_OP_PF_RESET_VF_BYE: - { - struct qdma_fmap_cfg fmap; - - fmap.qbase = 0; - fmap.qmax = 0; - rv = hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, &fmap, - QDMA_HW_ACCESS_WRITE); - - qdma_dev_entry_destroy(dma_device_index, hdr->src_func_id); - - ret = QDMA_MBOX_VF_RESET_BYE; - } - break; - case MBOX_OP_HELLO: - { - struct mbox_msg_fmap *fmap = &rcv->fmap; - struct qdma_fmap_cfg fmap_cfg; - struct mbox_msg_hello *rsp_hello = &resp->hello; - - rv = qdma_dev_qinfo_get(dma_device_index, hdr->src_func_id, - &fmap->qbase, &fmap->qmax); - if (rv < 0) - rv = qdma_dev_entry_create(dma_device_index, - hdr->src_func_id); - - if (!rv) { - rsp_hello->qbase = fmap->qbase; - rsp_hello->qmax = fmap->qmax; - rsp_hello->dma_device_index = dma_device_index; - hw->qdma_get_device_attributes(dev_hndl, - &rsp_hello->dev_cap); - } - qdma_mbox_memset(&fmap_cfg, 0, - sizeof(struct qdma_fmap_cfg)); - hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, &fmap_cfg, - QDMA_HW_ACCESS_WRITE); - - ret = QDMA_MBOX_VF_ONLINE; - } - break; - case MBOX_OP_FMAP: - { - struct mbox_msg_fmap *fmap = &rcv->fmap; - struct qdma_fmap_cfg fmap_cfg; - - fmap_cfg.qbase = fmap->qbase; - fmap_cfg.qmax = fmap->qmax; - - rv = hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, - &fmap_cfg, QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - qdma_log_error("%s: failed to write fmap, err:%d\n", - __func__, rv); - return rv; - } - } - break; - case MBOX_OP_CSR: - { - struct mbox_msg_csr *rsp_csr = &resp->csr; - struct qdma_dev_attributes dev_cap; - - uint32_t ringsz[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - uint32_t bufsz[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - uint32_t tmr_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - uint32_t cntr_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - int i; - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, ringsz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ); - if (rv < 0) - goto exit_func; - - hw->qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) { - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, bufsz, - QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_READ); - if (rv < 0 && - (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) - goto exit_func; - } - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, tmr_th, - QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_READ); - if (rv < 0 && - (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) - goto exit_func; - - rv = hw->qdma_global_csr_conf(dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, cntr_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_READ); - if (rv < 0 && - (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) - goto exit_func; - } - - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - rsp_csr->csr_info.ringsz[i] = ringsz[i] & - 0xFFFF; - if (!rv) { - rsp_csr->csr_info.bufsz[i] = bufsz[i] & 0xFFFF; - rsp_csr->csr_info.timer_cnt[i] = tmr_th[i] & - 0xFF; - rsp_csr->csr_info.cnt_thres[i] = cntr_th[i] & - 0xFF; - } - } - - if (rv == -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED) - rv = QDMA_SUCCESS; - } - break; - case MBOX_OP_QREQ: - { - struct mbox_msg_fmap *fmap = &rcv->fmap; - - rv = qdma_dev_update(dma_device_index, - hdr->src_func_id, - fmap->qmax, &fmap->qbase); - if (rv == 0) - rv = qdma_dev_qinfo_get(dma_device_index, - hdr->src_func_id, - &resp->fmap.qbase, - &resp->fmap.qmax); - if (rv < 0) - rv = -QDMA_ERR_MBOX_NUM_QUEUES; - else { - struct qdma_fmap_cfg fmap_cfg; - - qdma_mbox_memset(&fmap_cfg, 0, - sizeof(struct qdma_fmap_cfg)); - hw->qdma_fmap_conf(dev_hndl, hdr->src_func_id, - &fmap_cfg, QDMA_HW_ACCESS_WRITE); - } - } - break; - case MBOX_OP_QNOTIFY_ADD: - { - struct mbox_msg_q_nitfy *q_notify = &rcv->q_notify; - enum qdma_dev_q_range q_range; - - q_range = qdma_dev_is_queue_in_range( - dma_device_index, - q_notify->hdr.src_func_id, - q_notify->qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) - rv = -QDMA_ERR_MBOX_INV_QID; - else - rv = qdma_dev_increment_active_queue( - dma_device_index, - q_notify->hdr.src_func_id, - q_notify->q_type); - } - break; - case MBOX_OP_QNOTIFY_DEL: - { - struct mbox_msg_q_nitfy *q_notify = &rcv->q_notify; - enum qdma_dev_q_range q_range; - - q_range = qdma_dev_is_queue_in_range( - dma_device_index, - q_notify->hdr.src_func_id, - q_notify->qid_hw); - if (q_range != QDMA_DEV_Q_IN_RANGE) - rv = -QDMA_ERR_MBOX_INV_QID; - else - rv = qdma_dev_decrement_active_queue( - dma_device_index, - q_notify->hdr.src_func_id, - q_notify->q_type); - } - break; - case MBOX_OP_GET_QACTIVE_CNT: - { - rv = qdma_get_device_active_queue_count( - dma_device_index, - rcv->hdr.src_func_id, - QDMA_DEV_Q_TYPE_H2C); - - resp->qcnt.h2c_queues = rv; - - rv = qdma_get_device_active_queue_count( - dma_device_index, - rcv->hdr.src_func_id, - QDMA_DEV_Q_TYPE_C2H); - - resp->qcnt.c2h_queues = rv; - - rv = qdma_get_device_active_queue_count( - dma_device_index, - rcv->hdr.src_func_id, - QDMA_DEV_Q_TYPE_CMPT); - - resp->qcnt.cmpt_queues = rv; - } - break; - case MBOX_OP_INTR_CTXT_WRT: - { - struct mbox_msg_intr_ctxt *ictxt = &rcv->intr_ctxt.ctxt; - struct qdma_indirect_intr_ctxt *ctxt; - uint8_t i; - uint32_t ring_index; - - for (i = 0; i < ictxt->num_rings; i++) { - ring_index = ictxt->ring_index_list[i]; - - ctxt = &ictxt->ictxt[i]; - rv = hw->qdma_indirect_intr_ctx_conf(dev_hndl, - ring_index, - NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) - resp->hdr.status = rv; - rv = hw->qdma_indirect_intr_ctx_conf(dev_hndl, - ring_index, ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) - resp->hdr.status = rv; - } - } - break; - case MBOX_OP_INTR_CTXT_RD: - { - struct mbox_msg_intr_ctxt *rcv_ictxt = &rcv->intr_ctxt.ctxt; - struct mbox_msg_intr_ctxt *rsp_ictxt = &resp->intr_ctxt.ctxt; - uint8_t i; - uint32_t ring_index; - - for (i = 0; i < rcv_ictxt->num_rings; i++) { - ring_index = rcv_ictxt->ring_index_list[i]; - - rv = hw->qdma_indirect_intr_ctx_conf(dev_hndl, - ring_index, - &rsp_ictxt->ictxt[i], - QDMA_HW_ACCESS_READ); - if (rv < 0) - resp->hdr.status = rv; - - } - } - break; - case MBOX_OP_INTR_CTXT_CLR: - { - int i; - struct mbox_msg_intr_ctxt *ictxt = &rcv->intr_ctxt.ctxt; - - for (i = 0; i < ictxt->num_rings; i++) { - rv = hw->qdma_indirect_intr_ctx_conf( - dev_hndl, - ictxt->ring_index_list[i], - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) - resp->hdr.status = rv; - } - } - break; - case MBOX_OP_INTR_CTXT_INV: - { - struct mbox_msg_intr_ctxt *ictxt = &rcv->intr_ctxt.ctxt; - int i; - - for (i = 0; i < ictxt->num_rings; i++) { - rv = hw->qdma_indirect_intr_ctx_conf( - dev_hndl, - ictxt->ring_index_list[i], - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) - resp->hdr.status = rv; - } - } - break; - case MBOX_OP_QCTXT_INV: - { - struct mbox_msg_qctxt *qctxt = &rcv->qctxt; - - rv = mbox_invalidate_queue_contexts(dev_hndl, - dma_device_index, - hdr->src_func_id, - qctxt->qid_hw, - qctxt->st, - qctxt->c2h, - qctxt->cmpt_ctxt_type); - } - break; - case MBOX_OP_QCTXT_CLR: - { - struct mbox_msg_qctxt *qctxt = &rcv->qctxt; - - rv = mbox_clear_queue_contexts(dev_hndl, - dma_device_index, - hdr->src_func_id, - qctxt->qid_hw, - qctxt->st, - qctxt->c2h, - qctxt->cmpt_ctxt_type); - } - break; - case MBOX_OP_QCTXT_RD: - { - struct mbox_msg_qctxt *qctxt = &rcv->qctxt; - - rv = mbox_read_queue_contexts(dev_hndl, hdr->src_func_id, - qctxt->qid_hw, - qctxt->st, - qctxt->c2h, - qctxt->cmpt_ctxt_type, - &resp->qctxt.descq_ctxt); - } - break; - case MBOX_OP_QCTXT_WRT: - { - struct mbox_msg_qctxt *qctxt = &rcv->qctxt; - - qctxt->descq_conf.func_id = hdr->src_func_id; - rv = mbox_write_queue_contexts(dev_hndl, - dma_device_index, qctxt); - } - break; - case MBOX_OP_RESET_PREPARE_RESP: - return QDMA_MBOX_VF_RESET; - case MBOX_OP_RESET_DONE_RESP: - return QDMA_MBOX_PF_RESET_DONE; - case MBOX_OP_REG_LIST_READ: - { - struct mbox_read_reg_list *rcv_read_reg_list = - &rcv->reg_read_list; - struct mbox_read_reg_list *rsp_read_reg_list = - &resp->reg_read_list; - - rv = hw->qdma_read_reg_list((void *)dev_hndl, 1, - rcv_read_reg_list->group_num, - &rsp_read_reg_list->num_regs, - rsp_read_reg_list->reg_list); - - if (rv < 0 || rsp_read_reg_list->num_regs == 0) { - rv = -QDMA_ERR_MBOX_REG_READ_FAILED; - goto exit_func; - } - - } - break; - case MBOX_OP_PF_BYE_RESP: - return QDMA_MBOX_PF_BYE; - default: - qdma_log_error("%s: op=%d invalid, err:%d\n", - __func__, - rcv->hdr.op, - -QDMA_ERR_MBOX_INV_MSG); - return -QDMA_ERR_MBOX_INV_MSG; - break; - } - -exit_func: - resp->hdr.op = rcv->hdr.op + MBOX_MSG_OP_RSP_OFFSET; - resp->hdr.dst_func_id = rcv->hdr.src_func_id; - resp->hdr.src_func_id = func_id; - - resp->hdr.status = rv; - - return ret; -} - -int qmda_mbox_compose_vf_online(uint16_t func_id, - uint16_t qmax, int *qbase, uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_HELLO; - msg->hdr.src_func_id = func_id; - msg->fmap.qbase = (uint32_t)*qbase; - msg->fmap.qmax = qmax; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_offline(uint16_t func_id, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_VF_BYE; - msg->hdr.src_func_id = func_id; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_reset_offline(uint16_t func_id, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_PF_RESET_VF_BYE; - msg->hdr.src_func_id = func_id; - - return QDMA_SUCCESS; -} - - - -int qdma_mbox_compose_vf_qreq(uint16_t func_id, - uint16_t qmax, int qbase, uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QREQ; - msg->hdr.src_func_id = func_id; - msg->fmap.qbase = qbase; - msg->fmap.qmax = qmax; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_notify_qadd(uint16_t func_id, - uint16_t qid_hw, - enum qdma_dev_q_type q_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QNOTIFY_ADD; - msg->hdr.src_func_id = func_id; - msg->q_notify.qid_hw = qid_hw; - msg->q_notify.q_type = q_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_get_device_active_qcnt(uint16_t func_id, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_GET_QACTIVE_CNT; - msg->hdr.src_func_id = func_id; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_notify_qdel(uint16_t func_id, - uint16_t qid_hw, - enum qdma_dev_q_type q_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QNOTIFY_DEL; - msg->hdr.src_func_id = func_id; - msg->q_notify.qid_hw = qid_hw; - msg->q_notify.q_type = q_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_fmap_prog(uint16_t func_id, - uint16_t qmax, int qbase, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_FMAP; - msg->hdr.src_func_id = func_id; - msg->fmap.qbase = (uint32_t)qbase; - msg->fmap.qmax = qmax; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_qctxt_write(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - struct mbox_descq_conf *descq_conf, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QCTXT_WRT; - msg->hdr.src_func_id = func_id; - msg->qctxt.qid_hw = qid_hw; - msg->qctxt.c2h = c2h; - msg->qctxt.st = st; - msg->qctxt.cmpt_ctxt_type = cmpt_ctxt_type; - - qdma_mbox_memcpy(&msg->qctxt.descq_conf, descq_conf, - sizeof(struct mbox_descq_conf)); - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_qctxt_read(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QCTXT_RD; - msg->hdr.src_func_id = func_id; - msg->qctxt.qid_hw = qid_hw; - msg->qctxt.c2h = c2h; - msg->qctxt.st = st; - msg->qctxt.cmpt_ctxt_type = cmpt_ctxt_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_qctxt_invalidate(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QCTXT_INV; - msg->hdr.src_func_id = func_id; - msg->qctxt.qid_hw = qid_hw; - msg->qctxt.c2h = c2h; - msg->qctxt.st = st; - msg->qctxt.cmpt_ctxt_type = cmpt_ctxt_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_qctxt_clear(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_QCTXT_CLR; - msg->hdr.src_func_id = func_id; - msg->qctxt.qid_hw = qid_hw; - msg->qctxt.c2h = c2h; - msg->qctxt.st = st; - msg->qctxt.cmpt_ctxt_type = cmpt_ctxt_type; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_csr_read(uint16_t func_id, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_CSR; - msg->hdr.src_func_id = func_id; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_reg_read(uint16_t func_id, - uint16_t group_num, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_REG_LIST_READ; - msg->hdr.src_func_id = func_id; - msg->reg_read_list.group_num = group_num; - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_intr_ctxt_write(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_INTR_CTXT_WRT; - msg->hdr.src_func_id = func_id; - qdma_mbox_memcpy(&msg->intr_ctxt.ctxt, intr_ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_intr_ctxt_read(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_INTR_CTXT_RD; - msg->hdr.src_func_id = func_id; - qdma_mbox_memcpy(&msg->intr_ctxt.ctxt, intr_ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_intr_ctxt_clear(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_INTR_CTXT_CLR; - msg->hdr.src_func_id = func_id; - qdma_mbox_memcpy(&msg->intr_ctxt.ctxt, intr_ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return QDMA_SUCCESS; -} - -int qdma_mbox_compose_vf_intr_ctxt_invalidate(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) { - qdma_log_error("%s: raw_data=%p, err:%d\n", - __func__, raw_data, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_INTR_CTXT_INV; - msg->hdr.src_func_id = func_id; - qdma_mbox_memcpy(&msg->intr_ctxt.ctxt, intr_ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return QDMA_SUCCESS; -} - -uint8_t qdma_mbox_is_msg_response(uint32_t *send_data, uint32_t *rcv_data) -{ - union qdma_mbox_txrx *tx_msg = (union qdma_mbox_txrx *)send_data; - union qdma_mbox_txrx *rx_msg = (union qdma_mbox_txrx *)rcv_data; - - return ((tx_msg->hdr.op + MBOX_MSG_OP_RSP_OFFSET) == rx_msg->hdr.op) ? - 1 : 0; -} - -int qdma_mbox_vf_response_status(uint32_t *rcv_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - return msg->hdr.status; -} - -uint8_t qdma_mbox_vf_func_id_get(uint32_t *rcv_data, uint8_t is_vf) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - uint16_t func_id; - - if (is_vf) - func_id = msg->hdr.dst_func_id; - else - func_id = msg->hdr.src_func_id; - - return func_id; -} - -int qdma_mbox_vf_active_queues_get(uint32_t *rcv_data, - enum qdma_dev_q_type q_type) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - int queues = 0; - - if (q_type == QDMA_DEV_Q_TYPE_H2C) - queues = msg->qcnt.h2c_queues; - - if (q_type == QDMA_DEV_Q_TYPE_C2H) - queues = msg->qcnt.c2h_queues; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) - queues = msg->qcnt.cmpt_queues; - - return queues; -} - - -uint8_t qdma_mbox_vf_parent_func_id_get(uint32_t *rcv_data) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - return msg->hdr.src_func_id; -} - -int qdma_mbox_vf_dev_info_get(uint32_t *rcv_data, - struct qdma_dev_attributes *dev_cap, uint32_t *dma_device_index) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - *dev_cap = msg->hello.dev_cap; - *dma_device_index = msg->hello.dma_device_index; - - return msg->hdr.status; -} - -int qdma_mbox_vf_qinfo_get(uint32_t *rcv_data, int *qbase, uint16_t *qmax) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - *qbase = msg->fmap.qbase; - *qmax = msg->fmap.qmax; - - return msg->hdr.status; -} - -int qdma_mbox_vf_csr_get(uint32_t *rcv_data, struct qdma_csr_info *csr) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - qdma_mbox_memcpy(csr, &msg->csr.csr_info, sizeof(struct qdma_csr_info)); - - return msg->hdr.status; - -} - -int qdma_mbox_vf_reg_list_get(uint32_t *rcv_data, - uint16_t *num_regs, struct qdma_reg_data *reg_list) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - *num_regs = msg->reg_read_list.num_regs; - qdma_mbox_memcpy(reg_list, &(msg->reg_read_list.reg_list), - (*num_regs * sizeof(struct qdma_reg_data))); - - return msg->hdr.status; - -} - -int qdma_mbox_vf_context_get(uint32_t *rcv_data, - struct qdma_descq_context *ctxt) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - qdma_mbox_memcpy(ctxt, &msg->qctxt.descq_ctxt, - sizeof(struct qdma_descq_context)); - - return msg->hdr.status; -} - -int qdma_mbox_vf_intr_context_get(uint32_t *rcv_data, - struct mbox_msg_intr_ctxt *ictxt) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)rcv_data; - - qdma_mbox_memcpy(ictxt, &msg->intr_ctxt.ctxt, - sizeof(struct mbox_msg_intr_ctxt)); - - return msg->hdr.status; -} - -void qdma_mbox_pf_hw_clear_ack(void *dev_hndl) -{ - uint32_t v; - uint32_t reg; - int i; - uint32_t mbox_base = get_mbox_offset(dev_hndl, 0); - - reg = mbox_base + MBOX_PF_ACK_BASE; - - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - if ((v & F_MBOX_FN_STATUS_ACK) == 0) - return; - - for (i = 0; i < MBOX_PF_ACK_COUNT; i++, reg += MBOX_PF_ACK_STEP) { - v = qdma_reg_read(dev_hndl, reg); - - if (!v) - continue; - - /* clear the ack status */ - qdma_reg_write(dev_hndl, reg, v); - } -} - -int qdma_mbox_send(void *dev_hndl, uint8_t is_vf, uint32_t *raw_data) -{ - int i; - uint32_t reg = MBOX_OUT_MSG_BASE; - uint32_t v; - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - uint16_t dst_func_id = msg->hdr.dst_func_id; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - if (v & F_MBOX_FN_STATUS_OUT_MSG) - return -QDMA_ERR_MBOX_SEND_BUSY; - - if (!is_vf) - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_TARGET, - V_MBOX_FN_TARGET_ID(dst_func_id)); - - for (i = 0; i < MBOX_MSG_REG_MAX; i++, reg += MBOX_MSG_STEP) - qdma_reg_write(dev_hndl, mbox_base + reg, raw_data[i]); - - /* clear the outgoing ack */ - if (!is_vf) - mbox_pf_hw_clear_func_ack(dev_hndl, dst_func_id); - - - qdma_log_debug("%s %s tx from_id=%d, to_id=%d, opcode=0x%x\n", __func__, - is_vf?"VF":"PF", msg->hdr.src_func_id, - msg->hdr.dst_func_id, msg->hdr.op); - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_CMD, F_MBOX_FN_CMD_SND); - - return QDMA_SUCCESS; -} - -int qdma_mbox_rcv(void *dev_hndl, uint8_t is_vf, uint32_t *raw_data) -{ - uint32_t reg = MBOX_IN_MSG_BASE; - uint32_t v = 0; - int all_zero_msg = 1; - int i; - uint32_t from_id = 0; - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - - if (!(v & M_MBOX_FN_STATUS_IN_MSG)) - return -QDMA_ERR_MBOX_NO_MSG_IN; - - if (!is_vf) { - from_id = G_MBOX_FN_STATUS_SRC(v); - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_TARGET, from_id); - } - - for (i = 0; i < MBOX_MSG_REG_MAX; i++, reg += MBOX_MSG_STEP) { - raw_data[i] = qdma_reg_read(dev_hndl, mbox_base + reg); - /* if rcv'ed message is all zero, stop and disable the mbox, - * the h/w mbox is not working properly - */ - if (raw_data[i]) - all_zero_msg = 0; - } - - /* ack'ed the sender */ - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_CMD, F_MBOX_FN_CMD_RCV); - if (all_zero_msg) { - qdma_log_error("%s: Message recv'd is all zeros. failure:%d\n", - __func__, - -QDMA_ERR_MBOX_ALL_ZERO_MSG); - return -QDMA_ERR_MBOX_ALL_ZERO_MSG; - } - - - qdma_log_debug("%s %s fid=%d, opcode=0x%x\n", __func__, - is_vf?"VF":"PF", msg->hdr.dst_func_id, - msg->hdr.op); - if (!is_vf && (from_id != msg->hdr.src_func_id)) - msg->hdr.src_func_id = from_id; - - return QDMA_SUCCESS; -} - -void qdma_mbox_hw_init(void *dev_hndl, uint8_t is_vf) -{ - uint32_t v; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - if (is_vf) { - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - if (v & M_MBOX_FN_STATUS_IN_MSG) - qdma_reg_write(dev_hndl, mbox_base + MBOX_FN_CMD, - F_MBOX_FN_CMD_RCV); - } else - qdma_mbox_pf_hw_clear_ack(dev_hndl); -} - -void qdma_mbox_enable_interrupts(void *dev_hndl, uint8_t is_vf) -{ - int vector = 0x0; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - qdma_reg_write(dev_hndl, mbox_base + MBOX_ISR_VEC, vector); - qdma_reg_write(dev_hndl, mbox_base + MBOX_ISR_EN, 0x1); -} - -void qdma_mbox_disable_interrupts(void *dev_hndl, uint8_t is_vf) -{ - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - qdma_reg_write(dev_hndl, mbox_base + MBOX_ISR_EN, 0x0); -} - - -int qdma_mbox_compose_vf_reset_message(uint32_t *raw_data, uint8_t src_funcid, - uint8_t dest_funcid) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) - return -QDMA_ERR_INV_PARAM; - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_RESET_PREPARE; - msg->hdr.src_func_id = src_funcid; - msg->hdr.dst_func_id = dest_funcid; - return 0; -} - -int qdma_mbox_compose_pf_reset_done_message(uint32_t *raw_data, - uint8_t src_funcid, uint8_t dest_funcid) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) - return -QDMA_ERR_INV_PARAM; - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_RESET_DONE; - msg->hdr.src_func_id = src_funcid; - msg->hdr.dst_func_id = dest_funcid; - return 0; -} - -int qdma_mbox_compose_pf_offline(uint32_t *raw_data, uint8_t src_funcid, - uint8_t dest_funcid) -{ - union qdma_mbox_txrx *msg = (union qdma_mbox_txrx *)raw_data; - - if (!raw_data) - return -QDMA_ERR_INV_PARAM; - - qdma_mbox_memset(raw_data, 0, sizeof(union qdma_mbox_txrx)); - msg->hdr.op = MBOX_OP_PF_BYE; - msg->hdr.src_func_id = src_funcid; - msg->hdr.dst_func_id = dest_funcid; - return 0; -} - -int qdma_mbox_vf_rcv_msg_handler(uint32_t *rcv_msg, uint32_t *resp_msg) -{ - union qdma_mbox_txrx *rcv = (union qdma_mbox_txrx *)rcv_msg; - union qdma_mbox_txrx *resp = (union qdma_mbox_txrx *)resp_msg; - int rv = 0; - - switch (rcv->hdr.op) { - case MBOX_OP_RESET_PREPARE: - resp->hdr.op = rcv->hdr.op + MBOX_MSG_OP_RSP_OFFSET; - resp->hdr.dst_func_id = rcv->hdr.src_func_id; - resp->hdr.src_func_id = rcv->hdr.dst_func_id; - rv = QDMA_MBOX_VF_RESET; - break; - case MBOX_OP_RESET_DONE: - resp->hdr.op = rcv->hdr.op + MBOX_MSG_OP_RSP_OFFSET; - resp->hdr.dst_func_id = rcv->hdr.src_func_id; - resp->hdr.src_func_id = rcv->hdr.dst_func_id; - rv = QDMA_MBOX_PF_RESET_DONE; - break; - case MBOX_OP_PF_BYE: - resp->hdr.op = rcv->hdr.op + MBOX_MSG_OP_RSP_OFFSET; - resp->hdr.dst_func_id = rcv->hdr.src_func_id; - resp->hdr.src_func_id = rcv->hdr.dst_func_id; - rv = QDMA_MBOX_PF_BYE; - break; - default: - break; - } - return rv; -} - -uint8_t qdma_mbox_out_status(void *dev_hndl, uint8_t is_vf) -{ - uint32_t v; - uint32_t mbox_base = get_mbox_offset(dev_hndl, is_vf); - - v = qdma_reg_read(dev_hndl, mbox_base + MBOX_FN_STATUS); - if (v & F_MBOX_FN_STATUS_OUT_MSG) - return 1; - else - return 0; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_mbox_protocol.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_mbox_protocol.h deleted file mode 100755 index b29a8c0..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_mbox_protocol.h +++ /dev/null @@ -1,695 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_MBOX_PROTOCOL_H_ -#define __QDMA_MBOX_PROTOCOL_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA message box handling interface definitions - * - * Header file *qdma_mbox_protocol.h* defines data structures and function - * signatures exported for QDMA Mbox message handling. - */ - -#include "qdma_platform.h" -#include "qdma_resource_mgmt.h" - - -#define QDMA_MBOX_VF_ONLINE (1) -#define QDMA_MBOX_VF_OFFLINE (-1) -#define QDMA_MBOX_VF_RESET (2) -#define QDMA_MBOX_PF_RESET_DONE (3) -#define QDMA_MBOX_PF_BYE (4) -#define QDMA_MBOX_VF_RESET_BYE (5) - -/** mailbox register max */ -#define MBOX_MSG_REG_MAX 32 - -#define mbox_invalidate_msg(m) { (m)->hdr.op = MBOX_OP_NOOP; } - -/** - * struct mbox_descq_conf - collective bit-fields of all contexts - */ -struct mbox_descq_conf { - - /** @ring_bs_addr: ring base address */ - uint64_t ring_bs_addr; - /** @cmpt_ring_bs_addr: completion ring base address */ - uint64_t cmpt_ring_bs_addr; - /** @forced_en: enable fetch credit */ - uint32_t forced_en:1; - /** @en_bypass: bypass enable */ - uint32_t en_bypass:1; - /** @irq_arm: arm irq */ - uint32_t irq_arm:1; - /** @wbi_intvl_en: writeback interval enable */ - uint32_t wbi_intvl_en:1; - /** @wbi_chk: writeback pending check */ - uint32_t wbi_chk:1; - /** @at: address translation */ - uint32_t at:1; - /** @wbk_en: writeback enable */ - uint32_t wbk_en:1; - /** @irq_en: irq enable */ - uint32_t irq_en:1; - /** @pfch_en: prefetch enable */ - uint32_t pfch_en:1; - /** @en_bypass_prefetch: prefetch bypass enable */ - uint32_t en_bypass_prefetch:1; - /** @dis_overflow_check: disable overflow check */ - uint32_t dis_overflow_check:1; - /** @cmpt_int_en: completion interrupt enable */ - uint32_t cmpt_int_en:1; - /** @cmpt_at: completion address translation */ - uint32_t cmpt_at:1; - /** @cmpt_color: completion ring initial color bit */ - uint32_t cmpt_color:1; - /** @cmpt_full_upd: completion full update */ - uint32_t cmpt_full_upd:1; - /** @cmpl_stat_en: completion status enable */ - uint32_t cmpl_stat_en:1; - /** @desc_sz: descriptor size */ - uint32_t desc_sz:2; - /** @cmpt_desc_sz: completion ring descriptor size */ - uint32_t cmpt_desc_sz:2; - /** @triggermode: trigger mode */ - uint32_t triggermode:3; - /** @rsvd: reserved */ - uint32_t rsvd:9; - /** @func_id: function ID */ - uint32_t func_id:16; - /** @cnt_thres: counter threshold */ - uint32_t cnt_thres:8; - /** @timer_thres: timer threshold */ - uint32_t timer_thres:8; - /** @intr_id: interrupt id */ - uint16_t intr_id:11; - /** @intr_aggr: interrupt aggregation */ - uint16_t intr_aggr:1; - /** @filler: filler bits */ - uint16_t filler:4; - /** @ringsz: ring size */ - uint16_t ringsz; - /** @bufsz: c2h buffer size */ - uint16_t bufsz; - /** @cmpt_ringsz: completion ring size */ - uint16_t cmpt_ringsz; -}; - -/** - * @enum - mbox_cmpt_ctxt_type - * @brief specifies whether cmpt is enabled with MM/ST - */ -enum mbox_cmpt_ctxt_type { - /** @QDMA_MBOX_CMPT_CTXT_ONLY: only cmpt context programming required */ - QDMA_MBOX_CMPT_CTXT_ONLY, - /** @QDMA_MBOX_CMPT_WITH_MM: completion context with MM */ - QDMA_MBOX_CMPT_WITH_MM, - /** @QDMA_MBOX_CMPT_WITH_ST: complete context with ST */ - QDMA_MBOX_CMPT_WITH_ST, - /** @QDMA_MBOX_CMPT_CTXT_NONE: No completion context */ - QDMA_MBOX_CMPT_CTXT_NONE -}; - -/** - * @struct - mbox_msg_intr_ctxt - * @brief interrupt context mailbox message - */ -struct mbox_msg_intr_ctxt { - /** @num_rings: number of intr context rings be assigned - * for virtual function - */ - uint8_t num_rings; /* 1 ~ 8 */ - /** @ring_index_list: ring index associated for each vector */ - uint32_t ring_index_list[QDMA_NUM_DATA_VEC_FOR_INTR_CXT]; - /** @w: interrupt context data for all rings*/ - struct qdma_indirect_intr_ctxt ictxt[QDMA_NUM_DATA_VEC_FOR_INTR_CXT]; -}; - -/*****************************************************************************/ -/** - * qdma_mbox_hw_init(): Initialize the mobx HW - * - * @dev_hndl: device handle - * @is_vf: is VF mbox - * - * Return: None - *****************************************************************************/ -void qdma_mbox_hw_init(void *dev_hndl, uint8_t is_vf); - -/*****************************************************************************/ -/** - * qdma_mbox_pf_rcv_msg_handler(): handles the raw message received in pf - * - * @dma_device_index: pci bus number - * @dev_hndl: device handle - * @func_id: own function id - * @rcv_msg: received raw message - * @resp_msg: raw response message - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_pf_rcv_msg_handler(void *dev_hndl, uint8_t dma_device_index, - uint16_t func_id, uint32_t *rcv_msg, - uint32_t *resp_msg); - -/*****************************************************************************/ -/** - * qmda_mbox_compose_vf_online(): compose VF online message - * - * @func_id: destination function id - * @qmax: number of queues being requested - * @qbase: q base at which queues are allocated - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qmda_mbox_compose_vf_online(uint16_t func_id, - uint16_t qmax, int *qbase, uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_offline(): compose VF offline message - * - * @func_id: destination function id - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_offline(uint16_t func_id, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_reset_message(): compose VF reset message - * - * @raw_data: output raw message to be sent - * @src_funcid: own function id - * @dest_funcid: destination function id - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_reset_message(uint32_t *raw_data, uint8_t src_funcid, - uint8_t dest_funcid); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_reset_offline(): compose VF BYE for PF initiated RESET - * - * @func_id: own function id - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_reset_offline(uint16_t func_id, - uint32_t *raw_data); -/*****************************************************************************/ -/** - * qdma_mbox_compose_pf_reset_done_message(): compose PF reset done message - * - * @raw_data: output raw message to be sent - * @src_funcid: own function id - * @dest_funcid: destination function id - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_pf_reset_done_message(uint32_t *raw_data, - uint8_t src_funcid, uint8_t dest_funcid); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_pf_offline(): compose PF offline message - * - * @raw_data: output raw message to be sent - * @src_funcid: own function id - * @dest_funcid: destination function id - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_pf_offline(uint32_t *raw_data, uint8_t src_funcid, - uint8_t dest_funcid); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qreq(): compose message to request queues - * - * @func_id: destination function id - * @qmax: number of queues being requested - * @qbase: q base at which queues are allocated - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qreq(uint16_t func_id, - uint16_t qmax, int qbase, uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_notify_qadd(): compose message to notify queue add - * - * @func_id: destination function id - * @qid_hw: number of queues being requested - * @q_type: direction of the of queue - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_notify_qadd(uint16_t func_id, - uint16_t qid_hw, - enum qdma_dev_q_type q_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_notify_qdel(): compose message to notify queue delete - * - * @func_id: destination function id - * @qid_hw: number of queues being requested - * @q_type: direction of the of queue - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_notify_qdel(uint16_t func_id, - uint16_t qid_hw, - enum qdma_dev_q_type q_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_notify_qdel(): compose message to get the active - * queue count - * - * @func_id: destination function id - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_get_device_active_qcnt(uint16_t func_id, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_fmap_prog(): handles the raw message received - * - * @func_id: destination function id - * @qmax: number of queues being requested - * @qbase: q base at which queues are allocated - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_fmap_prog(uint16_t func_id, - uint16_t qmax, int qbase, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_write(): compose queue configuration data for - * compose and program - * - * @func_id: destination function id - * @qid_hw: HW queue for which the context has to be read - * @st: is st mode - * @c2h: is c2h direction - * @cmpt_ctxt_type: completion context type - * @descq_conf: pointer to queue config data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qctxt_write(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - struct mbox_descq_conf *descq_conf, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_read(): compose message to read context data of a - * queue - * - * @func_id: destination function id - * @qid_hw: HW queue for which the context has to be read - * @st: is st mode - * @c2h: is c2h direction - * @cmpt_ctxt_type: completion context type - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qctxt_read(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_invalidate(): compose queue context invalidate - * message - * - * @func_id: destination function id - * @qid_hw: HW queue for which the context has to be invalidated - * @st: is st mode - * @c2h: is c2h direction - * @cmpt_ctxt_type: completion context type - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qctxt_invalidate(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_clear(): compose queue context clear message - * - * @func_id: destination function id - * @qid_hw: HW queue for which the context has to be cleared - * @st: is st mode - * @c2h: is c2h direction - * @cmpt_ctxt_type: completion context type - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_qctxt_clear(uint16_t func_id, - uint16_t qid_hw, uint8_t st, uint8_t c2h, - enum mbox_cmpt_ctxt_type cmpt_ctxt_type, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_csr_read(): compose message to read csr info - * - * @func_id: destination function id - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_csr_read(uint16_t func_id, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_reg_read(): compose message to read the register values - * - * @func_id: destination function id - * @group_num: group number for the registers to read - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_reg_read(uint16_t func_id, uint16_t group_num, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_intr_ctxt_write(): compose interrupt ring context - * programming message - * - * @func_id: destination function id - * @intr_ctxt: pointer to interrupt context data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_intr_ctxt_write(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_intr_ctxt_read(): handles the raw message received - * - * @func_id: destination function id - * @intr_ctxt: pointer to interrupt context data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_intr_ctxt_read(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_intr_ctxt_clear(): compose interrupt ring context - * clear message - * - * @func_id: destination function id - * @intr_ctxt: pointer to interrupt context data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_intr_ctxt_clear(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_compose_vf_qctxt_invalidate(): compose interrupt ring context - * invalidate message - * - * @func_id: destination function id - * @intr_ctxt: pointer to interrupt context data structure - * @raw_data: output raw message to be sent - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_compose_vf_intr_ctxt_invalidate(uint16_t func_id, - struct mbox_msg_intr_ctxt *intr_ctxt, - uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_is_msg_response(): check if the received msg opcode is response - * sent message opcode - * - * @send_data: mbox message sent - * @rcv_data: mbox message recieved - * - * Return: 1 : match and 0: does not match - *****************************************************************************/ -uint8_t qdma_mbox_is_msg_response(uint32_t *send_data, uint32_t *rcv_data); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_response_status(): return the response received for the sent msg - * - * @rcv_data: mbox message recieved - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_response_status(uint32_t *rcv_data); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_func_id_get(): return the vf function id - * - * @rcv_data: mbox message recieved - * @is_vf: is VF mbox - * - * Return: vf function id - *****************************************************************************/ -uint8_t qdma_mbox_vf_func_id_get(uint32_t *rcv_data, uint8_t is_vf); - -int qdma_mbox_vf_active_queues_get(uint32_t *rcv_data, - enum qdma_dev_q_type q_type); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_parent_func_id_get(): return the vf parent function id - * - * @rcv_data: mbox message recieved - * - * Return: vf function id - *****************************************************************************/ -uint8_t qdma_mbox_vf_parent_func_id_get(uint32_t *rcv_data); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_dev_info_get(): get dev info from received message - * - * @rcv_data: mbox message recieved - * @dev_cap: device capability information - * @dma_device_index: DMA Identifier to be read using the mbox. - * - * Return: response status with dev info received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_dev_info_get(uint32_t *rcv_data, - struct qdma_dev_attributes *dev_cap, - uint32_t *dma_device_index); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_qinfo_get(): get qinfo from received message - * - * @rcv_data: mbox message recieved - * @qmax: number of queues - * @qbase: q base at which queues are allocated - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_qinfo_get(uint32_t *rcv_data, int *qbase, uint16_t *qmax); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_csr_get(): get csr info from received message - * - * @rcv_data: mbox message recieved - * @csr: pointer to the csr info - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_csr_get(uint32_t *rcv_data, struct qdma_csr_info *csr); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_reg_list_get(): get reg info from received message - * - * @rcv_data: mbox message recieved - * @num_regs: number of register read - * @reg_list: pointer to the register info - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_reg_list_get(uint32_t *rcv_data, - uint16_t *num_regs, struct qdma_reg_data *reg_list); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_context_get(): get queue context info from received message - * - * @rcv_data: mbox message recieved - * @ctxt: pointer to the queue context info - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_context_get(uint32_t *rcv_data, - struct qdma_descq_context *ctxt); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_context_get(): get intr context info from received message - * - * @rcv_data: mbox message recieved - * @ctxt: pointer to the intr context info - * - * Return: response status received to the sent message - *****************************************************************************/ -int qdma_mbox_vf_intr_context_get(uint32_t *rcv_data, - struct mbox_msg_intr_ctxt *ictxt); - - -/*****************************************************************************/ -/** - * qdma_mbox_pf_hw_clear_ack() - clear the HW ack - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_mbox_pf_hw_clear_ack(void *dev_hndl); - -/*****************************************************************************/ -/** - * qdma_mbox_send() - function to send raw data via qdma mailbox - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @raw_data: pointer to message being sent - * - * The function sends the raw_data to the outgoing mailbox memory and if PF, - * then assert the acknowledge status register bit. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_mbox_send(void *dev_hndl, uint8_t is_vf, uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_rcv() - function to receive raw data via qdma mailbox - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @raw_data: pointer to the message being received - * - * The function receives the raw_data from the incoming mailbox memory and - * then acknowledge the sender by setting msg_rcv field in the command - * register. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_mbox_rcv(void *dev_hndl, uint8_t is_vf, uint32_t *raw_data); - -/*****************************************************************************/ -/** - * qdma_mbox_enable_interrupts() - Enable the QDMA mailbox interrupt - * - * @dev_hndl: pointer to xlnx_dma_dev - * @is_vf: Whether PF or VF - * - * @return none - *****************************************************************************/ -void qdma_mbox_enable_interrupts(void *dev_hndl, uint8_t is_vf); - -/*****************************************************************************/ -/** - * qdma_mbox_disable_interrupts() - Disable the QDMA mailbox interrupt - * - * @dev_hndl: pointer to xlnx_dma_dev - * @is_vf: Whether PF or VF - * - * @return none - *****************************************************************************/ -void qdma_mbox_disable_interrupts(void *dev_hndl, uint8_t is_vf); - -/*****************************************************************************/ -/** - * qdma_mbox_vf_rcv_msg_handler(): handles the raw message received in VF - * - * @rcv_msg: received raw message - * @resp_msg: raw response message - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_mbox_vf_rcv_msg_handler(uint32_t *rcv_msg, uint32_t *resp_msg); - -/*****************************************************************************/ -/** - * qdma_mbox_out_status(): - * - * @dev_hndl: pointer to xlnx_dma_dev - * @is_vf: Whether PF or VF - * - * Return: 0 if MBOX outbox is empty, 1 if MBOX is not empty - *****************************************************************************/ -uint8_t qdma_mbox_out_status(void *dev_hndl, uint8_t is_vf); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_MBOX_PROTOCOL_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_platform.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_platform.h deleted file mode 100755 index 996b891..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_platform.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_PLATFORM_H_ -#define __QDMA_PLATFORM_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA platform specific interface definitions - * - * Header file *qdma_platform_env.h* defines function signatures that are - * required to be implemented by platform specific drivers. - */ - -#include "qdma_access_common.h" - -/*****************************************************************************/ -/** - * qdma_calloc(): allocate memory and initialize with 0 - * - * @num_blocks: number of blocks of contiguous memory of @size - * @size: size of each chunk of memory - * - * Return: pointer to the memory block created on success and NULL on failure - *****************************************************************************/ -void *qdma_calloc(uint32_t num_blocks, uint32_t size); - -/*****************************************************************************/ -/** - * qdma_memfree(): free the memory - * - * @memptr: pointer to the memory block - * - * Return: None - *****************************************************************************/ -void qdma_memfree(void *memptr); - -/*****************************************************************************/ -/** - * qdma_resource_lock_init() - Init lock to access resource management APIs - * - * @return None - *****************************************************************************/ -int qdma_resource_lock_init(void); - -/*****************************************************************************/ -/** - * qdma_resource_lock_take() - take lock to access resource management APIs - * - * @return None - *****************************************************************************/ -void qdma_resource_lock_take(void); - -/*****************************************************************************/ -/** - * qdma_resource_lock_give() - release lock after accessing resource management - * APIs - * - * @return None - *****************************************************************************/ -void qdma_resource_lock_give(void); - -/*****************************************************************************/ -/** - * qdma_reg_write() - Register write API. - * - * @dev_hndl: device handle - * @reg_offst: QDMA Config bar register offset to write - * @val: value to be written - * - * Return: Nothing - *****************************************************************************/ -void qdma_reg_write(void *dev_hndl, uint32_t reg_offst, uint32_t val); - -/*****************************************************************************/ -/** - * qdma_reg_read() - Register read API. - * - * @dev_hndl: device handle - * @reg_offst: QDMA Config bar register offset to be read - * - * Return: Value read - *****************************************************************************/ -uint32_t qdma_reg_read(void *dev_hndl, uint32_t reg_offst); - -/*****************************************************************************/ -/** - * qdma_reg_access_lock() - Lock function for Register access - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_reg_access_lock(void *dev_hndl); - -/*****************************************************************************/ -/** - * qdma_reg_access_release() - Release function for Register access - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_reg_access_release(void *dev_hndl); - -/*****************************************************************************/ -/** - * qdma_udelay() - delay function to be used in the common library - * - * @delay_usec: delay in microseconds - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_udelay(uint32_t delay_usec); - -/*****************************************************************************/ -/** - * qdma_get_hw_access() - function to get the qdma_hw_access - * - * @dev_hndl: device handle - * @dev_cap: pointer to hold qdma_hw_access structure - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_get_hw_access(void *dev_hndl, struct qdma_hw_access **hw); - -/*****************************************************************************/ -/** - * qdma_strncpy(): copy n size string from source to destination buffer - * - * @memptr: pointer to the memory block - * - * Return: None - *****************************************************************************/ -void qdma_strncpy(char *dest, const char *src, size_t n); - - -/*****************************************************************************/ -/** - * qdma_get_err_code() - function to get the qdma access mapped error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_err_code(int acc_err_code); - -/*****************************************************************************/ -/** - * qdma_io_wmb() - Write memory barrier for IO device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_io_wmb(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_PLATFORM_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_reg_dump.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_reg_dump.h deleted file mode 100755 index f774bf6..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_reg_dump.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_REG_DUMP_H__ -#define __QDMA_REG_DUMP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform_env.h" -#include "qdma_access_common.h" - -#define DEBUGFS_DEV_INFO_SZ (300) - -#define QDMA_REG_NAME_LENGTH 64 -#define DEBUGFS_INTR_CNTX_SZ (2048 * 2) -#define DBGFS_ERR_BUFLEN (64) -#define DEBGFS_LINE_SZ (81) -#define DEBGFS_GEN_NAME_SZ (40) -#define REG_DUMP_SIZE_PER_LINE (256) - -#define MAX_QDMA_CFG_REGS (200) - -#define QDMA_MM_EN_SHIFT 0 -#define QDMA_CMPT_EN_SHIFT 1 -#define QDMA_ST_EN_SHIFT 2 -#define QDMA_MAILBOX_EN_SHIFT 3 - -#define QDMA_MM_MODE (1 << QDMA_MM_EN_SHIFT) -#define QDMA_COMPLETION_MODE (1 << QDMA_CMPT_EN_SHIFT) -#define QDMA_ST_MODE (1 << QDMA_ST_EN_SHIFT) -#define QDMA_MAILBOX (1 << QDMA_MAILBOX_EN_SHIFT) - - -#define QDMA_MM_ST_MODE \ - (QDMA_MM_MODE | QDMA_COMPLETION_MODE | QDMA_ST_MODE) - -#define GET_CAPABILITY_MASK(mm_en, st_en, mm_cmpt_en, mailbox_en) \ - ((mm_en << QDMA_MM_EN_SHIFT) | \ - ((mm_cmpt_en | st_en) << QDMA_CMPT_EN_SHIFT) | \ - (st_en << QDMA_ST_EN_SHIFT) | \ - (mailbox_en << QDMA_MAILBOX_EN_SHIFT)) - - -struct regfield_info { - const char *field_name; - uint32_t field_mask; -}; - -struct xreg_info { - const char *name; - uint32_t addr; - uint32_t repeat; - uint32_t step; - uint8_t shift; - uint8_t len; - uint8_t is_debug_reg; - uint8_t mode; - uint8_t read_type; - uint8_t num_bitfields; - struct regfield_info *bitfields; -}; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_resource_mgmt.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_resource_mgmt.c deleted file mode 100755 index 1875ac4..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_resource_mgmt.c +++ /dev/null @@ -1,795 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "qdma_resource_mgmt.h" -#include "qdma_platform.h" -#include "qdma_list.h" -#include "qdma_access_errors.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_resource_mgmt.tmh" -#endif - -struct qdma_resource_entry { - int qbase; - uint32_t total_q; - struct qdma_list_head node; -}; - -/** per function entry */ -struct qdma_dev_entry { - uint16_t func_id; - uint32_t active_h2c_qcnt; - uint32_t active_c2h_qcnt; - uint32_t active_cmpt_qcnt; - struct qdma_resource_entry entry; -}; - -/** for hodling the qconf_entry structure */ -struct qdma_resource_master { - /** DMA device index this resource belongs to */ - uint32_t dma_device_index; - /** starting pci bus number this resource belongs to */ - uint32_t pci_bus_start; - /** ending pci bus number this resource belongs to */ - uint32_t pci_bus_end; - /** total queue this resource manager handles */ - uint32_t total_q; - /** queue base from which this resource manger handles */ - int qbase; - /** for attaching to master resource list */ - struct qdma_list_head node; - /** for holding device entries */ - struct qdma_list_head dev_list; - /** for holding free resource list */ - struct qdma_list_head free_list; - /** active queue count per resource*/ - uint32_t active_qcnt; -}; - -static QDMA_LIST_HEAD(master_resource_list); - -static struct qdma_resource_master *qdma_find_master_resource_entry( - uint32_t bus_start, uint32_t bus_end) -{ - struct qdma_list_head *entry, *tmp; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &master_resource_list) { - struct qdma_resource_master *q_resource = - (struct qdma_resource_master *) - QDMA_LIST_GET_DATA(entry); - - if (q_resource->pci_bus_start == bus_start && - q_resource->pci_bus_end == bus_end) { - qdma_resource_lock_give(); - return q_resource; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_resource_master *qdma_get_master_resource_entry( - uint32_t dma_device_index) -{ - struct qdma_list_head *entry, *tmp; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &master_resource_list) { - struct qdma_resource_master *q_resource = - (struct qdma_resource_master *) - QDMA_LIST_GET_DATA(entry); - - if (q_resource->dma_device_index == dma_device_index) { - qdma_resource_lock_give(); - return q_resource; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_dev_entry *qdma_get_dev_entry(uint32_t dma_device_index, - uint16_t func_id) -{ - struct qdma_list_head *entry, *tmp; - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - - if (!q_resource) - return NULL; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &q_resource->dev_list) { - struct qdma_dev_entry *dev_entry = (struct qdma_dev_entry *) - QDMA_LIST_GET_DATA(entry); - - if (dev_entry->func_id == func_id) { - qdma_resource_lock_give(); - return dev_entry; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_resource_entry *qdma_free_entry_create(int q_base, - uint32_t total_q) -{ - struct qdma_resource_entry *entry = (struct qdma_resource_entry *) - qdma_calloc(1, sizeof(struct qdma_resource_master)); - if (entry == NULL) - return NULL; - - entry->total_q = total_q; - entry->qbase = q_base; - - return entry; -} - -static void qdma_submit_to_free_list(struct qdma_dev_entry *dev_entry, - struct qdma_list_head *head) -{ - struct qdma_resource_entry *streach_node = NULL; - struct qdma_list_head *entry, *tmp; - /* create a new node to be added to empty free list */ - struct qdma_resource_entry *new_node = NULL; - - if (!dev_entry->entry.total_q) - return; - - if (qdma_list_is_empty(head)) { - new_node = qdma_free_entry_create(dev_entry->entry.qbase, - dev_entry->entry.total_q); - if (new_node == NULL) - return; - QDMA_LIST_SET_DATA(&new_node->node, new_node); - qdma_list_add_tail(&new_node->node, head); - /* reset device entry q resource params */ - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - } else { - qdma_list_for_each_safe(entry, tmp, head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *) - QDMA_LIST_GET_DATA(entry); - - /* insert the free slot at appropriate place */ - if ((node->qbase > dev_entry->entry.qbase) || - qdma_list_is_last_entry(entry, head)) { - new_node = qdma_free_entry_create( - dev_entry->entry.qbase, - dev_entry->entry.total_q); - if (new_node == NULL) - return; - QDMA_LIST_SET_DATA(&new_node->node, new_node); - if (node->qbase > dev_entry->entry.qbase) - qdma_list_insert_before(&new_node->node, - &node->node); - else - qdma_list_add_tail(&new_node->node, - head); - /* reset device entry q resource params */ - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - break; - } - } - } - - /* de-fragment (merge contiguous resource chunks) if possible */ - qdma_list_for_each_safe(entry, tmp, head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if (!streach_node) - streach_node = node; - else { - if ((streach_node->qbase + streach_node->total_q) == - (uint32_t)node->qbase) { - streach_node->total_q += node->total_q; - qdma_list_del(&node->node); - qdma_memfree(node); - } else - streach_node = node; - } - } -} - -/** - * qdma_resource_entry() - return the best free list entry node that can - * accommodate the new request - */ -static struct qdma_resource_entry *qdma_get_resource_node(uint32_t qmax, - int qbase, - struct qdma_list_head *free_list_head) -{ - struct qdma_list_head *entry, *tmp; - struct qdma_resource_entry *best_fit_node = NULL; - - /* try to honor requested qbase */ - if (qbase >= 0) { - qdma_list_for_each_safe(entry, tmp, free_list_head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if ((qbase >= node->qbase) && - (node->qbase + node->total_q) >= - (qbase + qmax)) { - best_fit_node = node; - goto fragment_free_list; - } - } - } - best_fit_node = NULL; - - /* find a best node to accommodate q resource request */ - qdma_list_for_each_safe(entry, tmp, free_list_head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if (node->total_q >= qmax) { - if (!best_fit_node || (best_fit_node->total_q >= - node->total_q)) { - best_fit_node = node; - qbase = best_fit_node->qbase; - } - } - } - -fragment_free_list: - if (!best_fit_node) - return NULL; - - if ((qbase == best_fit_node->qbase) && - (qmax == best_fit_node->total_q)) - return best_fit_node; - - /* split free resource node accordingly */ - if ((qbase == best_fit_node->qbase) && - (qmax != best_fit_node->total_q)) { - /* - * create an extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase + qmax; - uint32_t lqmax = best_fit_node->total_q - qmax; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_after(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q -= lqmax; - } else if ((qbase > best_fit_node->qbase) && - ((qbase + qmax) == (best_fit_node->qbase + - best_fit_node->total_q))) { - /* - * create an extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase; - uint32_t lqmax = qbase - best_fit_node->qbase; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_before(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q = qmax; - best_fit_node->qbase = qbase; - } else { - /* - * create two extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase; - uint32_t lqmax = qbase - best_fit_node->qbase; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_before(&new_entry->node, - &best_fit_node->node); - - best_fit_node->qbase = qbase; - best_fit_node->total_q -= lqmax; - - lqbase = best_fit_node->qbase + qmax; - lqmax = best_fit_node->total_q - qmax; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_after(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q = qmax; - } - - return best_fit_node; -} - -static int qdma_request_q_resource(struct qdma_dev_entry *dev_entry, - uint32_t new_qmax, int new_qbase, - struct qdma_list_head *free_list_head) -{ - uint32_t qmax = dev_entry->entry.total_q; - int qbase = dev_entry->entry.qbase; - struct qdma_resource_entry *free_entry_node = NULL; - int rv = QDMA_SUCCESS; - - /* submit already allocated queues back to free list before requesting - * new resource - */ - qdma_submit_to_free_list(dev_entry, free_list_head); - - if (!new_qmax) - return 0; - /* check if the request can be accomodated */ - free_entry_node = qdma_get_resource_node(new_qmax, new_qbase, - free_list_head); - if (free_entry_node == NULL) { - /* request cannot be accommodated. Restore the dev_entry */ - free_entry_node = qdma_get_resource_node(qmax, qbase, - free_list_head); - rv = -QDMA_ERR_RM_NO_QUEUES_LEFT; - qdma_log_error("%s: Not enough queues, err:%d\n", __func__, - -QDMA_ERR_RM_NO_QUEUES_LEFT); - if (free_entry_node == NULL) { - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - - return rv; - } - } - - dev_entry->entry.qbase = free_entry_node->qbase; - dev_entry->entry.total_q = free_entry_node->total_q; - - qdma_list_del(&free_entry_node->node); - qdma_memfree(free_entry_node); - - return rv; -} - -int qdma_master_resource_create(uint32_t bus_start, uint32_t bus_end, - int q_base, uint32_t total_q, uint32_t *dma_device_index) -{ - struct qdma_resource_master *q_resource; - struct qdma_resource_entry *free_entry; - static int index; - - q_resource = qdma_find_master_resource_entry(bus_start, bus_end); - if (q_resource) { - *dma_device_index = q_resource->dma_device_index; - qdma_log_debug("%s: Resource already created", __func__); - qdma_log_debug("for this device(%d)\n", - q_resource->dma_device_index); - return -QDMA_ERR_RM_RES_EXISTS; - } - - *dma_device_index = index; - - q_resource = (struct qdma_resource_master *)qdma_calloc(1, - sizeof(struct qdma_resource_master)); - if (!q_resource) { - qdma_log_error("%s: no memory for q_resource, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - free_entry = (struct qdma_resource_entry *) - qdma_calloc(1, sizeof(struct qdma_resource_entry)); - if (!free_entry) { - qdma_memfree(q_resource); - qdma_log_error("%s: no memory for free_entry, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_resource_lock_take(); - q_resource->dma_device_index = index; - q_resource->pci_bus_start = bus_start; - q_resource->pci_bus_end = bus_end; - q_resource->total_q = total_q; - q_resource->qbase = q_base; - qdma_list_init_head(&q_resource->dev_list); - qdma_list_init_head(&q_resource->free_list); - QDMA_LIST_SET_DATA(&q_resource->node, q_resource); - QDMA_LIST_SET_DATA(&q_resource->free_list, q_resource); - qdma_list_add_tail(&q_resource->node, &master_resource_list); - - - free_entry->total_q = total_q; - free_entry->qbase = q_base; - QDMA_LIST_SET_DATA(&free_entry->node, free_entry); - qdma_list_add_tail(&free_entry->node, &q_resource->free_list); - qdma_resource_lock_give(); - - qdma_log_debug("%s: New master resource created at %d", - __func__, index); - ++index; - - return QDMA_SUCCESS; -} - -void qdma_master_resource_destroy(uint32_t dma_device_index) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_list_head *entry, *tmp; - - if (!q_resource) - return; - qdma_resource_lock_take(); - if (!qdma_list_is_empty(&q_resource->dev_list)) { - qdma_resource_lock_give(); - return; - } - qdma_list_for_each_safe(entry, tmp, &q_resource->free_list) { - struct qdma_resource_entry *free_entry = - (struct qdma_resource_entry *) - QDMA_LIST_GET_DATA(entry); - - qdma_list_del(&free_entry->node); - qdma_memfree(free_entry); - } - qdma_list_del(&q_resource->node); - qdma_memfree(q_resource); - qdma_resource_lock_give(); -} - - -int qdma_dev_entry_create(uint32_t dma_device_index, uint16_t func_id) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, - -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - if (!dev_entry) { - qdma_resource_lock_take(); - dev_entry = (struct qdma_dev_entry *) - qdma_calloc(1, sizeof(struct qdma_dev_entry)); - if (dev_entry == NULL) { - qdma_resource_lock_give(); - qdma_log_error("%s: Insufficient memory, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - dev_entry->func_id = func_id; - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - QDMA_LIST_SET_DATA(&dev_entry->entry.node, dev_entry); - qdma_list_add_tail(&dev_entry->entry.node, - &q_resource->dev_list); - qdma_resource_lock_give(); - qdma_log_info("%s: Created the dev entry successfully\n", - __func__); - } else { - qdma_log_error("%s: Dev entry already created, err = %d\n", - __func__, - -QDMA_ERR_RM_DEV_EXISTS); - return -QDMA_ERR_RM_DEV_EXISTS; - } - - return QDMA_SUCCESS; -} - -void qdma_dev_entry_destroy(uint32_t dma_device_index, uint16_t func_id) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found.\n", __func__); - return; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found\n", __func__); - return; - } - qdma_resource_lock_take(); - qdma_submit_to_free_list(dev_entry, &q_resource->free_list); - - qdma_list_del(&dev_entry->entry.node); - qdma_memfree(dev_entry); - qdma_resource_lock_give(); -} - -int qdma_dev_update(uint32_t dma_device_index, uint16_t func_id, - uint32_t qmax, int *qbase) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev Entry not found, err: %d\n", - __func__, - -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - - /* if any active queue on device, no more new qmax - * configuration allowed - */ - if (dev_entry->active_h2c_qcnt || - dev_entry->active_c2h_qcnt || - dev_entry->active_cmpt_qcnt) { - qdma_resource_lock_give(); - qdma_log_error("%s: Qs active. Config blocked, err: %d\n", - __func__, -QDMA_ERR_RM_QMAX_CONF_REJECTED); - return -QDMA_ERR_RM_QMAX_CONF_REJECTED; - } - - rv = qdma_request_q_resource(dev_entry, qmax, *qbase, - &q_resource->free_list); - - *qbase = dev_entry->entry.qbase; - qdma_resource_lock_give(); - - - return rv; -} - -int qdma_dev_qinfo_get(uint32_t dma_device_index, uint16_t func_id, - int *qbase, uint32_t *qmax) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_debug("%s: Dev Entry not created yet\n", __func__); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - *qbase = dev_entry->entry.qbase; - *qmax = dev_entry->entry.total_q; - qdma_resource_lock_give(); - - return QDMA_SUCCESS; -} - -enum qdma_dev_q_range qdma_dev_is_queue_in_range(uint32_t dma_device_index, - uint16_t func_id, - uint32_t qid_hw) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - uint32_t qmax; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return QDMA_DEV_Q_OUT_OF_RANGE; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found, err: %d\n", - __func__, -QDMA_ERR_RM_DEV_NOT_EXISTS); - return QDMA_DEV_Q_OUT_OF_RANGE; - } - - qdma_resource_lock_take(); - qmax = dev_entry->entry.qbase + dev_entry->entry.total_q; - if (dev_entry->entry.total_q && (qid_hw < qmax) && - ((int)qid_hw >= dev_entry->entry.qbase)) { - qdma_resource_lock_give(); - return QDMA_DEV_Q_IN_RANGE; - } - qdma_resource_lock_give(); - - return QDMA_DEV_Q_OUT_OF_RANGE; -} - -int qdma_dev_increment_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv = QDMA_SUCCESS; - uint32_t *active_qcnt = NULL; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev Entry not found, err: %d\n", - __func__, - -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - active_qcnt = &dev_entry->active_h2c_qcnt; - break; - case QDMA_DEV_Q_TYPE_C2H: - active_qcnt = &dev_entry->active_c2h_qcnt; - break; - case QDMA_DEV_Q_TYPE_CMPT: - active_qcnt = &dev_entry->active_cmpt_qcnt; - break; - default: - rv = -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - if (active_qcnt && (dev_entry->entry.total_q < ((*active_qcnt) + 1))) { - qdma_resource_lock_give(); - return -QDMA_ERR_RM_NO_QUEUES_LEFT; - } - - if (active_qcnt) { - *active_qcnt = (*active_qcnt) + 1; - q_resource->active_qcnt++; - } - qdma_resource_lock_give(); - - return rv; -} - - -int qdma_dev_decrement_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv = QDMA_SUCCESS; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, - -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found, err: %d\n", - __func__, -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - if (dev_entry->active_h2c_qcnt) - dev_entry->active_h2c_qcnt--; - break; - case QDMA_DEV_Q_TYPE_C2H: - if (dev_entry->active_c2h_qcnt) - dev_entry->active_c2h_qcnt--; - break; - case QDMA_DEV_Q_TYPE_CMPT: - if (dev_entry->active_cmpt_qcnt) - dev_entry->active_cmpt_qcnt--; - break; - default: - rv = -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - q_resource->active_qcnt--; - qdma_resource_lock_give(); - - return rv; -} - -uint32_t qdma_get_active_queue_count(uint32_t dma_device_index) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - uint32_t q_cnt; - - if (!q_resource) - return QDMA_SUCCESS; - - qdma_resource_lock_take(); - q_cnt = q_resource->active_qcnt; - qdma_resource_lock_give(); - - return q_cnt; -} - -int qdma_get_device_active_queue_count(uint32_t dma_device_index, - uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - uint32_t dev_active_qcnt = 0; - - if (!q_resource) - return -QDMA_ERR_RM_RES_NOT_EXISTS; - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - dev_active_qcnt = dev_entry->active_h2c_qcnt; - break; - case QDMA_DEV_Q_TYPE_C2H: - dev_active_qcnt = dev_entry->active_c2h_qcnt; - break; - case QDMA_DEV_Q_TYPE_CMPT: - dev_active_qcnt = dev_entry->active_cmpt_qcnt; - break; - default: - dev_active_qcnt = 0; - } - qdma_resource_lock_give(); - - return dev_active_qcnt; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_resource_mgmt.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_resource_mgmt.h deleted file mode 100755 index 5c53c47..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_resource_mgmt.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_RESOURCE_MGMT_H_ -#define __QDMA_RESOURCE_MGMT_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA resource management interface definitions - * - * Header file *qdma_resource_mgmt.h* defines data structures and function - * signatures exported for QDMA queue management. - */ - -#include "qdma_platform_env.h" -#include "qdma_access_export.h" - -/** - * enum qdma_dev_q_range: Q ranage check - */ -enum qdma_dev_q_range { - /** @QDMA_DEV_Q_IN_RANGE: Q belongs to dev */ - QDMA_DEV_Q_IN_RANGE, - /** @QDMA_DEV_Q_OUT_OF_RANGE: Q does not belong to dev */ - QDMA_DEV_Q_OUT_OF_RANGE, - /** @QDMA_DEV_Q_RANGE_MAX: total Q validity states */ - QDMA_DEV_Q_RANGE_MAX -}; - -/*****************************************************************************/ -/** - * qdma_master_resource_create(): create the master q resource - * - * @bus_start: Bus number of the device i.e. pdev->bus->number - * @bus_end: Ending bus number i.e. the subordinate bus number of the - * parent bridge - * @q_base: base from which this master resource needs to be created - * @total_q: total queues in this master resource - * @dma_device_index: DMA device identifier assigned by resource manager to - * track the number of devices - * - * A master resource per driver per board is created to manage the queues - * allocated to this driver. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_master_resource_create(uint32_t bus_start, uint32_t bus_end, - int q_base, uint32_t total_q, uint32_t *dma_device_index); - -/*****************************************************************************/ -/** - * qdma_master_resource_destroy(): destroy the master q resource - * - * @dma_device_index: DMA device identifier this master resource belongs to - * - * Return: None - *****************************************************************************/ -void qdma_master_resource_destroy(uint32_t dma_device_index); - -/*****************************************************************************/ -/** - * qdma_dev_entry_create(): create a device entry for @func_id - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * - * A device entry is to be created on every function probe. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_entry_create(uint32_t dma_device_index, uint16_t func_id); - -/*****************************************************************************/ -/** - * qdma_dev_entry_destroy(): destroy device entry for @func_id - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * - * Return: None - *****************************************************************************/ -void qdma_dev_entry_destroy(uint32_t dma_device_index, uint16_t func_id); - -/*****************************************************************************/ -/** - * qdma_dev_update(): update qmax for the device - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @dev_type: device type - * @qmax: qmax for this device - * @qbase: output qbase for this device - * - * This API is to be called for update request of qmax of any function. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_update(uint32_t dma_device_index, uint16_t func_id, - uint32_t qmax, int *qbase); - -/*****************************************************************************/ -/** - * qdma_dev_qinfo_get(): get device info - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @dev_type: device type - * @qmax: output qmax for this device - * @qbase: output qbase for this device - * - * This API can be used get the qbase and qmax for any function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_qinfo_get(uint32_t dma_device_index, uint16_t func_id, - int *qbase, uint32_t *qmax); - -/*****************************************************************************/ -/** - * qdma_dev_is_queue_in_range(): check if queue belongs to this device - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @qid_hw: hardware queue id - * - * This API checks if the queue ID is in valid range for function specified - * - * Return: @QDMA_DEV_Q_IN_RANGE : valid and - * @QDMA_DEV_Q_OUT_OF_RANGE: invalid - *****************************************************************************/ -enum qdma_dev_q_range qdma_dev_is_queue_in_range(uint32_t dma_device_index, - uint16_t func_id, - uint32_t qid_hw); - -/*****************************************************************************/ -/** - * qdma_dev_increment_active_queue(): increment active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to increment the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_increment_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type); - -/*****************************************************************************/ -/** - * qdma_dev_decrement_active_queue(): increment active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to increment the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_decrement_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type); - -/*****************************************************************************/ -/** - * qdma_is_active_queue(): check if any queue is active - * - * @dma_device_index: DMA device identifier that this resource belongs to - * - * This API is used to check if any active queue is present. - * - * Return: active queue count - *****************************************************************************/ -uint32_t qdma_get_active_queue_count(uint32_t dma_device_index); - -/*****************************************************************************/ -/** - * qdma_get_device_active_queue_count(): get device active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to get the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_get_device_active_queue_count(uint32_t dma_device_index, - uint16_t func_id, - enum qdma_dev_q_type q_type); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_RESOURCE_MGMT_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_access.c b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_access.c deleted file mode 100755 index b23a4df..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_access.c +++ /dev/null @@ -1,6239 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include "qdma_soft_access.h" -#include "qdma_soft_reg.h" -#include "qdma_reg_dump.h" - - -#ifdef ENABLE_WPP_TRACING -#include "qdma_soft_access.tmh" -#endif - -/** QDMA Context array size */ -#define QDMA_FMAP_NUM_WORDS 2 -#define QDMA_SW_CONTEXT_NUM_WORDS 5 -#define QDMA_PFETCH_CONTEXT_NUM_WORDS 2 -#define QDMA_CMPT_CONTEXT_NUM_WORDS 5 -#define QDMA_HW_CONTEXT_NUM_WORDS 2 -#define QDMA_CR_CONTEXT_NUM_WORDS 1 -#define QDMA_IND_INTR_CONTEXT_NUM_WORDS 3 -#define QDMA_REG_IND_CTXT_REG_COUNT 8 - - -#define QDMA_REG_GROUP_1_START_ADDR 0x000 -#define QDMA_REG_GROUP_2_START_ADDR 0x400 -#define QDMA_REG_GROUP_3_START_ADDR 0xB00 -#define QDMA_REG_GROUP_4_START_ADDR 0x1014 - -#define QDMA_DEFAULT_PFCH_STOP_THRESH 256 - -static void qdma_hw_st_h2c_err_process(void *dev_hndl); -static void qdma_hw_st_c2h_err_process(void *dev_hndl); -static void qdma_hw_desc_err_process(void *dev_hndl); -static void qdma_hw_trq_err_process(void *dev_hndl); -static void qdma_hw_ram_sbe_err_process(void *dev_hndl); -static void qdma_hw_ram_dbe_err_process(void *dev_hndl); - -static struct xreg_info qdma_config_regs[] = { - - /* QDMA_TRQ_SEL_GLBL1 (0x00000) */ - {"CFG_BLOCK_ID", - 0x00, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_BUSDEV", - 0x04, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_MAX_PL_SZ", - 0x08, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_MAX_RDRQ_SZ", - 0x0C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_SYS_ID", - 0x10, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_MSI_EN", - 0x14, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_DATA_WIDTH", - 0x18, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_CTRL", - 0x1C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_AXI_USR_MAX_PL_SZ", - 0x40, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_AXI_USR_MAX_RDRQ_SZ", - 0x44, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_MISC_CTRL", - 0x4C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_SCRATCH_REG", - 0x80, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_SBE_MSK_A", - 0xF0, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_SBE_STS_A", - 0xF4, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_DBE_MSK_A", - 0xF8, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_DBE_STS_A", - 0xFC, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_GLBL2 (0x00100) */ - {"GLBL2_ID", - 0x100, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_BL_INT", - 0x104, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_VF_BL_INT", - 0x108, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_BL_EXT", - 0x10C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_VF_BL_EXT", - 0x110, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_INST", - 0x114, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_QDMA", - 0x118, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_STRM", - 0x11C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_QDMA_CAP", - 0x120, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PASID_CAP", - 0x128, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_FUNC_RET", - 0x12C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_SYS_ID", - 0x130, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_MISC_CAP", - 0x134, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_PCIE_RQ", - 0x1B8, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_AXIMM_WR", - 0x1C0, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_AXIMM_RD", - 0x1C8, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_GLBL (0x00200) */ - {"GLBL_RNGSZ", - 0x204, 16, 1, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL_ERR_STAT", - 0x248, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_ERR_MASK", - 0x24C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_CFG", - 0x250, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_STS", - 0x254, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_MSK", - 0x258, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_LOG", - 0x25C, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_STS", - 0x264, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_MSK", - 0x268, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_LOG", - 0x26C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_DBG_DAT", - 0x270, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_LOG2", - 0x27C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_INTERRUPT_CFG", - 0x288, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - - /* QDMA_TRQ_SEL_FMAP (0x00400 - 0x7FC) */ - /* TODO: max 256, display 4 for now */ - {"TRQ_SEL_FMAP", - 0x400, 4, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_IND (0x00800) */ - {"IND_CTXT_DATA", - 0x804, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"IND_CTXT_MASK", - 0x824, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"IND_CTXT_CMD", - 0x844, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_C2H (0x00A00) */ - {"C2H_TIMER_CNT", - 0xA00, 16, 0, 0, 0, 0, - QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CNT_THRESH", - 0xA40, 16, 0, 0, 0, 0, - QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - 0xA88, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_S_AXIS_CMPT_ACCEPTED", - 0xA8C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED", - 0xA90, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_AXIS_PKG_CMP", - 0xA94, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_ACCEPTED", - 0xA98, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_CMP", - 0xA9C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WRQ_OUT", - 0xAA0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WPL_REN_ACCEPTED", - 0xAA4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_TOTAL_WRQ_LEN", - 0xAA8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_TOTAL_WPL_LEN", - 0xAAC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_BUF_SZ", - 0xAB0, 16, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_ERR_STAT", - 0xAF0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_ERR_MASK", - 0xAF4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_STAT", - 0xAF8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_MASK", - 0xAFC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_ENABLE", - 0xB00, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_ERR_INT", - 0xB04, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_PFCH_CFG", - 0xB08, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INT_TIMER_TICK", - 0xB0C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED", - 0xB10, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED", - 0xB14, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_REQ", - 0xB18, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG", - 0xB1C, 4, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH_ERR_CTXT", - 0xB2C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_FIRST_ERR_QID", - 0xB30, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"STAT_NUM_CMPT_IN", - 0xB34, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_CMPT_OUT", - 0xB38, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_CMPT_DRP", - 0xB3C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_STAT_DESC_OUT", - 0xB40, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_DSC_CRDT_SENT", - 0xB44, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_FCH_DSC_RCVD", - 0xB48, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_BYP_DSC_RCVD", - 0xB4C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CMPT_COAL_CFG", - 0xB50, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_REQ", - 0xB54, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_MM_REQ", - 0xB58, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_ERR_INT_REQ", - 0xB5C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_REQ", - 0xB60, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_MSIX_ACK", - 0xB64, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_MSIX_FAIL", - 0xB68, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_NO_MSIX", - 0xB6C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_CTXT_INVAL", - 0xB70, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_C2H_ST_MSIX_ACK", - 0xB74, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_MSIX_FAIL", - 0xB78, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_NO_MSIX", - 0xB7C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_C2H_ST_CTXT_INVAL", - 0xB80, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WR_CMP", - 0xB84, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG_4", - 0xB88, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG_5", - 0xB8C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH_QID", - 0xB90, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH", - 0xB94, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INT_DEBUG", - 0xB98, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_IMM_ACCEPTED", - 0xB9C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_MARKER_ACCEPTED", - 0xBA0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED", - 0xBA4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_C2H_PAYLOAD_FIFO_CRDT_CNT", - 0xBA8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_DYN_REQ", - 0xBAC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_DYN_MSIX", - 0xBB0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_LEN_MISMATCH", - 0xBB4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_DESC_RSP_LEN", - 0xBB8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_QID_FIFO_LEN", - 0xBBC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_PAYLOAD_CNT", - 0xBC0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_C2H_CMPT_FORMAT", - 0xBC4, 7, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_PFCH_CACHE_DEPTH", - 0xBE0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CMPT_COAL_BUF_DEPTH", - 0xBE4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_PFCH_CRDT", - 0xBE8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_H2C(0x00E00) Register Space*/ - {"H2C_ERR_STAT", - 0xE00, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_ERR_MASK", - 0xE04, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_FIRST_ERR_QID", - 0xE08, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_DBG_REG", - 0xE0C, 5, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_FATAL_ERR_EN", - 0xE20, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_REQ_THROT", - 0xE24, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_ALN_DBG_REG0", - 0xE28, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_C2H_MM (0x1000) */ - {"C2H_MM_CONTROL", - 0x1004, 3, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_STATUS", - 0x1040, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_CMPL_DSC_CNT", - 0x1048, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_CODE_EN_MASK", - 0x1054, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_CODE", - 0x1058, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_INFO", - 0x105C, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_CTRL", - 0x10C0, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_CY_CNT", - 0x10C4, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_DATA_CNT", - 0x10CC, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_DBG_INFO", - 0x10E8, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_H2C_MM (0x1200)*/ - {"H2C_MM_CONTROL", - 0x1204, 3, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_STATUS", - 0x1240, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_CMPL_DSC_CNT", - 0x1248, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_CODE_EN_MASK", - 0x1254, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_CODE", - 0x1258, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_INFO", - 0x125C, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_CTRL", - 0x12C0, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_CY_CNT", - 0x12C4, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_DATA_CNT", - 0x12CC, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_DBG_INFO", - 0x12E8, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_REQ_THROT", - 0x12EC, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_PF_MAILBOX (0x2400) */ - {"FUNC_STATUS", - 0x2400, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FUNC_CMD", - 0x2404, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FUNC_INTR_VEC", - 0x2408, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"TARGET_FUNC", - 0x240C, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"INTR_CTRL", - 0x2410, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"PF_ACK", - 0x2420, 8, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FLR_CTRL_STATUS", - 0x2500, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"MSG_IN", - 0x2800, 32, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"MSG_OUT", - 0x2C00, 32, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - {"", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL } -}; - - -static struct qdma_hw_err_info qdma_err_info[QDMA_ERRS_ALL] = { - /* Descriptor errors */ - { - QDMA_DSC_ERR_POISON, - "Poison error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_POISON_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_UR_CA_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_PARAM, - "Parameter mismatch error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_PARAM_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_ADDR, - "Address mismatch error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_ADDR_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_TAG, - "Unexpected tag error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_TAG_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_FLR, - "FLR error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_FLR_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_TIMEOUT, - "Timed out error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_TIMEOUT_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DAT_POISON, - "Poison data error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DAT_POISON_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_FLR_CANCEL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DMA, - "DMA engine error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DMA_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DSC, - "Invalid PIDX update error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DSC_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_RQ_CANCEL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DBE_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_SBE_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_ALL, - "All Descriptor errors", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_ALL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - - /* TRQ errors */ - { - QDMA_TRQ_ERR_UNMAPPED, - "Access targeted unmapped register space error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_UNMAPPED_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_QID_RANGE, - "Qid range error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_QID_RANGE_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_VF_ACCESS, - "Invalid VF access error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_VF_ACCESS_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_TCP_TIMEOUT, - "Timeout on request error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_TCP_TIMEOUT_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_ALL, - "All TRQ errors", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_ALL_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - - /* C2H Errors*/ - { - QDMA_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_MTY_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_LEN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_QID_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_DESC_RSP_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ENG_WPL_DATA_PAR_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_MSI_INT_FAIL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ERR_DESC_CNT_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_PORTID_CTXT_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - "Port id in packet and bypass interface mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_PORTID_BYP_IN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - "Writeback on invalid queue error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_INV_Q_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - "Completion queue gets full error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_QFULL_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - "Bad CIDX update by the software error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_CIDX_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - "C2H completion Parity error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_PRTY_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ALL, - "All C2h errors", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_MTY_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_LEN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_QID_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_TIMER_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PFCH_II_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_CMPT_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PFCH_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_INT_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_TUSER_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_QID_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_WPL_DATA_PAR, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_WPL_DATA_PAR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_ALL, - "All fatal errors", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - "Zero length descriptor error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_ZERO_LEN_DESC_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_CSI_MOP, - "Non EOP descriptor received error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_CSI_MOP_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_NO_DMA_DSC_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_SBE_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_DBE_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_ALL, - "All H2C errors", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - QDMA_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_MI_H2C0_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_MI_C2H0_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_C2H_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_C2H_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_FUNC_MAP_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_HW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CRD_RCV_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_SW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CPLI_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CPLD_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PASID_CTXT_RAM, - "PASID configuration RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PASID_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_TIMER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_QID_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_TUSER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_WRB_COAL_DATA_RAM, - "Completion Coalescing RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_WRB_COAL_DATA_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_INT_QID2VEC_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_INT_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PFCH_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_WRB_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PFCH_LL_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_PEND_FIFO, - "H2C ST pending fifo RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_PEND_FIFO_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_ALL, - "All SBE errors", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_ALL_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - - - /* DBE Errors */ - { - QDMA_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_MI_H2C0_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_MI_C2H0_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_C2H_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_C2H_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_FUNC_MAP, - "Function map RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_FUNC_MAP_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_HW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CRD_RCV_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_SW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CPLI_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CPLD_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PASID_CTXT_RAM, - "PASID configuration RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PASID_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_TIMER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_QID_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_TUSER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_WRB_COAL_DATA_RAM, - "Completion Coalescing RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_WRB_COAL_DATA_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_INT_QID2VEC_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_INT_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PFCH_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_WRB_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PFCH_LL_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_PEND_FIFO, - "H2C pending fifo RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_PEND_FIFO_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_ALL, - "All DBE errors", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_ALL_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - } -}; - -static int32_t all_hw_errs[TOTAL_LEAF_ERROR_AGGREGATORS] = { - - QDMA_DSC_ERR_ALL, - QDMA_TRQ_ERR_ALL, - QDMA_ST_C2H_ERR_ALL, - QDMA_ST_FATAL_ERR_ALL, - QDMA_ST_H2C_ERR_ALL, - QDMA_SBE_ERR_ALL, - QDMA_DBE_ERR_ALL -}; - -static int qdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int qdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - - -static struct qctx_entry sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Function Id", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Address Translation", 0}, - {"Fetch Max", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, -}; - -static struct qctx_entry hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Address (Low)", 0}, - {"Base Address (High)", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, - {"Over Flow Check Disable", 0}, - {"Address Translation", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, -}; - -static struct qctx_entry c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry fmap_ctxt_entries[] = { - {"Queue Base", 0}, - {"Queue Max", 0}, -}; - -static struct qctx_entry ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, - {"at", 0}, -}; - -uint32_t qdma_soft_reg_dump_buf_len(void) -{ - uint32_t length = ((sizeof(qdma_config_regs) / - sizeof(qdma_config_regs[0])) + 1) * - REG_DUMP_SIZE_PER_LINE; - return length; -} - -uint32_t qdma_get_config_num_regs(void) -{ - return (sizeof(qdma_config_regs)/ - sizeof(qdma_config_regs[0])); -} - -struct xreg_info *qdma_get_config_regs(void) -{ - return qdma_config_regs; -} - -int qdma_soft_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - uint32_t len = 0; - int rv = 0; - - *buflen = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(cmpt_ctxt_entries) / - sizeof(cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(sw_ctxt_entries) / - sizeof(sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(hw_ctxt_entries) / - sizeof(hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(credit_ctxt_entries) / - sizeof(credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(fmap_ctxt_entries) / - sizeof(fmap_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(cmpt_ctxt_entries) / - sizeof(cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(c2h_pftch_ctxt_entries) / - sizeof(c2h_pftch_ctxt_entries[0])) - + 1) * REG_DUMP_SIZE_PER_LINE); - } - } - - *buflen = len; - return rv; -} - -/* - * qdma_acc_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void qdma_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - sw_ctxt_entries[0].value = sw_ctxt->pidx; - sw_ctxt_entries[1].value = sw_ctxt->irq_arm; - sw_ctxt_entries[2].value = sw_ctxt->fnc_id; - sw_ctxt_entries[3].value = sw_ctxt->qen; - sw_ctxt_entries[4].value = sw_ctxt->frcd_en; - sw_ctxt_entries[5].value = sw_ctxt->wbi_chk; - sw_ctxt_entries[6].value = sw_ctxt->wbi_intvl_en; - sw_ctxt_entries[7].value = sw_ctxt->at; - sw_ctxt_entries[8].value = sw_ctxt->fetch_max; - sw_ctxt_entries[9].value = sw_ctxt->rngsz_idx; - sw_ctxt_entries[10].value = sw_ctxt->desc_sz; - sw_ctxt_entries[11].value = sw_ctxt->bypass; - sw_ctxt_entries[12].value = sw_ctxt->mm_chn; - sw_ctxt_entries[13].value = sw_ctxt->wbk_en; - sw_ctxt_entries[14].value = sw_ctxt->irq_en; - sw_ctxt_entries[15].value = sw_ctxt->port_id; - sw_ctxt_entries[16].value = sw_ctxt->irq_no_last; - sw_ctxt_entries[17].value = sw_ctxt->err; - sw_ctxt_entries[18].value = sw_ctxt->err_wb_sent; - sw_ctxt_entries[19].value = sw_ctxt->irq_req; - sw_ctxt_entries[20].value = sw_ctxt->mrkr_dis; - sw_ctxt_entries[21].value = sw_ctxt->is_mm; - sw_ctxt_entries[22].value = sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - sw_ctxt_entries[23].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; - sw_ctxt_entries[24].value = sw_ctxt->vec; - sw_ctxt_entries[25].value = sw_ctxt->intr_aggr; -} - -/* - * qdma_acc_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void qdma_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - cmpt_ctxt_entries[0].value = cmpt_ctxt->en_stat_desc; - cmpt_ctxt_entries[1].value = cmpt_ctxt->en_int; - cmpt_ctxt_entries[2].value = cmpt_ctxt->trig_mode; - cmpt_ctxt_entries[3].value = cmpt_ctxt->fnc_id; - cmpt_ctxt_entries[4].value = cmpt_ctxt->counter_idx; - cmpt_ctxt_entries[5].value = cmpt_ctxt->timer_idx; - cmpt_ctxt_entries[6].value = cmpt_ctxt->in_st; - cmpt_ctxt_entries[7].value = cmpt_ctxt->color; - cmpt_ctxt_entries[8].value = cmpt_ctxt->ringsz_idx; - cmpt_ctxt_entries[9].value = cmpt_ctxt->bs_addr & 0xFFFFFFFF; - cmpt_ctxt_entries[10].value = - (cmpt_ctxt->bs_addr >> 32) & 0xFFFFFFFF; - cmpt_ctxt_entries[11].value = cmpt_ctxt->desc_sz; - cmpt_ctxt_entries[12].value = cmpt_ctxt->pidx; - cmpt_ctxt_entries[13].value = cmpt_ctxt->cidx; - cmpt_ctxt_entries[14].value = cmpt_ctxt->valid; - cmpt_ctxt_entries[15].value = cmpt_ctxt->err; - cmpt_ctxt_entries[16].value = cmpt_ctxt->user_trig_pend; - cmpt_ctxt_entries[17].value = cmpt_ctxt->timer_running; - cmpt_ctxt_entries[18].value = cmpt_ctxt->full_upd; - cmpt_ctxt_entries[19].value = cmpt_ctxt->ovf_chk_dis; - cmpt_ctxt_entries[20].value = cmpt_ctxt->at; - cmpt_ctxt_entries[21].value = cmpt_ctxt->vec; - cmpt_ctxt_entries[22].value = cmpt_ctxt->int_aggr; -} - -/* - * qdma_acc_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void qdma_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - hw_ctxt_entries[0].value = hw_ctxt->cidx; - hw_ctxt_entries[1].value = hw_ctxt->crd_use; - hw_ctxt_entries[2].value = hw_ctxt->dsc_pend; - hw_ctxt_entries[3].value = hw_ctxt->idl_stp_b; - hw_ctxt_entries[4].value = hw_ctxt->evt_pnd; - hw_ctxt_entries[5].value = hw_ctxt->fetch_pnd; -} - -/* - * qdma_acc_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void qdma_fill_credit_ctxt(struct qdma_descq_credit_ctxt *cr_ctxt) -{ - credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * qdma_acc_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void qdma_fill_pfetch_ctxt(struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - c2h_pftch_ctxt_entries[0].value = pfetch_ctxt->bypass; - c2h_pftch_ctxt_entries[1].value = pfetch_ctxt->bufsz_idx; - c2h_pftch_ctxt_entries[2].value = pfetch_ctxt->port_id; - c2h_pftch_ctxt_entries[3].value = pfetch_ctxt->err; - c2h_pftch_ctxt_entries[4].value = pfetch_ctxt->pfch_en; - c2h_pftch_ctxt_entries[5].value = pfetch_ctxt->pfch; - c2h_pftch_ctxt_entries[6].value = pfetch_ctxt->sw_crdt; - c2h_pftch_ctxt_entries[7].value = pfetch_ctxt->valid; -} - -/* - * qdma_acc_fill_fmap_ctxt() - Helper function to fill fmap context - * into structure - * - */ -static void qdma_fill_fmap_ctxt(struct qdma_fmap_cfg *fmap_ctxt) -{ - fmap_ctxt_entries[0].value = fmap_ctxt->qbase; - fmap_ctxt_entries[1].value = fmap_ctxt->qmax; -} - -/* - * dump_soft_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_soft_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - qdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_H2C) { - qdma_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_fill_credit_ctxt(&queue_context->cr_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_C2H) { - qdma_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_fill_credit_ctxt(&queue_context->cr_ctxt); - if (st) { - qdma_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - qdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - } - - qdma_fill_fmap_ctxt(&queue_context->fmap); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - /* SW context dump */ - n = sizeof(sw_ctxt_entries) / sizeof((sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - sw_ctxt_entries[i].name, - sw_ctxt_entries[i].value, - sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(hw_ctxt_entries) / sizeof((hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - hw_ctxt_entries[i].name, - hw_ctxt_entries[i].value, - hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(credit_ctxt_entries) / - sizeof((credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - credit_ctxt_entries[i].name, - credit_ctxt_entries[i].value, - credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(cmpt_ctxt_entries) / sizeof((cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - cmpt_ctxt_entries[i].name, - cmpt_ctxt_entries[i].value, - cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(c2h_pftch_ctxt_entries) / - sizeof(c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - c2h_pftch_ctxt_entries[i].name, - c2h_pftch_ctxt_entries[i].value, - c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* Fmap context dump */ - n = sizeof(fmap_ctxt_entries) / - sizeof(fmap_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Fmap Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - fmap_ctxt_entries[i].name, - fmap_ctxt_entries[i].value, - fmap_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * qdma_indirect_reg_invalidate() - helper function to invalidate indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = QDMA_OFFSET_IND_CTXT_DATA; - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_IND_CTXT_DATA_NUM_REGS; index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = QDMA_OFFSET_IND_CTXT_DATA; - - for (index = 0; index < ((2 * QDMA_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_version() - Function to get the qdma version - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @version_info: pointer to hold the version info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_VERSION : - QDMA_OFFSET_GLBL2_MISC_CAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - qdma_fetch_version_details(dev_hndl, is_vf, reg_val, version_info); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_fmap_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap[QDMA_FMAP_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - fmap[num_words_count++] = - FIELD_SET(QDMA_FMAP_CTXT_W0_QID_MASK, config->qbase); - fmap[num_words_count++] = - FIELD_SET(QDMA_FMAP_CTXT_W1_QID_MAX_MASK, config->qmax); - - return qdma_indirect_reg_write(dev_hndl, sel, func_id, - fmap, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_fmap_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - int rv = QDMA_SUCCESS; - uint32_t fmap[QDMA_FMAP_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, func_id, - QDMA_FMAP_NUM_WORDS, fmap); - if (rv < 0) - return rv; - - config->qbase = FIELD_GET(QDMA_FMAP_CTXT_W0_QID_MASK, fmap[0]); - config->qmax = FIELD_GET(QDMA_FMAP_CTXT_W1_QID_MAX_MASK, fmap[1]); - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_fmap_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_clear(void *dev_hndl, uint16_t func_id) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu\n", __func__, func_id); - return qdma_indirect_reg_clear(dev_hndl, sel, func_id); -} - -/*****************************************************************************/ -/** - * qdma_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_fmap_read(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_fmap_write(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_fmap_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[QDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W0_PIDX, ctxt->pidx) | - FIELD_SET(QDMA_SW_CTXT_W0_IRQ_ARM_MASK, ctxt->irq_arm) | - FIELD_SET(QDMA_SW_CTXT_W0_FUNC_ID_MASK, ctxt->fnc_id); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x\n", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(QDMA_SW_CTXT_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(QDMA_SW_CTXT_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(QDMA_SW_CTXT_W1_WB_INT_EN_MASK, ctxt->wbi_intvl_en) | - FIELD_SET(QDMA_SW_CTXT_W1_AT_MASK, ctxt->at) | - FIELD_SET(QDMA_SW_CTXT_W1_FETCH_MAX_MASK, ctxt->fetch_max) | - FIELD_SET(QDMA_SW_CTXT_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(QDMA_SW_CTXT_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(QDMA_SW_CTXT_W1_BYP_MASK, ctxt->bypass) | - FIELD_SET(QDMA_SW_CTXT_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(QDMA_SW_CTXT_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(QDMA_SW_CTXT_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK, ctxt->irq_no_last) | - FIELD_SET(QDMA_SW_CTXT_W1_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK, ctxt->err_wb_sent) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(QDMA_SW_CTXT_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(QDMA_SW_CTXT_W1_IS_MM_MASK, ctxt->is_mm); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,err=%x", - __func__, ctxt->port_id, ctxt->irq_no_last, ctxt->err); - qdma_log_debug(", err_wb_sent=%x\n", ctxt->err_wb_sent); - - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(QDMA_SW_CTXT_W4_INTR_AGGR_MASK, ctxt->intr_aggr); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t sw_ctxt[QDMA_SW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(QDMA_SW_CTXT_W0_PIDX, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W0_IRQ_ARM_MASK, sw_ctxt[0])); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W0_FUNC_ID_MASK, sw_ctxt[0])); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - ctxt->qen = FIELD_GET(QDMA_SW_CTXT_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(QDMA_SW_CTXT_W1_FCRD_EN_MASK, sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(QDMA_SW_CTXT_W1_WBI_CHK_MASK, sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(QDMA_SW_CTXT_W1_WB_INT_EN_MASK, sw_ctxt[1]); - ctxt->at = FIELD_GET(QDMA_SW_CTXT_W1_AT_MASK, sw_ctxt[1]); - ctxt->fetch_max = - FIELD_GET(QDMA_SW_CTXT_W1_FETCH_MAX_MASK, sw_ctxt[1]); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_RNG_SZ_MASK, sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_DSC_SZ_MASK, sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_BYP_MASK, sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_MM_CHN_MASK, sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_WBK_EN_MASK, sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_EN_MASK, sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_PORT_ID_MASK, sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_REQ_MASK, sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_MRKR_DIS_MASK, sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IS_MM_MASK, sw_ctxt[1])); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,", - __func__, ctxt->port_id, ctxt->irq_no_last); - qdma_log_debug(" err=%x, err_wb_sent=%x\n", - ctxt->err, ctxt->err_wb_sent); - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - ctxt->vec = FIELD_GET(QDMA_SW_CTXT_W4_VEC_MASK, sw_ctxt[4]); - ctxt->intr_aggr = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W4_INTR_AGGR_MASK, - sw_ctxt[4])); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_sw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_sw_context_write(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_sw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[QDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(QDMA_PFTCH_CTXT_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK, ctxt->pfch) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK, sw_crdt_l); - - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(QDMA_PFTCH_CTXT_W1_VALID_MASK, ctxt->valid); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t pfetch_ctxt[QDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - FIELD_GET(QDMA_PFTCH_CTXT_W0_BYPASS_MASK, pfetch_ctxt[0]); - ctxt->bufsz_idx = - FIELD_GET(QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK, pfetch_ctxt[0]); - ctxt->port_id = - FIELD_GET(QDMA_PFTCH_CTXT_W0_PORT_ID_MASK, pfetch_ctxt[0]); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK, pfetch_ctxt[0]); - - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK, pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_pfetch_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_pfetch_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_pfetch_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[QDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h, pidx_l, pidx_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR) { - qdma_log_error("%s: trig_mode(%d) > (%d) is invalid, err:%d\n", - __func__, - ctxt->trig_mode, - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_COMPL_CTXT_BADDR_GET_L_MASK, - ctxt->bs_addr); - baddr_h = (uint32_t)FIELD_GET(QDMA_COMPL_CTXT_BADDR_GET_H_MASK, - ctxt->bs_addr); - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, ctxt->pidx); - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, ctxt->pidx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(QDMA_COMPL_CTXT_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(QDMA_COMPL_CTXT_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK, - ctxt->counter_idx) | - FIELD_SET(QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK, ctxt->timer_idx) | - FIELD_SET(QDMA_COMPL_CTXT_W0_INT_ST_MASK, ctxt->in_st) | - FIELD_SET(QDMA_COMPL_CTXT_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(QDMA_COMPL_CTXT_W0_RING_SZ_MASK, ctxt->ringsz_idx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK, baddr_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK, baddr_h) | - FIELD_SET(QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK, ctxt->desc_sz) | - FIELD_SET(QDMA_COMPL_CTXT_W2_PIDX_L_MASK, pidx_l); - - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W3_PIDX_H_MASK, pidx_h) | - FIELD_SET(QDMA_COMPL_CTXT_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(QDMA_COMPL_CTXT_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(QDMA_COMPL_CTXT_W3_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK, - ctxt->user_trig_pend); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W4_TMR_RUN_MASK, - ctxt->timer_running) | - FIELD_SET(QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK, ctxt->full_upd) | - FIELD_SET(QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK, - ctxt->ovf_chk_dis) | - FIELD_SET(QDMA_COMPL_CTXT_W4_AT_MASK, ctxt->at) | - FIELD_SET(QDMA_COMPL_CTXT_W4_INTR_VEC_MASK, ctxt->vec) | - FIELD_SET(QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK, ctxt->int_aggr); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cmpt_ctxt[QDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr_l, baddr_h, pidx_l, pidx_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(QDMA_COMPL_CTXT_W0_EN_INT_MASK, cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_RING_SZ_MASK, - cmpt_ctxt[0])); - - baddr_l = FIELD_GET(QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK, cmpt_ctxt[1]); - - baddr_h = FIELD_GET(QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK, cmpt_ctxt[2]); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_W2_PIDX_L_MASK, cmpt_ctxt[2]); - - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_W3_PIDX_H_MASK, cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_ERR_MASK, cmpt_ctxt[3])); - ctxt->user_trig_pend = (uint8_t) - (FIELD_GET(QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK, cmpt_ctxt[3])); - - ctxt->timer_running = - FIELD_GET(QDMA_COMPL_CTXT_W4_TMR_RUN_MASK, cmpt_ctxt[4]); - ctxt->full_upd = - FIELD_GET(QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK, cmpt_ctxt[4]); - ctxt->ovf_chk_dis = - FIELD_GET(QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK, cmpt_ctxt[4]); - ctxt->at = FIELD_GET(QDMA_COMPL_CTXT_W4_AT_MASK, cmpt_ctxt[4]); - ctxt->vec = FIELD_GET(QDMA_COMPL_CTXT_W4_INTR_VEC_MASK, cmpt_ctxt[4]); - ctxt->int_aggr = (uint8_t) - (FIELD_GET(QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK, cmpt_ctxt[4])); - - ctxt->bs_addr = - FIELD_SET(QDMA_COMPL_CTXT_BADDR_GET_L_MASK, (uint64_t)baddr_l) | - FIELD_SET(QDMA_COMPL_CTXT_BADDR_GET_H_MASK, (uint64_t)baddr_h); - - ctxt->pidx = - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, pidx_l) | - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, pidx_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cmpt_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_cmpt_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_cmpt_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t hw_ctxt[QDMA_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or hw_ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(QDMA_HW_CTXT_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(QDMA_HW_CTXT_W0_CRD_USE_MASK, hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_DSC_PND_MASK, hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->evt_pnd = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_EVENT_PEND_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = (uint8_t) - (FIELD_GET(QDMA_HW_CTXT_W1_FETCH_PEND_MASK, hw_ctxt[1])); - - qdma_log_debug("%s: cidx=%hu, crd_use=%hu, dsc_pend=%x\n", - __func__, ctxt->cidx, ctxt->crd_use, ctxt->dsc_pend); - qdma_log_debug("%s: idl_stp_b=%x, evt_pnd=%x, fetch_pnd=%x\n", - __func__, ctxt->idl_stp_b, ctxt->evt_pnd, - ctxt->fetch_pnd); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_hw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_hw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[QDMA_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(QDMA_CR_CTXT_W0_CREDT_MASK, cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_credit_ctx_conf() - configure credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_credit_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_credit_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_write() - create indirect interrupt context - * and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_write(void *dev_hndl, uint16_t ring_index, - const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[QDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint32_t baddr_l, baddr_m, baddr_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_m = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, - ctxt->baddr_4k); - baddr_h = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(QDMA_INTR_CTXT_W0_VEC_ID_MASK, ctxt->vec) | - FIELD_SET(QDMA_INTR_CTXT_W0_INT_ST_MASK, ctxt->int_st) | - FIELD_SET(QDMA_INTR_CTXT_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(QDMA_INTR_CTXT_W0_BADDR_64_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W1_BADDR_64_MASK, baddr_m); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W2_BADDR_64_MASK, baddr_h) | - FIELD_SET(QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK, ctxt->page_size) | - FIELD_SET(QDMA_INTR_CTXT_W2_PIDX_MASK, ctxt->pidx) | - FIELD_SET(QDMA_INTR_CTXT_W2_AT_MASK, ctxt->at); - - return qdma_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_read(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t intr_ctxt[QDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_m, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, ring_index, - QDMA_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(QDMA_INTR_CTXT_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(QDMA_INTR_CTXT_W0_VEC_ID_MASK, intr_ctxt[0]); - ctxt->int_st = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W0_INT_ST_MASK, - intr_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W0_COLOR_MASK, - intr_ctxt[0])); - - baddr_l = FIELD_GET(QDMA_INTR_CTXT_W0_BADDR_64_MASK, intr_ctxt[0]); - - baddr_m = FIELD_GET(QDMA_INTR_CTXT_W1_BADDR_64_MASK, intr_ctxt[1]); - - baddr_h = FIELD_GET(QDMA_INTR_CTXT_W2_BADDR_64_MASK, intr_ctxt[2]); - ctxt->page_size = - FIELD_GET(QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK, intr_ctxt[2]); - ctxt->pidx = - (uint16_t)(FIELD_GET(QDMA_INTR_CTXT_W2_PIDX_MASK, - intr_ctxt[2])); - ctxt->at = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W2_AT_MASK, intr_ctxt[2])); - - ctxt->baddr_4k = - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, baddr_m) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_clear() - clear indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_clear(void *dev_hndl, uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_invalidate() - invalidate indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_indirect_intr_context_read(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_indirect_intr_context_write(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_indirect_intr_context_invalidate(dev_hndl, - ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_set_default_global_csr() - function to set the global CSR register to - * default values. The value can be modified later by using the set/get csr - * functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t cfg_val = 0, reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, 385, - 513, 769, 1025, 1537, 3073, 4097, 6145, 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, 32, 48, 64, - 80, 96, 112, 128, 144, 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 8192, - 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_TIMER_CNT, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(QDMA_GLBL_DSC_CFG_MAX_DSC_FETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG, reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_C2H_PFETCH_CACHE_DEPTH); - reg_val = - FIELD_SET(QDMA_C2H_PFCH_FL_TH_MASK, - QDMA_DEFAULT_PFCH_STOP_THRESH) | - FIELD_SET(QDMA_C2H_NUM_PFCH_MASK, - DEFAULT_PFCH_NUM_ENTRIES_PER_Q) | - FIELD_SET(QDMA_C2H_PFCH_QCNT_MASK, (cfg_val >> 1)) | - FIELD_SET(QDMA_C2H_EVT_QCNT_TH_MASK, - ((cfg_val >> 1) - 2)); - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_PFETCH_CFG, reg_val); - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_INT_TIMER_TICK, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_C2H_CMPT_COAL_BUF_DEPTH); - reg_val = - FIELD_SET(QDMA_C2H_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(QDMA_C2H_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(QDMA_C2H_MAX_BUF_SZ_MASK, cfg_val); - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_WRB_COAL_CFG, reg_val); - - /* H2C throttle Configuration*/ - reg_val = - FIELD_SET(QDMA_H2C_DATA_THRESH_MASK, - QDMA_H2C_THROT_DATA_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_DATA_MASK, - QDMA_THROT_EN_DATA) | - FIELD_SET(QDMA_H2C_REQ_THRESH_MASK, - QDMA_H2C_THROT_REQ_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_REQ_MASK, - QDMA_THROT_EN_REQ); - qdma_reg_write(dev_hndl, QDMA_OFFSET_H2C_REQ_THROT, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_pidx_update() - function to update the desc PIDX - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @reg_info: data needed for the PIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info) -{ - uint32_t reg_addr = 0; - uint32_t reg_val = 0; - - if (!dev_hndl || !reg_info) { - qdma_log_error("%s: dev_hndl:(%p), reg_info:(%p), err:%d\n", - __func__, dev_hndl, reg_info, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!is_vf) { - reg_addr = (is_c2h) ? QDMA_OFFSET_DMAP_SEL_C2H_DSC_PIDX : - QDMA_OFFSET_DMAP_SEL_H2C_DSC_PIDX; - } else { - reg_addr = (is_c2h) ? QDMA_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX : - QDMA_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX; - } - - reg_addr += (qid * QDMA_PIDX_STEP); - - reg_val = FIELD_SET(QDMA_DMA_SEL_DESC_PIDX_MASK, reg_info->pidx) | - FIELD_SET(QDMA_DMA_SEL_IRQ_EN_MASK, - reg_info->irq_en); - - /* Make sure writes to the H2C/C2H descriptors are synchronized - * before updating PIDX - */ - qdma_io_wmb(); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_cmpt_cidx_update() - function to update the CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_OFFSET_DMAP_SEL_CMPT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl || !reg_info) { - qdma_log_error("%s: dev_handle (%p) reg_info (%p) , err:%d\n", - __func__, dev_hndl, reg_info, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += (qid * QDMA_CMPT_CIDX_STEP); - - reg_val = - FIELD_SET(QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK, - reg_info->wrb_cidx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_info->counter_idx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK, - reg_info->timer_idx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK, - reg_info->trig_mode) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_info->wrb_en) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK, reg_info->irq_en); - - /* Make sure writes to the CMPT ring are synchronized - * before updating CIDX - */ - qdma_io_wmb(); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_intr_cidx_update() - function to update the CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_INT_CIDX : - QDMA_OFFSET_DMAP_SEL_INT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl || !reg_info) { - qdma_log_error("%s: dev_handle (%p) reg_info (%p), err:%d\n", - __func__, dev_hndl, reg_info, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += qid * QDMA_INT_CIDX_STEP; - - reg_val = - FIELD_SET(QDMA_DMA_SEL_INT_SW_CIDX_MASK, reg_info->sw_cidx) | - FIELD_SET(QDMA_DMA_SEL_INT_RING_IDX_MASK, reg_info->rng_idx); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_user_bar() - Function to get the - * AXI Master Lite(user bar) number - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_USER_BAR_ID : - QDMA_OFFSET_GLBL2_PF_BARLITE_EXT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: user_bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - - if (!is_vf) - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - else - user_bar_id = user_bar_id & 0x3F; - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, vf:%d, usrbar:%d, err:%d\n", - __func__, - is_vf, - *user_bar, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_device_attributes() - Function to get the qdma device attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_PF_BARLITE_INT); - if (FIELD_GET(QDMA_GLBL2_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_CHANNEL_QDMA_CAP); - dev_info->num_qs = FIELD_GET(QDMA_GLBL2_MULTQ_MAX_MASK, reg_val); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_MISC_CAP); - dev_info->mailbox_en = FIELD_GET(QDMA_GLBL2_MAILBOX_EN_MASK, reg_val); - dev_info->flr_present = FIELD_GET(QDMA_GLBL2_FLR_PRESENT_MASK, reg_val); - dev_info->mm_cmpt_en = FIELD_GET(QDMA_GLBL2_MM_CMPT_EN_MASK, reg_val); - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_CHANNEL_MDMA); - dev_info->mm_en = (FIELD_GET(QDMA_GLBL2_MM_C2H_MASK, reg_val) - && FIELD_GET(QDMA_GLBL2_MM_H2C_MASK, reg_val)) ? 1 : 0; - dev_info->st_en = (FIELD_GET(QDMA_GLBL2_ST_C2H_MASK, reg_val) - && FIELD_GET(QDMA_GLBL2_ST_H2C_MASK, reg_val)) ? 1 : 0; - - /* num of mm channels */ - /* TODO : Register not yet defined for this. Hard coding it to 1.*/ - dev_info->mm_channel_max = 1; - - dev_info->debug_mode = 0; - dev_info->desc_eng_mode = 0; - dev_info->qid2vec_ctx = 0; - dev_info->cmpt_ovf_chk_dis = 1; - dev_info->mailbox_intr = 1; - dev_info->sw_desc_64b = 1; - dev_info->cmpt_desc_64b = 1; - dev_info->dynamic_bar = 1; - dev_info->legacy_intr = 1; - dev_info->cmpt_trig_count_timer = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_ram_sbe_err_process() - Function to dump SBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_ram_sbe_err_process(void *dev_hndl) -{ - qdma_dump_reg_info(dev_hndl, QDMA_OFFSET_RAM_SBE_STAT, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_hw_ram_dbe_err_process() - Function to dump DBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_ram_dbe_err_process(void *dev_hndl) -{ - qdma_dump_reg_info(dev_hndl, QDMA_OFFSET_RAM_DBE_STAT, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_hw_desc_err_process() - Function to dump Descriptor Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - QDMA_OFFSET_GLBL_DSC_ERR_STS, - QDMA_OFFSET_GLBL_DSC_ERR_LOG0, - QDMA_OFFSET_GLBL_DSC_ERR_LOG1, - QDMA_OFFSET_GLBL_DSC_DBG_DAT0, - QDMA_OFFSET_GLBL_DSC_DBG_DAT1, - QDMA_OFFSET_GLBL_DSC_ERR_LOG2 - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * qdma_hw_trq_err_process() - Function to dump Target Access Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - QDMA_OFFSET_GLBL_TRQ_ERR_STS, - QDMA_OFFSET_GLBL_TRQ_ERR_LOG - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } - - -} - -/*****************************************************************************/ -/** - * qdma_hw_st_h2c_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_OFFSET_H2C_FIRST_ERR_QID, - QDMA_OFFSET_H2C_DBG_REG0, - QDMA_OFFSET_H2C_DBG_REG1, - QDMA_OFFSET_H2C_DBG_REG2, - QDMA_OFFSET_H2C_DBG_REG3, - QDMA_OFFSET_H2C_DBG_REG4 - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, st_h2c_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_hw_st_c2h_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_OFFSET_C2H_FIRST_ERR_QID, - QDMA_OFFSET_C2H_STAT_S_AXIS_C2H_ACCEPTED, - QDMA_OFFSET_C2H_STAT_S_AXIS_CMPT_ACCEPTED, - QDMA_OFFSET_C2H_STAT_DESC_RSP_PKT_ACCEPTED, - QDMA_OFFSET_C2H_STAT_AXIS_PKG_CMP, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_0, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_1, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_2, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_3, - QDMA_OFFSET_C2H_STAT_DESC_RSP_DROP_ACCEPTED, - QDMA_OFFSET_C2H_STAT_DESC_RSP_ERR_ACCEPTED - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, st_c2h_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_hw_get_error_name() - Function to get the error in string format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *qdma_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= QDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, (enum qdma_error_idx)err_idx); - return NULL; - } - - return qdma_err_info[(enum qdma_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t bit = 0, i = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[TOTAL_LEAF_ERROR_AGGREGATORS] = { - QDMA_DSC_ERR_POISON, - QDMA_TRQ_ERR_UNMAPPED, - QDMA_ST_C2H_ERR_MTY_MISMATCH, - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - QDMA_SBE_ERR_MI_H2C0_DAT, - QDMA_DBE_ERR_MI_H2C0_DAT - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_STAT); - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - qdma_log_info("addr = 0x%08x val = 0x%08x", - QDMA_OFFSET_GLBL_ERR_STAT, - glbl_err_stat); - for (i = 0; i < TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - bit = hw_err_position[i]; - - if ((!dev_cap.st_en) && (bit == QDMA_ST_C2H_ERR_MTY_MISMATCH || - bit == QDMA_ST_FATAL_ERR_MTY_MISMATCH || - bit == QDMA_ST_H2C_ERR_ZERO_LEN_DESC)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - qdma_err_info[bit].stat_reg_addr); - - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - qdma_err_info[bit].stat_reg_addr, - err_stat); - - qdma_err_info[bit].qdma_hw_err_process( - dev_hndl); - - for (idx = bit; idx < all_hw_errs[i]; idx++) { - /* call the platform specific handler */ - if (err_stat & qdma_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s", - __func__, - qdma_hw_get_error_name(idx)); - } - - qdma_reg_write(dev_hndl, - qdma_err_info[bit].stat_reg_addr, - err_stat); - - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_STAT, glbl_err_stat); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > QDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == QDMA_ERRS_ALL) { - for (i = 0; i < TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - - idx = all_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == QDMA_ST_C2H_ERR_ALL || - idx == QDMA_ST_FATAL_ERR_ALL || - idx == QDMA_ST_H2C_ERR_ALL) - continue; - } - - reg_val = qdma_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - qdma_err_info[idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_GLBL_ERR_MASK); - reg_val |= FIELD_SET( - qdma_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= QDMA_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= QDMA_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - qdma_err_info[err_idx].mask_reg_addr); - reg_val |= FIELD_SET(qdma_err_info[err_idx].leaf_err_mask, 1); - qdma_reg_write(dev_hndl, - qdma_err_info[err_idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK); - reg_val |= FIELD_SET(qdma_err_info[err_idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK, reg_val); - } - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_soft_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs) / sizeof((qdma_config_regs)[0]); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < qdma_soft_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = qdma_config_regs; - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", reg_info[i].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/* - * qdma_fill_intr_ctxt() - Helper function to fill interrupt context - * into structure - * - */ -static void qdma_fill_intr_ctxt(struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - ind_intr_ctxt_entries[0].value = intr_ctxt->valid; - ind_intr_ctxt_entries[1].value = intr_ctxt->vec; - ind_intr_ctxt_entries[2].value = intr_ctxt->int_st; - ind_intr_ctxt_entries[3].value = intr_ctxt->color; - ind_intr_ctxt_entries[4].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - ind_intr_ctxt_entries[5].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - ind_intr_ctxt_entries[6].value = intr_ctxt->page_size; - ind_intr_ctxt_entries[7].value = intr_ctxt->pidx; - ind_intr_ctxt_entries[8].value = intr_ctxt->at; -} - - -static uint32_t qdma_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(ind_intr_ctxt_entries) / - sizeof(ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * dump_intr_context() - Helper function to dump interrupt context into string - * - * return len - length of the string copied into buffer - */ -static int dump_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - qdma_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(ind_intr_ctxt_entries) / - sizeof((ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - ind_intr_ctxt_entries[i].name, - ind_intr_ctxt_entries[i].value, - ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - - -/*****************************************************************************/ -/** - * qdma_dump_intr_context() - Function to get qdma interrupt context dump in a - * buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - req_buflen = qdma_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_soft_dump_queue_context() - Function to get qdma queue context dump in a - * buffer - * - * @dev_hndl: device handle - * @st: Queue Mode (ST or MM) - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_soft_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error( - "%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_soft_context(ctxt_data, st, q_type, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_read_dump_queue_context() - Function to read and dump the queue - * context in the user-provided buffer. This API is valid only for PF and - * should not be used for VFs. For VF's use qdma_dump_queue_context() API - * after reading the context through mailbox. - * - * @dev_hndl: device handle - * @is_vf: VF or PF - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT)* - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_soft_context_buf_len(st, q_type, &req_buflen); - - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error( - "%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = qdma_sw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.sw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:sw ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_hw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.hw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:hw ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, - &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:cr ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = qdma_pfetch_ctx_conf(dev_hndl, - qid_hw, &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s:pftch ctxt read fail, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s:cmpt ctxt read fail, err = %d", - __func__, rv); - return rv; - } - } - - rv = qdma_fmap_conf(dev_hndl, func_id, - &(context.fmap), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s:fmap ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - rv = dump_soft_context(&context, st, q_type, buf, buflen); - - return rv; -} -/*****************************************************************************/ -/** - * qdma_is_legacy_intr_pend() - function to get legacy_intr_pending status bit - * - * @dev_hndl: device handle - * - * Return: legacy interrupt pending status bit value - *****************************************************************************/ -int qdma_is_legacy_intr_pend(void *dev_hndl) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - if (FIELD_GET(QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK, reg_val)) - return QDMA_SUCCESS; - - qdma_log_error("%s: no pending legacy intr, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR; -} - -/*****************************************************************************/ -/** - * qdma_clear_pend_legacy_intr() - function to clear legacy_intr_pending bit - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -int qdma_clear_pend_legacy_intr(void *dev_hndl) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_legacy_intr_conf() - function to disable/enable legacy interrupt - * - * @dev_hndl: device handle - * @enable: enable/disable flag. 1 - enable, 0 - disable - * - * Return: void - *****************************************************************************/ -int qdma_legacy_intr_conf(void *dev_hndl, enum status_type enable) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_INTR_CFG_EN_LGCY_INTR_MASK, enable); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_init_ctxt_memory() - function to initialize the context memory - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - qdma_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = qdma_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - qdma_indirect_reg_clear(dev_hndl, - QDMA_CTXT_SEL_FMAP, i); - -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return QDMA_SUCCESS; - -} - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs)/ - sizeof((qdma_config_regs)[0]); - - reg_info = qdma_config_regs; - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_soft_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_soft_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = qdma_config_regs; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (reg_count = 0; - (reg_count < total_regs);) { - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs)/ - sizeof((qdma_config_regs)[0]); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_group) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = QDMA_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = QDMA_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = QDMA_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = QDMA_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid group received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - reg_info = &qdma_config_regs[reg_index]; - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * qdma_write_global_ring_sizes() - function to set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_ring_sizes() - function to get the global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_TIMER_CNT, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_OFFSET_C2H_TIMER_CNT, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_counter_threshold() - function to get the counter threshold - * values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_write() - function to set the writeback - * interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_read() - function to get the writeback - * interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_global_writeback_interval_write(dev_hndl, *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? QDMA_OFFSET_C2H_MM_CONTROL : - QDMA_OFFSET_H2C_MM_CONTROL; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) { - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - } - - return QDMA_SUCCESS; -} - - -int qdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = qdma_get_config_num_regs(); - struct xreg_info *config_regs = qdma_get_config_regs(); - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; - -} - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_access.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_access.h deleted file mode 100755 index 9cb5247..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_access.h +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_SOFT_ACCESS_H_ -#define __QDMA_SOFT_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library interface definitions - * - * Header file *qdma_access.h* defines data structures and function signatures - * exported by QDMA common library. - */ - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum qdma_error_idx { - /* Descriptor errors */ - QDMA_DSC_ERR_POISON, - QDMA_DSC_ERR_UR_CA, - QDMA_DSC_ERR_PARAM, - QDMA_DSC_ERR_ADDR, - QDMA_DSC_ERR_TAG, - QDMA_DSC_ERR_FLR, - QDMA_DSC_ERR_TIMEOUT, - QDMA_DSC_ERR_DAT_POISON, - QDMA_DSC_ERR_FLR_CANCEL, - QDMA_DSC_ERR_DMA, - QDMA_DSC_ERR_DSC, - QDMA_DSC_ERR_RQ_CANCEL, - QDMA_DSC_ERR_DBE, - QDMA_DSC_ERR_SBE, - QDMA_DSC_ERR_ALL, - - /* TRQ Errors */ - QDMA_TRQ_ERR_UNMAPPED, - QDMA_TRQ_ERR_QID_RANGE, - QDMA_TRQ_ERR_VF_ACCESS, - QDMA_TRQ_ERR_TCP_TIMEOUT, - QDMA_TRQ_ERR_ALL, - - /* C2H Errors */ - QDMA_ST_C2H_ERR_MTY_MISMATCH, - QDMA_ST_C2H_ERR_LEN_MISMATCH, - QDMA_ST_C2H_ERR_QID_MISMATCH, - QDMA_ST_C2H_ERR_DESC_RSP_ERR, - QDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - QDMA_ST_C2H_ERR_MSI_INT_FAIL, - QDMA_ST_C2H_ERR_ERR_DESC_CNT, - QDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - QDMA_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - QDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - QDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - QDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - QDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - QDMA_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_ST_FATAL_ERR_LEN_MISMATCH, - QDMA_ST_FATAL_ERR_QID_MISMATCH, - QDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - QDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - QDMA_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_WPL_DATA_PAR, - QDMA_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - QDMA_ST_H2C_ERR_CSI_MOP, - QDMA_ST_H2C_ERR_NO_DMA_DSC, - QDMA_ST_H2C_ERR_SBE, - QDMA_ST_H2C_ERR_DBE, - QDMA_ST_H2C_ERR_ALL, - - /* Single bit errors */ - QDMA_SBE_ERR_MI_H2C0_DAT, - QDMA_SBE_ERR_MI_C2H0_DAT, - QDMA_SBE_ERR_H2C_RD_BRG_DAT, - QDMA_SBE_ERR_H2C_WR_BRG_DAT, - QDMA_SBE_ERR_C2H_RD_BRG_DAT, - QDMA_SBE_ERR_C2H_WR_BRG_DAT, - QDMA_SBE_ERR_FUNC_MAP, - QDMA_SBE_ERR_DSC_HW_CTXT, - QDMA_SBE_ERR_DSC_CRD_RCV, - QDMA_SBE_ERR_DSC_SW_CTXT, - QDMA_SBE_ERR_DSC_CPLI, - QDMA_SBE_ERR_DSC_CPLD, - QDMA_SBE_ERR_PASID_CTXT_RAM, - QDMA_SBE_ERR_TIMER_FIFO_RAM, - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_SBE_ERR_QID_FIFO_RAM, - QDMA_SBE_ERR_TUSER_FIFO_RAM, - QDMA_SBE_ERR_WRB_COAL_DATA_RAM, - QDMA_SBE_ERR_INT_QID2VEC_RAM, - QDMA_SBE_ERR_INT_CTXT_RAM, - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_SBE_ERR_PFCH_CTXT_RAM, - QDMA_SBE_ERR_WRB_CTXT_RAM, - QDMA_SBE_ERR_PFCH_LL_RAM, - QDMA_SBE_ERR_H2C_PEND_FIFO, - QDMA_SBE_ERR_ALL, - - /* Double bit Errors */ - QDMA_DBE_ERR_MI_H2C0_DAT, - QDMA_DBE_ERR_MI_C2H0_DAT, - QDMA_DBE_ERR_H2C_RD_BRG_DAT, - QDMA_DBE_ERR_H2C_WR_BRG_DAT, - QDMA_DBE_ERR_C2H_RD_BRG_DAT, - QDMA_DBE_ERR_C2H_WR_BRG_DAT, - QDMA_DBE_ERR_FUNC_MAP, - QDMA_DBE_ERR_DSC_HW_CTXT, - QDMA_DBE_ERR_DSC_CRD_RCV, - QDMA_DBE_ERR_DSC_SW_CTXT, - QDMA_DBE_ERR_DSC_CPLI, - QDMA_DBE_ERR_DSC_CPLD, - QDMA_DBE_ERR_PASID_CTXT_RAM, - QDMA_DBE_ERR_TIMER_FIFO_RAM, - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_DBE_ERR_QID_FIFO_RAM, - QDMA_DBE_ERR_TUSER_FIFO_RAM, - QDMA_DBE_ERR_WRB_COAL_DATA_RAM, - QDMA_DBE_ERR_INT_QID2VEC_RAM, - QDMA_DBE_ERR_INT_CTXT_RAM, - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_DBE_ERR_PFCH_CTXT_RAM, - QDMA_DBE_ERR_WRB_CTXT_RAM, - QDMA_DBE_ERR_PFCH_LL_RAM, - QDMA_DBE_ERR_H2C_PEND_FIFO, - QDMA_DBE_ERR_ALL, - - QDMA_ERRS_ALL -}; - -struct qdma_hw_err_info { - enum qdma_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*qdma_hw_err_process)(void *dev_hndl); -}; - - -int qdma_set_default_global_csr(void *dev_hndl); - -int qdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - -int qdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int qdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info); - -int qdma_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info); - -int qdma_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info); - -int qdma_init_ctxt_memory(void *dev_hndl); - -int qdma_legacy_intr_conf(void *dev_hndl, enum status_type enable); - -int qdma_clear_pend_legacy_intr(void *dev_hndl); - -int qdma_is_legacy_intr_pend(void *dev_hndl); - -int qdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -uint32_t qdma_soft_reg_dump_buf_len(void); - -uint32_t qdma_get_config_num_regs(void); - -struct xreg_info *qdma_get_config_regs(void); - -int qdma_soft_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int qdma_soft_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int qdma_soft_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -int qdma_soft_read_dump_queue_context(void *dev_hndl, - uint16_t func_id, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int qdma_hw_error_process(void *dev_hndl); - -const char *qdma_hw_get_error_name(uint32_t err_idx); - -int qdma_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int qdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -int qdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint16_t func_id, uint8_t *user_bar); - -int qdma_soft_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int qdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int qdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int qdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int qdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable); - -int qdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_SOFT_ACCESS_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_reg.h b/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_reg.h deleted file mode 100755 index d3876c0..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_access/qdma_soft_access/qdma_soft_reg.h +++ /dev/null @@ -1,583 +0,0 @@ -/* - * Copyright (c) 2019-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_SOFT_REG_H__ -#define __QDMA_SOFT_REG_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * User defined helper macros for masks and shifts. If the same macros are - * defined in linux kernel code , then undefined them and used the user - * defined macros - */ -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - - -#define DEBGFS_LINE_SZ (81) - - -#define QDMA_H2C_THROT_DATA_THRESH 0x4000 -#define QDMA_THROT_EN_DATA 1 -#define QDMA_THROT_EN_REQ 0 -#define QDMA_H2C_THROT_REQ_THRESH 0x60 - -/* - * Q Context programming (indirect) - */ - -#define QDMA_REG_IND_CTXT_REG_COUNT 8 -#define QDMA_REG_IND_CTXT_WCNT_1 1 -#define QDMA_REG_IND_CTXT_WCNT_2 2 -#define QDMA_REG_IND_CTXT_WCNT_3 3 -#define QDMA_REG_IND_CTXT_WCNT_4 4 -#define QDMA_REG_IND_CTXT_WCNT_5 5 -#define QDMA_REG_IND_CTXT_WCNT_6 6 -#define QDMA_REG_IND_CTXT_WCNT_7 7 -#define QDMA_REG_IND_CTXT_WCNT_8 8 - -/* ------------------------- QDMA_TRQ_SEL_IND (0x00800) ----------------*/ -#define QDMA_OFFSET_IND_CTXT_DATA 0x804 -#define QDMA_OFFSET_IND_CTXT_MASK 0x824 -#define QDMA_OFFSET_IND_CTXT_CMD 0x844 -#define QDMA_IND_CTXT_CMD_BUSY_MASK 0x1 - -/** QDMA_IND_REG_SEL_FMAP */ -#define QDMA_FMAP_CTXT_W1_QID_MAX_MASK GENMASK(11, 0) -#define QDMA_FMAP_CTXT_W0_QID_MASK GENMASK(10, 0) - -/** QDMA_IND_REG_SEL_SW_C2H */ -/** QDMA_IND_REG_SEL_SW_H2C */ -#define QDMA_SW_CTXT_W4_INTR_AGGR_MASK BIT(11) -#define QDMA_SW_CTXT_W4_VEC_MASK GENMASK(10, 0) -#define QDMA_SW_CTXT_W3_DSC_H_MASK GENMASK(31, 0) -#define QDMA_SW_CTXT_W2_DSC_L_MASK GENMASK(31, 0) -#define QDMA_SW_CTXT_W1_IS_MM_MASK BIT(31) -#define QDMA_SW_CTXT_W1_MRKR_DIS_MASK BIT(30) -#define QDMA_SW_CTXT_W1_IRQ_REQ_MASK BIT(29) -#define QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK BIT(28) -#define QDMA_SW_CTXT_W1_ERR_MASK GENMASK(27, 26) -#define QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK BIT(25) -#define QDMA_SW_CTXT_W1_PORT_ID_MASK GENMASK(24, 22) -#define QDMA_SW_CTXT_W1_IRQ_EN_MASK BIT(21) -#define QDMA_SW_CTXT_W1_WBK_EN_MASK BIT(20) -#define QDMA_SW_CTXT_W1_MM_CHN_MASK BIT(19) -#define QDMA_SW_CTXT_W1_BYP_MASK BIT(18) -#define QDMA_SW_CTXT_W1_DSC_SZ_MASK GENMASK(17, 16) -#define QDMA_SW_CTXT_W1_RNG_SZ_MASK GENMASK(15, 12) -#define QDMA_SW_CTXT_W1_FETCH_MAX_MASK GENMASK(7, 5) -#define QDMA_SW_CTXT_W1_AT_MASK BIT(4) -#define QDMA_SW_CTXT_W1_WB_INT_EN_MASK BIT(3) -#define QDMA_SW_CTXT_W1_WBI_CHK_MASK BIT(2) -#define QDMA_SW_CTXT_W1_FCRD_EN_MASK BIT(1) -#define QDMA_SW_CTXT_W1_QEN_MASK BIT(0) -#define QDMA_SW_CTXT_W0_FUNC_ID_MASK GENMASK(24, 17) -#define QDMA_SW_CTXT_W0_IRQ_ARM_MASK BIT(16) -#define QDMA_SW_CTXT_W0_PIDX GENMASK(15, 0) - - - -#define QDMA_PFTCH_CTXT_W1_VALID_MASK BIT(13) -#define QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK BIT(28) -#define QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK BIT(27) -#define QDMA_PFTCH_CTXT_W0_ERR_MASK BIT(26) -#define QDMA_PFTCH_CTXT_W0_PORT_ID_MASK GENMASK(7, 5) -#define QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK GENMASK(4, 1) -#define QDMA_PFTCH_CTXT_W0_BYPASS_MASK BIT(0) - - - - -#define QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK BIT(15) -#define QDMA_COMPL_CTXT_W4_INTR_VEC_MASK GENMASK(14, 4) -#define QDMA_COMPL_CTXT_W4_AT_MASK BIT(3) -#define QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK BIT(2) -#define QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK BIT(1) -#define QDMA_COMPL_CTXT_W4_TMR_RUN_MASK BIT(0) -#define QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK BIT(31) -#define QDMA_COMPL_CTXT_W3_ERR_MASK GENMASK(30, 29) -#define QDMA_COMPL_CTXT_W3_VALID_MASK BIT(28) -#define QDMA_COMPL_CTXT_W3_CIDX_MASK GENMASK(27, 12) -#define QDMA_COMPL_CTXT_W3_PIDX_H_MASK GENMASK(11, 0) -#define QDMA_COMPL_CTXT_W2_PIDX_L_MASK GENMASK(31, 28) -#define QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK GENMASK(27, 26) -#define QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK GENMASK(25, 0) -#define QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK GENMASK(31, 6) -#define QDMA_COMPL_CTXT_W0_RING_SZ_MASK GENMASK(31, 28) -#define QDMA_COMPL_CTXT_W0_COLOR_MASK BIT(27) -#define QDMA_COMPL_CTXT_W0_INT_ST_MASK GENMASK(26, 25) -#define QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK GENMASK(24, 21) -#define QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK GENMASK(20, 17) -#define QDMA_COMPL_CTXT_W0_FNC_ID_MASK GENMASK(12, 5) -#define QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define QDMA_COMPL_CTXT_W0_EN_INT_MASK BIT(1) -#define QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK BIT(0) - -/** QDMA_IND_REG_SEL_HW_C2H */ -/** QDMA_IND_REG_SEL_HW_H2C */ -#define QDMA_HW_CTXT_W1_FETCH_PEND_MASK GENMASK(14, 11) -#define QDMA_HW_CTXT_W1_EVENT_PEND_MASK BIT(10) -#define QDMA_HW_CTXT_W1_IDL_STP_B_MASK BIT(9) -#define QDMA_HW_CTXT_W1_DSC_PND_MASK BIT(8) -#define QDMA_HW_CTXT_W0_CRD_USE_MASK GENMASK(31, 16) -#define QDMA_HW_CTXT_W0_CIDX_MASK GENMASK(15, 0) - -/** QDMA_IND_REG_SEL_CR_C2H */ -/** QDMA_IND_REG_SEL_CR_H2C */ -#define QDMA_CR_CTXT_W0_CREDT_MASK GENMASK(15, 0) - -/** QDMA_IND_REG_SEL_INTR */ - - -#define QDMA_INTR_CTXT_W2_AT_MASK BIT(18) -#define QDMA_INTR_CTXT_W2_PIDX_MASK GENMASK(17, 6) -#define QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK GENMASK(5, 3) -#define QDMA_INTR_CTXT_W2_BADDR_64_MASK GENMASK(2, 0) -#define QDMA_INTR_CTXT_W1_BADDR_64_MASK GENMASK(31, 0) -#define QDMA_INTR_CTXT_W0_BADDR_64_MASK GENMASK(31, 15) -#define QDMA_INTR_CTXT_W0_COLOR_MASK BIT(14) -#define QDMA_INTR_CTXT_W0_INT_ST_MASK BIT(13) -#define QDMA_INTR_CTXT_W0_VEC_ID_MASK GENMASK(11, 1) -#define QDMA_INTR_CTXT_W0_VALID_MASK BIT(0) - - - - - -/* ------------------------ QDMA_TRQ_SEL_GLBL (0x00200)-------------------*/ -#define QDMA_OFFSET_GLBL_RNG_SZ 0x204 -#define QDMA_OFFSET_GLBL_SCRATCH 0x244 -#define QDMA_OFFSET_GLBL_ERR_STAT 0x248 -#define QDMA_OFFSET_GLBL_ERR_MASK 0x24C -#define QDMA_OFFSET_GLBL_DSC_CFG 0x250 -#define QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define QDMA_GLBL_DSC_CFG_MAX_DSC_FETCH_MASK GENMASK(5, 3) -#define QDMA_OFFSET_GLBL_DSC_ERR_STS 0x254 -#define QDMA_OFFSET_GLBL_DSC_ERR_MSK 0x258 -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG0 0x25C -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG1 0x260 -#define QDMA_OFFSET_GLBL_TRQ_ERR_STS 0x264 -#define QDMA_OFFSET_GLBL_TRQ_ERR_MSK 0x268 -#define QDMA_OFFSET_GLBL_TRQ_ERR_LOG 0x26C -#define QDMA_OFFSET_GLBL_DSC_DBG_DAT0 0x270 -#define QDMA_OFFSET_GLBL_DSC_DBG_DAT1 0x274 -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG2 0x27C -#define QDMA_OFFSET_GLBL_INTERRUPT_CFG 0x2C4 -#define QDMA_GLBL_INTR_CFG_EN_LGCY_INTR_MASK BIT(0) -#define QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK BIT(1) - -/* ------------------------- QDMA_TRQ_SEL_C2H (0x00A00) ------------------*/ -#define QDMA_OFFSET_C2H_TIMER_CNT 0xA00 -#define QDMA_OFFSET_C2H_CNT_TH 0xA40 -#define QDMA_OFFSET_C2H_QID2VEC_MAP_QID 0xA80 -#define QDMA_OFFSET_C2H_QID2VEC_MAP 0xA84 -#define QDMA_OFFSET_C2H_STAT_S_AXIS_C2H_ACCEPTED 0xA88 -#define QDMA_OFFSET_C2H_STAT_S_AXIS_CMPT_ACCEPTED 0xA8C -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_PKT_ACCEPTED 0xA90 -#define QDMA_OFFSET_C2H_STAT_AXIS_PKG_CMP 0xA94 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_ACCEPTED 0xA98 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_CMP 0xA9C -#define QDMA_OFFSET_C2H_STAT_WRQ_OUT 0xAA0 -#define QDMA_OFFSET_C2H_STAT_WPL_REN_ACCEPTED 0xAA4 -#define QDMA_OFFSET_C2H_STAT_TOTAL_WRQ_LEN 0xAA8 -#define QDMA_OFFSET_C2H_STAT_TOTAL_WPL_LEN 0xAAC -#define QDMA_OFFSET_C2H_BUF_SZ 0xAB0 -#define QDMA_OFFSET_C2H_ERR_STAT 0xAF0 -#define QDMA_OFFSET_C2H_ERR_MASK 0xAF4 -#define QDMA_OFFSET_C2H_FATAL_ERR_STAT 0xAF8 -#define QDMA_OFFSET_C2H_FATAL_ERR_MASK 0xAFC -#define QDMA_OFFSET_C2H_FATAL_ERR_ENABLE 0xB00 -#define QDMA_OFFSET_C2H_ERR_INT 0xB04 -#define QDMA_OFFSET_C2H_PFETCH_CFG 0xB08 -#define QDMA_C2H_EVT_QCNT_TH_MASK GENMASK(31, 25) -#define QDMA_C2H_PFCH_QCNT_MASK GENMASK(24, 18) -#define QDMA_C2H_NUM_PFCH_MASK GENMASK(17, 9) -#define QDMA_C2H_PFCH_FL_TH_MASK GENMASK(8, 0) -#define QDMA_OFFSET_C2H_INT_TIMER_TICK 0xB0C -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_DROP_ACCEPTED 0xB10 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_ERR_ACCEPTED 0xB14 -#define QDMA_OFFSET_C2H_STAT_DESC_REQ 0xB18 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_0 0xB1C -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_1 0xB20 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_2 0xB24 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_3 0xB28 -#define QDMA_OFFSET_C2H_DBG_PFCH_ERR_CTXT 0xB2C -#define QDMA_OFFSET_C2H_FIRST_ERR_QID 0xB30 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_IN 0xB34 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_OUT 0xB38 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_DRP 0xB3C -#define QDMA_OFFSET_C2H_STAT_NUM_STAT_DESC_OUT 0xB40 -#define QDMA_OFFSET_C2H_STAT_NUM_DSC_CRDT_SENT 0xB44 -#define QDMA_OFFSET_C2H_STAT_NUM_FCH_DSC_RCVD 0xB48 -#define QDMA_OFFSET_C2H_STAT_NUM_BYP_DSC_RCVD 0xB4C -#define QDMA_OFFSET_C2H_WRB_COAL_CFG 0xB50 -#define QDMA_C2H_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define QDMA_C2H_TICK_VAL_MASK GENMASK(25, 14) -#define QDMA_C2H_TICK_CNT_MASK GENMASK(13, 2) -#define QDMA_C2H_SET_GLB_FLUSH_MASK BIT(1) -#define QDMA_C2H_DONE_GLB_FLUSH_MASK BIT(0) -#define QDMA_OFFSET_C2H_INTR_H2C_REQ 0xB54 -#define QDMA_OFFSET_C2H_INTR_C2H_MM_REQ 0xB58 -#define QDMA_OFFSET_C2H_INTR_ERR_INT_REQ 0xB5C -#define QDMA_OFFSET_C2H_INTR_C2H_ST_REQ 0xB60 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK 0xB64 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL 0xB68 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX 0xB6C -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL 0xB70 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_MSIX_ACK 0xB74 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_MSIX_FAIL 0xB78 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_NO_MSIX 0xB7C -#define QDMA_OFFSET_C2H_INTR_C2H_ST_CTXT_INVAL 0xB80 -#define QDMA_OFFSET_C2H_STAT_WR_CMP 0xB84 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_4 0xB88 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_5 0xB8C -#define QDMA_OFFSET_C2H_DBG_PFCH_QID 0xB90 -#define QDMA_OFFSET_C2H_DBG_PFCH 0xB94 -#define QDMA_OFFSET_C2H_INT_DEBUG 0xB98 -#define QDMA_OFFSET_C2H_STAT_IMM_ACCEPTED 0xB9C -#define QDMA_OFFSET_C2H_STAT_MARKER_ACCEPTED 0xBA0 -#define QDMA_OFFSET_C2H_STAT_DISABLE_CMP_ACCEPTED 0xBA4 -#define QDMA_OFFSET_C2H_PAYLOAD_FIFO_CRDT_CNT 0xBA8 -#define QDMA_OFFSET_C2H_PFETCH_CACHE_DEPTH 0xBE0 -#define QDMA_OFFSET_C2H_CMPT_COAL_BUF_DEPTH 0xBE4 - -/* ------------------------- QDMA_TRQ_SEL_H2C (0x00E00) ------------------*/ -#define QDMA_OFFSET_H2C_ERR_STAT 0xE00 -#define QDMA_OFFSET_H2C_ERR_MASK 0xE04 -#define QDMA_OFFSET_H2C_FIRST_ERR_QID 0xE08 -#define QDMA_OFFSET_H2C_DBG_REG0 0xE0C -#define QDMA_OFFSET_H2C_DBG_REG1 0xE10 -#define QDMA_OFFSET_H2C_DBG_REG2 0xE14 -#define QDMA_OFFSET_H2C_DBG_REG3 0xE18 -#define QDMA_OFFSET_H2C_DBG_REG4 0xE1C -#define QDMA_OFFSET_H2C_FATAL_ERR_EN 0xE20 -#define QDMA_OFFSET_H2C_REQ_THROT 0xE24 -#define QDMA_H2C_REQ_THROT_EN_REQ_MASK BIT(31) -#define QDMA_H2C_REQ_THRESH_MASK GENMASK(25, 17) -#define QDMA_H2C_REQ_THROT_EN_DATA_MASK BIT(16) -#define QDMA_H2C_DATA_THRESH_MASK GENMASK(15, 0) - - -/* ------------------------- QDMA_TRQ_SEL_H2C_MM (0x1200) ----------------*/ -#define QDMA_OFFSET_H2C_MM_CONTROL 0x1204 -#define QDMA_OFFSET_H2C_MM_CONTROL_W1S 0x1208 -#define QDMA_OFFSET_H2C_MM_CONTROL_W1C 0x120C -#define QDMA_OFFSET_H2C_MM_STATUS 0x1240 -#define QDMA_OFFSET_H2C_MM_STATUS_RC 0x1244 -#define QDMA_OFFSET_H2C_MM_COMPLETED_DESC_COUNT 0x1248 -#define QDMA_OFFSET_H2C_MM_ERR_CODE_EN_MASK 0x1254 -#define QDMA_OFFSET_H2C_MM_ERR_CODE 0x1258 -#define QDMA_OFFSET_H2C_MM_ERR_INFO 0x125C -#define QDMA_OFFSET_H2C_MM_PERF_MON_CONTROL 0x12C0 -#define QDMA_OFFSET_H2C_MM_PERF_MON_CYCLE_COUNT_0 0x12C4 -#define QDMA_OFFSET_H2C_MM_PERF_MON_CYCLE_COUNT_1 0x12C8 -#define QDMA_OFFSET_H2C_MM_PERF_MON_DATA_COUNT_0 0x12CC -#define QDMA_OFFSET_H2C_MM_PERF_MON_DATA_COUNT_1 0x12D0 -#define QDMA_OFFSET_H2C_MM_DEBUG 0x12E8 - -/* ------------------------- QDMA_TRQ_SEL_C2H_MM (0x1000) ----------------*/ -#define QDMA_OFFSET_C2H_MM_CONTROL 0x1004 -#define QDMA_OFFSET_C2H_MM_CONTROL_W1S 0x1008 -#define QDMA_OFFSET_C2H_MM_CONTROL_W1C 0x100C -#define QDMA_OFFSET_C2H_MM_STATUS 0x1040 -#define QDMA_OFFSET_C2H_MM_STATUS_RC 0x1044 -#define QDMA_OFFSET_C2H_MM_COMPLETED_DESC_COUNT 0x1048 -#define QDMA_OFFSET_C2H_MM_ERR_CODE_EN_MASK 0x1054 -#define QDMA_OFFSET_C2H_MM_ERR_CODE 0x1058 -#define QDMA_OFFSET_C2H_MM_ERR_INFO 0x105C -#define QDMA_OFFSET_C2H_MM_PERF_MON_CONTROL 0x10C0 -#define QDMA_OFFSET_C2H_MM_PERF_MON_CYCLE_COUNT_0 0x10C4 -#define QDMA_OFFSET_C2H_MM_PERF_MON_CYCLE_COUNT_1 0x10C8 -#define QDMA_OFFSET_C2H_MM_PERF_MON_DATA_COUNT_0 0x10CC -#define QDMA_OFFSET_C2H_MM_PERF_MON_DATA_COUNT_1 0x10D0 -#define QDMA_OFFSET_C2H_MM_DEBUG 0x10E8 - -/* ------------------------- QDMA_TRQ_SEL_GLBL1 (0x0) -----------------*/ -#define QDMA_OFFSET_CONFIG_BLOCK_ID 0x0 -#define QDMA_CONFIG_BLOCK_ID_MASK GENMASK(31, 16) - - -/* ------------------------- QDMA_TRQ_SEL_GLBL2 (0x00100) ----------------*/ -#define QDMA_OFFSET_GLBL2_ID 0x100 -#define QDMA_OFFSET_GLBL2_PF_BARLITE_INT 0x104 -#define QDMA_GLBL2_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define QDMA_GLBL2_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define QDMA_GLBL2_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define QDMA_GLBL2_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_OFFSET_GLBL2_PF_VF_BARLITE_INT 0x108 -#define QDMA_OFFSET_GLBL2_PF_BARLITE_EXT 0x10C -#define QDMA_OFFSET_GLBL2_PF_VF_BARLITE_EXT 0x110 -#define QDMA_OFFSET_GLBL2_CHANNEL_INST 0x114 -#define QDMA_OFFSET_GLBL2_CHANNEL_MDMA 0x118 -#define QDMA_GLBL2_ST_C2H_MASK BIT(17) -#define QDMA_GLBL2_ST_H2C_MASK BIT(16) -#define QDMA_GLBL2_MM_C2H_MASK BIT(8) -#define QDMA_GLBL2_MM_H2C_MASK BIT(0) -#define QDMA_OFFSET_GLBL2_CHANNEL_STRM 0x11C -#define QDMA_OFFSET_GLBL2_CHANNEL_QDMA_CAP 0x120 -#define QDMA_GLBL2_MULTQ_MAX_MASK GENMASK(11, 0) -#define QDMA_OFFSET_GLBL2_CHANNEL_PASID_CAP 0x128 -#define QDMA_OFFSET_GLBL2_CHANNEL_FUNC_RET 0x12C -#define QDMA_OFFSET_GLBL2_SYSTEM_ID 0x130 -#define QDMA_OFFSET_GLBL2_MISC_CAP 0x134 - -#define QDMA_GLBL2_DEVICE_ID_MASK GENMASK(31, 28) -#define QDMA_GLBL2_VIVADO_RELEASE_MASK GENMASK(27, 24) -#define QDMA_GLBL2_VERSAL_IP_MASK GENMASK(23, 20) -#define QDMA_GLBL2_RTL_VERSION_MASK GENMASK(19, 16) -#define QDMA_OFFSET_GLBL2_DBG_PCIE_RQ0 0x1B8 -#define QDMA_OFFSET_GLBL2_DBG_PCIE_RQ1 0x1BC -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_WR0 0x1C0 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_WR1 0x1C4 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_RD0 0x1C8 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_RD1 0x1CC - -/* used for VF bars identification */ -#define QDMA_OFFSET_VF_USER_BAR_ID 0x1018 -#define QDMA_OFFSET_VF_CONFIG_BAR_ID 0x1014 - -/* FLR programming */ -#define QDMA_OFFSET_VF_REG_FLR_STATUS 0x1100 -#define QDMA_OFFSET_PF_REG_FLR_STATUS 0x2500 -#define QDMA_FLR_STATUS_MASK 0x1 - -/* VF qdma version */ -#define QDMA_OFFSET_VF_VERSION 0x1014 -#define QDMA_OFFSET_PF_VERSION 0x2414 -#define QDMA_GLBL2_VF_UNIQUE_ID_MASK GENMASK(31, 16) -#define QDMA_GLBL2_VF_DEVICE_ID_MASK GENMASK(15, 12) -#define QDMA_GLBL2_VF_VIVADO_RELEASE_MASK GENMASK(11, 8) -#define QDMA_GLBL2_VF_VERSAL_IP_MASK GENMASK(7, 4) -#define QDMA_GLBL2_VF_RTL_VERSION_MASK GENMASK(3, 0) - - -/* ------------------------- QDMA_TRQ_SEL_QUEUE_PF (0x18000) ----------------*/ - -#define QDMA_OFFSET_DMAP_SEL_INT_CIDX 0x18000 -#define QDMA_OFFSET_DMAP_SEL_H2C_DSC_PIDX 0x18004 -#define QDMA_OFFSET_DMAP_SEL_C2H_DSC_PIDX 0x18008 -#define QDMA_OFFSET_DMAP_SEL_CMPT_CIDX 0x1800C - -#define QDMA_OFFSET_VF_DMAP_SEL_INT_CIDX 0x3000 -#define QDMA_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX 0x3004 -#define QDMA_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX 0x3008 -#define QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX 0x300C - -#define QDMA_DMA_SEL_INT_SW_CIDX_MASK GENMASK(15, 0) -#define QDMA_DMA_SEL_INT_RING_IDX_MASK GENMASK(23, 16) -#define QDMA_DMA_SEL_DESC_PIDX_MASK GENMASK(15, 0) -#define QDMA_DMA_SEL_IRQ_EN_MASK BIT(16) -#define QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK BIT(28) -#define QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK BIT(27) -#define QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK GENMASK(26, 24) -#define QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK GENMASK(23, 20) -#define QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK GENMASK(19, 16) -#define QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK GENMASK(15, 0) - -/* ------------------------- Hardware Errors ------------------------------ */ -#define TOTAL_LEAF_ERROR_AGGREGATORS 7 - -#define QDMA_OFFSET_GLBL_ERR_INT 0xB04 -#define QDMA_GLBL_ERR_FUNC_MASK GENMASK(7, 0) -#define QDMA_GLBL_ERR_VEC_MASK GENMASK(22, 12) -#define QDMA_GLBL_ERR_ARM_MASK BIT(24) - -#define QDMA_OFFSET_GLBL_ERR_STAT 0x248 -#define QDMA_OFFSET_GLBL_ERR_MASK 0x24C -#define QDMA_GLBL_ERR_RAM_SBE_MASK BIT(0) -#define QDMA_GLBL_ERR_RAM_DBE_MASK BIT(1) -#define QDMA_GLBL_ERR_DSC_MASK BIT(2) -#define QDMA_GLBL_ERR_TRQ_MASK BIT(3) -#define QDMA_GLBL_ERR_ST_C2H_MASK BIT(8) -#define QDMA_GLBL_ERR_ST_H2C_MASK BIT(11) - -#define QDMA_OFFSET_C2H_ERR_STAT 0xAF0 -#define QDMA_OFFSET_C2H_ERR_MASK 0xAF4 -#define QDMA_C2H_ERR_MTY_MISMATCH_MASK BIT(0) -#define QDMA_C2H_ERR_LEN_MISMATCH_MASK BIT(1) -#define QDMA_C2H_ERR_QID_MISMATCH_MASK BIT(3) -#define QDMA_C2H_ERR_DESC_RSP_ERR_MASK BIT(4) -#define QDMA_C2H_ERR_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define QDMA_C2H_ERR_MSI_INT_FAIL_MASK BIT(7) -#define QDMA_C2H_ERR_ERR_DESC_CNT_MASK BIT(9) -#define QDMA_C2H_ERR_PORTID_CTXT_MISMATCH_MASK BIT(10) -#define QDMA_C2H_ERR_PORTID_BYP_IN_MISMATCH_MASK BIT(11) -#define QDMA_C2H_ERR_CMPT_INV_Q_ERR_MASK BIT(12) -#define QDMA_C2H_ERR_CMPT_QFULL_ERR_MASK BIT(13) -#define QDMA_C2H_ERR_CMPT_CIDX_ERR_MASK BIT(14) -#define QDMA_C2H_ERR_CMPT_PRTY_ERR_MASK BIT(15) -#define QDMA_C2H_ERR_ALL_MASK 0xFEDB - -#define QDMA_OFFSET_C2H_FATAL_ERR_STAT 0xAF8 -#define QDMA_OFFSET_C2H_FATAL_ERR_MASK 0xAFC -#define QDMA_C2H_FATAL_ERR_MTY_MISMATCH_MASK BIT(0) -#define QDMA_C2H_FATAL_ERR_LEN_MISMATCH_MASK BIT(1) -#define QDMA_C2H_FATAL_ERR_QID_MISMATCH_MASK BIT(3) -#define QDMA_C2H_FATAL_ERR_TIMER_FIFO_RAM_RDBE_MASK BIT(4) -#define QDMA_C2H_FATAL_ERR_PFCH_II_RAM_RDBE_MASK BIT(8) -#define QDMA_C2H_FATAL_ERR_CMPT_CTXT_RAM_RDBE_MASK BIT(9) -#define QDMA_C2H_FATAL_ERR_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define QDMA_C2H_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define QDMA_C2H_FATAL_ERR_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define QDMA_C2H_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define QDMA_C2H_FATAL_ERR_TUSER_FIFO_RAM_RDBE_MASK BIT(15) -#define QDMA_C2H_FATAL_ERR_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define QDMA_C2H_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE_MASK BIT(17) -#define QDMA_C2H_FATAL_ERR_WPL_DATA_PAR_MASK BIT(18) -#define QDMA_C2H_FATAL_ERR_ALL_MASK 0x7DF1B - -#define QDMA_OFFSET_H2C_ERR_STAT 0xE00 -#define QDMA_OFFSET_H2C_ERR_MASK 0xE04 -#define QDMA_H2C_ERR_ZERO_LEN_DESC_MASK BIT(0) -#define QDMA_H2C_ERR_CSI_MOP_MASK BIT(1) -#define QDMA_H2C_ERR_NO_DMA_DSC_MASK BIT(2) -#define QDMA_H2C_ERR_SBE_MASK BIT(3) -#define QDMA_H2C_ERR_DBE_MASK BIT(4) -#define QDMA_H2C_ERR_ALL_MASK 0x1F - -#define QDMA_OFFSET_GLBL_DSC_ERR_STAT 0x254 -#define QDMA_OFFSET_GLBL_DSC_ERR_MASK 0x258 -#define QDMA_GLBL_DSC_ERR_POISON_MASK BIT(0) -#define QDMA_GLBL_DSC_ERR_UR_CA_MASK BIT(1) -#define QDMA_GLBL_DSC_ERR_PARAM_MASK BIT(2) -#define QDMA_GLBL_DSC_ERR_ADDR_MASK BIT(3) -#define QDMA_GLBL_DSC_ERR_TAG_MASK BIT(4) -#define QDMA_GLBL_DSC_ERR_FLR_MASK BIT(5) -#define QDMA_GLBL_DSC_ERR_TIMEOUT_MASK BIT(9) -#define QDMA_GLBL_DSC_ERR_DAT_POISON_MASK BIT(16) -#define QDMA_GLBL_DSC_ERR_FLR_CANCEL_MASK BIT(19) -#define QDMA_GLBL_DSC_ERR_DMA_MASK BIT(20) -#define QDMA_GLBL_DSC_ERR_DSC_MASK BIT(21) -#define QDMA_GLBL_DSC_ERR_RQ_CANCEL_MASK BIT(22) -#define QDMA_GLBL_DSC_ERR_DBE_MASK BIT(23) -#define QDMA_GLBL_DSC_ERR_SBE_MASK BIT(24) -#define QDMA_GLBL_DSC_ERR_ALL_MASK 0x1F9023F - -#define QDMA_OFFSET_GLBL_TRQ_ERR_STAT 0x264 -#define QDMA_OFFSET_GLBL_TRQ_ERR_MASK 0x268 -#define QDMA_GLBL_TRQ_ERR_UNMAPPED_MASK BIT(0) -#define QDMA_GLBL_TRQ_ERR_QID_RANGE_MASK BIT(1) -#define QDMA_GLBL_TRQ_ERR_VF_ACCESS_MASK BIT(2) -#define QDMA_GLBL_TRQ_ERR_TCP_TIMEOUT_MASK BIT(3) -#define QDMA_GLBL_TRQ_ERR_ALL_MASK 0xF - -#define QDMA_OFFSET_RAM_SBE_STAT 0xF4 -#define QDMA_OFFSET_RAM_SBE_MASK 0xF0 -#define QDMA_SBE_ERR_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_SBE_ERR_MI_C2H0_DAT_MASK BIT(4) -#define QDMA_SBE_ERR_H2C_RD_BRG_DAT_MASK BIT(9) -#define QDMA_SBE_ERR_H2C_WR_BRG_DAT_MASK BIT(10) -#define QDMA_SBE_ERR_C2H_RD_BRG_DAT_MASK BIT(11) -#define QDMA_SBE_ERR_C2H_WR_BRG_DAT_MASK BIT(12) -#define QDMA_SBE_ERR_FUNC_MAP_MASK BIT(13) -#define QDMA_SBE_ERR_DSC_HW_CTXT_MASK BIT(14) -#define QDMA_SBE_ERR_DSC_CRD_RCV_MASK BIT(15) -#define QDMA_SBE_ERR_DSC_SW_CTXT_MASK BIT(16) -#define QDMA_SBE_ERR_DSC_CPLI_MASK BIT(17) -#define QDMA_SBE_ERR_DSC_CPLD_MASK BIT(18) -#define QDMA_SBE_ERR_PASID_CTXT_RAM_MASK BIT(19) -#define QDMA_SBE_ERR_TIMER_FIFO_RAM_MASK BIT(20) -#define QDMA_SBE_ERR_PAYLOAD_FIFO_RAM_MASK BIT(21) -#define QDMA_SBE_ERR_QID_FIFO_RAM_MASK BIT(22) -#define QDMA_SBE_ERR_TUSER_FIFO_RAM_MASK BIT(23) -#define QDMA_SBE_ERR_WRB_COAL_DATA_RAM_MASK BIT(24) -#define QDMA_SBE_ERR_INT_QID2VEC_RAM_MASK BIT(25) -#define QDMA_SBE_ERR_INT_CTXT_RAM_MASK BIT(26) -#define QDMA_SBE_ERR_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define QDMA_SBE_ERR_PFCH_CTXT_RAM_MASK BIT(28) -#define QDMA_SBE_ERR_WRB_CTXT_RAM_MASK BIT(29) -#define QDMA_SBE_ERR_PFCH_LL_RAM_MASK BIT(30) -#define QDMA_SBE_ERR_H2C_PEND_FIFO_MASK BIT(31) -#define QDMA_SBE_ERR_ALL_MASK 0xFFFFFF11 - -#define QDMA_OFFSET_RAM_DBE_STAT 0xFC -#define QDMA_OFFSET_RAM_DBE_MASK 0xF8 -#define QDMA_DBE_ERR_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_DBE_ERR_MI_C2H0_DAT_MASK BIT(4) -#define QDMA_DBE_ERR_H2C_RD_BRG_DAT_MASK BIT(9) -#define QDMA_DBE_ERR_H2C_WR_BRG_DAT_MASK BIT(10) -#define QDMA_DBE_ERR_C2H_RD_BRG_DAT_MASK BIT(11) -#define QDMA_DBE_ERR_C2H_WR_BRG_DAT_MASK BIT(12) -#define QDMA_DBE_ERR_FUNC_MAP_MASK BIT(13) -#define QDMA_DBE_ERR_DSC_HW_CTXT_MASK BIT(14) -#define QDMA_DBE_ERR_DSC_CRD_RCV_MASK BIT(15) -#define QDMA_DBE_ERR_DSC_SW_CTXT_MASK BIT(16) -#define QDMA_DBE_ERR_DSC_CPLI_MASK BIT(17) -#define QDMA_DBE_ERR_DSC_CPLD_MASK BIT(18) -#define QDMA_DBE_ERR_PASID_CTXT_RAM_MASK BIT(19) -#define QDMA_DBE_ERR_TIMER_FIFO_RAM_MASK BIT(20) -#define QDMA_DBE_ERR_PAYLOAD_FIFO_RAM_MASK BIT(21) -#define QDMA_DBE_ERR_QID_FIFO_RAM_MASK BIT(22) -#define QDMA_DBE_ERR_TUSER_FIFO_RAM_MASK BIT(23) -#define QDMA_DBE_ERR_WRB_COAL_DATA_RAM_MASK BIT(24) -#define QDMA_DBE_ERR_INT_QID2VEC_RAM_MASK BIT(25) -#define QDMA_DBE_ERR_INT_CTXT_RAM_MASK BIT(26) -#define QDMA_DBE_ERR_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define QDMA_DBE_ERR_PFCH_CTXT_RAM_MASK BIT(28) -#define QDMA_DBE_ERR_WRB_CTXT_RAM_MASK BIT(29) -#define QDMA_DBE_ERR_PFCH_LL_RAM_MASK BIT(30) -#define QDMA_DBE_ERR_H2C_PEND_FIFO_MASK BIT(31) -#define QDMA_DBE_ERR_ALL_MASK 0xFFFFFF11 - -#define QDMA_OFFSET_MBOX_BASE_VF 0x1000 -#define QDMA_OFFSET_MBOX_BASE_PF 0x2400 - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_SOFT_REG_H__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_compat.h b/QDMA/linux-kernel/driver/libqdma/qdma_compat.h deleted file mode 100755 index ded71b5..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_compat.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -/** - * @file - * @brief This file is used to allow the driver to be compiled under multiple - * versions of Linux with as few obtrusive in-line ifdef's as possible. - */ - -#ifndef __QDMA_COMPAT_H -#define __QDMA_COMPAT_H - -#include <linux/version.h> -#include <linux/wait.h> -#include <asm/barrier.h> - -/** - * if linux kernel version is < 3.19.0 - * then define the dma_rmb and dma_wmb - */ -#if KERNEL_VERSION(3, 19, 0) > LINUX_VERSION_CODE - -#ifndef dma_rmb -#define dma_rmb rmb -#endif /* #ifndef dma_rmb */ - -#ifndef dma_wmb -#define dma_wmb wmb -#endif /* #ifndef dma_wmb */ - -#endif - -#ifdef RHEL_RELEASE_VERSION -#define qdma_wait_queue wait_queue_head_t -#define qdma_waitq_init init_waitqueue_head -#define qdma_waitq_wakeup wake_up_interruptible -#define qdma_waitq_wait_event wait_event_interruptible -#define qdma_waitq_wait_event_timeout wait_event_interruptible_timeout -#else -/* use simple wait queue (swaitq) with kernels > 4.6.0 but < 4.19.0 */ -#if ((KERNEL_VERSION(4, 6, 0) <= LINUX_VERSION_CODE) && \ - (KERNEL_VERSION(4, 19, 0) >= LINUX_VERSION_CODE)) -#include <linux/swait.h> - -#define qdma_wait_queue struct swait_queue_head -#define qdma_waitq_init init_swait_queue_head -#define qdma_waitq_wakeup swake_up -#define qdma_waitq_wait_event swait_event_interruptible -#define qdma_waitq_wait_event_timeout swait_event_interruptible_timeout - -#else -#include <linux/wait.h> - -#define qdma_wait_queue wait_queue_head_t -#define qdma_waitq_init init_waitqueue_head -#define qdma_waitq_wakeup wake_up_interruptible -#define qdma_waitq_wait_event wait_event_interruptible -#define qdma_waitq_wait_event_timeout wait_event_interruptible_timeout - -#endif /* swaitq */ -#endif - -/* timer */ -#if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE -#define qdma_timer_setup(timer, fp_handler, data) \ - timer_setup(timer, fp_handler, 0) - -#define qdma_timer_start(timer, expires) \ - mod_timer(timer, round_jiffies(jiffies + (expires))) - -#else -#define qdma_timer_setup(timer, fp_handler, priv) \ - do { \ - init_timer(timer); \ - timer->data = (unsigned long)priv; \ - timer->function = fp_handler; \ - del_timer(timer); \ - } while (0) - -#define qdma_timer_start(timer, timeout) \ - do { \ - del_timer(timer); \ - timer->expires = jiffies + (timeout); \ - add_timer(timer); \ - } while (0) - - -#endif /* timer */ - - -#endif /* #ifndef __QDMA_COMPAT_H */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_context.c b/QDMA/linux-kernel/driver/libqdma/qdma_context.c deleted file mode 100755 index 246280b..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_context.c +++ /dev/null @@ -1,952 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include <linux/kernel.h> -#include <linux/pci.h> -#include "qdma_device.h" -#include "qdma_descq.h" -#include "qdma_intr.h" -#include "qdma_regs.h" -#include "qdma_context.h" -#include "qdma_access_common.h" -#include "qdma_mbox_protocol.h" - -/** - * Make the interrupt context - */ -static int make_intr_context(struct xlnx_dma_dev *xdev, - struct qdma_indirect_intr_ctxt *ctxt) -{ - int i; - - if ((xdev->conf.qdma_drv_mode != INDIRECT_INTR_MODE) && - (xdev->conf.qdma_drv_mode != AUTO_MODE)) { - pr_err("Invalid driver mode: %d", xdev->conf.qdma_drv_mode); - return -EINVAL; - } - - /** program the coalescing context - * i -> Number of vectors - */ - for (i = 0; i < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; i++) { - struct intr_coal_conf *entry = (xdev->intr_coal_list + i); - - ctxt[i].valid = 1; - ctxt[i].vec = entry->vec_id; - ctxt[i].baddr_4k = entry->intr_ring_bus; - ctxt[i].color = entry->color; - ctxt[i].page_size = xdev->conf.intr_rngsz; - ctxt[i].func_id = xdev->func_id; - } - - return 0; -} - -#ifndef __QDMA_VF__ -static int make_sw_context(struct qdma_descq *descq, - struct qdma_descq_sw_ctxt *sw_ctxt) -{ - memset(sw_ctxt, 0, sizeof(struct qdma_descq_sw_ctxt)); - - /* sw context */ - if ((descq->xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (descq->xdev->conf.qdma_drv_mode == AUTO_MODE)) { - sw_ctxt->vec = get_intr_ring_index(descq->xdev, - descq->intr_id); - sw_ctxt->intr_aggr = 0x01; - } else { - sw_ctxt->vec = descq->intr_id; - } - - sw_ctxt->ring_bs_addr = descq->desc_bus; - sw_ctxt->wbi_chk = descq->conf.cmpl_status_pend_chk; - sw_ctxt->wbi_intvl_en = descq->conf.cmpl_status_acc_en; - sw_ctxt->rngsz_idx = descq->conf.desc_rng_sz_idx; - sw_ctxt->bypass = descq->conf.desc_bypass; - sw_ctxt->wbk_en = descq->conf.wb_status_en; - sw_ctxt->irq_en = descq->conf.irq_en; - sw_ctxt->is_mm = ~descq->conf.st; - sw_ctxt->qen = 1; - - if (descq->conf.desc_bypass && - (descq->conf.sw_desc_sz == DESC_SZ_64B)) { - sw_ctxt->desc_sz = descq->conf.sw_desc_sz; - } else { - sw_ctxt->fetch_max = FETCH_MAX_NUM; - if (!descq->conf.st) { /* mm h2c/c2h */ - sw_ctxt->desc_sz = DESC_SZ_32B; - sw_ctxt->mm_chn = descq->channel; - sw_ctxt->host_id = descq->channel; - } else if (descq->conf.q_type == Q_C2H) { /* st c2h */ - sw_ctxt->frcd_en = descq->conf.fetch_credit; - sw_ctxt->desc_sz = DESC_SZ_8B; - } else if (descq->conf.q_type == Q_H2C) { /* st h2c */ - sw_ctxt->frcd_en = descq->conf.fetch_credit; - sw_ctxt->desc_sz = DESC_SZ_16B; - } else - sw_ctxt->desc_sz = DESC_SZ_16B; - } - - /* pidx = 0; irq_ack = 0 */ - sw_ctxt->fnc_id = descq->xdev->func_id; - sw_ctxt->irq_arm = descq->conf.irq_en; - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - sw_ctxt->irq_en = 0; - sw_ctxt->irq_arm = 0; - sw_ctxt->wbk_en = 0; - sw_ctxt->wbi_chk = 0; - } - - /* Disable the marker response. Not applicable for ST C2H */ - if ((!descq->conf.desc_bypass) && - ((!descq->conf.st) || (descq->conf.q_type == Q_H2C))) - sw_ctxt->mrkr_dis = 1; - -#ifdef ERR_DEBUG - if (descq->induce_err & (1 << param)) { - sw_ctxt->fnc_id = 0xFFF; - pr_info("induced error %d", ind_ctxt_cmd_err); - } -#endif - - return 0; -} - -static int make_qid2vec_context(struct qdma_descq *descq, - struct qdma_qid2vec *cntxt) -{ - u32 vec_num = 0; - u32 en_coal = 0; - struct xlnx_dma_dev *xdev = NULL; - - BUG_ON(!descq); - BUG_ON(!cntxt); - - vec_num = descq->intr_id; - xdev = descq->xdev; - - memset(cntxt, 0, sizeof(struct qdma_qid2vec)); - /* - * Enable interrupt coalescing - * In case of Indirect interrupt, interrupt ring index and enable - * coalescing should be programmed. In case of Direct interrupt, - * interrupt vector number should be programmed - */ - if ((descq->xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (descq->xdev->conf.qdma_drv_mode == AUTO_MODE)) { - vec_num = get_intr_ring_index(xdev, descq->intr_id); - en_coal = 1; - } - if (descq->conf.q_type == Q_C2H) { - cntxt->c2h_en_coal = en_coal; - cntxt->c2h_vector = vec_num; - } else if (descq->conf.q_type == Q_H2C) { - cntxt->h2c_en_coal = en_coal; - cntxt->h2c_vector = vec_num; - } - - pr_debug("qid2vec context :\n c2h_vector = %x\n" - "c2h_en_coal = %x\n" - "h2c_vector = %x\nh2c_en_coal = %x\n", - cntxt->c2h_vector, - cntxt->c2h_en_coal, cntxt->h2c_vector, cntxt->h2c_en_coal); - return 0; -} - -/* ST: prefetch context setup */ -static int make_prefetch_context(struct qdma_descq *descq, - struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - BUG_ON(!descq); - BUG_ON(!pfetch_ctxt); - - memset(pfetch_ctxt, 0, sizeof(struct qdma_descq_prefetch_ctxt)); - - /* prefetch context */ - pfetch_ctxt->valid = 1; - pfetch_ctxt->bypass = descq->conf.pfetch_bypass; - pfetch_ctxt->bufsz_idx = descq->conf.c2h_buf_sz_idx; - pfetch_ctxt->pfch_en = descq->conf.pfetch_en; - - return 0; -} - -/* ST C2H : writeback context setup */ -static int make_cmpt_context(struct qdma_descq *descq, - struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - int ring_index; - - memset(cmpt_ctxt, 0, sizeof(struct qdma_descq_cmpt_ctxt)); - - cmpt_ctxt->en_stat_desc = descq->conf.cmpl_stat_en; - cmpt_ctxt->en_int = descq->conf.cmpl_en_intr; - cmpt_ctxt->trig_mode = descq->conf.cmpl_trig_mode; - cmpt_ctxt->fnc_id = descq->xdev->func_id; - cmpt_ctxt->timer_idx = descq->conf.cmpl_timer_idx; - cmpt_ctxt->counter_idx = descq->conf.cmpl_cnt_th_idx; - cmpt_ctxt->color = 1; - cmpt_ctxt->ringsz_idx = descq->conf.cmpl_rng_sz_idx; - - cmpt_ctxt->bs_addr = descq->desc_cmpt_bus; - cmpt_ctxt->desc_sz = descq->conf.cmpl_desc_sz; - cmpt_ctxt->full_upd = descq->conf.adaptive_rx; - - cmpt_ctxt->valid = 1; - - cmpt_ctxt->ovf_chk_dis = descq->conf.cmpl_ovf_chk_dis; - if ((descq->xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (descq->xdev->conf.qdma_drv_mode == AUTO_MODE)) { - ring_index = get_intr_ring_index(descq->xdev, descq->intr_id); - cmpt_ctxt->vec = ring_index; - cmpt_ctxt->int_aggr = 1; - } else { - cmpt_ctxt->vec = descq->intr_id; - } - - return 0; -} -#endif - -#ifdef __QDMA_VF__ -int qdma_intr_context_setup(struct xlnx_dma_dev *xdev) -{ - int i = 0; - int rv; - struct mbox_msg *m = NULL; - struct mbox_msg_intr_ctxt ictxt; - - if ((xdev->conf.qdma_drv_mode != INDIRECT_INTR_MODE) && - (xdev->conf.qdma_drv_mode != AUTO_MODE)) - return 0; - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - memset(&ictxt, 0, sizeof(struct mbox_msg_intr_ctxt)); - - ictxt.num_rings = QDMA_NUM_DATA_VEC_FOR_INTR_CXT; - - for (i = 0; i < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; i++) { - ictxt.ring_index_list[i] = - get_intr_ring_index(xdev, xdev->dvec_start_idx + i); - } - - rv = make_intr_context(xdev, ictxt.ictxt); - if (rv < 0) - goto free_msg; - - qdma_mbox_compose_vf_intr_ctxt_write(xdev->func_id, &ictxt, m->raw); - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - pr_err("%s, mbox failed for interrupt context %d.\n", - xdev->conf.name, rv); - goto free_msg; - } - rv = qdma_mbox_vf_response_status(m->raw); - if (rv < 0) { - pr_err("mbox_vf_response_status failed, err = %d", rv); - rv = -EINVAL; - } - -free_msg: - qdma_mbox_msg_free(m); - return rv; -} - -int qdma_intr_context_read(struct xlnx_dma_dev *xdev, - int ring_index, - struct qdma_indirect_intr_ctxt *ctxt) -{ - struct mbox_msg *m; - int rv = 0; - struct mbox_msg_intr_ctxt ictxt; - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - memset(&ictxt, 0, sizeof(struct mbox_msg_intr_ctxt)); - ictxt.num_rings = 1; - - ictxt.ring_index_list[0] = ring_index; - qdma_mbox_compose_vf_intr_ctxt_read(xdev->func_id, - &ictxt, m->raw); - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - pr_err("%s invalidate interrupt context failed %d.\n", - xdev->conf.name, rv); - } - rv = qdma_mbox_vf_intr_context_get(m->raw, &ictxt); - if (rv < 0) { - pr_err("mbox_vf_intr_context_get failed, err = %d", rv); - rv = -EINVAL; - } else - memcpy(ctxt, &ictxt.ictxt[0], - sizeof(struct qdma_indirect_intr_ctxt)); - - qdma_mbox_msg_free(m); - - return rv; -} - -int qdma_descq_context_clear(struct xlnx_dma_dev *xdev, unsigned int qid_hw, - bool st, u8 type, bool clr) -{ - struct mbox_msg *m = qdma_mbox_msg_alloc(); - int rv; - enum mbox_cmpt_ctxt_type cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - - if (!m) - return -ENOMEM; - - if (!st) { - if (type == Q_CMPT) - cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_ONLY; - else - cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - } else { - if (type == Q_C2H) - cmpt_ctxt_type = QDMA_MBOX_CMPT_WITH_ST; - } - - if (clr) - qdma_mbox_compose_vf_qctxt_clear(xdev->func_id, - qid_hw, st, type, cmpt_ctxt_type, m->raw); - else - qdma_mbox_compose_vf_qctxt_invalidate(xdev->func_id, - qid_hw, st, type, cmpt_ctxt_type, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - if (rv != -ENODEV) - pr_err("%s, qid_hw 0x%x mbox failed %d.\n", - xdev->conf.name, qid_hw, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw); - if (rv < 0) { - pr_err("mbox_vf_response_status failed, err = %d", rv); - rv = -EINVAL; - } - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -int qdma_descq_context_read(struct xlnx_dma_dev *xdev, unsigned int qid_hw, - bool st, u8 type, struct qdma_descq_context *context) -{ - struct mbox_msg *m = qdma_mbox_msg_alloc(); - int rv; - enum mbox_cmpt_ctxt_type cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - - if (!m) - return -ENOMEM; - - if (!st) { - if (type == Q_CMPT) - cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_ONLY; - else - cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - } else { - if (type == Q_C2H) - cmpt_ctxt_type = QDMA_MBOX_CMPT_WITH_ST; - } - - qdma_mbox_compose_vf_qctxt_read(xdev->func_id, - qid_hw, st, type, cmpt_ctxt_type, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - if (rv != -ENODEV) - pr_err("%s, qid_hw 0x%x mbox failed %d.\n", - xdev->conf.name, qid_hw, rv); - goto err_out; - } - - rv = qdma_mbox_vf_context_get(m->raw, context); - if (rv < 0) { - pr_err("mbox_vf_context_get faled with error = %d", rv); - rv = -EINVAL; - } -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -int qdma_descq_context_setup(struct qdma_descq *descq) -{ - struct xlnx_dma_dev *xdev = descq->xdev; - struct mbox_msg *m = qdma_mbox_msg_alloc(); - struct mbox_descq_conf descq_conf; - int rv; - enum mbox_cmpt_ctxt_type cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - - if (!m) - return -ENOMEM; - - memset(&descq_conf, 0, sizeof(struct mbox_descq_conf)); - descq_conf.ring_bs_addr = descq->desc_bus; - descq_conf.cmpt_ring_bs_addr = descq->desc_cmpt_bus; - descq_conf.en_bypass = descq->conf.desc_bypass; - descq_conf.irq_arm = descq->conf.irq_en; - descq_conf.wbi_intvl_en = descq->conf.cmpl_status_acc_en; - descq_conf.wbi_chk = descq->conf.cmpl_status_pend_chk; - descq_conf.at = descq->conf.at; - descq_conf.wbk_en = descq->conf.wb_status_en; - descq_conf.irq_en = descq->conf.irq_en; - descq_conf.pfch_en = descq->conf.pfetch_en; - descq_conf.en_bypass_prefetch = descq->conf.pfetch_bypass; - descq_conf.dis_overflow_check = descq->conf.cmpl_ovf_chk_dis; - descq_conf.cmpt_int_en = descq->conf.cmpl_en_intr; - descq_conf.cmpl_stat_en = descq->conf.cmpl_stat_en; - if (descq->conf.desc_bypass && - (descq->conf.sw_desc_sz == DESC_SZ_64B)) - descq_conf.desc_sz = descq->conf.sw_desc_sz; - else { - if (descq->conf.q_type != Q_CMPT) { - if (!descq->conf.st) /* mm h2c/c2h */ - descq_conf.desc_sz = DESC_SZ_32B; - else if (descq->conf.q_type) {/* st c2h */ - descq_conf.desc_sz = DESC_SZ_8B; - descq_conf.forced_en = descq->conf.fetch_credit; - } else /* st h2c */ - descq_conf.desc_sz = DESC_SZ_16B; - } - } - descq_conf.cmpt_desc_sz = descq->conf.cmpl_desc_sz; - descq_conf.triggermode = descq->conf.cmpl_trig_mode; - descq_conf.cmpt_at = descq->conf.at; - descq_conf.cmpt_color = 1; - descq_conf.cmpt_full_upd = 0; - descq_conf.func_id = descq->xdev->func_id; - descq_conf.cnt_thres = - xdev->csr_info.c2h_cnt_th[descq->conf.cmpl_cnt_th_idx]; - descq_conf.timer_thres = - xdev->csr_info.c2h_timer_cnt[descq->conf.cmpl_timer_idx]; - descq_conf.ringsz = descq->conf.rngsz; - descq_conf.bufsz = descq->conf.c2h_bufsz; - descq_conf.cmpt_ringsz = descq->conf.rngsz_cmpt; - if ((descq->xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (descq->xdev->conf.qdma_drv_mode == AUTO_MODE)) { - int ring_index = get_intr_ring_index(descq->xdev, - descq->intr_id); - descq_conf.intr_id = ring_index & 0xFFF; - descq_conf.intr_aggr = 1; - } else - descq_conf.intr_id = descq->intr_id; - - if (!descq->conf.st) { - if (descq->conf.q_type == Q_CMPT) - cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_ONLY; - else - cmpt_ctxt_type = QDMA_MBOX_CMPT_CTXT_NONE; - } else { - if (descq->conf.q_type == Q_C2H) - cmpt_ctxt_type = QDMA_MBOX_CMPT_WITH_ST; - } - - qdma_mbox_compose_vf_qctxt_write(xdev->func_id, descq->qidx_hw, - descq->conf.st, descq->conf.q_type, - cmpt_ctxt_type, &descq_conf, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - if (rv != -ENODEV) - pr_err("%s, qid_hw 0x%x, %s mbox failed %d.\n", - xdev->conf.name, descq->qidx_hw, - descq->conf.name, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw); - if (rv < 0) { - pr_err("mbox_vf_response_status failed, err = %d", rv); - rv = -EINVAL; - } -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -int qdma_descq_context_dump(struct qdma_descq *descq, char *buf, int buflen) -{ - int rv = 0; - int ring_index = -1; - int ring_count = 0; - int len = 0; - struct qdma_descq_context queue_context; - struct qdma_indirect_intr_ctxt intr_ctxt; - - rv = qdma_descq_context_read(descq->xdev, descq->qidx_hw, - descq->conf.st, descq->conf.q_type, &queue_context); - if (rv < 0) { - pr_err("Failed to read queue context, rv = %d", rv); - return rv; - } - - rv = descq->xdev->hw.qdma_dump_queue_context(descq->xdev, - descq->conf.st, - (enum qdma_dev_q_type)descq->conf.q_type, - &queue_context, - buf, buflen); - if (rv < 0) { - pr_err("Failed to dump queue context, rv = %d", rv); - return descq->xdev->hw.qdma_get_error_code(rv); - } - len = rv; - - /** if interrupt aggregation is enabled - * add the interrupt context - */ - if ((descq->xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (descq->xdev->conf.qdma_drv_mode == AUTO_MODE)) { - for (ring_count = 0; - ring_count < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; - ring_count++) { - ring_index = get_intr_ring_index( - descq->xdev, - (descq->xdev->dvec_start_idx + - ring_count)); - - rv = qdma_intr_context_read(descq->xdev, - ring_index, &intr_ctxt); - if (rv < 0) { - pr_err("Failed to read intr context for ring %d, rv = %d", - ring_index, rv); - return rv; - } - - rv = descq->xdev->hw.qdma_dump_intr_context(descq->xdev, - &intr_ctxt, ring_index, - buf + len, buflen - len); - if (rv < 0) { - pr_err("Failed to dump intr context, rv = %d", - rv); - return descq->xdev->hw.qdma_get_error_code(rv); - } - len += rv; - } - } - - return len; -} - -#else /* PF only */ - -int qdma_prog_intr_context(struct xlnx_dma_dev *xdev, - struct mbox_msg_intr_ctxt *ictxt) -{ - int i = 0; - int rv; - int ring_index; - struct qdma_indirect_intr_ctxt *ctxt; - - for (i = 0; i < ictxt->num_rings; i++) { - ring_index = ictxt->ring_index_list[i]; - - ctxt = &ictxt->ictxt[i]; - rv = xdev->hw.qdma_indirect_intr_ctx_conf(xdev, ring_index, - ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - pr_err("Intr ctxt write failed, err = %d\n", rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - - return 0; -} - -int qdma_intr_context_setup(struct xlnx_dma_dev *xdev) -{ - struct qdma_indirect_intr_ctxt ctxt[QDMA_NUM_DATA_VEC_FOR_INTR_CXT]; - int i = 0; - int rv; - int ring_index; - - if ((xdev->conf.qdma_drv_mode != INDIRECT_INTR_MODE) && - (xdev->conf.qdma_drv_mode != AUTO_MODE)) - return 0; - - memset(ctxt, 0, sizeof(struct qdma_indirect_intr_ctxt) * - QDMA_NUM_DATA_VEC_FOR_INTR_CXT); - /** Preparing the interrupt context for all the vectors - * each vector's context width is QDMA_REG_IND_CTXT_WCNT_3(3) - */ - rv = make_intr_context(xdev, ctxt); - if (rv < 0) - return rv; - - for (i = 0; i < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; i++) { - ring_index = get_intr_ring_index(xdev, - (i + xdev->dvec_start_idx)); - rv = xdev->hw.qdma_indirect_intr_ctx_conf(xdev, ring_index, - NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - pr_err("Intr ctxt clear failed, err = %d\n", rv); - return xdev->hw.qdma_get_error_code(rv); - } - rv = xdev->hw.qdma_indirect_intr_ctx_conf(xdev, - ring_index, &ctxt[i], QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - pr_err("Intr ctxt write failed, err = %d\n", rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - - return 0; -} - -int qdma_descq_context_clear(struct xlnx_dma_dev *xdev, unsigned int qid_hw, - bool st, u8 type, bool clr) -{ - int rv = 0; - - - if (clr) { - - if (type != Q_CMPT) { - rv = xdev->hw.qdma_sw_ctx_conf(xdev, type, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - pr_err("Fail to clear sw context, rv = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = xdev->hw.qdma_hw_ctx_conf(xdev, type, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - pr_err("Fail to clear hw context, rv = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = xdev->hw.qdma_credit_ctx_conf(xdev, type, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - pr_err("Fail to clear credit context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - - /* Only clear prefetch and writeback contexts - * if this queue is ST C2H - */ - if (st && (type == Q_C2H)) { - rv = xdev->hw.qdma_pfetch_ctx_conf(xdev, qid_hw, - NULL, QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - pr_err("Fail to clear pfetch context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - } - - /* Only clear cmpt context if this queue is ST C2H or MM cmpt*/ - if ((st && (type == Q_C2H)) || (!st && (type == Q_CMPT))) { - rv = xdev->hw.qdma_cmpt_ctx_conf(xdev, qid_hw, NULL, - QDMA_HW_ACCESS_CLEAR); - if (rv < 0) { - pr_err("Fail to clear cmpt context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - - } else { - if (type != Q_CMPT) { - - rv = xdev->hw.qdma_sw_ctx_conf(xdev, type, qid_hw, - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - pr_err("Fail to invalidate sw context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = xdev->hw.qdma_hw_ctx_conf(xdev, type, qid_hw, - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - pr_err("Fail to invalidate hw context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = xdev->hw.qdma_credit_ctx_conf(xdev, type, qid_hw, - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - pr_err("Fail to invalidate credit context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - - /* Only clear prefetch and writeback contexts if this - * queue is ST C2H - */ - if (st && (type == Q_C2H)) { - rv = xdev->hw.qdma_pfetch_ctx_conf(xdev, qid_hw, - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - pr_err("Fail to invalidate pfetch context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - } - - /* Only clear cmpt context if this queue is ST C2H MM cmpt*/ - if ((st && (type == Q_C2H)) || (!st && (type == Q_CMPT))) { - rv = xdev->hw.qdma_cmpt_ctx_conf(xdev, qid_hw, - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - pr_err("Fail to invalidate cmpt context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - } - - return 0; -} - -int qdma_descq_context_setup(struct qdma_descq *descq) -{ - struct qdma_descq_context context; - - memset(&context, 0, sizeof(context)); - - if (descq->conf.q_type != Q_CMPT) { - - make_sw_context(descq, &context.sw_ctxt); - - if (descq->xdev->dev_cap.qid2vec_ctx) { - if (descq->xdev->conf.qdma_drv_mode != POLL_MODE) - make_qid2vec_context(descq, &context.qid2vec); - } - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) - make_prefetch_context(descq, &context.pfetch_ctxt); - } - - if ((descq->conf.st && (descq->conf.q_type == Q_C2H)) || - (!descq->conf.st && (descq->conf.q_type == Q_CMPT))) - make_cmpt_context(descq, &context.cmpt_ctxt); - - return qdma_descq_context_program(descq->xdev, descq->qidx_hw, - descq->conf.st, descq->conf.q_type, &context); -} - -int qdma_descq_context_read(struct xlnx_dma_dev *xdev, unsigned int qid_hw, - bool st, u8 type, struct qdma_descq_context *context) -{ - int rv = 0; - - memset(context, 0, sizeof(struct qdma_descq_context)); - - if (type != Q_CMPT) { - rv = xdev->hw.qdma_sw_ctx_conf(xdev, type, qid_hw, - &(context->sw_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - pr_err("Failed to read sw context, rv = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = xdev->hw.qdma_hw_ctx_conf(xdev, type, qid_hw, - &(context->hw_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - pr_err("Failed to read hw context, rv = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = xdev->hw.qdma_credit_ctx_conf(xdev, type, qid_hw, - &(context->cr_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - pr_err("Failed to read hw context, rv = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = xdev->hw.qdma_fmap_conf(xdev, xdev->func_id, - &(context->fmap), QDMA_HW_ACCESS_READ); - if (rv < 0) { - pr_err("Failed to read fmap context, rv = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - if (st && type) { - rv = xdev->hw.qdma_pfetch_ctx_conf(xdev, qid_hw, - &(context->pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - pr_err("Failed to read pftch context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - } - - if ((st && (type == Q_C2H)) || (!st && (type == Q_CMPT))) { - rv = xdev->hw.qdma_cmpt_ctx_conf(xdev, qid_hw, - &(context->cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - pr_err("Failed to read cmpt context, rv = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - } - - return 0; -} - -int qdma_intr_context_read(struct xlnx_dma_dev *xdev, - int ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = 0; - - memset(ctxt, 0, sizeof(struct qdma_indirect_intr_ctxt)); - rv = xdev->hw.qdma_indirect_intr_ctx_conf(xdev, ring_index, ctxt, - QDMA_HW_ACCESS_READ); - if (rv < 0) { - pr_err("Failed to read intr context, rv = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - return 0; -} - -int qdma_descq_context_program(struct xlnx_dma_dev *xdev, unsigned int qid_hw, - bool st, u8 type, struct qdma_descq_context *context) -{ - int rv; - - /* always clear first */ - rv = qdma_descq_context_clear(xdev, qid_hw, st, type, 1); - if (rv < 0) { - pr_err("failed to clear the context, rv= %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - if (type != Q_CMPT) { - rv = xdev->hw.qdma_sw_ctx_conf(xdev, type, qid_hw, - &context->sw_ctxt, QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - pr_err("failed to program sw context, rv= %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - if (xdev->dev_cap.qid2vec_ctx) { - if (xdev->conf.qdma_drv_mode != POLL_MODE) - xdev->hw.qdma_qid2vec_conf(xdev, type, qid_hw, - &context->qid2vec, - QDMA_HW_ACCESS_WRITE); - } - - if (st && type) { - /* prefetch context */ - rv = xdev->hw.qdma_pfetch_ctx_conf(xdev, qid_hw, - &context->pfetch_ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - pr_err("failed to program pfetch context, rv= %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - } - - if ((st && (type == Q_C2H)) || (!st && (type == Q_CMPT))) { - /* cmpt context */ - rv = xdev->hw.qdma_cmpt_ctx_conf(xdev, qid_hw, - &context->cmpt_ctxt, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - pr_err("failed to program cmpt context, rv= %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - } - - return 0; -} - -int qdma_descq_context_dump(struct qdma_descq *descq, char *buf, int buflen) -{ - int rv = 0; - int ring_index = -1; - int ring_count = 0; - int len = 0; - struct qdma_indirect_intr_ctxt intr_ctxt; - - rv = descq->xdev->hw.qdma_read_dump_queue_context(descq->xdev, - descq->xdev->func_id, - descq->qidx_hw, - descq->conf.st, descq->conf.q_type, - buf, buflen); - if (rv < 0) { - pr_err("Failed to dump queue context, rv = %d", rv); - return descq->xdev->hw.qdma_get_error_code(rv); - } - len = rv; - - /** if interrupt aggregation is enabled - * add the interrupt context - */ - if ((descq->xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (descq->xdev->conf.qdma_drv_mode == AUTO_MODE)) { - for (ring_count = 0; - ring_count < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; - ring_count++) { - ring_index = get_intr_ring_index( - descq->xdev, - (descq->xdev->dvec_start_idx + - ring_count)); - - rv = qdma_intr_context_read(descq->xdev, - ring_index, &intr_ctxt); - if (rv < 0) { - pr_err("Failed to read intr context for ring %d, rv = %d", - ring_index, rv); - return rv; - } - - rv = descq->xdev->hw.qdma_dump_intr_context(descq->xdev, - &intr_ctxt, ring_index, - buf + len, buflen - len); - if (rv < 0) { - pr_err("Failed to dump intr context, rv = %d", - rv); - return descq->xdev->hw.qdma_get_error_code(rv); - } - len += rv; - } - } - - return len; -} - -#endif - - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_context.h b/QDMA/linux-kernel/driver/libqdma/qdma_context.h deleted file mode 100755 index 9d21d48..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_context.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __LIBQDMA_CONTEXT_H__ -#define __LIBQDMA_CONTEXT_H__ -/** - * @file - * @brief This file contains the declarations for qdma context handlers - * - */ -#include "xdev.h" -#include "qdma_mbox.h" - -/* - * fetch_max [40:37] - * Description: Maximum number of descriptor fetches outstanding for this queue. - * The max outstanding is fetch_max + 1 . - * Higher value can increase the single queue performance. - */ -#define FETCH_MAX_NUM 7 - -/*****************************************************************************/ -/** - * qdma_intr_context_setup() - handler to set the qdma interrupt context - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_intr_context_setup(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * qdma_prog_intr_context() - - * handler to program the qdma interrupt context for - * VF from PF - * - * @param[in] xdev: pointer to xdev - * @param[in] ictxt: interrupt context - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ - -int qdma_prog_intr_context(struct xlnx_dma_dev *xdev, - struct mbox_msg_intr_ctxt *ictxt); - -/*****************************************************************************/ -/** - * qdma_descq_context_setup() - handler to set the qdma sw descriptor context - * - * @param[in] descq: pointer to qdma_descq - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_context_setup(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * qdma_descq_context_clear() - handler to clear the qdma sw descriptor context - * - * @param[in] xdev: pointer to xdev - * @param[in] qid_hw: hw qidx - * @param[in] st: indicated whether the mm mode or st mode - * @param[in] c2h: indicates whether the h2c or c2h direction - * @param[in] mm_cmpt_en: indicates whether cmpt is enabled for mm or not - * @param[in] clr: flag to indicate whether to clear the context or not - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_context_clear(struct xlnx_dma_dev *xdev, unsigned int qid_hw, - bool st, u8 type, bool clr); - -/*****************************************************************************/ -/** - * qdma_descq_context_read() - handler to read the queue context - * - * @param[in] xdev: pointer to xdev - * @param[in] qid_hw: hw qidx - * @param[in] st: indicated whether the mm mode or st mode - * @param[in] c2h: indicates whether the h2c or c2h direction - * @param[in] mm_cmpt_en: indicates whether cmpt is enabled for mm or not - * @param[out] ctxt: pointer to context data - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_context_read(struct xlnx_dma_dev *xdev, unsigned int qid_hw, - bool st, u8 type, struct qdma_descq_context *context); - -/*****************************************************************************/ -/** - * qdma_descq_context_dump() - handler to dump the queue context - * - * - * @param[in] descq: pointer to qdma_descq - * @param[out] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_context_dump(struct qdma_descq *descq, char *buf, int buflen); - -/*****************************************************************************/ -/** - * qdma_intr_context_read() - handler to read the interrupt context - * - * @param[in] xdev: pointer to xdev - * @param[in] ring_index: interrupt ring index - * @param[in] ctxt_sz: context size - * @param[out] context: pointer to interrupt context* - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_intr_context_read(struct xlnx_dma_dev *xdev, - int ring_index, struct qdma_indirect_intr_ctxt *ctxt); - -#ifndef __QDMA_VF__ -/*****************************************************************************/ -/** - * qdma_descq_context_read() - handler to program the context for vf - * - * @param[in] xdev: pointer to xdev - * @param[in] qid_hw: hw qidx - * @param[in] st: indicated whether the mm mode or st mode - * @param[in] c2h: indicates whether the h2c or c2h direction - * @param[in] mm_cmpt_en: indicates whether cmpt is enabled for mm or not* - * @param[out] ctxt: pointer to context data - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_context_program(struct xlnx_dma_dev *xdev, unsigned int qid_hw, - bool st, u8 type, struct qdma_descq_context *context); - -#endif - -#endif /* ifndef __LIBQDMA_CONTEXT_H__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs.c b/QDMA/linux-kernel/driver/libqdma/qdma_debugfs.c deleted file mode 100755 index 0c61bad..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "qdma_debugfs.h" - -/*****************************************************************************/ -/** - * qdma_debugfs_init() - function to initialize debugfs - * - * param[in]: qdma_debugfs_root - debugfs root - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_debugfs_init(struct dentry **qdma_debugfs_root) -{ - struct dentry *debugfs_root = NULL; - /* create a directory by the name qdma in - * /sys/kernel/debugfs - */ -#ifndef __QDMA_VF__ - debugfs_root = debugfs_create_dir("qdma-pf", NULL); - if (!debugfs_root) - return -ENOENT; - pr_debug("created qdma-pf dir in Linux debug file system\n"); - -#else - debugfs_root = debugfs_create_dir("qdma-vf", NULL); - if (!debugfs_root) - return -ENOENT; - pr_debug("created qdma-vf dir in Linux debug file system\n"); - -#endif - - *qdma_debugfs_root = debugfs_root; - return 0; -} - -/*****************************************************************************/ -/** - * qdma_debugfs_exit() - function to cleanup debugfs - * - * param[in]: qdma_debugfs_root - debugfs root - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -void qdma_debugfs_exit(struct dentry *qdma_debugfs_root) -{ - debugfs_remove_recursive(qdma_debugfs_root); -#ifndef __QDMA_VF__ - pr_debug("removed qdma_pf directory from Linux debug file system\n"); -#else - pr_debug("removed qdma_vf directory from Linux debug file system\n"); -#endif -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs.h b/QDMA/linux-kernel/driver/libqdma/qdma_debugfs.h deleted file mode 100755 index 2b3600a..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_DEBUGFS_H__ -#define __QDMA_DEBUGFS_H__ - -#include <linux/pci.h> -#include <linux/debugfs.h> -#include <linux/fs.h> -#include <asm/uaccess.h> -#include <linux/mutex.h> -#include <linux/slab.h> - -#define DBGFS_DBG_FNAME_SZ (64) -#define QDMA_DEV_NAME_SZ (64) - -/*****************************************************************************/ -/** - * qdma_debugfs_init() - function to initialize debugfs - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int qdma_debugfs_init(struct dentry **qdma_debugfs_root); - -/*****************************************************************************/ -/** - * qdma_debugfs_exit() - function to cleanup debugfs - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -void qdma_debugfs_exit(struct dentry *qdma_debugfs_root); - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_dev.c b/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_dev.c deleted file mode 100755 index 3daa36a..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_dev.c +++ /dev/null @@ -1,1009 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - - -#ifdef DEBUGFS -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "qdma_debugfs_dev.h" -#include "qdma_reg_dump.h" -#include "qdma_access_common.h" -#include "qdma_context.h" -#include "libqdma_export.h" -#include "qdma_intr.h" -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/mutex.h> - - -enum dbgfs_dev_dbg_file_type { - DBGFS_DEV_DBGF_INFO = 0, - DBGFS_DEV_DBGF_REGS = 1, - DBGFS_DEV_DBGF_REG_INFO = 2, - DBGFS_DEV_DBGF_END, -}; - -enum dbgfs_dev_intr_file_type { - DBFS_DEV_INTR_CTX = 0, - DBFS_DEV_INTR_ENTRIES = 1, - DBGFS_DEV_INTR_END, -}; - -struct dbgfs_dev_dbgf { - char name[DBGFS_DBG_FNAME_SZ]; - struct file_operations fops; -}; - -struct dbgfs_dev_intr_dbgf { - char name[DBGFS_DBG_FNAME_SZ]; - struct file_operations fops; -}; - -struct dbgfs_dev_priv { - unsigned long dev_hndl; - char dev_name[QDMA_DEV_NAME_SZ]; - char *data; - int datalen; -}; - -enum bar_type { - DEBUGFS_BAR_CONFIG = 0, - DEBUGFS_BAR_USER = 1, - DEBUGFS_BAR_BYPASS = 2, -}; - -/** structure to hold file ops */ -static struct dbgfs_dev_dbgf dbgf[DBGFS_DEV_DBGF_END]; - -/** structure to hold interrupt file ops */ -static struct dbgfs_dev_dbgf dbg_intrf[DBGFS_DEV_INTR_END]; - -/*****************************************************************************/ -/** - * dump_banner() - static helper function to dump a device banner - * - * @param[in] dev_name: qdma device name - * @param[out] buf: buffer to which banner is dumped - * @param[in] buf_sz: size of the buffer passed to func - * - * @return len: length of the buffer printed - *****************************************************************************/ -static int dump_banner(char *dev_name, char *buf, int buf_sz) -{ - int len = 0; - char seperator[81] = {0}; - - memset(seperator, '#', 80); - - /** Banner consumes three lines, so size should be min 240 (80 * 3) - * If changed, check the minimum buffer size required - */ - if (buf_sz < (3 * DEBGFS_LINE_SZ)) - return -1; - - len += snprintf(buf + len, buf_sz - len, "%s\n", seperator); - len += snprintf(buf + len, buf_sz - len, - "###\t\t\t\tqdma%s, reg dump\n", - dev_name); - len += snprintf(buf + len, buf_sz - len, "%s\n", seperator); - - return len; -} - - -#define BANNER_LEN (81 * 5) - -/*****************************************************************************/ -/** - * dbgfs_dump_qdma_regs() - static function to dump qdma device registers - * - * @param[in] xpdev: pointer to qdma pci device structure - * @param[in] buf: buffer to dump the registers - * @param[in] buf_len:size of the buffer passed - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dbgfs_dump_qdma_regs(unsigned long dev_hndl, char *dev_name, - char **data, int *data_len) -{ - int len = 0; - int rv; - char *buf = NULL; - int buflen; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) - return -EINVAL; - -#ifndef __QDMA_VF__ - rv = qdma_acc_reg_dump_buf_len((void *)dev_hndl, - xdev->version_info.ip_type, - xdev->version_info.device_type, &buflen); -#else - rv = qdma_acc_reg_dump_buf_len((void *)dev_hndl, - xdev->version_info.ip_type, - xdev->version_info.device_type, &buflen); -#endif - if (rv < 0) { - pr_err("Failed to get reg dump buffer length\n"); - return rv; - } - buflen += BANNER_LEN; - - /** allocate memory */ - buf = (char *) kzalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - /* print the banner with device info */ - rv = dump_banner(dev_name, buf + len, buflen - len); - if (rv < 0) { - pr_warn("insufficient space to dump register banner, err =%d\n", - rv); - kfree(buf); - return len; - } - len += rv; - - rv = qdma_config_reg_dump(dev_hndl, buf + len, buflen - len); - if (rv < 0) { - pr_warn("Not able to dump Config Bar register values, err = %d\n", - rv); - *data = buf; - *data_len = buflen; - return len; - } - len += rv; - - *data = buf; - *data_len = buflen; - - return len; -} - -/*****************************************************************************/ -/** - * dbgfs_dump_qdma_reg_info() - static function to dump qdma device registers - * - * @param[in] xpdev: pointer to qdma pci device structure - * @param[in] buf: buffer to dump the registers - * @param[in] buf_len:size of the buffer passed - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dbgfs_dump_qdma_reg_info(unsigned long dev_hndl, char *dev_name, - char **data, int *data_len) -{ - int len = 0; - int rv; - char *buf = NULL; - int buflen; - int num_regs; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) - return -EINVAL; - - rv = qdma_acc_reg_info_len((void *)dev_hndl, - xdev->version_info.ip_type, - xdev->version_info.device_type, &buflen, &num_regs); - - if (rv < 0) { - pr_err("Failed to get reg dump buffer length\n"); - return rv; - } - buflen += BANNER_LEN; - - /** allocate memory */ - buf = (char *) kzalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - /* print the banner with device info */ - rv = dump_banner(dev_name, buf + len, buflen - len); - if (rv < 0) { - pr_warn("insufficient space to dump register banner, err =%d\n", - rv); - kfree(buf); - return len; - } - len += rv; - - rv = qdma_config_reg_info_dump(dev_hndl, 0, num_regs, buf + len, - buflen - len); - if (rv < 0) { - pr_warn("Not able to dump Config Bar register values, err = %d\n", - rv); - *data = buf; - *data_len = buflen; - return len; - } - len += rv; - - *data = buf; - *data_len = buflen; - - return len; -} - -/*****************************************************************************/ -/** - * dbgfs_dump_qdma_info() - static function to dump qdma device registers - * - * @xpdev: pointer to qdma pci device structure - * @buf: buffer to dump the registers - * @buf_len:size of the buffer passed - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dbgfs_dump_qdma_info(unsigned long dev_hndl, char *dev_name, - char **data, int *data_len) -{ - int len = 0; - char *buf = NULL; - int buflen = DEBUGFS_DEV_INFO_SZ; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_dev_conf *conf = NULL; - - if (!xdev) - return -EINVAL; - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) - return -EINVAL; - - conf = &xdev->conf; - - /** allocate memory */ - buf = (char *) kzalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - len += snprintf(buf + len, buflen - len, "%-36s: %s\n", "Master PF", - (conf->master_pf) ? "True" : "False"); - len += snprintf(buf + len, buflen - len, "%-36s: %d\n", "QBase", - conf->qsets_base); - len += snprintf(buf + len, buflen - len, "%-36s: %u\n", "Max Qsets", - conf->qsets_max); - len += snprintf(buf + len, buflen - len, "%-36s: %d\n", - "Number of VFs", xdev->vf_count); - len += snprintf(buf + len, buflen - len, "%-36s: %d\n", - "Max number of VFs", conf->vf_max); - len += snprintf(buf + len, buflen - len, "%-36s: %s mode\n", - "Driver Mode", - mode_name_list[conf->qdma_drv_mode].name); - - *data = buf; - *data_len = buflen; - - return len; -} - -/*****************************************************************************/ -/** - * dbgfs_dump_intr_cntx() - static function to dump interrupt context - * - * @param[in] xpdev: pointer to qdma pci device structure - * @param[in] buf: buffer to dump the interrupt context - * @param[in] buf_len:size of the buffer passed - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dbgfs_dump_intr_cntx(unsigned long dev_hndl, char *dev_name, - char **data, int *data_len) -{ - - int len = 0; - int rv = 0; - char *buf = NULL; - int i = 0; - int ring_index = 0; - struct qdma_indirect_intr_ctxt intr_ctxt; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int buflen = DEBUGFS_INTR_CNTX_SZ; - - - /** allocate memory */ - buf = (char *) kzalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - /** if interrupt aggregation is enabled - * add the interrupt context - */ - if ((xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (xdev->conf.qdma_drv_mode == AUTO_MODE)) { - for (i = 0; i < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; i++) { - ring_index = get_intr_ring_index( - xdev, - (i + xdev->dvec_start_idx)); - rv = qdma_intr_context_read( - xdev, - ring_index, - &intr_ctxt); - if (rv < 0) { - len += snprintf(buf + len, buflen - len, - "%s read intr context failed %d.\n", - xdev->conf.name, rv); - *data = buf; - *data_len = buflen; - return rv; - } - - rv = xdev->hw.qdma_dump_intr_context(xdev, - &intr_ctxt, ring_index, - buf + len, buflen - len); - if (rv < 0) { - pr_err("Failed to dump intr context, rv = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - len += rv; - } - } - - *data = buf; - *data_len = buflen; - - return len; -} - -/*****************************************************************************/ -/** - * dbgfs_dump_intr_ring() - static function to dump interrupt ring - * - * @param[in] xpdev: pointer to qdma pci device structure - * @param[in] buf: buffer to dump the interrupt ring - * @param[in] buf_len:size of the buffer passed - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dbgfs_dump_intr_ring(unsigned long dev_hndl, char *dev_name, - char **data, int *data_len) -{ - int len = 0; - int rv = 0; - char *buf = NULL; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - unsigned int vector_idx = xdev->msix[xdev->dvec_start_idx].entry; - int num_entries = (xdev->conf.intr_rngsz + 1) * 512; - int buflen = (45 * num_entries) + 1; - - - /** allocate memory */ - buf = (char *) kzalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - rv = qdma_intr_ring_dump(dev_hndl, vector_idx, 0, - num_entries - 1, buf, buflen); - if (rv < 0) { - len += snprintf(buf + len, buflen - len, - "%s read intr context failed %d.\n", - xdev->conf.name, rv); - kfree(buf); - return rv; - } - - len = strlen(buf); - buf[len++] = '\n'; - *data = buf; - *data_len = buflen; - - return len; -} -/*****************************************************************************/ -/** - * dev_dbg_file_open() - static function that provides generic open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dev_dbg_file_open(struct inode *inode, struct file *fp) -{ - unsigned long dev_id = -1; - int rv = 0; - unsigned char dev_name[QDMA_DEV_NAME_SZ] = {0}; - unsigned char *lptr = NULL, *rptr = NULL; - struct dentry *dev_dir = NULL; - struct dbgfs_dev_priv *priv = NULL; - struct xlnx_dma_dev *xdev = NULL; - - if (!inode || !fp) - return -EINVAL; - dev_dir = fp->f_path.dentry->d_parent; - xdev = inode->i_private; - if (!xdev) - return -EINVAL; - - /* convert colon sepearted b:d:f to hex */ - rptr = dev_dir->d_iname; - lptr = dev_name; - while (*rptr) { - if (*rptr == ':') { - rptr++; - continue; - } - *lptr++ = *rptr++; - } - - /* convert this string as hex integer */ - rv = kstrtoul((const char *)dev_name, 16, &dev_id); - if (rv < 0) { - rv = -ENODEV; - return rv; - } - - - priv = (struct dbgfs_dev_priv *) kzalloc(sizeof(struct dbgfs_dev_priv), - GFP_KERNEL); - if (!priv) { - rv = -ENOMEM; - return rv; - } - - priv->dev_hndl = (unsigned long)xdev; - snprintf(priv->dev_name, QDMA_DEV_NAME_SZ, "%s", dev_name); - fp->private_data = priv; - - return 0; -} - -/*****************************************************************************/ -/** - * dev_dbg_file_release() - static function that provides generic release - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dev_dbg_file_release(struct inode *inode, struct file *fp) -{ - kfree(fp->private_data); - - fp->private_data = NULL; - - return 0; -} - -/*****************************************************************************/ -/** - * dev_dbg_file_read() - static function that provides common read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * @param[in] type: information type - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t dev_dbg_file_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos, enum dbgfs_dev_dbg_file_type type) -{ - char *buf = NULL; - int buf_len = 0; - int len = 0; - int rv = 0; - struct dbgfs_dev_priv *dev_priv = - (struct dbgfs_dev_priv *)fp->private_data; - - if (dev_priv->data == NULL && dev_priv->datalen == 0) { - if (type == DBGFS_DEV_DBGF_INFO) { - rv = dbgfs_dump_qdma_info(dev_priv->dev_hndl, - dev_priv->dev_name, &buf, &buf_len); - } else if (type == DBGFS_DEV_DBGF_REGS) { - rv = dbgfs_dump_qdma_regs(dev_priv->dev_hndl, - dev_priv->dev_name, &buf, &buf_len); - } else if (type == DBGFS_DEV_DBGF_REG_INFO) { - rv = dbgfs_dump_qdma_reg_info(dev_priv->dev_hndl, - dev_priv->dev_name, &buf, &buf_len); - } - - if (rv < 0) - goto dev_dbg_file_read_exit; - - dev_priv->datalen = rv; - dev_priv->data = buf; - } - - buf = dev_priv->data; - len = dev_priv->datalen; - - if (!buf) - goto dev_dbg_file_read_exit; - - /** write to user buffer */ - if (*ppos >= len) { - rv = 0; - goto dev_dbg_file_read_exit; - } - - if (*ppos + count > len) - count = len - *ppos; - - if (copy_to_user(user_buffer, buf + *ppos, count)) { - rv = -EFAULT; - goto dev_dbg_file_read_exit; - } - - *ppos += count; - rv = count; - - pr_debug("number of bytes written to user space is %zu\n", count); - -dev_dbg_file_read_exit: - kfree(buf); - dev_priv->data = NULL; - dev_priv->datalen = 0; - return rv; -} - -/*****************************************************************************/ -/** - * dev_intr_file_read() - static function that provides common read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * @param[in] type: information type - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t dev_intr_file_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos, enum dbgfs_dev_intr_file_type type) -{ - char *buf = NULL; - int buf_len = 0; - int len = 0; - int rv = 0; - struct dbgfs_dev_priv *dev_priv = - (struct dbgfs_dev_priv *)fp->private_data; - - if (dev_priv->data == NULL && dev_priv->datalen == 0) { - if (type == DBFS_DEV_INTR_CTX) { - rv = dbgfs_dump_intr_cntx(dev_priv->dev_hndl, - dev_priv->dev_name, &buf, &buf_len); - } else if (type == DBFS_DEV_INTR_ENTRIES) { - rv = dbgfs_dump_intr_ring(dev_priv->dev_hndl, - dev_priv->dev_name, &buf, &buf_len); - } - - if (rv < 0) - goto dev_intr_file_read_exit; - - dev_priv->datalen = rv; - dev_priv->data = buf; - } - - buf = dev_priv->data; - len = dev_priv->datalen; - - if (!buf) - goto dev_intr_file_read_exit; - - /** write to user buffer */ - if (*ppos >= len) { - rv = 0; - goto dev_intr_file_read_exit; - } - - if (*ppos + count > len) - count = len - *ppos; - - if (copy_to_user(user_buffer, buf + *ppos, count)) { - rv = -EFAULT; - goto dev_intr_file_read_exit; - } - - *ppos += count; - rv = count; - - pr_debug("nuber of bytes written to user space is %zu\n", count); - -dev_intr_file_read_exit: - kfree(buf); - dev_priv->data = NULL; - dev_priv->datalen = 0; - return rv; -} - -/*****************************************************************************/ -/** - * dev_info_open() - static function that executes info open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dev_info_open(struct inode *inode, struct file *fp) -{ - return dev_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * dev_info_read() - static function that executes info read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t dev_info_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return dev_dbg_file_read(fp, user_buffer, count, ppos, - DBGFS_DEV_DBGF_INFO); -} - -/*****************************************************************************/ -/** - * dev_regs_open() - static function that opens regs debug file - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dev_regs_open(struct inode *inode, struct file *fp) -{ - return dev_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * dev_reg_info_open() - static function that opens regInfo debug file - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dev_reg_info_open(struct inode *inode, struct file *fp) -{ - return dev_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * dev_regs_read() - static function that executes info read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t dev_regs_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return dev_dbg_file_read(fp, user_buffer, count, ppos, - DBGFS_DEV_DBGF_REGS); -} - -/*****************************************************************************/ -/** - * dev_reg_info_read() - static function that executes info read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t dev_reg_info_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return dev_dbg_file_read(fp, user_buffer, count, ppos, - DBGFS_DEV_DBGF_REG_INFO); -} -/*****************************************************************************/ -/** - * dev_intr_cntx_open() -static function to open interrupt context debug file - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dev_intr_cntx_open(struct inode *inode, struct file *fp) -{ - return dev_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * dev_intr_cntx_read() - static function that executes interrupt context read - * file - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t dev_intr_cntx_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return dev_intr_file_read(fp, user_buffer, count, ppos, - DBFS_DEV_INTR_CTX); -} - -/*****************************************************************************/ -/** - * dev_intr_ring_open() -static function to open interrupt ring entries file - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int dev_intr_ring_open(struct inode *inode, struct file *fp) -{ - return dev_dbg_file_open(inode, fp); -} -/*****************************************************************************/ -/** - * dev_intr_ring_read() - static function that reads interrupt ring entries to - * file - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t dev_intr_ring_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return dev_intr_file_read(fp, user_buffer, count, ppos, - DBFS_DEV_INTR_ENTRIES); -} -/*****************************************************************************/ -/** - * create_dev_dbg_files() - static function to create queue debug files - * - * @param[in] dev_root: debugfs root for the device - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static int create_dev_dbg_files(struct xlnx_dma_dev *xdev, - struct dentry *dev_root) -{ - struct dentry *fp[DBGFS_DEV_DBGF_END] = { NULL }; - struct file_operations *fops = NULL; - int i = 0; - - memset(dbgf, 0, sizeof(struct dbgfs_dev_dbgf) * DBGFS_DEV_DBGF_END); - - for (i = 0; i < DBGFS_DEV_DBGF_END; i++) { - fops = &dbgf[i].fops; - fops->owner = THIS_MODULE; - switch (i) { - case DBGFS_DEV_DBGF_INFO: - snprintf(dbgf[i].name, 64, "%s", "qdma_info"); - fops->open = dev_info_open; - fops->read = dev_info_read; - fops->release = dev_dbg_file_release; - break; - case DBGFS_DEV_DBGF_REGS: - snprintf(dbgf[i].name, 64, "%s", "qdma_regs"); - fops->open = dev_regs_open; - fops->read = dev_regs_read; - fops->release = dev_dbg_file_release; - break; - case DBGFS_DEV_DBGF_REG_INFO: - snprintf(dbgf[i].name, 64, "%s", "qdma_reg_info"); - fops->open = dev_reg_info_open; - fops->read = dev_reg_info_read; - fops->release = dev_dbg_file_release; - break; - } - } - - for (i = 0; i < DBGFS_DEV_DBGF_END; i++) { - fp[i] = debugfs_create_file(dbgf[i].name, 0644, dev_root, - xdev, &dbgf[i].fops); - if (!fp[i]) - return -1; - } - return 0; -} - -/*****************************************************************************/ -/** - * create_dev_intr_files() - static function to create intr ring files - * - * @param[in] dev_root: debugfs root for the device - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static int create_dev_intr_files(struct xlnx_dma_dev *xdev, - struct dentry *intr_root) -{ - struct dentry *fp[DBGFS_DEV_DBGF_END] = { NULL }; - struct file_operations *fops = NULL; - int i = 0; - char intr_dir[16] = {0}; - struct dentry *dbgfs_intr_ring = NULL; - - snprintf(intr_dir, 8, "%d", - get_intr_ring_index(xdev, - xdev->dvec_start_idx)); - - dbgfs_intr_ring = debugfs_create_dir(intr_dir, intr_root); - memset(dbg_intrf, 0, sizeof( - struct dbgfs_dev_intr_dbgf) * DBGFS_DEV_INTR_END); - - for (i = 0; i < DBGFS_DEV_INTR_END; i++) { - fops = &dbg_intrf[i].fops; - fops->owner = THIS_MODULE; - switch (i) { - case DBFS_DEV_INTR_CTX: - snprintf(dbg_intrf[i].name, 64, "%s", "cntxt"); - fops->open = dev_intr_cntx_open; - fops->read = dev_intr_cntx_read; - fops->release = dev_dbg_file_release; - break; - case DBFS_DEV_INTR_ENTRIES: - snprintf(dbg_intrf[i].name, 64, "%s", "entries"); - fops->open = dev_intr_ring_open; - fops->read = dev_intr_ring_read; - fops->release = dev_dbg_file_release; - break; - } - } - - for (i = 0; i < DBGFS_DEV_INTR_END; i++) { - fp[i] = debugfs_create_file(dbg_intrf[i].name, 0644, - dbgfs_intr_ring, - xdev, &dbg_intrf[i].fops); - if (!fp[i]) - return -1; - } - return 0; -} - -/*****************************************************************************/ -/** - * dbgfs_dev_init() - function to initialize device debugfs files - * - * @param[in] xdev: Xilinx dma device - * @param[in] qdma_debugfs_root: root file in debugfs - * - * @return =0: success - * @return <0: error - *****************************************************************************/ -int dbgfs_dev_init(struct xlnx_dma_dev *xdev) -{ - char dname[QDMA_DEV_NAME_SZ] = {0}; - struct dentry *dbgfs_dev_root = NULL; - struct dentry *dbgfs_queues_root = NULL; - struct dentry *dbgfs_intr_root = NULL; - struct pci_dev *pdev = xdev->conf.pdev; - int rv = 0; - - if (!xdev->conf.debugfs_dev_root) { - snprintf(dname, QDMA_DEV_NAME_SZ, "%04x:%02x:%02x:%x", - pci_domain_nr(pdev->bus), - pdev->bus->number, - PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn)); - /* create a directory for the device in debugfs */ - dbgfs_dev_root = debugfs_create_dir(dname, qdma_debugfs_root); - if (!dbgfs_dev_root) { - pr_err("Failed to create device direcotry\n"); - return -1; - } - xdev->dbgfs_dev_root = dbgfs_dev_root; - } else - xdev->dbgfs_dev_root = xdev->conf.debugfs_dev_root; - - /* create debug files for qdma device */ - rv = create_dev_dbg_files(xdev, xdev->dbgfs_dev_root); - if (rv < 0) { - pr_err("Failed to create device debug files\n"); - goto dbgfs_dev_init_fail; - } - - /* create a directory for the queues in debugfs */ - dbgfs_queues_root = debugfs_create_dir("queues", xdev->dbgfs_dev_root); - if (!dbgfs_queues_root) { - pr_err("Failed to create queues directory under device directory\n"); - goto dbgfs_dev_init_fail; - } - if ((xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (xdev->conf.qdma_drv_mode == AUTO_MODE)) { - /* create a directory for the intr in debugfs */ - dbgfs_intr_root = debugfs_create_dir("intr_rings", - xdev->dbgfs_dev_root); - if (!dbgfs_queues_root) { - pr_err("Failed to create intr_ring directory under device directory\n"); - goto dbgfs_dev_init_fail; - } - - /* create debug files for intr */ - rv = create_dev_intr_files(xdev, dbgfs_intr_root); - if (rv < 0) { - pr_err("Failed to create intr ring files\n"); - goto dbgfs_dev_init_fail; - } - } - xdev->dbgfs_queues_root = dbgfs_queues_root; - xdev->dbgfs_intr_root = dbgfs_intr_root; - spin_lock_init(&xdev->qidx_lock); - - return 0; - -dbgfs_dev_init_fail: - - debugfs_remove_recursive(xdev->dbgfs_dev_root); - return -1; -} - -/*****************************************************************************/ -/** - * dbgfs_dev_exit() - function to cleanup device debugfs files - * - * @param[in] xdev: Xilinx dma device - * - *****************************************************************************/ -void dbgfs_dev_exit(struct xlnx_dma_dev *xdev) -{ - if (!xdev->conf.debugfs_dev_root) - debugfs_remove_recursive(xdev->dbgfs_dev_root); - xdev->dbgfs_dev_root = NULL; - xdev->dbgfs_queues_root = NULL; - xdev->dbgfs_intr_root = NULL; -} - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_dev.h b/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_dev.h deleted file mode 100755 index 5a74c79..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_dev.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_DEBUGFS_DEV_H__ -#define __QDMA_DEBUGFS_DEV_H__ - -#include "qdma_debugfs.h" -#include "xdev.h" - -int dbgfs_dev_init(struct xlnx_dma_dev *xdev); -void dbgfs_dev_exit(struct xlnx_dma_dev *xdev); - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_queue.c b/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_queue.c deleted file mode 100755 index c323c47..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_queue.c +++ /dev/null @@ -1,964 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "qdma_debugfs_queue.h" -#include "libqdma_export.h" -#include "qdma_regs.h" -#include "qdma_context.h" -#include "qdma_descq.h" -#include "qdma_regs.h" -#include <linux/uaccess.h> - -#ifdef DEBUGFS -#define DEBUGFS_QUEUE_DESC_SZ (100) -#define DEBUGFS_QUEUE_INFO_SZ (256) -#define DEBUGFS_QUEUE_CTXT_SZ (24 * 1024) - -#define DEBUGFS_CTXT_ELEM(reg, pos, size) \ - ((reg >> pos) & ~(~0 << size)) - -#define DBGFS_QUEUE_INFO_SZ 256 -#define DBGFS_ERR_BUFLEN (64) - -enum dbgfs_queue_info_type { - DBGFS_QINFO_INFO = 0, - DBGFS_QINFO_CNTXT = 1, - DBGFS_QINFO_DESC = 2, - DBGFS_QINFO_END, -}; - -enum dbgfs_cntxt_word { - DBGFS_CNTXT_W0 = 0, - DBGFS_CNTXT_W1 = 1, - DBGFS_CNTXT_W2 = 2, - DBGFS_CNTXT_W3 = 3, - DBGFS_CNTXT_W4 = 4, - DBGFS_CNTXT_W5 = 5, - DBGFS_CNTXT_W6 = 6, - DBGFS_CNTXT_W7 = 7, -}; - -enum dbgfs_cmpt_queue_info_type { - DBGFS_CMPT_QINFO_INFO = 0, - DBGFS_CMPT_QINFO_CNTXT = 1, - DBGFS_CMPT_QINFO_DESC = 2, - DBGFS_CMPT_QINFO_END, -}; - -struct dbgfs_q_dbgf { - char name[DBGFS_DBG_FNAME_SZ]; - struct file_operations fops; -}; - -struct dbgfs_q_priv { - unsigned long dev_hndl; - unsigned long qhndl; - char *data; - int datalen; -}; - -enum dbgfs_desc_type { - DBGFS_DESC_TYPE_C2H = 0, - DBGFS_DESC_TYPE_H2C = DBGFS_DESC_TYPE_C2H, - DBGFS_DESC_TYPE_CMPT = 1, - DBGFS_DESC_TYPE_END = 2, -}; - -/** structure to hold file ops */ -static struct dbgfs_q_dbgf qf[DBGFS_QINFO_END]; - -/** structure to hold file ops */ -static struct dbgfs_q_dbgf cmpt_qf[DBGFS_CMPT_QINFO_END]; -static int q_dbg_file_open(struct inode *inode, struct file *fp); -static int q_dbg_file_release(struct inode *inode, struct file *fp); -static int qdbg_info_read(unsigned long dev_hndl, unsigned long id, char **data, - int *data_len, enum dbgfs_desc_type type); -static int qdbg_desc_read(unsigned long dev_hndl, unsigned long id, char **data, - int *data_len, enum dbgfs_desc_type type); -static int qdbg_cntxt_read(unsigned long dev_hndl, unsigned long id, - char **data, int *data_len, enum dbgfs_desc_type type); - -/*****************************************************************************/ -/** - * cmpt_q_dbg_file_open() - static function that provides generic open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int cmpt_q_dbg_file_open(struct inode *inode, struct file *fp) -{ - return q_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * cmpt_q_dbg_file_release() - static function that provides generic release - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int cmpt_q_dbg_file_release(struct inode *inode, struct file *fp) -{ - return q_dbg_file_release(inode, fp); -} - -/*****************************************************************************/ -/** - * cmpt_q_dbg_file_read() - static function that provides common read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * @param[in] type: information type - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t cmpt_q_dbg_file_read(struct file *fp, - char __user *user_buffer, - size_t count, loff_t *ppos, - enum dbgfs_queue_info_type type) -{ - char *buf = NULL; - int buf_len = 0; - int len = 0; - int rv = 0; - struct dbgfs_q_priv *qpriv = - (struct dbgfs_q_priv *)fp->private_data; - - if (qpriv->data == NULL && qpriv->datalen == 0) { - if (type == DBGFS_QINFO_INFO) { - rv = qdbg_info_read(qpriv->dev_hndl, qpriv->qhndl, - &buf, &buf_len, DBGFS_DESC_TYPE_CMPT); - } else if (type == DBGFS_QINFO_CNTXT) { - rv = qdbg_cntxt_read(qpriv->dev_hndl, qpriv->qhndl, - &buf, &buf_len, DBGFS_DESC_TYPE_CMPT); - } else if (type == DBGFS_QINFO_DESC) { - rv = qdbg_desc_read(qpriv->dev_hndl, qpriv->qhndl, - &buf, &buf_len, DBGFS_DESC_TYPE_CMPT); - } - - if (rv < 0) - goto cmpt_q_dbg_file_read_exit; - - qpriv->datalen = rv; - qpriv->data = buf; - } - - buf = qpriv->data; - len = qpriv->datalen; - - if (!buf) - goto cmpt_q_dbg_file_read_exit; - - /** write to user buffer */ - if (*ppos >= len) { - rv = 0; - goto cmpt_q_dbg_file_read_exit; - } - - if (*ppos + count > len) - count = len - *ppos; - - if (copy_to_user(user_buffer, buf + *ppos, count)) { - rv = -EFAULT; - goto cmpt_q_dbg_file_read_exit; - } - - *ppos += count; - - pr_debug("cmpt q read size %zu\n", count); - - return count; - -cmpt_q_dbg_file_read_exit: - kfree(buf); - qpriv->data = NULL; - qpriv->datalen = 0; - return rv; -} - -/*****************************************************************************/ -/** - * cmpt_q_info_open() - static function that executes info open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int cmpt_q_info_open(struct inode *inode, struct file *fp) -{ - return cmpt_q_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * cmpt_q_info_read() - static function that executes info read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t cmpt_q_info_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return cmpt_q_dbg_file_read(fp, user_buffer, count, ppos, - DBGFS_QINFO_INFO); -} - -/*****************************************************************************/ -/** - * cmpt_q_cntxt_open() - static function that executes info open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int cmpt_q_cntxt_open(struct inode *inode, struct file *fp) -{ - return cmpt_q_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * cmpt_q_cntxt_read() - static function that executes info read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t cmpt_q_cntxt_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return cmpt_q_dbg_file_read(fp, user_buffer, count, ppos, - DBGFS_QINFO_CNTXT); -} - -/*****************************************************************************/ -/** - * cmpt_q_desc_open() - static function that executes descriptor open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int cmpt_q_desc_open(struct inode *inode, struct file *fp) -{ - return cmpt_q_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * cmpt_q_desc_read() - static function that executes descriptor read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t cmpt_q_desc_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return cmpt_q_dbg_file_read(fp, user_buffer, count, ppos, - DBGFS_QINFO_DESC); -} - -/*****************************************************************************/ -/** - * create_cmpt_q_dbg_files() - static function to create cmpt queue dbg files - * - * @param[in] queue_root: debugfs root for a queue - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static int create_cmpt_q_dbg_files(struct qdma_descq *descq, - struct dentry *queue_root) -{ - struct dentry *fp[DBGFS_QINFO_END] = { NULL }; - struct file_operations *fops = NULL; - int i = 0; - - memset(cmpt_qf, 0, sizeof(struct dbgfs_q_dbgf) * DBGFS_CMPT_QINFO_END); - - for (i = 0; i < DBGFS_CMPT_QINFO_END; i++) { - fops = &cmpt_qf[i].fops; - fops->owner = THIS_MODULE; - switch (i) { - case DBGFS_CMPT_QINFO_INFO: - snprintf(cmpt_qf[i].name, DBGFS_DBG_FNAME_SZ, - "%s", "info"); - fops->open = cmpt_q_info_open; - fops->read = cmpt_q_info_read; - fops->release = cmpt_q_dbg_file_release; - break; - case DBGFS_CMPT_QINFO_CNTXT: - snprintf(cmpt_qf[i].name, DBGFS_DBG_FNAME_SZ, - "%s", "cntxt"); - fops->open = cmpt_q_cntxt_open; - fops->read = cmpt_q_cntxt_read; - fops->release = cmpt_q_dbg_file_release; - break; - case DBGFS_CMPT_QINFO_DESC: - snprintf(cmpt_qf[i].name, DBGFS_DBG_FNAME_SZ, - "%s", "desc"); - fops->open = cmpt_q_desc_open; - fops->read = cmpt_q_desc_read; - fops->release = cmpt_q_dbg_file_release; - break; - } - } - - for (i = 0; i < DBGFS_CMPT_QINFO_END; i++) { - fp[i] = debugfs_create_file(cmpt_qf[i].name, 0644, queue_root, - descq, &cmpt_qf[i].fops); - if (!fp[i]) - return -1; - } - return 0; -} - -/*****************************************************************************/ -/** - * q_dbg_file_open() - generic queue debug file open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int q_dbg_file_open(struct inode *inode, struct file *fp) -{ - unsigned long dev_id = -1; - int qidx = -1; - struct dbgfs_q_priv *priv = NULL; - int rv = 0; - unsigned char dev_name[QDMA_DEV_NAME_SZ] = {0}; - unsigned char *lptr = NULL, *rptr = NULL; - struct dentry *direction_dir = NULL; - struct dentry *qid_dir = NULL; - struct dentry *qroot_dir = NULL; - struct dentry *dev_dir = NULL; - struct qdma_descq *descq = NULL; - - if (!inode || !fp) - return -EINVAL; - descq = inode->i_private; - if (!descq) - return -EINVAL; - - direction_dir = fp->f_path.dentry->d_parent; - qid_dir = direction_dir->d_parent; - qroot_dir = qid_dir->d_parent; - dev_dir = qroot_dir->d_parent; - - /* convert this string as integer */ - rv = kstrtoint((const char *)qid_dir->d_iname, 0, &qidx); - if (rv < 0) { - rv = -ENODEV; - return rv; - } - - /* convert colon sepearted b:d:f to hex */ - rptr = dev_dir->d_iname; - lptr = dev_name; - while (*rptr) { - if (*rptr == ':') { - rptr++; - continue; - } - *lptr++ = *rptr++; - } - - /* convert this string as hex integer */ - rv = kstrtoul((const char *)dev_name, 16, &dev_id); - if (rv < 0) { - pr_err("%s, kstrtoint failed for %s, Error:%d\n", __func__, - dev_dir->d_iname, rv); - rv = -ENODEV; - return rv; - } - - priv = (struct dbgfs_q_priv *) kzalloc(sizeof(struct dbgfs_q_priv), - GFP_KERNEL); - if (!priv) { - rv = -ENOMEM; - return rv; - } - - priv->dev_hndl = (unsigned long)descq->xdev; - priv->qhndl = qdma_device_get_id_from_descq(descq->xdev, descq); - - fp->private_data = priv; - - return 0; -} - -/*****************************************************************************/ -/** - * q_dbg_file_release() - function that provides generic release - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int q_dbg_file_release(struct inode *inode, struct file *fp) -{ - kfree(fp->private_data); - - fp->private_data = NULL; - - return 0; -} - -/*****************************************************************************/ -/** - * qdbg_cntxt_read() - reads queue context for a queue - * - * @param[in] dev_hndl: xdev device handle - * @param[in] id: queue handle - * @param[out] buf: buffer to collect the context info - * @param[in] buflen: buffer len - * @param[in] type: context type - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static int qdbg_cntxt_read(unsigned long dev_hndl, unsigned long id, - char **data, int *data_len, enum dbgfs_desc_type type) -{ - int rv = 0; - char *buf = NULL; - int buflen = DEBUGFS_QUEUE_CTXT_SZ; - struct qdma_descq *descq = NULL; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) - return -EINVAL; - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) - return -EINVAL; - - /* allocate memory */ - buf = (char *) kzalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - /** get descq by id */ - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 0); - if (!descq) { - kfree(buf); - return -EINVAL; - } - - rv = qdma_descq_context_dump(descq, buf, buflen); - if (rv < 0) { - pr_err("%s: Failed to dump the context, rv = %d", - descq->conf.name, rv); - return descq->xdev->hw.qdma_get_error_code(rv); - } - - - buf[rv] = '\0'; - - *data = buf; - *data_len = buflen; - - return rv; -} - -/*****************************************************************************/ -/** - * qdbg_info_read() - reads queue info for a queue - * - * @param[in] dev_hndl: xdev device handle - * @param[in] id: queue handle - * @param[out] data: buffer pointer to collect the queue info - * @param[out] data_len: buffer len pointer - * @param[in] type: ring type - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static int qdbg_info_read(unsigned long dev_hndl, unsigned long id, char **data, - int *data_len, enum dbgfs_desc_type type) -{ - int len = 0; - char *buf = NULL; - int buflen = DEBUGFS_QUEUE_INFO_SZ; - struct qdma_descq *descq = NULL; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** allocate memory */ - buf = (char *) kzalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 0); - if (!descq) { - kfree(buf); - return -EINVAL; - } - - len = qdma_descq_dump_state(descq, buf + len, buflen - len); - - *data = buf; - *data_len = buflen; - - return len; -} - -/*****************************************************************************/ -/** - * qdbg_desc_read() - reads descriptors of a queue - * - * @param[in] dev_hndl: xdev device handle - * @param[in] id: queue handle - * @param[out] data: buffer pointer to collect the queue descriptors - * @param[out] data_len: buffer len pointer - * @param[in] type: ring type - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static int qdbg_desc_read(unsigned long dev_hndl, unsigned long id, char **data, - int *data_len, enum dbgfs_desc_type type) -{ - int len = 0; - int rngsz = 0; - struct qdma_descq *descq = NULL; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - char *buf = NULL; - int buflen = 0; - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 0); - if (!descq) - return -EINVAL; - - /** get the ring size */ - if (type != DBGFS_DESC_TYPE_CMPT) - rngsz = descq->conf.rngsz; - else - rngsz = descq->conf.rngsz_cmpt; - - /** 128 bytes is to accomodate header printed in the begining */ - buflen = (rngsz * DEBUGFS_QUEUE_DESC_SZ) + 128; - - /* allocate memory */ - buf = (char *) kzalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - if (type != DBGFS_DESC_TYPE_CMPT) { - len += qdma_queue_dump_desc(dev_hndl, id, - 0, rngsz-1, buf + len, buflen - len); - } else { - len += qdma_queue_dump_cmpt(dev_hndl, id, - 0, rngsz-1, buf + len, buflen - len); - } - - *data = buf; - *data_len = buflen; - - return len; -} - -/*****************************************************************************/ -/** - * q_dbg_file_read() - static function that provides common read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * @param[in] type: information type - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t q_dbg_file_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos, enum dbgfs_queue_info_type type) -{ - char *buf = NULL; - int buf_len = 0, len = 0, rv = 0; - struct dbgfs_q_priv *qpriv = (struct dbgfs_q_priv *)fp->private_data; - - if (qpriv->data == NULL && qpriv->datalen == 0) { - if (type == DBGFS_QINFO_INFO) { - rv = qdbg_info_read(qpriv->dev_hndl, qpriv->qhndl, - &buf, &buf_len, DBGFS_DESC_TYPE_C2H); - } else if (type == DBGFS_QINFO_CNTXT) { - rv = qdbg_cntxt_read(qpriv->dev_hndl, qpriv->qhndl, - &buf, &buf_len, DBGFS_DESC_TYPE_C2H); - } else if (type == DBGFS_QINFO_DESC) { - rv = qdbg_desc_read(qpriv->dev_hndl, qpriv->qhndl, - &buf, &buf_len, DBGFS_DESC_TYPE_C2H); - } - - if (rv < 0) - goto q_dbg_file_read_exit; - - qpriv->datalen = rv; - qpriv->data = buf; - } - - buf = qpriv->data; - len = qpriv->datalen; - - if (!buf) - goto q_dbg_file_read_exit; - - /** write to user buffer */ - if (*ppos >= len) { - rv = 0; - goto q_dbg_file_read_exit; - } - - if (*ppos + count > len) - count = len - *ppos; - - if (copy_to_user(user_buffer, buf + *ppos, count)) { - rv = -EFAULT; - goto q_dbg_file_read_exit; - } - - *ppos += count; - rv = count; - - pr_debug("number of bytes written to user space is %zu\n", count); - -q_dbg_file_read_exit: - kfree(buf); - qpriv->data = NULL; - qpriv->datalen = 0; - return rv; -} - -/*****************************************************************************/ -/** - * q_info_open() - static function that executes info file open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int q_info_open(struct inode *inode, struct file *fp) -{ - return q_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * q_info_read() - static function that executes info file read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t q_info_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return q_dbg_file_read(fp, user_buffer, count, ppos, DBGFS_QINFO_INFO); -} - -/*****************************************************************************/ -/** - * q_cntxt_open() - static function that executes cntxt file open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int q_cntxt_open(struct inode *inode, struct file *fp) -{ - return q_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * q_cntxt_read() - static function that performs cntxt file read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t q_cntxt_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return q_dbg_file_read(fp, user_buffer, count, ppos, DBGFS_QINFO_CNTXT); -} - -/*****************************************************************************/ -/** - * q_desc_open() - static function that executes desc file open - * - * @param[in] inode: pointer to file inode - * @param[in] fp: pointer to file structure - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -static int q_desc_open(struct inode *inode, struct file *fp) -{ - return q_dbg_file_open(inode, fp); -} - -/*****************************************************************************/ -/** - * q_desc_read() - static function that executes desc read - * - * @param[in] fp: pointer to file structure - * @param[out] user_buffer: pointer to user buffer - * @param[in] count: size of data to read - * @param[in/out] ppos: pointer to offset read - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static ssize_t q_desc_read(struct file *fp, char __user *user_buffer, - size_t count, loff_t *ppos) -{ - return q_dbg_file_read(fp, user_buffer, count, ppos, DBGFS_QINFO_DESC); -} - -/*****************************************************************************/ -/** - * create_q_dbg_files() - static function to create queue debug files - * - * @param[in] queue_root: debugfs root for a queue - * - * @return >0: size read - * @return <0: error - *****************************************************************************/ -static int create_q_dbg_files(struct qdma_descq *descq, - struct dentry *queue_root) -{ - struct dentry *fp[DBGFS_QINFO_END] = { NULL }; - struct file_operations *fops = NULL; - int i = 0; - - memset(qf, 0, sizeof(struct dbgfs_q_dbgf) * DBGFS_QINFO_END); - - for (i = 0; i < DBGFS_QINFO_END; i++) { - fops = &qf[i].fops; - fops->owner = THIS_MODULE; - switch (i) { - case DBGFS_QINFO_INFO: - snprintf(qf[i].name, DBGFS_DBG_FNAME_SZ, "%s", "info"); - fops->open = q_info_open; - fops->read = q_info_read; - fops->release = q_dbg_file_release; - break; - case DBGFS_QINFO_CNTXT: - snprintf(qf[i].name, DBGFS_DBG_FNAME_SZ, "%s", "cntxt"); - fops->open = q_cntxt_open; - fops->read = q_cntxt_read; - fops->release = q_dbg_file_release; - break; - case DBGFS_QINFO_DESC: - snprintf(qf[i].name, DBGFS_DBG_FNAME_SZ, "%s", "desc"); - fops->open = q_desc_open; - fops->read = q_desc_read; - fops->release = q_dbg_file_release; - break; - } - } - - for (i = 0; i < DBGFS_QINFO_END; i++) { - fp[i] = debugfs_create_file(qf[i].name, 0644, queue_root, - descq, &qf[i].fops); - if (!fp[i]) - return -1; - } - return 0; -} - -/*****************************************************************************/ -/** - * dbgfs_queue_init() - queue initialization function - * - * @param[in] conf: queue configuration - * @param[in] pair_conf: pair queue configuration - * @param[in] dbgfs_queues_root: root directory for all queues - * - * @return 0: success - * @return <0: error - *****************************************************************************/ -int dbgfs_queue_init(struct qdma_queue_conf *conf, - struct qdma_descq *pairq, - struct dentry *dbgfs_queues_root) -{ - char qname[16] = {0}; - char qdir[8] = {0}; - struct dentry *dbgfs_qidx_root = NULL; - struct dentry *dbgfs_queue_root = NULL; - struct dentry *dbgfs_cmpt_queue_root = NULL; - struct qdma_descq *descq = container_of(conf, struct qdma_descq, conf); - int rv = 0; - - if (!descq) - return -EINVAL; - snprintf(qname, 16, "%u", conf->qidx); - - spin_lock(&descq->xdev->qidx_lock); - /** create queue root only if it is not created */ - if (pairq->dbgfs_qidx_root) { - dbgfs_qidx_root = pairq->dbgfs_qidx_root; - } else { - /* create a directory for the queue in debugfs */ - dbgfs_qidx_root = debugfs_create_dir(qname, - dbgfs_queues_root); - if (!dbgfs_qidx_root) { - pr_err("Failed to create queue [%s] directory\n", - qname); - spin_unlock(&descq->xdev->qidx_lock); - return -1; - } - } - - /* create a directory for direction */ - if (conf->q_type == Q_C2H) - snprintf(qdir, 8, "%s", "c2h"); - else if (conf->q_type == Q_H2C) - snprintf(qdir, 8, "%s", "h2c"); - else - snprintf(qdir, 8, "%s", "cmpt"); - - dbgfs_queue_root = debugfs_create_dir(qdir, - dbgfs_qidx_root); - if (!dbgfs_queue_root) { - pr_err("Failed to create %s directory under %s", - qdir, qname); - goto dbgfs_queue_init_fail; - } - - if ((conf->q_type == Q_C2H) && conf->st) { - /* create a directory for the cmpt in debugfs */ - dbgfs_cmpt_queue_root = debugfs_create_dir("cmpt", - dbgfs_qidx_root); - if (!dbgfs_cmpt_queue_root) { - pr_err("Failed to create cmpt directory under %s", - qname); - goto dbgfs_queue_init_fail; - } - } - - /* intialize fops and create all the files */ - rv = create_q_dbg_files(descq, dbgfs_queue_root); - if (rv < 0) { - pr_err("Failed to create qdbg files, removing %s dir\n", - qdir); - debugfs_remove_recursive(dbgfs_queue_root); - goto dbgfs_queue_init_fail; - } - - if (dbgfs_cmpt_queue_root) { - rv = create_cmpt_q_dbg_files(descq, dbgfs_cmpt_queue_root); - if (rv < 0) { - pr_err("Failed to create cmptq dbg files,removing cmpt dir\n"); - debugfs_remove_recursive(dbgfs_cmpt_queue_root); - goto dbgfs_queue_init_fail; - } - } - - descq->dbgfs_qidx_root = dbgfs_qidx_root; - descq->dbgfs_queue_root = dbgfs_queue_root; - descq->dbgfs_cmpt_queue_root = dbgfs_cmpt_queue_root; - spin_unlock(&descq->xdev->qidx_lock); - - return 0; - -dbgfs_queue_init_fail: - if (pairq->dbgfs_qidx_root) { - spin_unlock(&descq->xdev->qidx_lock); - return -1; - } - pr_err("Failed to init q debug files, removing [%s] dir\n", qname); - debugfs_remove_recursive(dbgfs_qidx_root); - spin_unlock(&descq->xdev->qidx_lock); - return -1; -} - -/*****************************************************************************/ -/** - * dbgfs_queue_exit() - debugfs queue teardown function - * - * @param[in] conf: queue configuration - * @param[in] conf: pair queue configuration - * - *****************************************************************************/ -void dbgfs_queue_exit(struct qdma_queue_conf *conf, - struct qdma_descq *pairq) -{ - struct qdma_descq *descq = container_of(conf, struct qdma_descq, conf); - - if (!descq) - return; - debugfs_remove_recursive(descq->dbgfs_queue_root); - debugfs_remove_recursive(descq->dbgfs_cmpt_queue_root); - descq->dbgfs_queue_root = NULL; - descq->dbgfs_cmpt_queue_root = NULL; - if (!pairq) - debugfs_remove_recursive(descq->dbgfs_qidx_root); - - descq->dbgfs_qidx_root = NULL; -} - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_queue.h b/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_queue.h deleted file mode 100755 index 37d62e7..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_debugfs_queue.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_DEBUGFS_QUEUE_H__ -#define __QDMA_DEBUGFS_QUEUE_H__ - -#include "qdma_debugfs.h" -#include "qdma_descq.h" - - -int dbgfs_queue_init(struct qdma_queue_conf *conf, - struct qdma_descq *pairq, - struct dentry *dbgfs_queues_root); -void dbgfs_queue_exit(struct qdma_queue_conf *conf, - struct qdma_descq *pairq); - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_descq.c b/QDMA/linux-kernel/driver/libqdma/qdma_descq.c deleted file mode 100755 index 9cc4e49..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_descq.c +++ /dev/null @@ -1,2139 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "qdma_descq.h" - -#include <linux/kernel.h> -#include <linux/delay.h> - -#include "qdma_device.h" -#include "qdma_intr.h" -#include "qdma_regs.h" -#include "qdma_thread.h" -#include "qdma_context.h" -#include "qdma_st_c2h.h" -#include "qdma_access_common.h" -#ifdef __XRT__ -#include "eqdma_soft_access.h" -#endif -#include "thread.h" -#include "qdma_ul_ext.h" -#include "version.h" -#ifdef ERR_DEBUG -#include "qdma_nl.h" -#endif - -struct q_state_name q_state_list[] = { - {Q_STATE_DISABLED, "disabled"}, - {Q_STATE_ENABLED, "cfg'ed"}, - {Q_STATE_ONLINE, "online"} -}; - -/* - * dma transfer requests - */ -#ifdef DEBUG -static void sgl_dump(struct qdma_sw_sg *sgl, unsigned int sgcnt) -{ - struct qdma_sw_sg *sg = sgl; - int i; - - pr_info("sgl 0x%p, sgcntt %u.\n", sgl, sgcnt); - - for (i = 0; i < sgcnt; i++, sg++) - pr_info("%d, 0x%p, pg 0x%p,%u+%u, dma 0x%llx.\n", - i, sg, sg->pg, sg->offset, sg->len, sg->dma_addr); -} -#endif - -u64 rdtsc_gettime(void) -{ - unsigned int low, high; - - asm volatile("rdtscp" : "=a" (low), "=d" (high)); - return low | ((u64)high) << 32; -} - -int qdma_sgl_find_offset(struct qdma_request *req, struct qdma_sw_sg **sg_p, - unsigned int *sg_offset) -{ - struct qdma_sgt_req_cb *cb = qdma_req_cb_get(req); - struct qdma_sw_sg *sg = req->sgl; - unsigned int sgcnt = req->sgcnt; - unsigned int offset = cb->offset; - unsigned int len = 0; - int i; - - if (req->count == 0) { - *sg_p = sg; - *sg_offset = 0; - return 0; - } - - - for (i = 0; i < sgcnt; i++, sg++) { - len += sg->len; - - if (len == offset) { - *sg_p = sg + 1; - *sg_offset = 0; - ++i; - break; - } else if (len > offset) { - *sg_p = sg; - *sg_offset = sg->len - (len - offset); - break; - } - } - - if (i < sgcnt) - return i; - - return -EINVAL; -} - -void qdma_update_request(void *q_hndl, struct qdma_request *req, - unsigned int num_desc, - unsigned int data_cnt, - unsigned int sg_offset, - void *sg) -{ - struct qdma_descq *descq = (struct qdma_descq *)q_hndl; - struct qdma_sgt_req_cb *cb = qdma_req_cb_get(req); - - cb->desc_nr += num_desc; - cb->offset += data_cnt; - cb->sg_offset = sg_offset; - cb->sg = sg; - if (cb->offset >= req->count) { - qdma_work_queue_del(descq, cb); - list_add_tail(&cb->list, &descq->pend_list); - } -} - -static int descq_mm_n_h2c_cmpl_status(struct qdma_descq *descq); - -static int descq_poll_mm_n_h2c_cmpl_status(struct qdma_descq *descq) -{ - enum qdma_drv_mode drv_mode = descq->xdev->conf.qdma_drv_mode; - - if ((drv_mode == POLL_MODE) || (drv_mode == AUTO_MODE)) { - descq->proc_req_running = 1; - return descq_mm_n_h2c_cmpl_status(descq); - } else - return 0; -} - -static inline unsigned int incr_pidx(unsigned int pidx, unsigned int incr_val, - unsigned int ring_sz) -{ - pidx += incr_val; - if (pidx >= ring_sz) - pidx -= ring_sz; - - return pidx; -} - -static inline int qdma_pidx_update(struct qdma_descq *descq, - unsigned char force) -{ - int ret = 0; - unsigned int desc_avail_max = descq->conf.rngsz - 1; - - /* interrupt for last update came, now submit descs that are setup */ - if (force) /* re-arm interrupt with pidx update */ - goto update; - /* q is not very busy, go ahead and submit */ - if (descq->avail > (desc_avail_max - descq->conf.pidx_acc)) - goto update; - - /* accumulating descs to be submitted */ - if (descq->desc_pend < descq->conf.pidx_acc) - goto exit_update; - -update: - ret = queue_pidx_update(descq->xdev, descq->conf.qidx, - descq->conf.q_type, &descq->pidx_info); - if (ret < 0) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - return -EINVAL; - } - - descq->desc_pend = 0; - -exit_update: - return ret; -} - -static ssize_t descq_mm_proc_request(struct qdma_descq *descq) -{ - int rv = 0; - unsigned int desc_written = 0; - unsigned int rngsz = descq->conf.rngsz; - unsigned int pidx; - u64 ep_addr = 0; - struct qdma_mm_desc *desc; - struct qdma_queue_conf *qconf = &descq->conf; - unsigned char is_ul_ext = (qconf->desc_bypass && - qconf->fp_bypass_desc_fill) ? 1 : 0; - u32 aperture = qconf->aperture_size ? - qconf->aperture_size : QDMA_DESC_BLEN_MAX; - u8 keyhole_en = qconf->aperture_size ? 1 : 0; - u64 ep_addr_max = 0; -#ifdef __XRT__ - if (descq->xdev->version_info.ip_type == EQDMA_SOFT_IP) { - uint32_t ip_version; -#ifndef __QDMA_VF__ - uint8_t is_vf = 0; -#else - uint8_t is_vf = 1; -#endif - rv = eqdma_get_ip_version(descq->xdev, is_vf, &ip_version); - if (ip_version == EQDMA_IP_VERSION_5) { - pr_info("EQDMA Soft IP 5.0 supports descriptor length < 64K.\n"); - aperture = qconf->aperture_size ? - qconf->aperture_size : SOFT_QDMA_DESC_BLEN_MAX; - } - } -#endif - - lock_descq(descq); - /* process completion of submitted requests */ - if (descq->q_stop_wait) { - descq_mm_n_h2c_cmpl_status(descq); - unlock_descq(descq); - return 0; - } - if (unlikely(descq->q_state != Q_STATE_ONLINE)) { - unlock_descq(descq); - return 0; - } - - if (descq->proc_req_running) { - unlock_descq(descq); - return 0; - } - - pidx = descq->pidx; - desc = (struct qdma_mm_desc *)descq->desc + pidx; - - descq_poll_mm_n_h2c_cmpl_status(descq); - - while (!list_empty(&descq->work_list)) { - struct qdma_sgt_req_cb *cb = list_first_entry(&descq->work_list, - struct qdma_sgt_req_cb, list); - struct qdma_request *req = (struct qdma_request *)cb; - struct qdma_sw_sg *sg = req->sgl; - unsigned int sg_offset = 0; - unsigned int sg_max = req->sgcnt; - struct qdma_mm_desc *desc_start = NULL; - struct qdma_mm_desc *desc_end = NULL; - unsigned int desc_max = descq->avail; - unsigned int data_cnt = 0; - unsigned int desc_cnt = 0; - unsigned int len = 0; - int i = 0; - int rv; - - ep_addr_max = req->ep_addr + aperture - 1; - - /** - * When keyhole feature is enabled, the ep_addr - * cannot ever exceed the aperture size. - * The offset calculation is implemented below. - */ - if (!keyhole_en) - ep_addr = req->ep_addr + cb->offset; - else - ep_addr = req->ep_addr + (cb->offset & (aperture - 1)); - - if (!desc_max) { - descq_poll_mm_n_h2c_cmpl_status(descq); - desc_max = descq->avail; - } - - if (!desc_max) - break; - - if (is_ul_ext) { - int desc_consumed = - qconf->fp_bypass_desc_fill(descq, - QDMA_Q_MODE_MM, - (qconf->q_type == Q_C2H) ? - QDMA_Q_DIR_C2H : - QDMA_Q_DIR_H2C, - req); - if (desc_consumed > 0) - desc_cnt += desc_consumed; - goto update_pidx; - } - rv = qdma_sgl_find_offset(req, &sg, &sg_offset); - if (rv < 0) { - pr_info("descq %s, req 0x%p, OOR %u/%u, %d/%u.\n", - descq->conf.name, req, cb->offset, - req->count, rv, sg_max); - qdma_update_request(descq, req, 0, 0, 0, NULL); - continue; - } - i = rv; - pr_debug("%s, req 0x%p, offset %u/%u -> sg %d, 0x%p,%u.\n", - descq->conf.name, req, cb->offset, req->count, - i, sg, sg_offset); - - desc_start = desc; - for (; i < sg_max && desc_cnt < desc_max; i++, sg++) { - unsigned int tlen = sg->len; - dma_addr_t src_addr = sg->dma_addr; - unsigned int pg_off = sg->offset; - - pr_debug("desc %u/%u, sgl %d, len %u,%u, offset %u.\n", - desc_cnt, desc_max, i, len, tlen, sg_offset); - - desc->flag_len = 0; - if (sg_offset) { - tlen -= sg_offset; - src_addr += sg_offset; - pg_off += sg_offset; - sg_offset = 0; - } - - do { - unsigned int len = min_t(unsigned int, tlen, - aperture); - - if (keyhole_en) { - if (ep_addr > ep_addr_max) - ep_addr = req->ep_addr; - - if (ep_addr + len > ep_addr_max) - len = ep_addr_max - ep_addr + 1; - } - - desc_end = desc; - sg_offset += len; - - desc->rsvd1 = 0UL; - desc->rsvd0 = 0U; - - if (descq->conf.q_type == Q_C2H) { - desc->src_addr = ep_addr; - desc->dst_addr = src_addr; - } else { - desc->dst_addr = ep_addr; - desc->src_addr = src_addr; - } - - desc->flag_len = len; - desc->flag_len |= (1 << S_DESC_F_DV); - ep_addr += len; - data_cnt += len; - src_addr += len; - tlen -= len; - pg_off += len; - - if (++pidx == rngsz) { - pidx = 0; - desc = - (struct qdma_mm_desc *)descq->desc; - } else { - desc++; - } - - desc_cnt++; - if (desc_cnt == desc_max) - break; - } while (tlen); - if (!tlen) - sg_offset = 0; - } - if (i == sg_max) { - sg = NULL; - sg_offset = 0; - } - - if (!desc_end || !desc_start) { - pr_info("descq %s, %u, pidx 0x%x, desc 0x%p ~ 0x%p.\n", - descq->conf.name, descq->qidx_hw, pidx, - desc_start, desc_end); - break; - } - - /* set eop */ - desc_end->flag_len |= (1 << S_DESC_F_EOP); - /* set sop */ - desc_start->flag_len |= (1 << S_DESC_F_SOP); - qdma_update_request(descq, req, desc_cnt, data_cnt, sg_offset, - sg); - descq->pidx = pidx; - descq->avail -= desc_cnt; -update_pidx: - - desc_written += desc_cnt; - - pr_debug("descq %s, +%u,%u, avail %u, ep_addr 0x%llx + 0x%x(%u).\n", - descq->conf.name, desc_cnt, pidx, descq->avail, - req->ep_addr, data_cnt, data_cnt); - - } - - if (desc_written) { - descq->pend_list_empty = 0; - descq->pidx_info.pidx = descq->pidx; - rv = queue_pidx_update(descq->xdev, descq->conf.qidx, - descq->conf.q_type, &descq->pidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - unlock_descq(descq); - return -EINVAL; - } - descq_poll_mm_n_h2c_cmpl_status(descq); - } - - descq->proc_req_running = 0; - unlock_descq(descq); - - if (desc_written && descq->cmplthp) - qdma_kthread_wakeup(descq->cmplthp); - - return 0; -} -/** - * This function is called directly while sending packet or as interrupt - * service when any pending request or pending descriptor is present. - */ -static ssize_t descq_proc_st_h2c_request_qep(struct qdma_descq *descq) -{ - int ret = 0; - struct qdma_request *req; - unsigned int desc_written = 0; - unsigned int desc_cnt = 0; - - /* exit as packet have been queued and can be processes as part of who - * ever holding the lock or during interrupt service - */ - if (!(spin_trylock_bh(&(descq)->lock))) - return 0; - - /* process completion of submitted requests */ - if (unlikely(descq->q_stop_wait)) { - descq_mm_n_h2c_cmpl_status(descq); - unlock_descq(descq); - return 0; - } - - if (unlikely(descq->q_state != Q_STATE_ONLINE)) { - unlock_descq(descq); - return 0; - } - -setup_desc: - while (qdma_work_queue_len(descq) && descq->avail) { - req = qdma_work_queue_first_entry(descq); - desc_cnt = descq->conf.fp_bypass_desc_fill(descq, - QDMA_Q_MODE_ST, QDMA_Q_DIR_H2C, req); - - if (unlikely(desc_cnt == 0)) - break; - - desc_written += desc_cnt; - - if (desc_written >= descq->conf.pidx_acc) - break; - } - - if (unlikely(!desc_written)) { - /* packet queued while holding lock and no interrupt pending */ - if (unlikely(qdma_work_queue_len(descq) && - descq->avail == descq->conf.rngsz - 1)) { - unlock_descq(descq); - descq_proc_st_h2c_request_qep(descq); - return 0; - } - unlock_descq(descq); - return 0; - } - - descq->desc_pend += desc_written; - descq->pidx_info.pidx = descq->pidx; - - ret = qdma_pidx_update(descq, 0); - if (unlikely(ret < 0)) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - unlock_descq(descq); - return -EINVAL; - } - - if (descq->work_req_pend && (desc_written >= descq->conf.pidx_acc)) { - desc_written = 0; - goto setup_desc; - } - - unlock_descq(descq); - - return ret; -} - - -static ssize_t descq_proc_st_h2c_request(struct qdma_descq *descq) -{ - int ret = 0; - struct qdma_h2c_desc *desc; - u8 *tx_time_pkt_offset = NULL; - unsigned int rngsz = descq->conf.rngsz; - unsigned int pidx; - unsigned int desc_written = 0; - struct qdma_queue_conf *qconf = &descq->conf; - unsigned char is_ul_ext = (qconf->desc_bypass && - qconf->fp_bypass_desc_fill) ? 1 : 0; - struct qdma_dev *qdev = NULL; - - lock_descq(descq); - /* process completion of submitted requests */ - if (descq->q_stop_wait) { - descq_mm_n_h2c_cmpl_status(descq); - unlock_descq(descq); - return 0; - } - if (unlikely(descq->q_state != Q_STATE_ONLINE)) { - unlock_descq(descq); - return 0; - } - - if (descq->proc_req_running) { - unlock_descq(descq); - return 0; - } - - qdev = xdev_2_qdev(descq->xdev); - /* service completion first */ - descq_poll_mm_n_h2c_cmpl_status(descq); - - pidx = descq->pidx; - desc = (struct qdma_h2c_desc *)descq->desc + pidx; - while (!list_empty(&descq->work_list)) { - struct qdma_sgt_req_cb *cb = list_first_entry(&descq->work_list, - struct qdma_sgt_req_cb, list); - struct qdma_request *req = (struct qdma_request *)cb; - struct qdma_sw_sg *sg = req->sgl; - unsigned int sg_offset = 0; - unsigned int sg_max = req->sgcnt; - unsigned int desc_max = descq->avail; - unsigned int data_cnt = 0; - unsigned int desc_cnt = 0; - unsigned int pktsz = req->ep_addr ? - min_t(unsigned int, req->ep_addr, PAGE_SIZE) : - PAGE_SIZE; - int i = 0; - int rv; - - if (!desc_max) { - descq_poll_mm_n_h2c_cmpl_status(descq); - desc_max = descq->avail; - } - - if (!desc_max) - break; - -#ifdef DEBUG - pr_info("%s, req %u.\n", descq->conf.name, req->count); - sgl_dump(req->sgl, sg_max); -#endif - if (is_ul_ext) { - int desc_consumed = - qconf->fp_bypass_desc_fill(descq, - QDMA_Q_MODE_ST, - QDMA_Q_DIR_H2C, - req); - if (desc_consumed > 0) - desc_cnt += desc_consumed; - goto update_pidx; - } - - rv = qdma_sgl_find_offset(req, &sg, - &sg_offset); - - if (rv < 0) { - pr_err("descq %s, req 0x%p, OOR %u/%u, %d/%u.\n", - descq->conf.name, req, cb->offset, - req->count, rv, sg_max); - qdma_update_request(descq, req, 0, 0, 0, NULL); - continue; - } - i = rv; - pr_debug("%s, req 0x%p, offset %u/%u -> sg %d, 0x%p,%u.\n", - descq->conf.name, req, cb->offset, req->count, - i, sg, sg_offset); - desc->flags = 0; - desc->cdh_flags = 0; - - for (; i < sg_max && desc_cnt < desc_max; i++, sg++) { - unsigned int tlen = sg->len; - dma_addr_t src_addr = sg->dma_addr; - - if (sg_offset) { - tlen -= sg_offset; - src_addr += sg_offset; - sg_offset = 0; - } - - do { /* to support zero byte transfer */ - unsigned int len = min_t(unsigned int, tlen, - pktsz); - - sg_offset += len; - desc->src_addr = src_addr; - desc->len = len; - desc->pld_len = len; - desc->cdh_flags |= S_H2C_DESC_F_ZERO_CDH; - data_cnt += len; - src_addr += len; - tlen -= len; - tx_time_pkt_offset = - (u8 *)(page_address(sg->pg) + - sg->offset); - - /* Setting SOP/EOP for the dummy bypass case */ - if (descq->conf.desc_bypass) { - if (i == 0) - desc->flags |= S_H2C_DESC_F_SOP; - - if ((i == sg_max - 1)) - desc->flags |= S_H2C_DESC_F_EOP; - } - -#if 0 - pr_info("desc %d, pidx 0x%x, data_cnt %u, cb off %u:\n", - i, pidx, data_cnt, cb->offset); - print_hex_dump(KERN_INFO, "desc", - DUMP_PREFIX_OFFSET, 16, 1, - (void *)desc, 16, false); -#endif - - if (++pidx == rngsz) { - pidx = 0; - desc = - (struct qdma_h2c_desc *)descq->desc; - } else { - desc++; - desc->flags = 0; - desc->cdh_flags = 0; - } - - desc_cnt++; - if (desc_cnt == desc_max) - break; - } while (tlen); - if (!tlen) - sg_offset = 0; - - } - if (i == sg_max) { - sg = NULL; - sg_offset = 0; - } - qdma_update_request(descq, req, desc_cnt, data_cnt, sg_offset, - sg); - descq->pidx = pidx; - descq->avail -= desc_cnt; -update_pidx: - if (!desc_cnt) - break; - desc_written += desc_cnt; - - pr_debug("descq %s, +%u,%u, avail %u, 0x%x(%u), cb off %u.\n", - descq->conf.name, desc_cnt, pidx, descq->avail, - data_cnt, data_cnt, cb->offset); - - } - - if (desc_written) { - descq->pend_list_empty = 0; - descq->pidx_info.pidx = descq->pidx; - if (descq->conf.ping_pong_en) { - if (tx_time_pkt_offset != NULL) { - u64 tx_time = rdtsc_gettime(); - - qdev->c2h_descq[qconf->qidx].ping_pong_tx_time = - tx_time; - memcpy(tx_time_pkt_offset, &tx_time, - sizeof(tx_time)); - } else - pr_err("Err: Tx Time Offset is NULL\n"); - } - - - ret = queue_pidx_update(descq->xdev, descq->conf.qidx, - descq->conf.q_type, &descq->pidx_info); - if (ret < 0) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - unlock_descq(descq); - return -EINVAL; - } - descq_poll_mm_n_h2c_cmpl_status(descq); - } - - descq->proc_req_running = 0; - - if (desc_written && descq->cmplthp) - qdma_kthread_wakeup(descq->cmplthp); - - unlock_descq(descq); - - return 0; -} - -/* - * descriptor Queue - */ -static inline int get_desc_size(struct qdma_descq *descq) -{ - if (descq->conf.desc_bypass && (descq->conf.sw_desc_sz == DESC_SZ_64B)) - return DESC_SZ_64B_BYTES; - if (!descq->conf.st) - return (int)sizeof(struct qdma_mm_desc); - - if (descq->conf.q_type == Q_C2H) - return (int)sizeof(struct qdma_c2h_desc); - - return (int)sizeof(struct qdma_h2c_desc); -} - -static inline int get_desc_cmpl_status_size(struct qdma_descq *descq) -{ - return (int)sizeof(struct qdma_desc_cmpl_status); -} - -static inline void desc_ring_free(struct xlnx_dma_dev *xdev, int ring_sz, - int desc_sz, int cs_sz, u8 *desc, dma_addr_t desc_bus) -{ - unsigned int len = ring_sz * desc_sz + cs_sz; - - pr_debug("free %u(0x%x)=%d*%u+%d, 0x%p, bus 0x%llx.\n", - len, len, desc_sz, ring_sz, cs_sz, desc, desc_bus); - - dma_free_coherent(&xdev->conf.pdev->dev, - ((size_t)ring_sz * desc_sz + cs_sz), - desc, desc_bus); -} - -static void *desc_ring_alloc(struct xlnx_dma_dev *xdev, int ring_sz, - int desc_sz, int cs_sz, dma_addr_t *bus, u8 **cs_pp) -{ - unsigned int len = ring_sz * desc_sz + cs_sz; - u8 *p = dma_alloc_coherent(&xdev->conf.pdev->dev, len, bus, GFP_KERNEL); - - if (!p) { - pr_err("%s, OOM, sz ring %d, desc %d, cmpl status sz %d.\n", - xdev->conf.name, ring_sz, desc_sz, cs_sz); - return NULL; - } - - *cs_pp = p + ring_sz * desc_sz; - memset(p, 0, len); - - pr_debug("alloc %u(0x%x)=%d*%u+%d, 0x%p, bus 0x%llx, cmpl status 0x%p.\n", - len, len, desc_sz, ring_sz, cs_sz, p, *bus, *cs_pp); - - return p; -} - -static void desc_alloc_irq(struct qdma_descq *descq) -{ - struct xlnx_dma_dev *xdev = descq->xdev; - unsigned long flags; - int i, idx = 0, min = -1; - - if (!xdev->num_vecs) - return; - - /** Pick the MSI-X vector that currently has the fewest queues - * on PF0, vector#0 is dedicated for Error interrupts and - * vector #1 is dedicated for User interrupts - * For all other PFs, vector#0 is dedicated for User interrupts - */ - - idx = xdev->dvec_start_idx; - if (xdev->conf.qdma_drv_mode == DIRECT_INTR_MODE) { - for (i = xdev->dvec_start_idx; i < xdev->num_vecs; i++) { - struct intr_info_t *intr_info_list = - &xdev->dev_intr_info_list[i]; - - spin_lock_irqsave(&intr_info_list->vec_q_list, - flags); - if (!intr_info_list->intr_list_cnt) { - spin_unlock_irqrestore( - &intr_info_list->vec_q_list, - flags); - idx = i; - break; - } - if (min < 0) - min = intr_info_list->intr_list_cnt; - if (intr_info_list->intr_list_cnt < min) { - min = intr_info_list->intr_list_cnt; - idx = i; - } - - spin_unlock_irqrestore(&intr_info_list->vec_q_list, - flags); - } - } - descq->intr_id = idx; - pr_debug("descq->intr_id = %d allocated to qidx = %d\n", - descq->intr_id, descq->conf.qidx); -} - -/* - * writeback handling - */ -static int descq_mm_n_h2c_cmpl_status(struct qdma_descq *descq) -{ - int rv = 0; - unsigned int cidx, cidx_hw; - unsigned int cr; - - pr_debug("descq 0x%p, %s, pidx %u, cidx %u.\n", - descq, descq->conf.name, descq->pidx, descq->cidx); - - if (descq->pidx == descq->cidx) { /* queue empty? */ - pr_debug("descq %s empty, return.\n", descq->conf.name); - return 0; - } - - cidx = descq->cidx; -#ifdef __READ_ONCE_DEFINED__ - cidx_hw = READ_ONCE(((struct qdma_desc_cmpl_status *) - descq->desc_cmpl_status)->cidx); -#else - cidx_hw = ((struct qdma_desc_cmpl_status *) - descq->desc_cmpl_status)->cidx; - dma_rmb(); -#endif - - if (cidx_hw == cidx) /* no new writeback? */ - return 0; - - /* completion credits */ - cr = (cidx_hw < cidx) ? (descq->conf.rngsz - cidx) + cidx_hw : - cidx_hw - cidx; - - pr_debug("%s descq %s, cidx 0x%x -> 0x%x, avail 0x%x + 0x%x.\n", - __func__, descq->conf.name, cidx, - cidx_hw, descq->avail, cr); - - descq->cidx = cidx_hw; - descq->avail += cr; - descq->credit += cr; - - incr_cmpl_desc_cnt(descq, cr); - - /* completes requests */ - pr_debug("%s %s, 0x%p, credit %u + %u.\n", - __func__, descq->conf.name, descq, cr, descq->credit); - - cr = descq->credit; - - while (!list_empty(&descq->pend_list)) { - struct qdma_sgt_req_cb *cb = list_first_entry(&descq->pend_list, - struct qdma_sgt_req_cb, list); - - pr_debug("%s, 0x%p, cb 0x%p, desc_nr %u, credit %u.\n", - descq->conf.name, descq, cb, cb->desc_nr, cr); - - if (cr >= cb->desc_nr) { - pr_debug("%s, cb 0x%p done, credit %u > %u.\n", - descq->conf.name, cb, cr, cb->desc_nr); - cr -= cb->desc_nr; - qdma_sgt_req_done(descq, cb, 0); - } else { - pr_debug("%s, cb 0x%p not done, credit %u < %u.\n", - descq->conf.name, cb, cr, cb->desc_nr); - cb->desc_nr -= cr; - cr = 0; - } - - if (!cr) - break; - } - - descq->credit = cr; - pr_debug("%s, 0x%p, credit %u.\n", - descq->conf.name, descq, descq->credit); - - rv = qdma_pidx_update(descq, 1); - if (unlikely(rv < 0)) - pr_err("%s: Failed to update pidx\n", descq->conf.name); - - return 0; -} - -/* ************** public function definitions ******************************* */ - -void qdma_descq_init(struct qdma_descq *descq, struct xlnx_dma_dev *xdev, - int idx_hw, int idx_sw) -{ - struct qdma_dev *qdev = xdev_2_qdev(xdev); - - memset(descq, 0, sizeof(struct qdma_descq)); - - spin_lock_init(&descq->lock); - spin_lock_init(&descq->work_list_lock); - INIT_LIST_HEAD(&descq->work_list); - INIT_LIST_HEAD(&descq->pend_list); - qdma_waitq_init(&descq->pend_list_wq); - INIT_LIST_HEAD(&descq->intr_list); - INIT_LIST_HEAD(&descq->legacy_intr_q_list); - INIT_WORK(&descq->work, intr_work); - descq->xdev = xdev; - descq->channel = 0; - descq->qidx_hw = qdev->qbase + idx_hw; - descq->conf.qidx = idx_sw; -} - -int qdma_q_desc_get(void *q_hndl, const unsigned int desc_cnt, - struct qdma_q_desc_list **desc_list) -{ - struct qdma_descq *descq = (struct qdma_descq *)q_hndl; - - if (unlikely(desc_cnt >= descq->conf.rngsz)) { - pr_err("Number of descriptors required > ring size"); - return -EINVAL; /* not possible to give so many desc */ - } - - /* - * it is very unlikely that below condition hits in MM or ST H2C as - * one packet is submitted at once. But It is ibserved that HW is not - * giving writeback and sometimes its corresponding interrupt. For this - * reason a polling logic is introduced as below - **/ - if (descq->avail < desc_cnt) - descq_mm_n_h2c_cmpl_status(descq); - - if (unlikely(descq->avail < desc_cnt)) { - pr_err("No entries available to read"); - return -EBUSY; /* curently not available */ - } - - *desc_list = descq->desc_list + descq->pidx; - descq->pidx = incr_pidx(descq->pidx, - desc_cnt, - descq->conf.rngsz); - descq->avail -= desc_cnt; - return 0; -} - -int qdma_q_init_pointers(void *q_hndl) -{ - struct qdma_descq *descq = (struct qdma_descq *)q_hndl; - int rv; - - if ((descq->conf.st && (descq->conf.q_type == Q_C2H)) || - (!descq->conf.st && (descq->conf.q_type == Q_CMPT))) { - if (descq->conf.init_pidx_dis) { - /* use qdma_q_init_pointers - *for updating the pidx and cidx later - */ - descq->cmpt_cidx_info.wrb_cidx = 0; - rv = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, - &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - return -EINVAL; - } - - if (descq->conf.q_type == Q_CMPT) - return 0; - - descq->pidx_info.pidx = descq->conf.rngsz - 1; - rv = queue_pidx_update(descq->xdev, descq->conf.qidx, - descq->conf.q_type, &descq->pidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - return -EINVAL; - } - } else { - pr_err("pidx disable is active"); - return -EINVAL; - } - } else { - pr_err("Invalid mode"); - return -EINVAL; - } - - return 0; -} - -int qdma_queue_update_pointers(unsigned long dev_hndl, unsigned long qhndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq = qdma_device_get_descq_by_id(xdev, qhndl, - NULL, 0, 0); - int ret = 0; - - if (!descq) { - pr_err("%s descq is null\n", __func__); - return -EINVAL; - } - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - lock_descq(descq); - if (descq->q_state == Q_STATE_ONLINE) { - ret = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, - &descq->cmpt_cidx_info); - if (ret < 0) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - - ret = -EBUSY; - goto func_exit; - } - ret = queue_pidx_update(descq->xdev, - descq->conf.qidx, - descq->conf.q_type, - &descq->pidx_info); - if (ret < 0) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - ret = -EBUSY; - goto func_exit; - } - /* - * Memory barrier in update pointers - */ - wmb(); - } else { - pr_debug("Pointer update for offline queue for %s", - descq->conf.name); - ret = -ENODEV; - } - } else { - pr_err("Pointer update for invalid queue for %s", - descq->conf.name); - ret = -EINVAL; - } - -func_exit: - unlock_descq(descq); - return ret; - -} - -int qdma_descq_alloc_resource(struct qdma_descq *descq) -{ - struct xlnx_dma_dev *xdev = descq->xdev; - struct qdma_queue_conf *qconf = &descq->conf; - unsigned char is_ul_ext = (qconf->desc_bypass && - qconf->fp_bypass_desc_fill) ? 1 : 0; - int rv; -#ifdef TEST_64B_DESC_BYPASS_FEATURE - int i = 0; - u8 *desc_bypass; - u8 bypass_data[DESC_SZ_64B_BYTES]; -#endif - /* descriptor ring */ - if (descq->conf.q_type != Q_CMPT) { - descq->desc = desc_ring_alloc(xdev, descq->conf.rngsz, - get_desc_size(descq), - get_desc_cmpl_status_size(descq), - &descq->desc_bus, &descq->desc_cmpl_status); - if (!descq->desc) { - pr_err("dev %s, descq %s, sz %u, desc ring OOM.\n", - xdev->conf.name, descq->conf.name, - descq->conf.rngsz); - goto err_out; - } - } - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - - flq->desc = (struct qdma_c2h_desc *)descq->desc; - flq->size = descq->conf.rngsz; - flq->buf_pg_shift = fls(descq->conf.c2h_bufsz) - 1; - flq->buf_pg_mask = (1 << flq->buf_pg_shift) - 1; - - flq->desc_buf_size = get_next_powof2(descq->conf.c2h_bufsz); - flq->desc_pg_shift = fls(flq->desc_buf_size) - 1; - - /* These code changes are to accomodate buf_sz - * of less than 4096 - */ - - if (flq->desc_pg_shift < PAGE_SHIFT) - flq->desc_pg_order = 0; - else - flq->desc_pg_order = flq->desc_pg_shift - PAGE_SHIFT; - - flq->max_pg_offset = (PAGE_SIZE << flq->desc_pg_order); - - pr_debug("%s: buf_pg_shift = %d, buf_pg_mask = %d, desc_buf_size = %d, desc_pg_shift = %d, flq->desc_pg_order = %d, flq->max_pg_offset = %d", - descq->conf.name, - flq->buf_pg_shift, - flq->buf_pg_mask, - flq->desc_buf_size, - flq->desc_pg_shift, - flq->desc_pg_order, - flq->max_pg_offset); - - - /* freelist / rx buffers */ - rv = descq_flq_alloc_resource(descq); - if (rv < 0) { - pr_err("%s: resource allocation failed", - __func__); - goto err_out; - } - } else if (is_ul_ext) { - int i; - unsigned int desc_sz = get_desc_size(descq); - - descq->desc_list = kcalloc(descq->conf.rngsz, - sizeof(struct qdma_q_desc_list), - GFP_KERNEL); - if (!descq->desc_list) { - pr_err("desc_list allocation failed.OOM"); - goto err_out; - } - for (i = 0; i < descq->conf.rngsz; i++) { - int next = (i == (descq->conf.rngsz - 1)) ? 0 : (i + 1); - - descq->desc_list[i].desc = descq->desc + (i * desc_sz); - descq->desc_list[i].next = &descq->desc_list[next]; - } - } - - if ((descq->conf.st && (descq->conf.q_type == Q_C2H)) || - (!descq->conf.st && (descq->conf.q_type == Q_CMPT))) { - - descq->color = 1; - - /* writeback ring */ - descq->desc_cmpt = desc_ring_alloc(xdev, - descq->conf.rngsz_cmpt, - descq->cmpt_entry_len, - sizeof(struct - qdma_c2h_cmpt_cmpl_status), - &descq->desc_cmpt_bus, - &descq->desc_cmpt_cmpl_status); - if (!descq->desc_cmpt) { - pr_warn("dev %s, descq %s, sz %u, cmpt ring OOM.\n", - xdev->conf.name, descq->conf.name, - descq->conf.rngsz_cmpt); - goto err_out; - } - descq->desc_cmpt_cur = descq->desc_cmpt; - - } - - pr_debug("%s: %u/%u, rng %u,%u, desc 0x%p, cmpl status 0x%p.\n", - descq->conf.name, descq->conf.qidx, descq->qidx_hw, - descq->conf.rngsz, descq->conf.rngsz_cmpt, descq->desc, - descq->desc_cmpt); - - /* interrupt vectors */ - desc_alloc_irq(descq); - - /* Fill in the descriptors with some hard coded value for testing */ -#ifdef TEST_64B_DESC_BYPASS_FEATURE - desc_bypass = descq->desc; - if (descq->conf.st && (descq->conf.q_type == Q_H2C)) { - if (descq->conf.desc_bypass && - (descq->conf.sw_desc_sz == DESC_SZ_64B)) { - for (i = 0; i < descq->conf.rngsz; i++) { - memset(bypass_data, i+1, DESC_SZ_64B_BYTES); - memcpy(&desc_bypass[i*DESC_SZ_64B_BYTES], - bypass_data, DESC_SZ_64B_BYTES); - } - } - } -#endif - return 0; - -err_out: - qdma_descq_free_resource(descq); - pr_err("Out of Memory"); - return -ENOMEM; -} - -void qdma_descq_free_resource(struct qdma_descq *descq) -{ - if (!descq) - return; - - if (descq->desc) { - - int desc_sz = get_desc_size(descq); - int cs_sz = get_desc_cmpl_status_size(descq); - - pr_debug("%s: desc 0x%p, cmpt 0x%p.\n", - descq->conf.name, descq->desc, descq->desc_cmpt); - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - descq_flq_free_resource(descq); - descq_flq_free_page_resource(descq); - } else - kfree(descq->desc_list); - - desc_ring_free(descq->xdev, descq->conf.rngsz, desc_sz, cs_sz, - descq->desc, descq->desc_bus); - descq->desc_cmpl_status = NULL; - descq->desc = NULL; - descq->desc_bus = 0UL; - } - - if (descq->desc_cmpt) { - desc_ring_free(descq->xdev, descq->conf.rngsz_cmpt, - descq->cmpt_entry_len, - sizeof(struct qdma_c2h_cmpt_cmpl_status), - descq->desc_cmpt, descq->desc_cmpt_bus); - - descq->desc_cmpt_cmpl_status = NULL; - descq->desc_cmpt = NULL; - descq->desc_cmpt_bus = 0UL; - } -} - -void qdma_descq_config(struct qdma_descq *descq, struct qdma_queue_conf *qconf, - int reconfig) -{ - if (!reconfig) { - int len; - - memcpy(&descq->conf, qconf, sizeof(struct qdma_queue_conf)); - /* descq->conf.st = qconf->st; - * descq->conf.c2h = qconf->c2h; - */ - - /* qdma[vf]<255>-MM/ST-H2C/C2H-Q[2048] */ -#ifdef __QDMA_VF__ - len = snprintf(descq->conf.name, QDMA_QUEUE_NAME_MAXLEN, - "qdmavf"); -#else - len = snprintf(descq->conf.name, QDMA_QUEUE_NAME_MAXLEN, - "qdma"); -#endif - len += snprintf(descq->conf.name + len, - QDMA_QUEUE_NAME_MAXLEN - len, - "%05x-%s-%u", - descq->xdev->conf.bdf, descq->conf.st ? "ST" : "MM", - descq->conf.qidx); - descq->conf.name[len] = '\0'; - - descq->conf.st = qconf->st; - descq->conf.q_type = qconf->q_type; - - } else { - descq->conf.desc_rng_sz_idx = qconf->desc_rng_sz_idx; - descq->conf.cmpl_rng_sz_idx = qconf->cmpl_rng_sz_idx; - descq->conf.c2h_buf_sz_idx = qconf->c2h_buf_sz_idx; - - descq->conf.irq_en = (descq->xdev->conf.qdma_drv_mode != - POLL_MODE) ? 1 : 0; - descq->conf.cmpl_en_intr = descq->conf.irq_en; - descq->conf.wb_status_en = qconf->wb_status_en; - descq->conf.cmpl_status_acc_en = qconf->cmpl_status_acc_en; - descq->conf.cmpl_status_pend_chk = qconf->cmpl_status_pend_chk; - descq->conf.cmpl_stat_en = qconf->cmpl_stat_en; - descq->conf.cmpl_trig_mode = qconf->cmpl_trig_mode; - descq->conf.cmpl_timer_idx = qconf->cmpl_timer_idx; - descq->conf.fetch_credit = qconf->fetch_credit; - descq->conf.cmpl_cnt_th_idx = qconf->cmpl_cnt_th_idx; - /* Below check is applicable only for Versal family. */ - if (descq->xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) - descq->channel = qconf->mm_channel; - - descq->conf.desc_bypass = qconf->desc_bypass; - descq->conf.pfetch_bypass = qconf->pfetch_bypass; - descq->conf.pfetch_en = qconf->pfetch_en; - descq->conf.cmpl_udd_en = qconf->cmpl_udd_en; - descq->conf.cmpl_desc_sz = qconf->cmpl_desc_sz; - descq->conf.sw_desc_sz = qconf->sw_desc_sz; - descq->conf.cmpl_ovf_chk_dis = qconf->cmpl_ovf_chk_dis; - descq->conf.adaptive_rx = qconf->adaptive_rx; - descq->conf.ping_pong_en = qconf->ping_pong_en; - descq->conf.aperture_size = qconf->aperture_size; - descq->conf.pidx_acc = qconf->pidx_acc; - } -} - -int qdma_descq_config_complete(struct qdma_descq *descq) -{ - struct global_csr_conf *csr_info = &descq->xdev->csr_info; - struct qdma_queue_conf *qconf = &descq->conf; - struct xlnx_dma_dev *xdev = descq->xdev; - - qconf->rngsz = csr_info->ring_sz[qconf->desc_rng_sz_idx] - 1; - - /* <= 2018.2 IP - * make the cmpl ring size bigger if possible to avoid run out of - * cmpl entry while desc. ring still have free entries - */ - if ((qconf->st && (qconf->q_type == Q_C2H)) || - (!qconf->st && (qconf->q_type == Q_CMPT))) { - int i; - unsigned int v = csr_info->ring_sz[qconf->cmpl_rng_sz_idx]; - int best_fit_idx = -1; - - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (csr_info->ring_sz[i] > v) { - if (best_fit_idx < 0) - best_fit_idx = i; - else if ((best_fit_idx >= 0) && - (csr_info->ring_sz[i] < - csr_info->ring_sz[best_fit_idx])) - best_fit_idx = i; - } - } - - if (best_fit_idx >= 0) - qconf->cmpl_rng_sz_idx = best_fit_idx; - - qconf->rngsz_cmpt = csr_info->ring_sz[qconf->cmpl_rng_sz_idx] - - 1; - qconf->c2h_bufsz = csr_info->c2h_buf_sz[qconf->c2h_buf_sz_idx]; - descq->cmpt_cidx_info.irq_en = qconf->cmpl_en_intr; - descq->cmpt_cidx_info.trig_mode = qconf->cmpl_trig_mode; - descq->cmpt_cidx_info.timer_idx = qconf->cmpl_timer_idx; - descq->cmpt_cidx_info.counter_idx = qconf->cmpl_cnt_th_idx; - descq->cmpt_cidx_info.wrb_en = qconf->cmpl_stat_en; - } - if (qconf->st && (qconf->q_type == Q_C2H)) - descq->pidx_info.irq_en = 0; - else - descq->pidx_info.irq_en = descq->conf.irq_en; - - /* we can never use the full ring because then cidx would equal pidx - * and thus the ring would be interpreted as empty. Thus max number of - * usable entries is ring_size - 1 - */ - descq->avail = descq->conf.rngsz - 1; - descq->pend_list_empty = 1; - - descq->pidx = 0; - descq->cidx = 0; - descq->cidx_cmpt = 0; - descq->pidx_cmpt = 0; - descq->credit = 0; - descq->work_req_pend = 0; - - /* ST C2H only */ - if ((qconf->st && (qconf->q_type == Q_C2H)) || - (!qconf->st && (qconf->q_type == Q_CMPT))) { - int i, hi_idx, low_idx; - - descq->cmpt_entry_len = 8 << qconf->cmpl_desc_sz; - - pr_debug("%s: cmpl sz %u(%d), udd_en %d.\n", - descq->conf.name, descq->cmpt_entry_len, - descq->conf.cmpl_desc_sz, descq->conf.cmpl_udd_en); - descq->c2h_pend_pkt_moving_avg = - csr_info->c2h_cnt_th[descq->conf.cmpl_cnt_th_idx]; - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (descq->conf.cmpl_cnt_th_idx == - descq->xdev->sorted_c2h_cntr_idx[i]) { - descq->sorted_c2h_cntr_idx = i; - break; - } - } - hi_idx = descq->sorted_c2h_cntr_idx + 1; - low_idx = descq->sorted_c2h_cntr_idx - 1; - - if (descq->sorted_c2h_cntr_idx == - (QDMA_GLOBAL_CSR_ARRAY_SZ - 1)) - hi_idx = descq->sorted_c2h_cntr_idx; - - i = xdev->sorted_c2h_cntr_idx[hi_idx]; - - descq->c2h_pend_pkt_avg_thr_hi = - (descq->c2h_pend_pkt_moving_avg + - csr_info->c2h_cnt_th[i]); - if (descq->sorted_c2h_cntr_idx == 0) - low_idx = 0; - - i = xdev->sorted_c2h_cntr_idx[low_idx]; - - descq->c2h_pend_pkt_avg_thr_lo = - (descq->c2h_pend_pkt_moving_avg + - csr_info->c2h_cnt_th[i]); - descq->c2h_pend_pkt_avg_thr_hi >>= 1; - descq->c2h_pend_pkt_avg_thr_lo >>= 1; - pr_debug("q%u: sorted idx = %u %u %u", descq->conf.qidx, - descq->sorted_c2h_cntr_idx, - descq->c2h_pend_pkt_avg_thr_lo, - descq->c2h_pend_pkt_avg_thr_hi); - } - - return 0; -} - -int qdma_descq_prog_hw(struct qdma_descq *descq) -{ - int rv = qdma_descq_context_setup(descq); - - if (rv < 0) { - pr_warn("%s failed to program contexts", descq->conf.name); - return rv; - } - - /* update pidx/cidx */ - if ((descq->conf.st && (descq->conf.q_type == Q_C2H)) || - (!descq->conf.st && (descq->conf.q_type == Q_CMPT))) { - if (!descq->conf.init_pidx_dis) { - /* use qdma_q_init_pointers - * for updating the pidx and cidx later - */ - descq->cmpt_cidx_info.wrb_cidx = 0; - rv = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, - &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - return -EINVAL; - } - - if (descq->conf.q_type == Q_CMPT) - return rv; - - descq->pidx_info.pidx = descq->conf.rngsz - 1; - rv = queue_pidx_update(descq->xdev, descq->conf.qidx, - descq->conf.q_type, &descq->pidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - return -EINVAL; - } - } - } - - return rv; -} - -int qdma_descq_service_cmpl_update(struct qdma_descq *descq, int budget, - bool c2h_upd_cmpl) -{ - int rv = 0; - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - lock_descq(descq); - if (descq->q_state == Q_STATE_ONLINE) { - rv = descq_process_completion_st_c2h(descq, budget, - c2h_upd_cmpl); - if (rv && (rv != -ENODATA)) - pr_err("Error detected in %s", - descq->conf.name); - } else { - pr_debug("Invalid q state of %s ", descq->conf.name); - rv = -EINVAL; - } - unlock_descq(descq); - } else if ((descq->xdev->conf.qdma_drv_mode == POLL_MODE) || - (descq->xdev->conf.qdma_drv_mode == AUTO_MODE)) { - lock_descq(descq); - if (!descq->proc_req_running) { - unlock_descq(descq); - qdma_descq_proc_sgt_request(descq); - } else { - pr_err("Processing previous request\n"); - unlock_descq(descq); - } - } else { - lock_descq(descq); - descq_mm_n_h2c_cmpl_status(descq); - if (qdma_work_queue_len(descq) || descq->desc_pend) { - unlock_descq(descq); - rv = qdma_descq_proc_sgt_request(descq); - return rv; - } - unlock_descq(descq); - } - - return rv; -} - -ssize_t qdma_descq_proc_sgt_request(struct qdma_descq *descq) -{ - if (!descq->conf.st) /* MM H2C/C2H */ - return descq_mm_proc_request(descq); - else if (descq->conf.st && (descq->conf.q_type == Q_H2C)) {/* ST H2C */ - if (descq->conf.fp_bypass_desc_fill && - descq->conf.desc_bypass && - descq->xdev->conf.qdma_drv_mode == DIRECT_INTR_MODE) - return descq_proc_st_h2c_request_qep(descq); - return descq_proc_st_h2c_request(descq); - } else /* ST C2H - should not happen - handled separately */ - return -EINVAL; -} - -void incr_cmpl_desc_cnt(struct qdma_descq *descq, unsigned int cnt) -{ - descq->total_cmpl_descs += cnt; - switch ((descq->conf.st << 1) | descq->conf.q_type) { - case 0: - descq->xdev->total_mm_h2c_pkts += cnt; - break; - case 1: - descq->xdev->total_mm_c2h_pkts += cnt; - break; - case 2: - descq->xdev->total_st_h2c_pkts += cnt; - break; - case 3: - descq->xdev->total_st_c2h_pkts += cnt; - break; - default: - break; - } -} - -void qdma_sgt_req_done(struct qdma_descq *descq, struct qdma_sgt_req_cb *cb, - int error) -{ - struct qdma_request *req = (struct qdma_request *)cb; - - if (unlikely(error)) - pr_err("req 0x%p, cb 0x%p, fp_done 0x%p done, err %d.\n", - req, cb, req->fp_done, error); - - list_del(&cb->list); - if (cb->unmap_needed) { - sgl_unmap(descq->xdev->conf.pdev, req->sgl, req->sgcnt, - (descq->conf.q_type == Q_C2H) ? - DMA_FROM_DEVICE : DMA_TO_DEVICE); - cb->unmap_needed = 0; - } - if (req->fp_done) { - if ((cb->offset != req->count) && - !(descq->conf.st && - (descq->conf.q_type == Q_C2H))) { - pr_info("req 0x%p not completed %u != %u.\n", - req, cb->offset, req->count); - error = -EINVAL; - } - cb->status = error; - cb->done = 1; - req->fp_done(req, cb->offset, error); - } else { - pr_debug("req 0x%p, cb 0x%p, wake up.\n", req, cb); - cb->status = error; - cb->done = 1; - qdma_waitq_wakeup(&cb->wq); - } - - if (!descq->conf.fp_descq_c2h_packet) { - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) - descq->pend_list_empty = (descq->avail == 0); - else - descq->pend_list_empty = (descq->avail == - (descq->conf.rngsz - 1)); - - if (descq->q_stop_wait && descq->pend_list_empty) - qdma_waitq_wakeup(&descq->pend_list_wq); - } else - descq->pend_list_empty = 1; -} - -int qdma_descq_dump_desc(struct qdma_descq *descq, int start, - int end, char *buf, int buflen) -{ - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - int desc_sz = get_desc_size(descq); - u8 *p = descq->desc + start * desc_sz; - struct qdma_sw_sg *fl = (descq->conf.st && - (descq->conf.q_type == Q_C2H)) ? - flq->sdesc + start : NULL; - int i = start; - int len = strlen(buf); - - if (!descq->desc) - return 0; - - for (; i < end && i < descq->conf.rngsz; i++, p += desc_sz) { - len += snprintf(buf + len, buflen - len, - "%d: 0x%p ", i, p); - hex_dump_to_buffer(p, desc_sz, - (desc_sz < DESC_SZ_16B_BYTES) ? 16 : 32, - 4, buf + len, buflen - len, 0); - len = strlen(buf); - if (desc_sz > DESC_SZ_32B_BYTES) { - len += snprintf(buf + len, buflen - len, " "); - hex_dump_to_buffer(p + DESC_SZ_32B_BYTES, desc_sz, - 32, 4, buf + len, buflen - len, 0); - len = strlen(buf); - } - if (fl) { - len += snprintf(buf + len, buflen - len, - " fl pg 0x%p, 0x%llx.\n", - fl->pg, fl->dma_addr); - fl++; - } else - buf[len++] = '\n'; - } - - p = descq->desc_cmpl_status; - - dma_rmb(); - - len += snprintf(buf + len, buflen - len, "CMPL STATUS: 0x%p ", p); - hex_dump_to_buffer(p, get_desc_cmpl_status_size(descq), 16, 4, - buf + len, buflen - len, 0); - len = strlen(buf); - buf[len++] = '\n'; - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - p = page_address(fl->pg); - len += snprintf(buf + len, buflen - len, "data 0: 0x%p ", p); - hex_dump_to_buffer(p, descq->cmpt_entry_len, - (descq->cmpt_entry_len < DESC_SZ_16B_BYTES) ? 16 : 32, - 4, buf + len, - buflen - len, 0); - len = strlen(buf); - if (descq->cmpt_entry_len > DESC_SZ_32B_BYTES) { - len += snprintf(buf + len, buflen - len, " "); - hex_dump_to_buffer(p + DESC_SZ_32B_BYTES, - descq->cmpt_entry_len, 32, 4, - buf + len, buflen - len, 0); - len = strlen(buf); - } - buf[len++] = '\n'; - } - - return len; -} - -int qdma_descq_dump_cmpt(struct qdma_descq *descq, int start, - int end, char *buf, int buflen) -{ - uint8_t *cmpt = descq->desc_cmpt; - u8 *p; - int i = start; - int len = strlen(buf); - int stride = descq->cmpt_entry_len; - - if (!descq->desc_cmpt) - return 0; - - for (cmpt += (start * stride); - i < end && i < descq->conf.rngsz_cmpt; i++, - cmpt += stride) { - len += snprintf(buf + len, buflen - len, - "%d: 0x%p ", i, cmpt); - hex_dump_to_buffer(cmpt, descq->cmpt_entry_len, - 32, 4, buf + len, buflen - len, 0); - len = strlen(buf); - if (descq->cmpt_entry_len > DESC_SZ_32B_BYTES) { - len += snprintf(buf + len, buflen - len, - " "); - hex_dump_to_buffer(cmpt + DESC_SZ_32B_BYTES, - descq->cmpt_entry_len, - 32, 4, buf + len, buflen - len, 0); - len = strlen(buf); - } - buf[len++] = '\n'; - } - - len += snprintf(buf + len, buflen - len, - "CMPL STATUS: 0x%p ", - descq->desc_cmpt_cmpl_status); - - p = descq->desc_cmpt_cmpl_status; - dma_rmb(); - hex_dump_to_buffer(p, sizeof(struct qdma_c2h_cmpt_cmpl_status), - 16, 4, buf + len, buflen - len, 0); - len = strlen(buf); - buf[len++] = '\n'; - - return len; -} - -int qdma_descq_dump_state(struct qdma_descq *descq, char *buf, int buflen) -{ - char *cur = buf; - char *const end = buf + buflen; - - if (!buf || !buflen) { - pr_warn("incorrect arguments buf=%p buflen=%d", buf, buflen); - return 0; - } - - if (descq->conf.q_type != Q_CMPT) - cur += snprintf(cur, end - cur, "%s %s ", - descq->conf.name, - (descq->conf.q_type == Q_C2H) ? "C2H" : "H2C"); - else - cur += snprintf(cur, end - cur, "%s %s ", - descq->conf.name, "CMPT"); - if (cur >= end) - goto handle_truncation; - - if (descq->err) - cur += snprintf(cur, end - cur, "ERR\n"); - else - cur += snprintf(cur, end - cur, "%s\n", - q_state_list[descq->q_state].name); - - if (cur >= end) - goto handle_truncation; - - return cur - buf; - -handle_truncation: - *buf = '\0'; - return cur - buf; -} - -int qdma_descq_dump(struct qdma_descq *descq, char *buf, int buflen, int detail) -{ - char *cur = buf; - char *const end = buf + buflen; - - if (!buf || !buflen) { - pr_info("%s:%s 0x%x/0x%x, desc sz %u/%u, pidx %u, cidx %u\n", - descq->conf.name, descq->err ? "ERR" : "", - descq->conf.qidx, descq->qidx_hw, descq->conf.rngsz, - descq->avail, descq->pidx, descq->cidx); - return 0; - } - - cur += qdma_descq_dump_state(descq, cur, end - cur); - if (cur >= end) - goto handle_truncation; - - if (descq->q_state == Q_STATE_DISABLED) - return cur - buf; - - cur += snprintf(cur, end - cur, - "\thw_ID %u, thp %s, desc 0x%p/0x%llx, %u\n", - descq->qidx_hw, - descq->cmplthp ? descq->cmplthp->name : "?", - descq->desc, descq->desc_bus, descq->conf.rngsz); - if (cur >= end) - goto handle_truncation; - - if (descq->conf.st && (descq->conf.q_type == Q_C2H)) { - cur += snprintf(cur, end - cur, - "\tcmpt desc 0x%p/0x%llx, %u\n", - descq->desc_cmpt, descq->desc_cmpt_bus, - descq->conf.rngsz_cmpt); - if (cur >= end) - goto handle_truncation; - } - - if (!detail) - return cur - buf; - - if (descq->desc_cmpl_status) { - u8 *cs = descq->desc_cmpl_status; - - cur += snprintf(cur, end - cur, "\n\tcmpl status: 0x%p, ", cs); - if (cur >= end) - goto handle_truncation; - - dma_rmb(); -#if KERNEL_VERSION(4, 0, 0) <= LINUX_VERSION_CODE - cur += hex_dump_to_buffer(cs, - sizeof(struct qdma_desc_cmpl_status), - 16, 4, cur, end - cur, 0); -#else - hex_dump_to_buffer(cs, sizeof(struct qdma_desc_cmpl_status), - 16, 4, cur, end - cur, 0); - cur += strlen(cur); -#endif - if (cur >= end) - goto handle_truncation; - - cur += snprintf(cur, end - cur, "\n"); - if (cur >= end) - goto handle_truncation; - } - if (descq->desc_cmpt_cmpl_status) { - u8 *cs = descq->desc_cmpt_cmpl_status; - - cur += snprintf(cur, end - cur, "\tCMPT CMPL STATUS: 0x%p, ", - cs); - if (cur >= end) - goto handle_truncation; - - dma_rmb(); -#if KERNEL_VERSION(4, 0, 0) <= LINUX_VERSION_CODE - cur += hex_dump_to_buffer(cs, - sizeof(struct qdma_c2h_cmpt_cmpl_status), - 16, 4, cur, end - cur, 0); -#else - hex_dump_to_buffer(cs, sizeof(struct qdma_c2h_cmpt_cmpl_status), - 16, 4, cur, end - cur, 0); - cur += strlen(cur); -#endif - if (cur >= end) - goto handle_truncation; - - cur += snprintf(cur, end - cur, "\n"); - if (cur >= end) - goto handle_truncation; - } - - return cur - buf; - -handle_truncation: - *buf = '\0'; - return cur - buf; -} - -int qdma_queue_avail_desc(unsigned long dev_hndl, unsigned long id) -{ - struct qdma_descq *descq = qdma_device_get_descq_by_id( - (struct xlnx_dma_dev *)dev_hndl, - id, NULL, 0, 1); - int avail; - - if (!descq) { - pr_err("Invalid qid: %ld", id); - return -EINVAL; - } - - lock_descq(descq); - avail = descq->avail; - unlock_descq(descq); - - return avail; -} - -#ifdef ERR_DEBUG -int qdma_queue_set_err_induction(unsigned long dev_hndl, unsigned long id, - u32 err, char *buf, int buflen) -{ - struct qdma_descq *descq = qdma_device_get_descq_by_id( - (struct xlnx_dma_dev *)dev_hndl, - id, buf, buflen, 1); - unsigned int err_en = (err >> 31); - unsigned int err_no = (err & 0x7FFFFFFF); - - if (!descq) { - pr_err("Invalid qid: %ld", id); - return -EINVAL; - } - - if (err_no < sb_mi_h2c0_dat) { - descq->induce_err &= ~(1 << err_no); - descq->induce_err |= (err_en << err_no); - } else { - descq->ecc_err &= ~(1 << (err_no - sb_mi_h2c0_dat)); - descq->ecc_err |= (err_en << (err_no - sb_mi_h2c0_dat)); - } - pr_info("Errs enabled = [QDMA]: 0x%08x 0x%08x\n [ECC]: 0x%08x 0x%08x", - (u32)(descq->induce_err >> 32), - (u32)(descq->induce_err & 0xFFFFFFFF), - (u32)(descq->ecc_err >> 32), - (u32)(descq->ecc_err & 0xFFFFFFFF)); - - return 0; -} -#endif - -int qdma_queue_packet_write(unsigned long dev_hndl, unsigned long id, - struct qdma_request *req) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - struct qdma_sgt_req_cb *cb; - int rv; - - /** make sure that the dev_hndl passed is Valid */ - if (unlikely(!xdev)) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (unlikely(xdev_check_hndl(__func__, - xdev->conf.pdev, dev_hndl) < 0)) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (unlikely(!req)) { - pr_err("req is NULL"); - return -EINVAL; - } - - cb = qdma_req_cb_get(req); - - descq = qdma_device_get_descq_by_id(xdev, id, NULL, 0, 0); - if (unlikely(!descq)) { - pr_err("Invalid qid: %ld", id); - return -EINVAL; - } - - if (unlikely(!descq->conf.st || (descq->conf.q_type == Q_C2H))) { - pr_err("%s: st %d, type %d.\n", - descq->conf.name, descq->conf.st, descq->conf.q_type); - return -EINVAL; - } - - memset(cb, 0, QDMA_REQ_OPAQUE_SIZE); - qdma_waitq_init(&cb->wq); - qdma_work_queue_add(descq, cb); - - if (!req->dma_mapped) { - rv = sgl_map(descq->xdev->conf.pdev, req->sgl, req->sgcnt, - DMA_TO_DEVICE); - if (rv < 0) { - pr_err("%s map sgl %u failed, %u.\n", - descq->conf.name, req->sgcnt, req->count); - goto unmap_sgl; - } - cb->unmap_needed = 1; - } - - if (!req->check_qstate_disabled) { - lock_descq(descq); - if (descq->q_state != Q_STATE_ONLINE) { - unlock_descq(descq); - pr_err("%s descq %s NOT online.\n", - descq->xdev->conf.name, descq->conf.name); - rv = -EINVAL; - goto unmap_sgl; - } - unlock_descq(descq); - } - - qdma_descq_proc_sgt_request(descq); - - - pr_debug("%s: cb 0x%p submitted for bytes %u.\n", - descq->conf.name, cb, req->count); - - return req->count; - -unmap_sgl: - if (cb->unmap_needed) - sgl_unmap(descq->xdev->conf.pdev, req->sgl, req->sgcnt, - DMA_TO_DEVICE); - return rv; -} - -int qdma_descq_get_cmpt_udd(unsigned long dev_hndl, unsigned long id, - char *buf, int buflen) -{ - uint8_t *cmpt; - uint8_t i = 0; - int len = 0; - int print_len = 0; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq = NULL; - struct qdma_c2h_cmpt_cmpl_status *cs; - - if (!buf || !buflen || !xdev) { - pr_err("Invalid bud:%p, buflen:%d", buf, buflen); - return -EINVAL; - } - - - descq = qdma_device_get_descq_by_id(xdev, id, buf, buflen, 1); - - if (!descq) { - pr_err("Invalid qid: %ld", id); - return -EINVAL; - } - - cs = (struct qdma_c2h_cmpt_cmpl_status *) - descq->desc_cmpt_cmpl_status; - - cmpt = descq->desc_cmpt + ((cs->pidx - 1) * descq->cmpt_entry_len); - - /* - * Ignoring the first 4 bits of the completion entry as they represent - * the error and color bits. - * TODO: May need to change the masking logic and move that in thegtest, - * as error and color bit positions may change in the future releases. - */ - for (i = 0; i < descq->cmpt_entry_len; i++) { - if (buf && buflen) { - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) - && xdev->version_info.device_type == - QDMA_DEVICE_VERSAL_CPM4) { - if (i <= 1) - continue; - else if (i == 2) - print_len = snprintf(buf + len, buflen, - "%02x", - (0xF0 & cmpt[i])); - else - print_len = snprintf(buf + len, buflen, - "%02x", - cmpt[i]); - } else { - if (i == 0) - print_len = snprintf(buf + len, buflen, - "%02x", - (cmpt[i] & 0xF0)); - else - print_len = snprintf(buf + len, buflen, - "%02x", - cmpt[i]); - } - - } - buflen -= print_len; - len += print_len; - } - buf[len] = '\0'; - - return 0; -} - -static int qdma_descq_read_cmpt(struct qdma_descq *descq, - u32 num_entries, u8 *cmpt_data) -{ - uint8_t *cmpt; - int i = 0; - int stride = descq->cmpt_entry_len; - u8 *temp = cmpt_data; - - if (!descq->desc_cmpt) - return 0; - - lock_descq(descq); - cmpt = descq->desc_cmpt + (descq->cidx_cmpt * stride); - for (i = 0; i < num_entries; - i++, cmpt += stride, cmpt_data += stride) { - memcpy(cmpt_data, cmpt, stride); - } - *(temp) = (*(temp) & 0xF0); - unlock_descq(descq); - - return i; -} - -int qdma_descq_read_cmpt_data(unsigned long dev_hndl, unsigned long id, - u32 *num_entries, u8 **cmpt_entries, - char *buf, int buflen) -{ - struct qdma_descq *descq = qdma_device_get_descq_by_id( - (struct xlnx_dma_dev *)dev_hndl, - id, buf, buflen, 1); - struct qdma_c2h_cmpt_cmpl_status *cs = NULL; - unsigned int pidx_cmpt = 0; - unsigned int cidx_cmpt = 0; - int rv = 0; - u32 pend = 0; - - if (!descq) { - pr_err("Invalid qid, qid = %ld", id); - return -EINVAL; - } - - if (!buf || !buflen) { - pr_err("Invalid buf:%p, buflen:%d", buf, buflen); - return -EINVAL; - } - - if (descq->conf.st) { - pr_err("Not supported for ST mode"); - rv = -EINVAL; - return rv; - } - - lock_descq(descq); - cs = (struct qdma_c2h_cmpt_cmpl_status *) - descq->desc_cmpt_cmpl_status; - cidx_cmpt = descq->cidx_cmpt; - pidx_cmpt = cs->pidx; - unlock_descq(descq); - pend = ring_idx_delta(pidx_cmpt, - cidx_cmpt, - descq->conf.rngsz_cmpt); - pr_debug("ringsz %d, pend = %d, cs->pidx = %d cs->cidx = %d, descq->cidx_cmpt = %d, descq->pidx_cmpt = %d", - descq->conf.rngsz_cmpt, pend, cs->pidx, cs->cidx, - cidx_cmpt, - pidx_cmpt); - *num_entries = min(pend, descq->conf.rngsz_cmpt); - - if (!pend) { - int l = 0; - - pr_debug("No pending cmpt entries"); - /* SW work around where next interrupt could be missed when - * there are no entries as of now - */ - if (descq->xdev->conf.qdma_drv_mode != POLL_MODE) { - lock_descq(descq); - descq->cmpt_cidx_info.wrb_cidx = cidx_cmpt; - unlock_descq(descq); - rv = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, - &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - return -EINVAL; - } - - } - - l = strlen(buf); - - l += snprintf(buf + l, buflen, - "%s no pending entries in cmpt ring\n", - descq->conf.name); - buf[l] = '\0'; - *num_entries = 0; - return 0; - } - - if (*num_entries > 0) { - /** Note: cmpt_entries will be freed by caller in nl.c - * do not free it here - */ - *cmpt_entries = kzalloc((*num_entries * descq->cmpt_entry_len), - GFP_KERNEL); - if (!*cmpt_entries) { - int l = snprintf(buf, buflen, "OOM for cmpt_entries\n"); - - buf[l] = '\0'; - *num_entries = 0; - return 0; - } - - qdma_descq_read_cmpt(descq, *num_entries, *cmpt_entries); - lock_descq(descq); - descq->cidx_cmpt += *num_entries; - descq->cmpt_cidx_info.wrb_cidx = descq->cidx_cmpt; - unlock_descq(descq); - rv = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, - &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - return -EINVAL; - } - } - - return rv; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_descq.h b/QDMA/linux-kernel/driver/libqdma/qdma_descq.h deleted file mode 100755 index bb1ba36..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_descq.h +++ /dev/null @@ -1,613 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_DESCQ_H__ -#define __QDMA_DESCQ_H__ -/** - * @file - * @brief This file contains the declarations for qdma descq processing - * - */ -#include <linux/spinlock_types.h> -#include <linux/types.h> -#include "qdma_compat.h" -#include "libqdma_export.h" -#include "qdma_regs.h" -#ifdef ERR_DEBUG -#include "qdma_nl.h" -#endif -#include "qdma_ul_ext.h" - -/** - * struct q_state_name - Structure to hold the q state and name - * - * A queue can be in one of these states - * - */ -struct q_state_name { - /** @q_state : Current state of the queue. */ - enum q_state_t q_state; - /** @state : Q state Name */ - char name[20]; -}; - -extern struct q_state_name q_state_list[]; - -#define QDMA_FLQ_SIZE 124 - -/** - * @struct - qdma_descq - * @brief qdma software descriptor book keeping fields - */ -struct qdma_descq { - /** qdma queue configuration */ - struct qdma_queue_conf conf; - /** lock to protect access to software descriptor */ - spinlock_t lock; - /** pointer to dma device */ - struct xlnx_dma_dev *xdev; - /** number of channels */ - u8 channel; - /** flag to indicate error on the Q, in halted state */ - u8 err:1; - /** color bit for the queue */ - u8 color:1; - /** cpu attached */ - u8 cpu_assigned:1; - /** state of the proc req */ - u8 proc_req_running; - /* rx_time in CPU timestamp of ping_pong pkt for - * measuring H2C-C2H loopback latency - */ - u64 ping_pong_rx_time; - /* tx_time in CPU timestamp of ping_pong pkt for - * measuring H2C-C2H loopback latency - */ - u64 ping_pong_tx_time; - /** Indicate q state */ - enum q_state_t q_state; - /** hw qidx associated for this queue */ - unsigned int qidx_hw; - /** cpu attached to intr_work */ - unsigned int intr_work_cpu; - /** @q_hndl: Q handle */ - unsigned long q_hndl; - /** queue handler */ - struct work_struct work; - /** interrupt list */ - struct list_head intr_list; - /** leagcy interrupt list */ - struct list_head legacy_intr_q_list; - /** interrupt id associated for this queue */ - int intr_id; - /** work list for the queue */ - struct list_head work_list; - /** current req count */ - unsigned int work_req_pend; - /* lock to synchonize work queue access*/ - spinlock_t work_list_lock; - /** write back therad list */ - struct qdma_kthread *cmplthp; - /** completion status thread list for the queue */ - struct list_head cmplthp_list; - /** pending qork thread list */ - struct list_head pend_list; - /** wait queue for pending list clear */ - qdma_wait_queue pend_list_wq; - /** pending list empty count */ - unsigned int pend_list_empty; - /* flag to indicate wwaiting for transfers to complete before q stop*/ - unsigned int q_stop_wait; - /** availed count */ - unsigned int avail; - /** current req count */ - unsigned int pend_req_desc; - /** current producer index */ - unsigned int pidx; - /** current consumer index */ - unsigned int cidx; - /** number of descrtors yet to be processed*/ - unsigned int credit; - /** desctor to be processed*/ - u8 *desc; - /** desctor dma address*/ - dma_addr_t desc_bus; - /** desctor writeback*/ - u8 *desc_cmpl_status; - - /* ST C2H */ - /** programming order of the data in ST c2h mode*/ - unsigned char fl_pg_order; - /** cmpt entry length*/ - unsigned char cmpt_entry_len; - /** 2 bits reserved*/ - unsigned char rsvd[2]; - /** qdma free list q*/ - unsigned char flq[QDMA_FLQ_SIZE]; - /**total # of udd outstanding */ - unsigned int udd_cnt; - /** packet count/number of packets to be processed*/ - unsigned int pkt_cnt; - /** packet data length */ - unsigned int pkt_dlen; - /** pidx of the completion entry */ - unsigned int pidx_cmpt; - /** completion cidx */ - unsigned int cidx_cmpt; - /** number of packets processed in q */ - unsigned long long total_cmpl_descs; - /** descriptor writeback, data type depends on the cmpt_entry_len */ - void *desc_cmpt_cur; - /* descriptor list to be provided for ul extenstion call */ - struct qdma_q_desc_list *desc_list; - /** pointer to completion entry */ - u8 *desc_cmpt; - /** descriptor dma bus address*/ - dma_addr_t desc_cmpt_bus; - /** descriptor writeback dma bus address*/ - u8 *desc_cmpt_cmpl_status; - /** @desc_pend: pending desc to be updated processed by hw */ - unsigned char desc_pend; - /** pidx info to be written to PIDX regiser*/ - struct qdma_q_pidx_reg_info pidx_info; - /** cmpt cidx info to be written to CMPT CIDX regiser*/ - struct qdma_q_cmpt_cidx_reg_info cmpt_cidx_info; - /** @c2h_pend_pkt_moving_avg: average rate of packets received */ - unsigned int c2h_pend_pkt_moving_avg; - /** @c2h_pend_pkt_avg_thr_hi: higher average threshold */ - unsigned int c2h_pend_pkt_avg_thr_hi; - /** @c2h_pend_pkt_avg_thr_lo: lower average threshold */ - unsigned int c2h_pend_pkt_avg_thr_lo; - /** @sorted_c2h_cntr_idx: sorted c2h counter index */ - unsigned char sorted_c2h_cntr_idx; - /** @c2h_cntr_monitor_cnt: c2h counter stagnant monitor count */ - unsigned char c2h_cntr_monitor_cnt; -#ifdef ERR_DEBUG - /** flag to indicate error inducing */ - u64 induce_err; - u64 ecc_err; -#endif -#ifdef DEBUGFS - /** debugfs queue index root */ - struct dentry *dbgfs_qidx_root; - /** debugfs queue root */ - struct dentry *dbgfs_queue_root; - /** debugfs cmpt queue root */ - struct dentry *dbgfs_cmpt_queue_root; -#endif -}; -#ifdef DEBUG_THREADS -#define lock_descq(descq) \ - do { \ - pr_debug("locking descq %s ...\n", (descq)->conf.name); \ - spin_lock_bh(&(descq)->lock); \ - } while (0) - -#define unlock_descq(descq) \ - do { \ - pr_debug("unlock descq %s ...\n", (descq)->conf.name); \ - spin_unlock_bh(&(descq)->lock); \ - } while (0) -#else -/** macro to lock descq */ -#define lock_descq(descq) spin_lock_bh(&(descq)->lock) -/** macro to un lock descq */ -#define unlock_descq(descq) spin_unlock_bh(&(descq)->lock) -#endif - -static inline unsigned int ring_idx_delta(unsigned int new, unsigned int old, - unsigned int rngsz) -{ - return new >= old ? (new - old) : new + (rngsz - old); -} - -static inline unsigned int ring_idx_incr(unsigned int idx, unsigned int cnt, - unsigned int rngsz) -{ - idx += cnt; - return idx >= rngsz ? idx - rngsz : idx; -} - -static inline unsigned int ring_idx_decr(unsigned int idx, unsigned int cnt, - unsigned int rngsz) -{ - return idx >= cnt ? idx - cnt : rngsz - (cnt - idx); -} - -/*****************************************************************************/ -/** - * qdma_descq_init() - initialize the sw descq entry - * - * @param[in] descq: pointer to qdma_descq - * @param[in] xdev: pointer to xdev - * @param[in] idx_hw: hw queue index - * @param[in] idx_sw: sw queue index - * - * @return none - *****************************************************************************/ -void qdma_descq_init(struct qdma_descq *descq, struct xlnx_dma_dev *xdev, - int idx_hw, int idx_sw); - -/*****************************************************************************/ -/** - * qdma_descq_config() - configure the sw descq entry - * - * @param[in] descq: pointer to qdma_descq - * @param[in] qconf: queue configuration - * @param[in] reconfig: flag to indicate whether to refig the sw descq - * - * @return none - *****************************************************************************/ -void qdma_descq_config(struct qdma_descq *descq, struct qdma_queue_conf *qconf, - int reconfig); - -/*****************************************************************************/ -/** - * qdma_descq_config_complete() - initialize the descq with default values - * - * @param[in] descq: pointer to qdma_descq - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_config_complete(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * qdma_descq_alloc_resource() - allocate the resources for a request - * - * @param[in] descq: pointer to qdma_descq - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_alloc_resource(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * qdma_descq_free_resource() - free up the resources assigned to a request - * - * @param[in] descq: pointer to qdma_descq - * - * @return none - *****************************************************************************/ -void qdma_descq_free_resource(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * qdma_descq_prog_hw() - program the hw descriptors - * - * @param[in] descq: pointer to qdma_descq - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_prog_hw(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * qdma_descq_context_cleanup() - clean up the queue context - * - * @param[in] descq: pointer to qdma_descq - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_context_cleanup(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * qdma_descq_service_cmpl_update() - process completion data for the request - * - * @param[in] descq: pointer to qdma_descq - * @param[in] budget: number of descriptors to process - * @param[in] c2h_upd_cmpl: C2H only: if update completion needed - * - * @return 0 - success, < 0 for failure - *****************************************************************************/ -int qdma_descq_service_cmpl_update(struct qdma_descq *descq, int budget, - bool c2h_upd_cmpl); - -/*****************************************************************************/ -/** - * qdma_descq_dump() - dump the queue sw desciptor data - * - * @param[in] descq: pointer to qdma_descq - * @param[in] detail: indicate whether full details or abstact details - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_dump(struct qdma_descq *descq, - char *buf, int buflen, int detail); - -/*****************************************************************************/ -/** - * qdma_descq_dump_desc() - dump the queue hw descriptors - * - * @param[in] descq: pointer to qdma_descq - * @param[in] start: start descriptor index - * @param[in] end: end descriptor index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_dump_desc(struct qdma_descq *descq, int start, int end, - char *buf, int buflen); - -/*****************************************************************************/ -/** - * qdma_descq_dump_state() - dump the queue desciptor state - * - * @param[in] descq: pointer to qdma_descq - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_dump_state(struct qdma_descq *descq, char *buf, int buflen); - -/*****************************************************************************/ -/** - * intr_cidx_update() - update the interrupt cidx - * - * @param[in] descq: pointer to qdma_descq - * @param[in] sw_cidx: sw cidx - * @param[in] ring_index: ring index - * - *****************************************************************************/ -void intr_cidx_update(struct qdma_descq *descq, unsigned int sw_cidx, - int ring_index); - -/*****************************************************************************/ -/** - * incr_cmpl_desc_cnt() - update the interrupt cidx - * - * @param[in] descq: pointer to qdma_descq - * - *****************************************************************************/ -void incr_cmpl_desc_cnt(struct qdma_descq *descq, unsigned int cnt); - -/** - * @struct - qdma_sgt_req_cb - * @brief qdma_sgt_req_cb fits in qdma_request.opaque - */ -struct qdma_sgt_req_cb { - /** qdma read/write request list*/ - struct list_head list; - /** request wait queue */ - qdma_wait_queue wq; - /** number of descriptors to proccess*/ - unsigned int desc_nr; - /** offset in the page*/ - unsigned int offset; - /** offset in the scatter gather list*/ - unsigned int sg_offset; - /** next sg to be processed */ - void *sg; - /** scatter gather ebtry index*/ - unsigned int sg_idx; - /** number of data byte not yet proccessed*/ - unsigned int left; - /** status of the request*/ - int status; - /** indicates whether request processing is done or not*/ - u8 done; - /** indicates whether to unmap the kernel pages*/ - u8 unmap_needed:1; -}; - -/** macro to get the request call back data */ -#define qdma_req_cb_get(req) (struct qdma_sgt_req_cb *)((req)->opaque) - -/*****************************************************************************/ -/** - * qdma_descq_proc_sgt_request() - handler to process the qdma - * read/write request - * - * @param[in] descq: pointer to qdma_descq - * @param[in] cb: scatter gather list call back data - * - * @return size of the request - *****************************************************************************/ -ssize_t qdma_descq_proc_sgt_request(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * qdma_sgt_req_done() - handler to track the progress of the request - * - * @param[in] descq: pointer to qdma_descq - * @param[in] cb: scatter gather list call back data - * @param[out] error: indicates the error status - * - * @return none - *****************************************************************************/ -void qdma_sgt_req_done(struct qdma_descq *descq, struct qdma_sgt_req_cb *cb, - int error); - -/*****************************************************************************/ -/** - * sgl_map() - handler to map the scatter gather list to kernel pages - * - * @param[in] pdev: pointer to struct pci_dev - * @param[in] sgl: scatter gather list - * @param[in] sgcnt: number of entries in scatter gather list - * @param[in] dir: direction of the request - * - * @return none - *****************************************************************************/ -int sgl_map(struct pci_dev *pdev, struct qdma_sw_sg *sgl, unsigned int sgcnt, - enum dma_data_direction dir); - -/*****************************************************************************/ -/** - * sgl_unmap() - handler to unmap the scatter gather list and free - * the kernel pages - * - * @param[in] pdev: pointer to struct pci_dev - * @param[in] sg: scatter gather list - * @param[in] sgcnt: number of entries in scatter gather list - * @param[in] dir: direction of the request - * - * @return none - *****************************************************************************/ -void sgl_unmap(struct pci_dev *pdev, struct qdma_sw_sg *sg, unsigned int sgcnt, - enum dma_data_direction dir); - -/*****************************************************************************/ -/** - * descq_flq_free_resource() - handler to free the pages for the request - * - * @param[in] descq: pointer to qdma_descq - * - * @return none - *****************************************************************************/ -void descq_flq_free_resource(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * descq_flq_free_page_resource() - handler to free the pages for the request - * - * @param[in] descq: pointer to qdma_descq - * - * @return none - *****************************************************************************/ -void descq_flq_free_page_resource(struct qdma_descq *descq); -int rcv_udd_only(struct qdma_descq *descq, struct qdma_ul_cmpt_info *cmpl); -int parse_cmpl_entry(struct qdma_descq *descq, struct qdma_ul_cmpt_info *cmpl); -void cmpt_next(struct qdma_descq *descq); - -/* CIDX/PIDX update macros */ -#ifndef __QDMA_VF__ -#define queue_pidx_update(xdev, qid, is_c2h, pidx_info) \ - (xdev->hw.qdma_queue_pidx_update(xdev, QDMA_DEV_PF, qid, is_c2h,\ - pidx_info)) -#else -#define queue_pidx_update(xdev, qid, is_c2h, pidx_info) \ - (xdev->hw.qdma_queue_pidx_update(xdev, QDMA_DEV_VF, qid, is_c2h, \ - pidx_info)) -#endif - -#ifndef __QDMA_VF__ -#define queue_cmpt_cidx_update(xdev, qid, cmpt_cidx_info) \ - (xdev->hw.qdma_queue_cmpt_cidx_update(xdev, QDMA_DEV_PF, qid, \ - cmpt_cidx_info)) -#else -#define queue_cmpt_cidx_update(xdev, qid, cmpt_cidx_info) \ - (xdev->hw.qdma_queue_cmpt_cidx_update(xdev, QDMA_DEV_VF, qid, \ - cmpt_cidx_info)) -#endif - -#ifndef __QDMA_VF__ -#define queue_cmpt_cidx_read(xdev, qid, cmpt_cidx_info) \ - (xdev->hw.qdma_queue_cmpt_cidx_read(xdev, QDMA_DEV_PF, qid, \ - cmpt_cidx_info)) -#else -#define queue_cmpt_cidx_read(xdev, qid, cmpt_cidx_info) \ - (xdev->hw.qdma_queue_cmpt_cidx_read(xdev, QDMA_DEV_VF, qid, \ - cmpt_cidx_info)) -#endif - -#ifndef __QDMA_VF__ -#define queue_intr_cidx_update(xdev, qid, intr_cidx_info) \ - (xdev->hw.qdma_queue_intr_cidx_update(xdev, QDMA_DEV_PF, qid, \ - intr_cidx_info)) -#else -#define queue_intr_cidx_update(xdev, qid, intr_cidx_info) \ - (xdev->hw.qdma_queue_intr_cidx_update(xdev, QDMA_DEV_VF, qid, \ - intr_cidx_info)) -#endif - -u64 rdtsc_gettime(void); -static inline unsigned int get_next_powof2(unsigned int value) -{ - unsigned int num_bits, mask, f_value; - - num_bits = fls(value) - 1; - mask = (1 << num_bits) - 1; - f_value = ((value + mask) >> num_bits) << num_bits; - - return f_value; -} - -//#define QDMA_SPIN_LOCK_GRANULAR - -static inline void qdma_work_queue_add(struct qdma_descq *descq, - struct qdma_sgt_req_cb *cb) -{ -#ifdef QDMA_SPIN_LOCK_GRANULAR - spin_lock_bh(&descq->work_list_lock); - list_add_tail(&cb->list, &descq->work_list); - descq->work_req_pend++; - spin_unlock_bh(&descq->work_list_lock); -#else - list_add_tail(&cb->list, &descq->work_list); - descq->work_req_pend++; -#endif -} - -static inline void qdma_work_queue_del(struct qdma_descq *descq, - struct qdma_sgt_req_cb *cb) -{ -#ifdef QDMA_SPIN_LOCK_GRANULAR - spin_lock_bh(&descq->work_list_lock); - list_del(&cb->list); - descq->work_req_pend--; - spin_unlock_bh(&descq->work_list_lock); -#else - list_del(&cb->list); - descq->work_req_pend--; -#endif -} - -static inline int qdma_work_queue_len(struct qdma_descq *descq) -{ - int count = 0; - -#ifdef QDMA_SPIN_LOCK_GRANULAR - spin_lock_bh(&descq->work_list_lock); - count = descq->work_req_pend; - spin_unlock_bh(&descq->work_list_lock); -#else - count = descq->work_req_pend; -#endif - return count; -} - -static inline struct qdma_request *qdma_work_queue_first_entry( - struct qdma_descq *descq) -{ - struct qdma_request *req; -#ifdef QDMA_SPIN_LOCK_GRANULAR - spin_lock_bh(&descq->work_list_lock); - req = (struct qdma_request *) list_first_entry(&descq->work_list, - struct qdma_sgt_req_cb, list); - spin_unlock_bh(&descq->work_list_lock); -#else - req = (struct qdma_request *) list_first_entry(&descq->work_list, - struct qdma_sgt_req_cb, list); -#endif - return req; -} -#endif /* ifndef __QDMA_DESCQ_H__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_device.c b/QDMA/linux-kernel/driver/libqdma/qdma_device.c deleted file mode 100755 index fcf8058..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_device.c +++ /dev/null @@ -1,635 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include <linux/module.h> -#include <linux/sched.h> -#include <linux/gfp.h> -#include "qdma_device.h" -#include "qdma_context.h" -#include "qdma_descq.h" -#include "qdma_intr.h" -#include "qdma_regs.h" -#include "qdma_mbox.h" -#include "qdma_access_common.h" -#include "qdma_resource_mgmt.h" - -#ifdef __QDMA_VF__ -static int device_set_qrange(struct xlnx_dma_dev *xdev) -{ - struct qdma_dev *qdev = xdev_2_qdev(xdev); - struct mbox_msg *m; - int rv = 0; - - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return -EINVAL; - } - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_fmap_prog(xdev->func_id, qdev->qmax, - (int)qdev->qbase, - m->raw); - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - if (rv != -ENODEV) - pr_info("%s set q range (fmap) failed %d.\n", - xdev->conf.name, rv); - goto err_out; - } - - rv = qdma_mbox_vf_response_status(m->raw); - if (rv < 0) { - pr_err("mbox_vf_response_status failed, err = %d", rv); - rv = -EINVAL; - } - pr_debug("%s, func id %u/%u, Q 0x%x + 0x%x.\n", - xdev->conf.name, xdev->func_id, xdev->func_id_parent, - qdev->qbase, qdev->qmax); - - if (!rv) - qdev->init_qrange = 1; - -err_out: - qdma_mbox_msg_free(m); - return rv; -} - -int device_set_qconf(struct xlnx_dma_dev *xdev, int *qmax, int *qbase) -{ - struct mbox_msg *m; - int rv = 0; - - m = qdma_mbox_msg_alloc(); - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_qreq(xdev->func_id, - (uint16_t)*qmax & 0xFFFF, *qbase, m->raw); - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - pr_info("%s set q range (qconf) failed %d.\n", - xdev->conf.name, rv); - goto err_out; - } - - rv = qdma_mbox_vf_qinfo_get(m->raw, qbase, (uint16_t *)qmax); - if (rv < 0) { - pr_err("mbox_vf_qinfo_get failed, err = %d", rv); - rv = -EINVAL; - } -err_out: - qdma_mbox_msg_free(m); - return rv; -} -#else -static int device_set_qrange(struct xlnx_dma_dev *xdev) -{ - struct qdma_dev *qdev = xdev_2_qdev(xdev); - struct qdma_fmap_cfg fmap; - int rv = 0; - - memset(&fmap, 0, sizeof(struct qdma_fmap_cfg)); - - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return -EINVAL; - } - - fmap.qmax = qdev->qmax; - fmap.qbase = qdev->qbase; - - rv = xdev->hw.qdma_fmap_conf(xdev, xdev->func_id, &fmap, - QDMA_HW_ACCESS_WRITE); - if (rv < 0) { - pr_err("FMAP write failed, err %d\n", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - qdev->init_qrange = 1; - - pr_debug("%s, func id %u, Q 0x%x + 0x%x.\n", - xdev->conf.name, xdev->func_id, qdev->qbase, qdev->qmax); - - return rv; -} -#endif /* ifndef __QDMA_VF__ */ - -int qdma_device_interrupt_setup(struct xlnx_dma_dev *xdev) -{ - int rv = 0; - - if ((xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (xdev->conf.qdma_drv_mode == AUTO_MODE)) { - rv = intr_ring_setup(xdev); - if (rv) { - pr_err("Failed to setup intr ring, err %d", rv); - return -EINVAL; - } - - if (xdev->intr_coal_list != NULL) { - rv = qdma_intr_context_setup(xdev); - if (rv) - return rv; - } else { - pr_info("dev %s intr vec[%d] >= queues[%d], No aggregation\n", - dev_name(&xdev->conf.pdev->dev), - (xdev->num_vecs - xdev->dvec_start_idx), - xdev->conf.qsets_max); - pr_warn("Changing the system mode to direct interrupt mode"); - xdev->conf.qdma_drv_mode = DIRECT_INTR_MODE; - } - } - - -#ifndef __QDMA_VF__ - if (((xdev->conf.qdma_drv_mode != POLL_MODE) && - (xdev->conf.qdma_drv_mode != LEGACY_INTR_MODE)) && - xdev->conf.master_pf) { - rv = qdma_err_intr_setup(xdev); - if (rv < 0) { - pr_err("Failed to setup err intr, err %d", rv); - return -EINVAL; - } - - rv = xdev->hw.qdma_hw_error_enable(xdev, - xdev->hw.qdma_max_errors); - if (rv < 0) { - pr_err("Failed to enable error interrupt, err = %d", - rv); - return -EINVAL; - } - - rv = xdev->hw.qdma_hw_error_intr_rearm(xdev); - if (rv < 0) { - pr_err("Failed to rearm error interrupt with error = %d", - rv); - return -EINVAL; - } - } -#endif - return rv; -} - -void qdma_device_interrupt_cleanup(struct xlnx_dma_dev *xdev) -{ - if (xdev->intr_coal_list) - intr_ring_teardown(xdev); -} - -int qdma_device_prep_q_resource(struct xlnx_dma_dev *xdev) -{ - struct qdma_dev *qdev = xdev_2_qdev(xdev); - int rv = 0; - - if (qdev->init_qrange) - goto done; - - rv = qdma_csr_read(xdev, &xdev->csr_info); - if (rv < 0) - goto done; - - rv = device_set_qrange(xdev); - if (rv < 0) - goto done; -done: - return rv; -} - -int qdma_device_init(struct xlnx_dma_dev *xdev) -{ - int i = 0; - struct qdma_fmap_cfg fmap; - -#ifndef __QDMA_VF__ - int rv = 0; -#endif - int qmax = xdev->conf.qsets_max; - struct qdma_descq *descq; - struct qdma_dev *qdev; - - memset(&fmap, 0, sizeof(struct qdma_fmap_cfg)); - - qdev = kzalloc(sizeof(struct qdma_dev), GFP_KERNEL); - - if (!qdev) { - pr_err("dev %s qmax %d OOM.\n", - dev_name(&xdev->conf.pdev->dev), qmax); - intr_teardown(xdev); - return -ENOMEM; - } - - spin_lock_init(&qdev->lock); - xdev->dev_priv = (void *)qdev; -#ifndef __QDMA_VF__ - if (xdev->conf.master_pf) { - rv = xdev->hw.qdma_init_ctxt_memory(xdev); - if (rv < 0) { - pr_err("init ctxt write failed, err %d\n", rv); - return xdev->hw.qdma_get_error_code(rv); - } - } -#endif - - qdev->h2c_descq = kmalloc(sizeof(struct qdma_descq) * qmax, GFP_KERNEL); - qdev->c2h_descq = kmalloc(sizeof(struct qdma_descq) * qmax, GFP_KERNEL); - qdev->cmpt_descq = kmalloc(sizeof(struct qdma_descq) * qmax, - GFP_KERNEL); - - qdev->qmax = qmax; - qdev->init_qrange = 0; - - qdev->qbase = xdev->conf.qsets_base; - - for (i = 0, descq = qdev->h2c_descq; i < qdev->qmax; i++, descq++) - qdma_descq_init(descq, xdev, i, i); - for (i = 0, descq = qdev->c2h_descq; i < qdev->qmax; i++, descq++) - qdma_descq_init(descq, xdev, i, i); - for (i = 0, descq = qdev->cmpt_descq; i < qdev->qmax; i++, descq++) - qdma_descq_init(descq, xdev, i, i); -#ifndef __QDMA_VF__ - xdev->hw.qdma_set_default_global_csr(xdev); - for (i = 0; i < xdev->dev_cap.mm_channel_max; i++) { - xdev->hw.qdma_mm_channel_conf(xdev, i, 1, 1); - xdev->hw.qdma_mm_channel_conf(xdev, i, 0, 1); - } -#endif - return 0; -} - -#define QDMA_BUF_LEN 256 -void qdma_device_cleanup(struct xlnx_dma_dev *xdev) -{ - int i; - struct qdma_dev *qdev = xdev_2_qdev(xdev); - struct qdma_descq *descq; - char buf[QDMA_BUF_LEN]; - - if (!qdev) { - pr_info("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return; - } - - for (i = 0, descq = qdev->h2c_descq; i < qdev->qmax; i++, descq++) { - if (descq->q_state == Q_STATE_ONLINE) - qdma_queue_stop((unsigned long int)xdev, - i, buf, QDMA_BUF_LEN); - } - - for (i = 0, descq = qdev->c2h_descq; i < qdev->qmax; i++, descq++) { - if (descq->q_state == Q_STATE_ONLINE) - qdma_queue_stop((unsigned long int)xdev, - i + qdev->qmax, buf, QDMA_BUF_LEN); - } - - for (i = 0, descq = qdev->h2c_descq; i < qdev->qmax; i++, descq++) { - if (descq->q_state == Q_STATE_ENABLED) - qdma_queue_remove((unsigned long int)xdev, - i, buf, QDMA_BUF_LEN); - } - - for (i = 0, descq = qdev->c2h_descq; i < qdev->qmax; i++, descq++) { - if (descq->q_state == Q_STATE_ENABLED) - qdma_queue_remove((unsigned long int)xdev, - i + qdev->qmax, buf, QDMA_BUF_LEN); - } - - kfree(qdev->h2c_descq); - kfree(qdev->c2h_descq); - kfree(qdev->cmpt_descq); - xdev->dev_priv = NULL; - kfree(qdev); -} - -long qdma_device_get_id_from_descq(struct xlnx_dma_dev *xdev, - struct qdma_descq *descq) -{ - struct qdma_dev *qdev; - unsigned long idx; - unsigned long idx_max; - struct qdma_descq *_descq; - - if (!xdev) { - pr_info("xdev NULL.\n"); - return -EINVAL; - } - - qdev = xdev_2_qdev(xdev); - - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return -EINVAL; - } - if (descq->conf.q_type == Q_H2C) { - _descq = qdev->h2c_descq; - idx = 0; - } else if (descq->conf.q_type == Q_C2H) { - _descq = qdev->c2h_descq; - idx = qdev->qmax; - } else { - _descq = qdev->cmpt_descq; - idx = 2 * qdev->qmax; - } - - idx_max = (idx + (2 * qdev->qmax)); - for (; idx < idx_max; idx++, _descq++) - if (_descq == descq) - return idx; - - return -EINVAL; - -} - -struct qdma_descq *qdma_device_get_descq_by_id(struct xlnx_dma_dev *xdev, - unsigned long idx, char *buf, int buflen, int init) -{ - struct qdma_dev *qdev; - struct qdma_descq *descq; - - if (!xdev) { - pr_info("xdev NULL.\n"); - return NULL; - } - - qdev = xdev_2_qdev(xdev); - - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return NULL; - } - - if (idx >= qdev->qmax) { - idx -= qdev->qmax; - if (idx >= qdev->qmax) { - idx -= qdev->qmax; - if (idx >= qdev->qmax) { - pr_info("%s, q idx too big 0x%lx > 0x%x.\n", - xdev->conf.name, idx, qdev->qmax); - if (buf && buflen) - snprintf(buf, buflen, - "%s, q idx too big 0x%lx > 0x%x.\n", - xdev->conf.name, idx, qdev->qmax); - return NULL; - } - descq = qdev->cmpt_descq + idx; - } else { - descq = qdev->c2h_descq + idx; - } - } else { - descq = qdev->h2c_descq + idx; - } - - if (init) { - lock_descq(descq); - if (descq->q_state == Q_STATE_DISABLED) { - pr_info("%s, idx 0x%lx, q 0x%p state invalid.\n", - xdev->conf.name, idx, descq); - if (buf && buflen) - snprintf(buf, buflen, - "%s, idx 0x%lx, q 0x%p state invalid.\n", - xdev->conf.name, idx, descq); - unlock_descq(descq); - return NULL; - } - unlock_descq(descq); - } - - return descq; -} - -#ifdef DEBUGFS -struct qdma_descq *qdma_device_get_pair_descq_by_id(struct xlnx_dma_dev *xdev, - unsigned long idx, char *buf, int buflen, int init) -{ - struct qdma_dev *qdev; - struct qdma_descq *pair_descq; - - if (!xdev) { - pr_info("xdev NULL.\n"); - return NULL; - } - - qdev = xdev_2_qdev(xdev); - - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return NULL; - } - - if (idx >= qdev->qmax) { - idx -= qdev->qmax; - if (idx >= qdev->qmax) { - pr_debug("%s, q idx too big 0x%lx > 0x%x.\n", - xdev->conf.name, idx, qdev->qmax); - if (buf && buflen) - snprintf(buf, buflen, - "%s, q idx too big 0x%lx > 0x%x.\n", - xdev->conf.name, idx, qdev->qmax); - return NULL; - } - pair_descq = qdev->h2c_descq + idx; - } else { - pair_descq = qdev->c2h_descq + idx; - } - - if (init) { - lock_descq(pair_descq); - if (pair_descq->q_state == Q_STATE_DISABLED) { - pr_debug("%s, idx 0x%lx, q 0x%p state invalid.\n", - xdev->conf.name, idx, pair_descq); - if (buf && buflen) - snprintf(buf, buflen, - "%s, idx 0x%lx, q 0x%p state invalid.\n", - xdev->conf.name, idx, pair_descq); - unlock_descq(pair_descq); - return NULL; - } - unlock_descq(pair_descq); - } - - return pair_descq; -} -#endif - -struct qdma_descq *qdma_device_get_descq_by_hw_qid(struct xlnx_dma_dev *xdev, - unsigned long qidx_hw, u8 c2h) -{ - struct qdma_dev *qdev; - struct qdma_descq *descq; - unsigned long qidx_sw = 0; - - if (!xdev) { - pr_info("xdev NULL.\n"); - return NULL; - } - - qdev = xdev_2_qdev(xdev); - - if (!qdev) { - pr_err("dev %s, qdev null.\n", - dev_name(&xdev->conf.pdev->dev)); - return NULL; - } - - qidx_sw = qidx_hw - qdev->qbase; - if (c2h) - descq = &qdev->c2h_descq[qidx_sw]; - else - descq = &qdev->h2c_descq[qidx_sw]; - - return descq; -} - - -void qdma_pf_trigger_vf_reset(unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - unsigned int sleep_timeout = 0; - struct mbox_msg *m = NULL; - struct qdma_vf_info *vf = NULL; - int i = 0, rv = 0; - u8 vf_count_online = 0, no_bye_count = 0; - uint32_t active_queue_count = 0; - - if (!xdev) { - pr_err("xdev NULL\n"); - return; - } - - if (!xdev->vf_count) { - pr_debug("VF count is zero\n"); - return; - } - - vf_count_online = xdev->vf_count_online; - vf = (struct qdma_vf_info *)xdev->vf_info; - - xdev->reset_state = RESET_STATE_PF_WAIT_FOR_BYES; - for (i = 0; i < vf_count_online; i++) { - active_queue_count = qdma_get_device_active_queue_count( - xdev->dma_device_index, - vf[i].func_id, QDMA_DEV_Q_TYPE_H2C); - active_queue_count += qdma_get_device_active_queue_count( - xdev->dma_device_index, - vf[i].func_id, QDMA_DEV_Q_TYPE_C2H); - sleep_timeout = QDMA_MBOX_MSG_TIMEOUT_MS + - (200 * active_queue_count); - - pr_info("VF reset in progress. Wait for 0x%x ms\n", - sleep_timeout); - - m = qdma_mbox_msg_alloc(); - if (!m) { - pr_err("Memory allocation for mbox message failed\n"); - return; - } - - pr_debug("xdev->func_id=%d, vf[i].func_id=%d, i = %d", - xdev->func_id, vf[i].func_id, i); - qdma_mbox_compose_vf_reset_message(m->raw, xdev->func_id, - vf[i].func_id); - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv == 0) { - qdma_waitq_wait_event_timeout(xdev->wq, - (xdev->vf_count_online == - (vf_count_online - i - 1)), - msecs_to_jiffies(sleep_timeout)); - } - if (xdev->vf_count_online != - (vf_count_online - i - 1)) { - xdev->vf_count_online--; - no_bye_count++; - pr_warn("BYE not recv from func=%d, online_count=%d\n", - vf[i].func_id, xdev->vf_count_online); - } - } - - xdev->reset_state = RESET_STATE_IDLE; - pr_debug("no_bye_count=%d\n", no_bye_count); - -} - -void qdma_pf_trigger_vf_offline(unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct mbox_msg *m = NULL; - struct qdma_vf_info *vf = NULL; - int i = 0, rv = 0; - unsigned int sleep_timeout = 0; - u8 vf_count_online = 0; - uint32_t active_queue_count = 0; - - if (!xdev) { - pr_err("xdev NULL\n"); - return; - } - - if (!xdev->vf_count) { - pr_debug("VF count is zero\n"); - return; - } - - vf_count_online = xdev->vf_count_online; - vf = (struct qdma_vf_info *)xdev->vf_info; - - for (i = 0; i < vf_count_online; i++) { - active_queue_count = qdma_get_device_active_queue_count( - xdev->dma_device_index, - vf[i].func_id, QDMA_DEV_Q_TYPE_H2C); - active_queue_count += qdma_get_device_active_queue_count( - xdev->dma_device_index, - vf[i].func_id, QDMA_DEV_Q_TYPE_C2H); - sleep_timeout = QDMA_MBOX_MSG_TIMEOUT_MS + - (200 * active_queue_count); - - pr_info("VF offline in progress. Wait for 0x%x ms\n", - sleep_timeout); - m = qdma_mbox_msg_alloc(); - if (!m) { - pr_err("Memory allocation for mbox message failed\n"); - return; - } - pr_info("xdev->func_id=%d, vf[i].func_id=%d, i = %d", - xdev->func_id, vf[i].func_id, i); - qdma_mbox_compose_pf_offline(m->raw, xdev->func_id, - vf[i].func_id); - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - - if (!rv) { - qdma_waitq_wait_event_timeout(xdev->wq, - vf[i].func_id == QDMA_FUNC_ID_INVALID, - msecs_to_jiffies(sleep_timeout)); - } - - if (vf[i].func_id != QDMA_FUNC_ID_INVALID) - pr_warn("BYE not recv from func=%d, online_count=%d\n", - vf[i].func_id, xdev->vf_count_online); - } - pr_debug("xdev->vf_count_online=%d\n", xdev->vf_count_online); -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_device.h b/QDMA/linux-kernel/driver/libqdma/qdma_device.h deleted file mode 100755 index c860467..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_device.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef LIBQDMA_QDMA_DEVICE_H_ -#define LIBQDMA_QDMA_DEVICE_H_ -/** - * @file - * @brief This file contains the declarations for QDMA device - * - */ -#include <linux/spinlock_types.h> -#include "libqdma_export.h" -#include "qdma_access_common.h" - -/** - * forward declaration for qdma descriptor - */ -struct qdma_descq; -/** - * forward declaration for xlnx_dma_dev - */ -struct xlnx_dma_dev; - -/** - * @struct - qdma_dev - * @brief qdma device per function - */ -struct qdma_dev { - /** flag indicates whether the fmap programming is completed or not */ - u8 init_qrange:1; - /** filler */ - u8 filler[3]; - /** max number of queues per function */ - unsigned short qmax; - /** queue start number for this function */ - unsigned short qbase; - /** qdma_dev lock */ - spinlock_t lock; - /** h2c descq list */ - struct qdma_descq *h2c_descq; - /** c2h descq list */ - struct qdma_descq *c2h_descq; - /** cmpt descq list */ - struct qdma_descq *cmpt_descq; -}; - -/** - * macro to convert the given xdev to qdev - */ -#define xdev_2_qdev(xdev) (struct qdma_dev *)((xdev)->dev_priv) - -/*****************************************************************************/ -/** - * qdma_device_init() - initializes the qdma device - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return -1: failure - *****************************************************************************/ -int qdma_device_init(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * qdma_device_cleanup() - clean up the qdma device - * - * @param[in] xdev: pointer to xdev - * - * @return none - *****************************************************************************/ -void qdma_device_cleanup(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * qdma_device_get_descq_by_id() - get the qhndl for descq - * - * @param[in] xdev: pointer to xdev - * @param[in] descq: pointer to the descq - * - * @return qhndl for descq on success - * @return <0 on failure - *****************************************************************************/ -long qdma_device_get_id_from_descq(struct xlnx_dma_dev *xdev, - struct qdma_descq *descq); -/*****************************************************************************/ -/** - * qdma_device_get_descq_by_id() - get the descq using the qid - * - * @param[in] xdev: pointer to xdev - * @param[in] idx: sw qidx - * @param[in] init: indicates whether to initialize the device or not - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return pointer to descq on success - * @return NULL on failure - *****************************************************************************/ -struct qdma_descq *qdma_device_get_descq_by_id(struct xlnx_dma_dev *xdev, - unsigned long idx, char *buf, int buflen, int init); - -#ifdef DEBUGFS -/*****************************************************************************/ -/** - * qdma_device_get_pair_descq_by_id() - get the descq using the qid - * - * @param[in] xdev: pointer to xdev - * @param[in] idx: sw qidx - * @param[in] init: indicates whether to initialize the device or not - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return pointer to descq on success - * @return NULL on failure - *****************************************************************************/ -struct qdma_descq *qdma_device_get_pair_descq_by_id(struct xlnx_dma_dev *xdev, - unsigned long idx, char *buf, int buflen, int init); -#endif - -/*****************************************************************************/ -/** - * qdma_device_get_descq_by_hw_qid() - get the descq using the hw qid - * - * @param[in] xdev: pointer to xdev - * @param[in] qidx_hw: hw qidx - * @param[in] c2h: indicates whether hw qidx belongs to c2h or h2c - * - * @return pointer to descq on success - * @return NULL on failure - *****************************************************************************/ -struct qdma_descq *qdma_device_get_descq_by_hw_qid(struct xlnx_dma_dev *xdev, - unsigned long qidx_hw, u8 c2h); - -/*****************************************************************************/ -/** - * qdma_device_prep_q_resource() - Prepare queue resources - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_device_prep_q_resource(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * qdma_device_interrupt_setup() - Setup device itnerrupts - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_device_interrupt_setup(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * qdma_device_interrupt_cleanup() - Celanup device interrupts - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -void qdma_device_interrupt_cleanup(struct xlnx_dma_dev *xdev); - -#ifdef __QDMA_VF__ -/*****************************************************************************/ -/** - * device_set_qconf() - set device conf - * - * @param[in] xdev: pointer to xdev - * @param[in] qmax: maximum request qsize for VF instance - * @param[in] qbase: queue base - * - * @return 0: success - * @return < 0: failure - *****************************************************************************/ -int device_set_qconf(struct xlnx_dma_dev *xdev, int *qmax, int *qbase); - -#endif - - -enum csr_type { - QDMA_CSR_TYPE_NONE, - QDMA_CSR_TYPE_RNGSZ, /** all global csr ring size settings */ - QDMA_CSR_TYPE_BUFSZ, /** all global csr buffer size settings */ - QDMA_CSR_TYPE_TIMER_CNT, /** all global csr timer count settings */ - QDMA_CSR_TYPE_CNT_TH, /** all global csr counter thresh settings */ - - QDMA_CSR_TYPE_MAX -}; - -/*****************************************************************************/ -/** - * qdma_csr_read() - Read specific global csr registers - * - * @param[in] xdev: pointer to xdev - * @param[out] csr: csr value - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_csr_read(struct xlnx_dma_dev *xdev, struct global_csr_conf *csr); - -/*****************************************************************************/ -/** - * qdma_set_ring_sizes() - Wrapper function to set the ring sizes values - * - * @param[in] xdev: pointer to xdev - * @param[in] index: Index from where the values needs to written - * @param[in] count: number of entries to be written - * @param[in] glbl_rng_sz: pointer to array of global ring sizes - * - * @return 0 on success - * @return <0 on failure - *****************************************************************************/ -int qdma_set_ring_sizes(struct xlnx_dma_dev *xdev, u8 index, - u8 count, u32 *glbl_rng_sz); - -/*****************************************************************************/ -/** - * qdma_set_ring_sizes() - Wrapper function to set the ring sizes values - * - * @param[in] xdev: pointer to xdev - * @param[in] index: Index from where the values needs to written - * @param[in] count: number of entries to be written - * @param[out] glbl_rng_sz: pointer to array of global ring sizes - * - * @return 0 on success - * @return <0 on failure - *****************************************************************************/ -int qdma_get_ring_sizes(struct xlnx_dma_dev *xdev, u8 index, - u8 count, u32 *glbl_rng_sz); - - -/*****************************************************************************/ -/** - * qdma_pf_trigger_vf_reset() - Function to trigger FLR of all the VFs on PF - * - * @param[in] dev_hndl: Handle of the xdev - *****************************************************************************/ -void qdma_pf_trigger_vf_reset(unsigned long dev_hndl); - -/** - * qdma_pf_trigger_vf_offline() - Function to trigger offline of all the VFs - * - * @param[in] dev_hndl: Handle of the xdev - *****************************************************************************/ -void qdma_pf_trigger_vf_offline(unsigned long dev_hndl); -#endif /* LIBQDMA_QDMA_DEVICE_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_intr.c b/QDMA/linux-kernel/driver/libqdma/qdma_intr.c deleted file mode 100755 index 1a90a42..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_intr.c +++ /dev/null @@ -1,1024 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include <linux/kernel.h> -#include "qdma_descq.h" -#include "qdma_device.h" -#include "qdma_regs.h" -#include "thread.h" -#include "version.h" -#include "qdma_mbox_protocol.h" -#include "qdma_intr.h" -#ifdef DUMP_ON_ERROR_INTERRUPT -#include "qdma_reg_dump.h" -#endif -#include "qdma_access_common.h" - -#ifndef __QDMA_VF__ -static LIST_HEAD(legacy_intr_q_list); -static spinlock_t legacy_intr_lock; -static spinlock_t legacy_q_add_lock; -static unsigned long legacy_intr_flags = IRQF_SHARED; -#endif - - -#ifndef __QDMA_VF__ -#ifdef DUMP_ON_ERROR_INTERRUPT -#define REG_BANNER_LEN (81 * 5) -static int dump_qdma_regs(struct xlnx_dma_dev *xdev) -{ - int len = 0, dis_len = 0; - int rv; - char *buf = NULL, *tbuff = NULL; - int buflen; - char temp_buf[512]; - - if (!xdev) { - pr_err("Invalid device\n"); - return -EINVAL; - } - - rv = qdma_reg_dump_buf_len((void *)xdev, - xdev->version_info.ip_type, &buflen); - if (rv < 0) { - pr_err("Failed to get reg dump buffer length\n"); - return rv; - } - buflen += REG_BANNER_LEN; - - /** allocate memory */ - tbuff = (char *) kzalloc(buflen, GFP_KERNEL); - if (!tbuff) - return -ENOMEM; - - buf = tbuff; - rv = qdma_dump_config_regs(xdev, buf + len, buflen - len); - if (rv < 0) { - pr_warn("Failed to dump Config Bar register values\n"); - goto free_buf; - } - len += rv; - - *data = buf; - *data_len = buflen; - - buf[++len] = '\0'; - memset(temp_buf, '\0', 512); - for (dis_len = 0; dis_len < len; dis_len += 512) { - memcpy(temp_buf, buf, 512); - pr_info("\n%s", temp_buf); - memset(temp_buf, '\0', 512); - buf += 512; - } - -free_buf: - kfree(tbuf); - return 0; -} -#endif -#endif - -#ifndef MBOX_INTERRUPT_DISABLE -static irqreturn_t mbox_intr_handler(int irq_index, int irq, void *dev_id) -{ - struct xlnx_dma_dev *xdev = dev_id; - struct qdma_mbox *mbox = &xdev->mbox; - - pr_debug("Mailbox IRQ fired on Funtion#%d: index=%d, vector=%d\n", - xdev->func_id, irq_index, irq); - - queue_work(mbox->workq, &mbox->rx_work); - - return IRQ_HANDLED; -} -#endif - -#ifndef USER_INTERRUPT_DISABLE -static irqreturn_t user_intr_handler(int irq_index, int irq, void *dev_id) -{ - struct xlnx_dma_dev *xdev = dev_id; - - pr_debug("User IRQ fired on Funtion#%d: index=%d, vector=%d\n", - xdev->func_id, irq_index, irq); - - if (xdev->conf.fp_user_isr_handler) { -#ifndef __XRT__ - xdev->conf.fp_user_isr_handler((unsigned long)xdev, - xdev->conf.uld); -#else - xdev->conf.fp_user_isr_handler((unsigned long)xdev, - irq_index, xdev->conf.uld); -#endif - } - - return IRQ_HANDLED; -} -#endif - -#ifndef __QDMA_VF__ -static irqreturn_t error_intr_handler(int irq_index, int irq, void *dev_id) -{ - struct xlnx_dma_dev *xdev = dev_id; - - pr_info("Error IRQ fired on Funtion#%d: index=%d, vector=%d\n", - xdev->func_id, irq_index, irq); - - xdev->hw.qdma_hw_error_process(xdev); - - xdev->hw.qdma_hw_error_intr_rearm(xdev); -#ifdef DUMP_ON_ERROR_INTERRUPT - dump_qdma_regs(xdev); -#endif - return IRQ_HANDLED; -} -#endif - -static void data_intr_aggregate(struct xlnx_dma_dev *xdev, int vidx, int irq, - u64 timestamp) -{ - struct qdma_descq *descq = NULL; - u32 counter = 0; - struct intr_coal_conf *coal_entry = - (xdev->intr_coal_list + vidx - xdev->dvec_start_idx); - union qdma_intr_ring *ring_entry; - struct qdma_intr_cidx_reg_info *intr_cidx_info; - uint8_t color = 0; - uint8_t intr_type = 0; - uint32_t qid = 0; - uint32_t num_entries_processed = 0; - - - if (!coal_entry) { - pr_err("Failed to locate the coalescing entry for vector = %d\n", - vidx); - return; - } - intr_cidx_info = &coal_entry->intr_cidx_info; - pr_debug("INTR_COAL: msix[%d].vector=%d, msix[%d].entry=%d, rngsize=%d, cidx = %d\n", - vidx, xdev->msix[vidx].vector, - vidx, - xdev->msix[vidx].entry, - coal_entry->intr_rng_num_entries, - intr_cidx_info->sw_cidx); - - pr_debug("vidx = %d, dvec_start_idx = %d\n", vidx, - xdev->dvec_start_idx); - - if ((xdev->msix[vidx].entry) != coal_entry->vec_id) { - pr_err("msix[%d].entry[%d] != vec_id[%d]\n", - vidx, xdev->msix[vidx].entry, - coal_entry->vec_id); - - return; - } - - counter = intr_cidx_info->sw_cidx; - ring_entry = (coal_entry->intr_ring_base + counter); - if (!ring_entry) { - pr_err("Failed to locate the ring entry for vector = %d\n", - vidx); - return; - } - - do { - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - (xdev->version_info.device_type == - QDMA_DEVICE_VERSAL_CPM4)) { - color = ring_entry->ring_cpm.coal_color; - intr_type = ring_entry->ring_cpm.intr_type; - qid = ring_entry->ring_cpm.qid; - } else { - color = ring_entry->ring_generic.coal_color; - intr_type = ring_entry->ring_generic.intr_type; - qid = ring_entry->ring_generic.qid; - } - - if (color != coal_entry->color) - break; - pr_debug("IRQ[%d]: IVE[%d], Qid = %d, e_color = %d, c_color = %d, intr_type = %d\n", - irq, vidx, qid, coal_entry->color, - color, intr_type); - - descq = qdma_device_get_descq_by_hw_qid(xdev, qid, - intr_type); - if (!descq) { - pr_err("IRQ[%d]: IVE[%d], Qid = %d: desc not found\n", - irq, vidx, qid); - return; - } - xdev->prev_descq = descq; - pr_debug("IRQ[%d]: IVE[%d], Qid = %d, e_color = %d, c_color = %d, intr_type = %d\n", - irq, vidx, qid, coal_entry->color, - color, intr_type); - - if (descq->conf.ping_pong_en && - descq->conf.q_type == Q_C2H && descq->conf.st) - descq->ping_pong_rx_time = timestamp; - - if (descq->conf.fp_descq_isr_top) { - descq->conf.fp_descq_isr_top(descq->q_hndl, - descq->conf.quld); - } else { - if (descq->cpu_assigned) - schedule_work_on(descq->intr_work_cpu, - &descq->work); - else - schedule_work(&descq->work); - } - - if (++intr_cidx_info->sw_cidx == - coal_entry->intr_rng_num_entries) { - counter = 0; - xdev->intr_coal_list->color = - (xdev->intr_coal_list->color) ? 0 : 1; - intr_cidx_info->sw_cidx = 0; - } else - counter++; - num_entries_processed++; - ring_entry = (coal_entry->intr_ring_base + counter); - } while (1); - - if (descq) { - queue_intr_cidx_update(descq->xdev, - descq->conf.qidx, &coal_entry->intr_cidx_info); - } else if (num_entries_processed == 0) { - pr_debug("No entries processed\n"); - descq = xdev->prev_descq; - if (descq) { - pr_debug("Doing stale update\n"); - queue_intr_cidx_update(descq->xdev, - descq->conf.qidx, &coal_entry->intr_cidx_info); - } - } - -} - -static void data_intr_direct(struct xlnx_dma_dev *xdev, int vidx, int irq, - u64 timestamp) -{ - struct qdma_descq *descq; - unsigned long flags; - struct list_head *descq_list = - &xdev->dev_intr_info_list[vidx].intr_list; - struct list_head *entry, *tmp; - - spin_lock_irqsave(&xdev->dev_intr_info_list[vidx].vec_q_list, - flags); - list_for_each_safe(entry, tmp, descq_list) { - descq = container_of(entry, struct qdma_descq, intr_list); - - if (descq->conf.ping_pong_en && - descq->conf.q_type == Q_C2H && descq->conf.st) - descq->ping_pong_rx_time = timestamp; - - if (descq->conf.fp_descq_isr_top) { - descq->conf.fp_descq_isr_top(descq->q_hndl, - descq->conf.quld); - } else { - if (descq->cpu_assigned) - schedule_work_on(descq->intr_work_cpu, - &descq->work); - else - schedule_work(&descq->work); - } - } - spin_unlock_irqrestore(&xdev->dev_intr_info_list[vidx].vec_q_list, - flags); -} - -static irqreturn_t data_intr_handler(int vector_index, int irq, void *dev_id) -{ - struct xlnx_dma_dev *xdev = dev_id; - u64 timestamp; - - pr_debug("%s: Data IRQ fired on Funtion#%05x: index=%d, vector=%d\n", - xdev->mod_name, xdev->func_id, vector_index, irq); - timestamp = rdtsc_gettime(); - - if ((xdev->conf.qdma_drv_mode == INDIRECT_INTR_MODE) || - (xdev->conf.qdma_drv_mode == AUTO_MODE)) - data_intr_aggregate(xdev, vector_index, irq, timestamp); - else - data_intr_direct(xdev, vector_index, irq, timestamp); - - return IRQ_HANDLED; -} - -static inline void intr_ring_free(struct xlnx_dma_dev *xdev, int ring_sz, - int intr_desc_sz, u8 *intr_desc, dma_addr_t desc_bus) -{ - unsigned int len = ring_sz * intr_desc_sz; - - pr_debug("free %u(0x%x)=%d*%u, 0x%p, bus 0x%llx.\n", - len, len, intr_desc_sz, ring_sz, intr_desc, desc_bus); - - dma_free_coherent(&xdev->conf.pdev->dev, (size_t)ring_sz * intr_desc_sz, - intr_desc, desc_bus); -} - -static void *intr_ring_alloc(struct xlnx_dma_dev *xdev, int ring_sz, - int intr_desc_sz, dma_addr_t *bus) -{ - unsigned int len = ring_sz * intr_desc_sz; - u8 *p = dma_alloc_coherent(&xdev->conf.pdev->dev, len, bus, GFP_KERNEL); - - if (!p) { - pr_err("%s, OOM, sz ring %d, intr_desc %d.\n", - xdev->conf.name, ring_sz, intr_desc_sz); - return NULL; - } - - memset(p, 0, len); - - pr_debug("alloc %u(0x%x)=%d*%u, bus 0x%llx .\n", - len, len, intr_desc_sz, ring_sz, *bus); - - return p; -} - -#ifdef __QDMA_VF__ -static void intr_context_invalidate(struct xlnx_dma_dev *xdev) -{ - int i = 0; - struct mbox_msg *m; - int rv = 0; - struct mbox_msg_intr_ctxt ictxt; - struct intr_coal_conf *ring_entry; - - m = qdma_mbox_msg_alloc(); - if (!m) - return; - memset(&ictxt, 0, sizeof(struct mbox_msg_intr_ctxt)); - ictxt.num_rings = QDMA_NUM_DATA_VEC_FOR_INTR_CXT; - - for (i = 0; i < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; i++) { - ictxt.ring_index_list[i] = - get_intr_ring_index(xdev, xdev->dvec_start_idx + i); - } - qdma_mbox_compose_vf_intr_ctxt_invalidate(xdev->func_id, - &ictxt, m->raw); - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - pr_err("%s invalidate interrupt context failed %d.\n", - xdev->conf.name, rv); - } - - qdma_mbox_msg_free(m); - - for (i = 0; i < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; i++) { - ring_entry = (xdev->intr_coal_list + i); - if (ring_entry) { - intr_ring_free(xdev, - ring_entry->intr_rng_num_entries, - sizeof(union qdma_intr_ring), - (u8 *)ring_entry->intr_ring_base, - ring_entry->intr_ring_bus); - } - } - -} -#else -static void intr_context_invalidate(struct xlnx_dma_dev *xdev) -{ - int i = 0; - unsigned int ring_index = 0; - struct intr_coal_conf *ring_entry; - int rv = 0; - - while (i < QDMA_NUM_DATA_VEC_FOR_INTR_CXT) { - ring_index = get_intr_ring_index(xdev, - (i + xdev->dvec_start_idx)); - rv = xdev->hw.qdma_indirect_intr_ctx_conf(xdev, ring_index, - NULL, QDMA_HW_ACCESS_INVALIDATE); - if (rv < 0) { - pr_err("Intr ctxt invalidate failed, err = %d", - rv); - return; - } - ring_entry = (xdev->intr_coal_list + i); - if (ring_entry) { - intr_ring_free(xdev, - ring_entry->intr_rng_num_entries, - sizeof(union qdma_intr_ring), - (u8 *)ring_entry->intr_ring_base, - ring_entry->intr_ring_bus); - } - i++; - } - -} -#endif - -void intr_ring_teardown(struct xlnx_dma_dev *xdev) -{ - intr_context_invalidate(xdev); - kfree(xdev->intr_coal_list); -} - -static void data_vector_handler(int irq, struct xlnx_dma_dev *xdev) -{ - int i; - - for (i = 0; i < xdev->num_vecs; i++) { - if (xdev->msix[i].vector == irq) { - xdev->dev_intr_info_list[i].intr_vec_map.intr_handler(i, - irq, (void *)xdev); - break; - } - } -} - -static irqreturn_t irq_bottom(int irq, void *dev_id) -{ - struct xlnx_dma_dev *xdev = dev_id; - - data_vector_handler(irq, xdev); - - return IRQ_HANDLED; -} - -static irqreturn_t irq_top(int irq, void *dev_id) -{ - struct xlnx_dma_dev *xdev = dev_id; - - if (xdev->conf.fp_q_isr_top_dev) { - xdev->conf.fp_q_isr_top_dev((unsigned long)xdev, - xdev->conf.uld); - } - - return IRQ_WAKE_THREAD; -} - - -void intr_teardown(struct xlnx_dma_dev *xdev) -{ - int i = xdev->num_vecs; - - while (--i >= 0) - free_irq(xdev->msix[i].vector, xdev); - - if (xdev->num_vecs) - pci_disable_msix(xdev->conf.pdev); - - kfree(xdev->msix); - kfree(xdev->dev_intr_info_list); -} - - -static int intr_vector_setup(struct xlnx_dma_dev *xdev, int idx, - enum intr_type_list type, f_intr_handler handler) -{ - int rv; - - if (type == INTR_TYPE_ERROR) - snprintf(xdev->dev_intr_info_list[idx].msix_name, - QDMA_DEV_NAME_MAXLEN + 16, "%s-error", - xdev->conf.name); - - if (type == INTR_TYPE_USER) -#ifndef USER_INTERRUPT_DISABLE - snprintf(xdev->dev_intr_info_list[idx].msix_name, - QDMA_DEV_NAME_MAXLEN + 16, "%s-user", xdev->conf.name); -#else - return -EINVAL; -#endif - if (type == INTR_TYPE_DATA) - snprintf(xdev->dev_intr_info_list[idx].msix_name, - QDMA_DEV_NAME_MAXLEN + 16, "%s-data", xdev->conf.name); - if (type == INTR_TYPE_MBOX) -#ifndef MBOX_INTERRUPT_DISABLE - snprintf(xdev->dev_intr_info_list[idx].msix_name, - QDMA_DEV_NAME_MAXLEN + 16, "%s-mbox", xdev->conf.name); -#else - return -EINVAL; -#endif - - xdev->dev_intr_info_list[idx].intr_vec_map.intr_type = type; - xdev->dev_intr_info_list[idx].intr_vec_map.intr_vec_index = idx; - xdev->dev_intr_info_list[idx].intr_vec_map.intr_handler = handler; - - if ((type == INTR_TYPE_DATA) || (type == INTR_TYPE_MBOX)) { - rv = request_irq(xdev->msix[idx].vector, irq_bottom, 0, - xdev->dev_intr_info_list[idx].msix_name, xdev); - } else - rv = request_threaded_irq(xdev->msix[idx].vector, irq_top, - irq_bottom, 0, - xdev->dev_intr_info_list[idx].msix_name, - xdev); - - pr_debug("%s requesting IRQ vector #%d: vec %d, type %d, %s.\n", - xdev->conf.name, idx, xdev->msix[idx].vector, - type, xdev->dev_intr_info_list[idx].msix_name); - - if (rv) { - pr_err("%s requesting IRQ vector #%d: vec %d failed %d.\n", - xdev->conf.name, idx, xdev->msix[idx].vector, rv); - return rv; - } - - return 0; -} -#ifdef __PCI_MSI_VEC_COUNT__ - -#define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1) - -static int pci_msix_vec_count(struct pci_dev *dev) -{ - u16 control; - - if (!dev->msix_cap) - return 0; - - pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control); - return msix_table_size(control); -} -#endif - -int intr_setup(struct xlnx_dma_dev *xdev) -{ - int rv = 0; - int i = 0; - int num_vecs = 0; - int num_vecs_req = 0; -#ifndef USER_INTERRUPT_DISABLE - int intr_count = 0; -#endif - - if ((xdev->conf.qdma_drv_mode == POLL_MODE) || - (xdev->conf.qdma_drv_mode == LEGACY_INTR_MODE)) { - goto exit; - } - num_vecs = pci_msix_vec_count(xdev->conf.pdev); - pr_debug("dev %s, xdev->num_vecs = %d\n", - dev_name(&xdev->conf.pdev->dev), xdev->num_vecs); - - if (num_vecs == 0) { - pr_warn("MSI-X not supported, running in polled mode\n"); - return 0; - } - - if (xdev->conf.data_msix_qvec_max == 0) { - pr_err("At least 1 data vector is required. input invalid: data_masix_qvec_max(%u)", - xdev->conf.data_msix_qvec_max); - return -EINVAL; - } - - xdev->num_vecs = min_t(int, num_vecs, xdev->conf.msix_qvec_max); - if (xdev->num_vecs < xdev->conf.msix_qvec_max) - pr_info("current device supports only (%u) msix vectors per function. ignoring input for (%u) vectors", - xdev->num_vecs, - xdev->conf.msix_qvec_max); - - /** Make sure the total supported vectors = - * (user vectors + data vectors + 1 error vectors - * + 1 mailbox vectors) - * find the requested vectors and check the available vectors - * can satisfy the request - */ - num_vecs_req = xdev->conf.user_msix_qvec_max + - xdev->conf.data_msix_qvec_max; - - /** Dedicate 1 vector for error interrupts */ - if (xdev->conf.master_pf) - num_vecs_req++; - -#ifndef MBOX_INTERRUPT_DISABLE - /** Dedicate 1 vector for mailbox interrupts */ - if (qdma_mbox_is_irq_availabe(xdev)) - num_vecs_req++; -#endif - - if (num_vecs_req > xdev->num_vecs) { - pr_warn("Available vectors(%u) is less than Requested vectors(%u) [u:%u|d:%u]\n", - xdev->num_vecs, - num_vecs_req, - xdev->conf.user_msix_qvec_max, - xdev->conf.data_msix_qvec_max); - return -EINVAL; - } - - xdev->msix = kzalloc((sizeof(struct msix_entry) * xdev->num_vecs), - GFP_KERNEL); - if (!xdev->msix) { - pr_err("dev %s xdev->msix OOM.\n", - dev_name(&xdev->conf.pdev->dev)); - rv = -ENOMEM; - goto exit; - } - - xdev->dev_intr_info_list = - kzalloc((sizeof(struct intr_info_t) * xdev->num_vecs), - GFP_KERNEL); - if (!xdev->dev_intr_info_list) { - pr_err("dev %s xdev->dev_intr_info_list OOM.\n", - dev_name(&xdev->conf.pdev->dev)); - rv = -ENOMEM; - goto free_msix; - } - - for (i = 0; i < xdev->num_vecs; i++) { - xdev->msix[i].entry = i; - INIT_LIST_HEAD(&xdev->dev_intr_info_list[i].intr_list); - spin_lock_init(&xdev->dev_intr_info_list[i].vec_q_list); - } - -#if KERNEL_VERSION(4, 12, 0) <= LINUX_VERSION_CODE - rv = pci_enable_msix_exact(xdev->conf.pdev, xdev->msix, xdev->num_vecs); -#else - rv = pci_enable_msix(xdev->conf.pdev, xdev->msix, xdev->num_vecs); -#endif - if (rv < 0) { - pr_err("Error enabling MSI-X (%d)\n", rv); - goto free_intr_info; - } - - /** On master PF0, vector#2 is dedicated for Error interrupts and - * vector #1 is dedicated for User interrupts - * For all other PFs and VFs, vector#0 is dedicated for User interrupts - * The remaining vectors are for Data interrupts - */ - i = 0; /* This is mandatory, do not delete */ - -#ifndef MBOX_INTERRUPT_DISABLE - if (qdma_mbox_is_irq_availabe(xdev)) { - /* Mail box interrupt */ - rv = intr_vector_setup(xdev, i, INTR_TYPE_MBOX, - mbox_intr_handler); - if (rv) - goto cleanup_irq; - i++; - } -#endif - -#ifndef USER_INTERRUPT_DISABLE - for (intr_count = 0; - intr_count < xdev->conf.user_msix_qvec_max; - intr_count++) { - /* user interrupt */ - rv = intr_vector_setup(xdev, i, INTR_TYPE_USER, - user_intr_handler); - if (rv) - goto cleanup_irq; - i++; - } -#endif - -#ifndef __QDMA_VF__ - /* global error interrupt */ - if (xdev->conf.master_pf) { - rv = intr_vector_setup(xdev, i, INTR_TYPE_ERROR, - error_intr_handler); - if (rv) - goto cleanup_irq; - i++; - } -#endif - - /* data interrupt */ - xdev->dvec_start_idx = i; - for (; i < xdev->num_vecs; i++) { - rv = intr_vector_setup(xdev, i, INTR_TYPE_DATA, - data_intr_handler); - if (rv) - goto cleanup_irq; - } - - xdev->flags |= XDEV_FLAG_IRQ; - return rv; - -cleanup_irq: - while (--i >= 0) - free_irq(xdev->msix[i].vector, xdev); - - pci_disable_msix(xdev->conf.pdev); - xdev->num_vecs = 0; -free_intr_info: - kfree(xdev->dev_intr_info_list); -free_msix: - kfree(xdev->msix); -exit: - return rv; -} - - - -#ifndef __QDMA_VF__ -static irqreturn_t irq_legacy(int irq, void *irq_data) -{ - struct list_head *entry, *tmp; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)irq_data; - irqreturn_t ret = IRQ_NONE; - - if (!xdev) { - pr_err("Invalid Xdev"); - goto irq_return; - } - - spin_lock_irqsave(&legacy_intr_lock, legacy_intr_flags); - if (!xdev->hw.qdma_is_legacy_intr_pend(xdev)) { - - list_for_each_safe(entry, tmp, &legacy_intr_q_list) { - struct qdma_descq *descq = - container_of(entry, - struct qdma_descq, - legacy_intr_q_list); - - qdma_descq_service_cmpl_update(descq, 0, 1); - } - xdev->hw.qdma_clear_pend_legacy_intr(xdev); - xdev->hw.qdma_legacy_intr_conf(xdev, ENABLE); - ret = IRQ_HANDLED; - } - spin_unlock_irqrestore(&legacy_intr_lock, legacy_intr_flags); - -irq_return: - return ret; -} - -void intr_legacy_clear(struct qdma_descq *descq) -{ - - if (!descq) { - pr_err("Invalid descq received"); - return; - } - list_del(&descq->legacy_intr_q_list); - - if (list_empty(&legacy_intr_q_list)) { - - pr_info("un-registering legacy interrupt from qdma%05x\n", - descq->xdev->conf.bdf); - - descq->xdev->hw.qdma_legacy_intr_conf(descq->xdev, DISABLE); - - free_irq(descq->xdev->conf.pdev->irq, descq->xdev); - } -} - -int intr_legacy_setup(struct qdma_descq *descq) -{ - int req_irq = 0; - int rv = 0; - - if (!descq) { - pr_err("Invalid descq received"); - return -EINVAL; - } - - spin_lock(&legacy_q_add_lock); - req_irq = list_empty(&legacy_intr_q_list); - rv = req_irq ? 0 : 1; - - if (req_irq != 0) { - spin_lock_init(&legacy_intr_lock); - pr_debug("registering legacy interrupt for irq-%d from qdma%05x\n", - descq->xdev->conf.pdev->irq, descq->xdev->conf.bdf); - - if (descq->xdev->hw.qdma_legacy_intr_conf(descq->xdev, - DISABLE)) { - spin_unlock(&legacy_q_add_lock); - return -EINVAL; - } - - rv = request_threaded_irq(descq->xdev->conf.pdev->irq, irq_top, - irq_legacy, legacy_intr_flags, - "qdma legacy intr", - descq->xdev); - - if (rv < 0) - goto exit_intr_setup; - else { - list_add_tail(&descq->legacy_intr_q_list, - &legacy_intr_q_list); - rv = 0; - } - if (descq->xdev->hw.qdma_legacy_intr_conf(descq->xdev, - ENABLE)) { - spin_unlock(&legacy_q_add_lock); - return -EINVAL; - } - } else - list_add_tail(&descq->legacy_intr_q_list, - &legacy_intr_q_list); - -exit_intr_setup: - spin_unlock(&legacy_q_add_lock); - return rv; -} -#endif - -int intr_ring_setup(struct xlnx_dma_dev *xdev) -{ - int num_entries = 0; - int counter = 0; - struct intr_coal_conf *intr_coal_list; - struct intr_coal_conf *intr_coal_list_entry; - - if ((xdev->conf.qdma_drv_mode != INDIRECT_INTR_MODE) && - (xdev->conf.qdma_drv_mode != AUTO_MODE)) { - pr_debug("skipping interrupt aggregation: driver is loaded in %s mode\n", - mode_name_list[xdev->conf.qdma_drv_mode].name); - xdev->intr_coal_list = NULL; - return 0; - } - - /** For master_pf, vec1 and vec2 is used for - * error and user interrupts - * for other pfs, vec0 is used for user interrupts - */ - if (xdev->num_vecs != 0) { - pr_debug("dev %s num_vectors[%d] < num_queues [%d]\n", - dev_name(&xdev->conf.pdev->dev), - xdev->num_vecs, - xdev->conf.qsets_max); - pr_debug("Enabling Interrupt aggregation\n"); - - /** obtain the number of queue entries - * in each inr_ring based on ring size - */ - num_entries = ((xdev->conf.intr_rngsz + 1) * 512); - - pr_debug("%s interrupt coalescing ring with %d entries\n", - dev_name(&xdev->conf.pdev->dev), num_entries); - /** - * Initially assuming that each vector has the same size of the - * ring, In practical it is possible to have different ring - * size of different vectors (?) - */ - intr_coal_list = kzalloc( - sizeof(struct intr_coal_conf) * - QDMA_NUM_DATA_VEC_FOR_INTR_CXT, - GFP_KERNEL); - if (!intr_coal_list) { - pr_err("dev %s num_vecs %d OOM.\n", - dev_name(&xdev->conf.pdev->dev), - QDMA_NUM_DATA_VEC_FOR_INTR_CXT); - return -ENOMEM; - } - - for (counter = 0; - counter < QDMA_NUM_DATA_VEC_FOR_INTR_CXT; - counter++) { - intr_coal_list_entry = (intr_coal_list + counter); - intr_coal_list_entry->intr_rng_num_entries = - num_entries; - intr_coal_list_entry->intr_ring_base = intr_ring_alloc( - xdev, num_entries, - sizeof(union qdma_intr_ring), - &intr_coal_list_entry->intr_ring_bus); - if (!intr_coal_list_entry->intr_ring_base) { - pr_err("dev %s, sz %u, intr_desc ring OOM.\n", - xdev->conf.name, - intr_coal_list_entry->intr_rng_num_entries); - goto err_out; - } - - intr_coal_list_entry->vec_id = - xdev->msix[counter + xdev->dvec_start_idx].entry; - intr_coal_list_entry->intr_cidx_info.sw_cidx = 0; - intr_coal_list_entry->color = 1; - intr_coal_list_entry->intr_cidx_info.rng_idx = - get_intr_ring_index(xdev, - intr_coal_list_entry->vec_id); - pr_debug("ring_number = %d, vector_index = %d, ring_size = %d, ring_base = 0x%08x", - counter, intr_coal_list_entry->vec_id, - intr_coal_list_entry->intr_rng_num_entries, - (unsigned int)intr_coal_list_entry->intr_ring_bus); - } - - pr_debug("dev %s interrupt coalescing ring setup successful\n", - dev_name(&xdev->conf.pdev->dev)); - - xdev->intr_coal_list = intr_coal_list; - } else { - pr_info("dev %s intr vec[%d] >= queues[%d], No aggregation\n", - dev_name(&xdev->conf.pdev->dev), - (xdev->num_vecs - xdev->dvec_start_idx), - xdev->conf.qsets_max); - - xdev->intr_coal_list = NULL; - /* Fallback from indirect interrupt mode */ - xdev->conf.qdma_drv_mode = POLL_MODE; - } - return 0; - -err_out: - while (--counter >= 0) { - intr_coal_list_entry = (intr_coal_list + counter); - intr_ring_free(xdev, intr_coal_list_entry->intr_rng_num_entries, - sizeof(union qdma_intr_ring), - (u8 *)intr_coal_list_entry->intr_ring_base, - intr_coal_list_entry->intr_ring_bus); - } - kfree(intr_coal_list); - return -ENOMEM; -} - -void intr_work(struct work_struct *work) -{ - struct qdma_descq *descq; - - descq = container_of(work, struct qdma_descq, work); - qdma_descq_service_cmpl_update(descq, 0, 1); -} - -/** - * qdma_queue_service - service the queue - * in the case of irq handler is registered by the user, the user should - * call qdma_queue_service() in its interrupt handler to service the queue - * @dev_hndl: hndl retured from qdma_device_open() - * @qhndl: hndl retured from qdma_queue_add() - */ -int qdma_queue_service(unsigned long dev_hndl, unsigned long id, int budget, - bool c2h_upd_cmpl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, NULL, 0, 0); - if (descq) - return qdma_descq_service_cmpl_update(descq, - budget, c2h_upd_cmpl); - - return -EINVAL; -} - -static u8 get_intr_vec_index(struct xlnx_dma_dev *xdev, u8 intr_type) -{ - int i = 0; - - for (i = 0; i < xdev->num_vecs; i++) { - if (xdev->dev_intr_info_list[i].intr_vec_map.intr_type == - intr_type) { - struct intr_info_t *dev_intr_info_list = - &xdev->dev_intr_info_list[i]; - return dev_intr_info_list->intr_vec_map.intr_vec_index; - } - } - return 0; -} - -int qdma_err_intr_setup(struct xlnx_dma_dev *xdev) -{ - int rv = 0; - u8 err_intr_index = 0; - - err_intr_index = get_intr_vec_index(xdev, INTR_TYPE_ERROR); - - rv = xdev->hw.qdma_hw_error_intr_setup(xdev, xdev->func_id, - err_intr_index); - if (rv < 0) { - pr_err("Failed to setup error interrupt, err = %d", rv); - return -EINVAL; - } - - return 0; -} - -int get_intr_ring_index(struct xlnx_dma_dev *xdev, u32 vector_index) -{ - int ring_index = 0; - - ring_index = (vector_index - xdev->dvec_start_idx) + - (xdev->func_id * QDMA_NUM_DATA_VEC_FOR_INTR_CXT); - pr_debug("func_id = %d, vector_index = %d, ring_index = %d\n", - xdev->func_id, vector_index, ring_index); - - return ring_index; -} - -void intr_legacy_init(void) -{ -#ifndef __QDMA_VF__ - spin_lock_init(&legacy_q_add_lock); -#endif -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_intr.h b/QDMA/linux-kernel/driver/libqdma/qdma_intr.h deleted file mode 100755 index c26174e..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_intr.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef LIBQDMA_QDMA_INTR_H_ -#define LIBQDMA_QDMA_INTR_H_ -/** - * @file - * @brief This file contains the declarations for qdma dev interrupt handlers - * - */ -#include <linux/types.h> -#include <linux/workqueue.h> -#include "qdma_descq.h" -/** - * forward declaration for xlnx_dma_dev - */ -struct xlnx_dma_dev; - -/** - * @struct - qdma_intr_ring_cpm - * @brief Interrupt ring entry definition for 2018.2 CPM release - */ -struct qdma_intr_ring_cpm { - /** producer index. This is from Interrupt source. - * Cumulative pointer of total interrupt Aggregation - * Ring entry written - */ - __be64 pidx:16; - /** consumer index. This is from Interrupt source. - * Cumulative consumed pointer - */ - __be64 cidx:16; - /** source color. This is from Interrupt source. - * This bit inverts every time pidx wraps around - * and this field gets copied to color field of descriptor. - */ - __be64 s_color:1; - /** This is from Interrupt source. - * Interrupt state, 0: CMPT_INT_ISR; 1: CMPT_INT_TRIG; 2: CMPT_INT_ARMED - */ - __be64 intr_satus:2; - /** error. This is from interrupt source - * {C2h_err[1:0], h2c_err[1:0]} - */ - __be64 error:4; - /** 11 reserved bits*/ - __be64 rsvd:11; - /** Is the interrupt raised due to error ? - * 1: error interrupt; 0: non-error interrupt - */ - __be64 error_int:1; - /** interrupt type, 0: H2C; 1: C2H*/ - __be64 intr_type:1; - /** This is from Interrupt source. Queue ID*/ - __be64 qid:11; - /** The color bit of the Interrupt Aggregation Ring. - * This bit inverts every time pidx wraps around on the - * Interrupt Aggregation Ring. - */ - __be64 coal_color:1; -}; - -/** - * @struct - qdma_intr_ring_generic - * @brief Interrupt ring entry definition - */ -struct qdma_intr_ring_generic { - /** producer index. This is from Interrupt source. - * Cumulative pointer of total interrupt Aggregation - * Ring entry written - */ - __be64 pidx:16; - /** consumer index. This is from Interrupt source. - * Cumulative consumed pointer - */ - __be64 cidx:16; - /** source color. This is from Interrupt source. - * This bit inverts every time pidx wraps around - * and this field gets copied to color field of descriptor. - */ - __be64 s_color:1; - /** This is from Interrupt source. - * Interrupt state, 0: CMPT_INT_ISR; 1: CMPT_INT_TRIG; 2: CMPT_INT_ARMED - */ - __be64 intr_satus:2; - /** error. This is from interrupt source - * {C2h_err[1:0], h2c_err[1:0]} - */ - __be64 error:2; - /** 1 reserved bits*/ - __be64 rsvd:1; - /** interrupt type, 0: H2C; 1: C2H*/ - __be64 intr_type:1; - /** This is from Interrupt source. Queue ID*/ - __be64 qid:24; - /** The color bit of the Interrupt Aggregation Ring. - * This bit inverts every time pidx wraps around on the - * Interrupt Aggregation Ring. - */ - __be64 coal_color:1; -}; - -union qdma_intr_ring { - struct qdma_intr_ring_cpm ring_cpm; - struct qdma_intr_ring_generic ring_generic; -}; - - -/*****************************************************************************/ -/** - * intr_teardown() - un register the interrupts for the device - * - * @param[in] xdev: pointer to xdev - * - * @return none - *****************************************************************************/ -void intr_teardown(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * intr_setup() - register the interrupts for the device - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int intr_setup(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * intr_ring_teardown() - delete the interrupt ring - * - * @param[in] xdev: pointer to xdev - * - * @return none - *****************************************************************************/ -void intr_ring_teardown(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * intr_context_setup() - set up the interrupt context - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int intr_context_setup(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * intr_ring_setup() - create the interrupt ring - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int intr_ring_setup(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * intr_legacy_setup() - setup the legacy interrupt handler - * - * @param[in] descq: descq on which the interrupt needs to be setup - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int intr_legacy_setup(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * intr_legacy_clear() - clear the legacy interrupt handler - * - * @param[in] descq: descq on which the interrupt needs to be cleared - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -void intr_legacy_clear(struct qdma_descq *descq); - - -/*****************************************************************************/ -/** - * intr_work() - attach the top half for the interrupt - * - * @param[in] work: pointer to struct work_struct - * - * @return none - *****************************************************************************/ -void intr_work(struct work_struct *work); - -/*****************************************************************************/ -/** - * qdma_err_intr_setup() - set up the error interrupt - * - * @param[in] xdev: pointer to xdev - * - * @return none - *****************************************************************************/ -int qdma_err_intr_setup(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * qdma_enable_hw_err() - enable the hw errors - * - * @param[in] xdev: pointer to xdev - * @param[in] hw_err_type: hw error type - * - * @return none - *****************************************************************************/ -void qdma_enable_hw_err(struct xlnx_dma_dev *xdev, u8 hw_err_type); - -/*****************************************************************************/ -/** - * get_intr_ring_index() - get the interrupt ring index based on vector index - * - * @param[in] xdev: pointer to xdev - * @param[in] vector_index: vector index - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int get_intr_ring_index(struct xlnx_dma_dev *xdev, u32 vector_index); - -#ifndef __QDMA_VF__ -#ifdef ERR_DEBUG -/*****************************************************************************/ -/** - * err_stat_handler() - error interrupt handler - * - * @param[in] xdev: pointer to xdev - * - * @return none - *****************************************************************************/ -void err_stat_handler(struct xlnx_dma_dev *xdev); -#endif -#endif - -#endif /* LIBQDMA_QDMA_DEVICE_H_ */ - diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_license.h b/QDMA/linux-kernel/driver/libqdma/qdma_license.h deleted file mode 100755 index 3175073..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_license.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef LIBQDMA_QDMA_LICENSE_H_ -#define LIBQDMA_QDMA_LICENSE_H_ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#endif /* LIBQDMA_QDMA_LICENSE_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_mbox.c b/QDMA/linux-kernel/driver/libqdma/qdma_mbox.c deleted file mode 100755 index 0161d04..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_mbox.c +++ /dev/null @@ -1,594 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include <linux/kernel.h> -#include <linux/version.h> -#include <linux/string.h> -#include <linux/errno.h> -#include <linux/jiffies.h> -#include <linux/timer.h> -#include <linux/delay.h> -#include <linux/sched.h> - -#include "qdma_compat.h" -#include "xdev.h" -#include "qdma_device.h" -#include "qdma_regs.h" -#include "qdma_context.h" -#include "qdma_intr.h" -#include "qdma_mbox.h" - -#define MBOX_TIMER_INTERVAL (1) - -#ifdef __QDMA_VF__ -#define QDMA_DEV QDMA_DEV_VF -#else -#define QDMA_DEV QDMA_DEV_PF -#endif - -static int mbox_hw_send(struct qdma_mbox *mbox, struct mbox_msg *m) -{ - struct xlnx_dma_dev *xdev = mbox->xdev; - int rv; - - spin_lock_bh(&mbox->hw_tx_lock); - rv = qdma_mbox_send(xdev, QDMA_DEV, m->raw); - spin_unlock_bh(&mbox->hw_tx_lock); - - return rv; -} - -static int mbox_hw_rcv(struct qdma_mbox *mbox, struct mbox_msg *m) -{ - struct xlnx_dma_dev *xdev = mbox->xdev; - int rv; - - spin_lock_bh(&mbox->hw_rx_lock); - memset(m->raw, 0, MBOX_MSG_REG_MAX * - sizeof(uint32_t)); - rv = qdma_mbox_rcv(xdev, QDMA_DEV, m->raw); - spin_unlock_bh(&mbox->hw_rx_lock); - return rv; -} - -/* - * mbox tx message processing - */ -static void mbox_msg_destroy(struct kref *kref) -{ - struct mbox_msg *m = container_of(kref, struct mbox_msg, refcnt); -#ifdef RHEL_RELEASE_VERSION -#if RHEL_RELEASE_VERSION(8, 1) <= RHEL_RELEASE_CODE - vfree(m); -#else - kfree(m); -#endif -#else - kfree(m); -#endif -} - -void __qdma_mbox_msg_free(const char *f, struct mbox_msg *m) -{ - kref_put(&m->refcnt, mbox_msg_destroy); -} - -struct mbox_msg *qdma_mbox_msg_alloc(void) -{ -#ifdef RHEL_RELEASE_VERSION -#if RHEL_RELEASE_VERSION(8, 1) <= RHEL_RELEASE_CODE - struct mbox_msg *m = vmalloc(sizeof(struct mbox_msg)); -#else - struct mbox_msg *m = kzalloc(sizeof(struct mbox_msg), GFP_KERNEL); -#endif -#else - struct mbox_msg *m = kzalloc(sizeof(struct mbox_msg), GFP_KERNEL); -#endif - if (!m) - return NULL; - memset(m, 0, sizeof(struct mbox_msg)); - kref_init(&m->refcnt); - qdma_waitq_init(&m->waitq); - - return m; -} - -int qdma_mbox_msg_send(struct xlnx_dma_dev *xdev, struct mbox_msg *m, - bool wait_resp, unsigned int timeout_ms) -{ - struct qdma_mbox *mbox = &xdev->mbox; - - m->resp_op_matched = 0; - m->wait_resp = wait_resp ? 1 : 0; - m->retry_cnt = (timeout_ms / 1000) + 1; - -#if defined(__QDMA_VF__) - if (xdev->reset_state == RESET_STATE_INVALID) - return -EINVAL; -#endif - /* queue up to ensure order */ - spin_lock_bh(&mbox->list_lock); - list_add_tail(&m->list, &mbox->tx_todo_list); - spin_unlock_bh(&mbox->list_lock); - - /* kick start the tx */ - queue_work(mbox->workq, &mbox->tx_work); - - if (!wait_resp) - return 0; - - qdma_waitq_wait_event_timeout(m->waitq, m->resp_op_matched, - msecs_to_jiffies(timeout_ms)); - - if (!m->resp_op_matched) { - /* delete from mbox list */ - spin_lock_bh(&mbox->list_lock); - list_del(&m->list); - spin_unlock_bh(&mbox->list_lock); - - pr_err("%s mbox timed out. timeout %u ms.\n", - xdev->conf.name, timeout_ms); - - return -EPIPE; - } - - return 0; -} - -/* - * mbox rx message processing - */ -#ifdef __QDMA_VF__ - -static int mbox_rcv_one_msg(struct qdma_mbox *mbox) -{ - struct mbox_msg *m_rcv = &mbox->rx; - struct mbox_msg *m_snd = NULL, *tmp1 = NULL, *tmp2 = NULL; - struct mbox_msg *m_resp = NULL; - int rv = 0; - - if (mbox->xdev->func_id == mbox->xdev->func_id_parent) { - mbox->xdev->func_id = qdma_mbox_vf_func_id_get(m_rcv->raw, - QDMA_DEV); - mbox->xdev->func_id_parent = qdma_mbox_vf_parent_func_id_get( - m_rcv->raw); - } - spin_lock_bh(&mbox->list_lock); - /* check if the sent request expired */ - if (!list_empty(&mbox->rx_pend_list)) { - list_for_each_entry_safe(tmp1, tmp2, &mbox->rx_pend_list, - list) { - if (qdma_mbox_is_msg_response(tmp1->raw, m_rcv->raw)) { - m_snd = tmp1; - m_snd->resp_op_matched = 1; - break; - } - } - } - spin_unlock_bh(&mbox->list_lock); - - if (list_empty(&mbox->rx_pend_list)) { - m_resp = qdma_mbox_msg_alloc(); - if (!m_resp) { - pr_err("Failed to allocate mbox msg\n"); - return -ENOMEM; - } - rv = qdma_mbox_vf_rcv_msg_handler(m_rcv->raw, m_resp->raw); - if (rv == QDMA_MBOX_VF_RESET) { - qdma_mbox_msg_send(mbox->xdev, m_resp, 0, - QDMA_MBOX_MSG_TIMEOUT_MS); - mbox->xdev->reset_state = RESET_STATE_RECV_PF_RESET_REQ; - queue_work(mbox->xdev->workq, - &(mbox->xdev->reset_work)); - } else if (rv == QDMA_MBOX_PF_RESET_DONE) { - mbox->xdev->reset_state = - RESET_STATE_RECV_PF_RESET_DONE; - qdma_waitq_wakeup(&mbox->xdev->wq); - qdma_mbox_msg_send(mbox->xdev, m_resp, 0, - QDMA_MBOX_MSG_TIMEOUT_MS); - - - } else if (rv == QDMA_MBOX_PF_BYE) { - qdma_mbox_msg_send(mbox->xdev, m_resp, 0, - QDMA_MBOX_MSG_TIMEOUT_MS); - mbox->xdev->reset_state = - RESET_STATE_RECV_PF_OFFLINE_REQ; - queue_work(mbox->xdev->workq, - &(mbox->xdev->reset_work)); - } else { - pr_err("func_id=0x%x parent=0x%x", mbox->xdev->func_id, - mbox->xdev->func_id_parent); - } - - } - - if (m_snd) { - /* a matching request is found */ - spin_lock_bh(&mbox->list_lock); - list_del(&m_snd->list); - memcpy(m_snd->raw, m_rcv->raw, MBOX_MSG_REG_MAX * - sizeof(uint32_t)); - /* wake up anyone waiting on the response */ - qdma_waitq_wakeup(&m_snd->waitq); - spin_unlock_bh(&mbox->list_lock); - } - - return 0; -} - -#else -static int mbox_rcv_one_msg(struct qdma_mbox *mbox) -{ - struct mbox_msg *m = &mbox->rx; - struct mbox_msg *m_resp = qdma_mbox_msg_alloc(); - struct mbox_msg *m_snd = NULL, *tmp1 = NULL, *tmp2 = NULL; - int rv; - - if (!m_resp) - return -ENOMEM; - - rv = qdma_mbox_pf_rcv_msg_handler(mbox->xdev, - mbox->xdev->dma_device_index, - mbox->xdev->func_id, - m->raw, m_resp->raw); - - if (rv == QDMA_MBOX_VF_OFFLINE || - rv == QDMA_MBOX_VF_RESET_BYE) { -#ifdef CONFIG_PCI_IOV - uint16_t vf_func_id = qdma_mbox_vf_func_id_get(m->raw, - QDMA_DEV); - - xdev_sriov_vf_offline(mbox->xdev, vf_func_id); -#endif - if (rv == QDMA_MBOX_VF_RESET_BYE) - qdma_mbox_msg_send(mbox->xdev, m_resp, 0, - QDMA_MBOX_MSG_TIMEOUT_MS); - else - qdma_mbox_msg_free(m_resp); - } else if (rv == QDMA_MBOX_VF_ONLINE) { -#ifdef CONFIG_PCI_IOV - uint16_t vf_func_id = qdma_mbox_vf_func_id_get(m->raw, - QDMA_DEV); - - xdev_sriov_vf_online(mbox->xdev, vf_func_id); -#endif - qdma_mbox_msg_send(mbox->xdev, m_resp, 0, - QDMA_MBOX_MSG_TIMEOUT_MS); - } else if (rv == QDMA_MBOX_VF_RESET || - rv == QDMA_MBOX_PF_RESET_DONE || - rv == QDMA_MBOX_PF_BYE) { - spin_lock_bh(&mbox->list_lock); - if (!list_empty(&mbox->rx_pend_list)) { - list_for_each_entry_safe(tmp1, tmp2, - &mbox->rx_pend_list, - list) { - if (qdma_mbox_is_msg_response(tmp1->raw, - m->raw)) { - m_snd = tmp1; - m_snd->resp_op_matched = 1; - break; - } - } - } - if (m_snd) { - list_del(&m_snd->list); - memcpy(m_snd->raw, m->raw, MBOX_MSG_REG_MAX * - sizeof(uint32_t)); - qdma_waitq_wakeup(&m_snd->waitq); - qdma_mbox_msg_free(m_snd); - } - qdma_mbox_msg_free(m_resp); - spin_unlock_bh(&mbox->list_lock); - } else - qdma_mbox_msg_send(mbox->xdev, m_resp, 0, - QDMA_MBOX_MSG_TIMEOUT_MS); - - return 0; -} -#endif - -static inline void mbox_timer_stop(struct qdma_mbox *mbox) -{ - del_timer(&mbox->timer); -} - -static inline void mbox_timer_start(struct qdma_mbox *mbox) -{ - struct timer_list *timer = &mbox->timer; - - qdma_timer_start(timer, MBOX_TIMER_INTERVAL); -} - -/* - * tx & rx workqueue handler - */ -static void mbox_tx_work(struct work_struct *work) -{ - struct qdma_mbox *mbox = container_of(work, struct qdma_mbox, tx_work); - - while (1) { - struct mbox_msg *m = NULL; - - spin_lock_bh(&mbox->list_lock); - if (list_empty(&mbox->tx_todo_list)) { - spin_unlock_bh(&mbox->list_lock); - break; - } - - m = list_first_entry(&mbox->tx_todo_list, - struct mbox_msg, list); - - spin_unlock_bh(&mbox->list_lock); - - if (mbox_hw_send(mbox, m) == 0) { - mbox->send_busy = 0; - spin_lock_bh(&mbox->list_lock); - /* Msg tx successful, remove from list */ - list_del(&m->list); - spin_unlock_bh(&mbox->list_lock); - - /* response needed */ - if (m->wait_resp) { - spin_lock_bh(&mbox->list_lock); - list_add_tail(&m->list, &mbox->rx_pend_list); - spin_unlock_bh(&mbox->list_lock); - } else - qdma_mbox_msg_free(m); - } else { - if (!xlnx_dma_device_flag_check(mbox->xdev, - XDEV_FLAG_OFFLINE)) { - if (!m->wait_resp) { - m->retry_cnt--; - if (!m->retry_cnt) { - spin_lock_bh(&mbox->list_lock); - list_del(&m->list); - spin_unlock_bh( - &mbox->list_lock); - qdma_mbox_msg_free(m); - break; - } - } - mbox->send_busy = 1; - mbox_timer_start(mbox); - } else - qdma_mbox_msg_free(m); - break; - } - } -} - -static void mbox_rx_work(struct work_struct *work) -{ - struct qdma_mbox *mbox = container_of(work, struct qdma_mbox, rx_work); - struct xlnx_dma_dev *xdev = mbox->xdev; - struct mbox_msg *m = &mbox->rx; - int rv; - int mbox_stop = 0; - - rv = mbox_hw_rcv(mbox, m); - while (rv == 0) { - if (unlikely(xlnx_dma_device_flag_check(xdev, - XDEV_FLAG_OFFLINE))) - break; - else if (mbox_rcv_one_msg(mbox) == -EINVAL) - break; - rv = mbox_hw_rcv(mbox, m); - } - - if (rv == -QDMA_ERR_MBOX_ALL_ZERO_MSG) { -#ifdef __QDMA_VF__ - if (xdev->reset_state == RESET_STATE_IDLE) { - mbox_stop = 1; - pr_info("func_id=0x%x parent=0x%x %s: rcv'ed all zeros msg, disable mbox processing.\n", - xdev->func_id, xdev->func_id_parent, - xdev->conf.name); - } -#else - mbox_stop = 1; - pr_info("PF func_id=0x%x %s: rcv'ed all zero mbox msg, disable mbox processing.\n", - xdev->func_id, xdev->conf.name); -#endif - - } else if (xlnx_dma_device_flag_check(xdev, XDEV_FLAG_OFFLINE)) - mbox_stop = 1; - - if (mbox->rx_poll) { - - if (mbox_stop == 1) - mbox_timer_stop(mbox); - else - mbox_timer_start(mbox); - } else { - if (mbox_stop != 0) - qdma_mbox_disable_interrupts(xdev, QDMA_DEV); - } -} - -/* - * non-interrupt mode: use timer for periodic checking of new messages - */ -#if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE -static void mbox_timer_handler(struct timer_list *t) -#else -static void mbox_timer_handler(unsigned long arg) -#endif -{ -#if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE - struct qdma_mbox *mbox = from_timer(mbox, t, timer); -#else - struct qdma_mbox *mbox = (struct qdma_mbox *)arg; -#endif - if (mbox->rx_poll) - queue_work(mbox->workq, &mbox->rx_work); - if (mbox->send_busy) - queue_work(mbox->workq, &mbox->tx_work); -} - -bool qdma_mbox_is_irq_availabe(struct xlnx_dma_dev *xdev) -{ - /*MBOX is available in all QDMA Soft Devices for vivado release > - * 2019.1 - */ - if (((xdev->version_info.device_type == QDMA_DEVICE_SOFT) && - (xdev->version_info.vivado_release >= QDMA_VIVADO_2019_1))) - return true; - /*MBOX is available in all Versal Hard IP from CPM5 onwards */ - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - (xdev->version_info.device_type == QDMA_DEVICE_VERSAL_CPM5)) - return true; - - return false; -} - -/* - * mailbox initialization and cleanup - */ -void qdma_mbox_stop(struct xlnx_dma_dev *xdev) -{ - struct qdma_mbox *mbox = &xdev->mbox; - uint8_t retry_count = 100; - int rv = 0; - -#ifndef __QDMA_VF__ - if (!xdev->dev_cap.mailbox_en) - return; -#endif - do { - spin_lock_bh(&mbox->list_lock); - if (list_empty(&mbox->tx_todo_list)) - break; - spin_unlock_bh(&mbox->list_lock); - mdelay(10); /* sleep 10ms for msgs to be sent or freed */ - } while (1); - spin_unlock_bh(&mbox->list_lock); - - do { - rv = qdma_mbox_out_status(xdev, QDMA_DEV); - if (!rv) - break; - retry_count--; - mdelay(10); - } while (retry_count != 0); - mbox_timer_stop(&xdev->mbox); - pr_debug("func_id=%d retry_count=%d\n", xdev->func_id, retry_count); - if (qdma_mbox_is_irq_availabe(xdev)) { - if (!xdev->mbox.rx_poll) - qdma_mbox_disable_interrupts(xdev, QDMA_DEV); - } -} - -void qdma_mbox_start(struct xlnx_dma_dev *xdev) -{ - -#ifndef __QDMA_VF__ - if (!xdev->dev_cap.mailbox_en) - return; -#endif - if (xdev->mbox.rx_poll) - mbox_timer_start(&xdev->mbox); - else - qdma_mbox_enable_interrupts(xdev, QDMA_DEV); -} - -void qdma_mbox_poll_start(struct xlnx_dma_dev *xdev) -{ - -#ifndef __QDMA_VF__ - if (!xdev->dev_cap.mailbox_en) - return; -#endif - xdev->mbox.rx_poll = 1; - qdma_mbox_disable_interrupts(xdev, QDMA_DEV); - mbox_timer_start(&xdev->mbox); -} - -void qdma_mbox_cleanup(struct xlnx_dma_dev *xdev) -{ - struct qdma_mbox *mbox = &xdev->mbox; - - if (mbox->workq) { - mbox_timer_stop(mbox); - if (!xdev->mbox.rx_poll) - qdma_mbox_disable_interrupts(xdev, QDMA_DEV); - flush_workqueue(mbox->workq); - destroy_workqueue(mbox->workq); - } -} - -int qdma_mbox_init(struct xlnx_dma_dev *xdev) -{ - struct qdma_mbox *mbox = &xdev->mbox; - struct timer_list *timer = &mbox->timer; -#ifndef __QDMA_VF__ - int i; -#endif - struct mbox_msg m; - char name[80]; - int rv; - - mbox->xdev = xdev; - - spin_lock_init(&mbox->lock); - spin_lock_init(&mbox->list_lock); - spin_lock_init(&mbox->hw_rx_lock); - spin_lock_init(&mbox->hw_tx_lock); - - INIT_LIST_HEAD(&mbox->tx_todo_list); - INIT_LIST_HEAD(&mbox->rx_pend_list); - INIT_WORK(&mbox->tx_work, mbox_tx_work); - INIT_WORK(&mbox->rx_work, mbox_rx_work); - - snprintf(name, 80, "%s_mbox_wq", xdev->conf.name); - mbox->workq = create_singlethread_workqueue(name); - - if (!mbox->workq) { - pr_info("%s OOM, mbox workqueue.\n", xdev->conf.name); - goto cleanup; - } - - - /* read & discard whatever in the incoming message buffer */ -#ifndef __QDMA_VF__ - for (i = 0; i < 256; i++) - rv = mbox_hw_rcv(mbox, &m); -#else - rv = mbox_hw_rcv(mbox, &m); -#endif - /* ack any received messages in the Q */ - qdma_mbox_hw_init(xdev, QDMA_DEV); - if (qdma_mbox_is_irq_availabe(xdev)) { - if ((xdev->conf.qdma_drv_mode != POLL_MODE) && - (xdev->conf.qdma_drv_mode != LEGACY_INTR_MODE)) { - mbox->rx_poll = 0; - qdma_mbox_enable_interrupts(xdev, QDMA_DEV); - } else - mbox->rx_poll = 1; - } else - mbox->rx_poll = 1; - - qdma_timer_setup(timer, mbox_timer_handler, mbox); - - return 0; - -cleanup: - qdma_mbox_cleanup(xdev); - return -ENOMEM; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_mbox.h b/QDMA/linux-kernel/driver/libqdma/qdma_mbox.h deleted file mode 100755 index e027eda..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_mbox.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_MBOX_H__ -#define __QDMA_MBOX_H__ - -#include "qdma_compat.h" -#include "qdma_device.h" -#include "qdma_access_common.h" -#include "qdma_mbox_protocol.h" - -/** - * @file - * @brief This file contains the declarations for qdma mailbox apis - * - */ - -/** - * mailbox messages - * - * NOTE: make sure the total message length is <= 128 bytes: - * mbox_msg_hdr: 4 bytes - * body: <= (128 - hdr) bytes - * - */ - -struct mbox_msg { - struct work_struct work; /** workqueue item */ - struct list_head list; /** message list */ - qdma_wait_queue waitq; - struct kref refcnt; - u8 wait_resp; - u8 resp_op_matched; - u16 retry_cnt; - - u32 raw[MBOX_MSG_REG_MAX]; -}; - -/** - * forward declaration of xlnx_dma_dev - */ -struct xlnx_dma_dev; -/** - * @struct - qdma_mbox book keeping - * @brief mailbox book keeping structure - */ -struct qdma_mbox { - /** common lock */ - spinlock_t lock; - /** tx lock */ - spinlock_t hw_tx_lock; - /** rx lock */ - spinlock_t hw_rx_lock; - /** work queue */ - struct workqueue_struct *workq; - /** pointer to device data */ - struct xlnx_dma_dev *xdev; - /** tx work_struct to pass data to tx work queue */ - struct work_struct tx_work; - /** rx work_struct to pass data to rx work queue */ - struct work_struct rx_work; - /** mbox rx message */ - struct mbox_msg rx; - /** list lock */ - spinlock_t list_lock; - /** list of messages waiting to be sent */ - struct list_head tx_todo_list; - /** list of messages waiting for response */ - struct list_head rx_pend_list; - /* flag to monitor tx is busy */ - uint8_t send_busy; - /* flag for rx polling mode */ - uint8_t rx_poll; - - /** timer list */ - struct timer_list timer; - -}; - -#define QDMA_MBOX_MSG_TIMEOUT_MS 10000 /* 10 sec*/ -/*****************************************************************************/ -/** - * qdma_mbox_init() - initialize qdma mailbox - * - * @param xdev: pointer to xlnx_dma_dev - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_mbox_init(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * qdma_mbox_cleanup() - cleanup resources of qdma mailbox - * qdma_mbox_stop() - stop mailbox processing - * qdma_mbox_start() - start mailbox processing - * qdma_mbox_poll_start() - start mailbox processing in poll mode - * - * @param xdev: pointer to xlnx_dma_dev - * - * @return none - *****************************************************************************/ -void qdma_mbox_cleanup(struct xlnx_dma_dev *xdev); -void qdma_mbox_stop(struct xlnx_dma_dev *xdev); -void qdma_mbox_start(struct xlnx_dma_dev *xdev); -void qdma_mbox_poll_start(struct xlnx_dma_dev *xdev); -bool qdma_mbox_is_irq_availabe(struct xlnx_dma_dev *xdev); - - -/*****************************************************************************/ -/** - * qdma_mbox_msg_send() - handler to send a mailbox message - * - * @param xdev: pointer to xlnx_dma_dev - * @param m: mailbox message - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_mbox_msg_send(struct xlnx_dma_dev *xdev, struct mbox_msg *m, - bool wait_resp, unsigned int timeout_ms); - - -/*****************************************************************************/ -/** - * qdma_mbox_msg_alloc() - allocate a mailbox message - * - * @param xdev: pointer to xlnx_dma_dev - * - * @return 0: success - * @return NULL: failure - *****************************************************************************/ -struct mbox_msg *qdma_mbox_msg_alloc(void); - -/*****************************************************************************/ -/** - * __qdma_mbox_msg_free() - free the mailbox message - * - * @param f: function name - * @param m: mailbox message - * - * @return none - *****************************************************************************/ -void __qdma_mbox_msg_free(const char *f, struct mbox_msg *m); -#define qdma_mbox_msg_free(m) __qdma_mbox_msg_free(__func__, m) - -#endif /* #ifndef __QDMA_MBOX_H__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_platform.c b/QDMA/linux-kernel/driver/libqdma/qdma_platform.c deleted file mode 100755 index d008d92..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_platform.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ -#include "qdma_platform.h" -#include "qdma_regs.h" -#include "qdma_access_errors.h" -#include <linux/errno.h> -#include <linux/delay.h> - -static struct err_code_map error_code_map_list[] = { - {QDMA_SUCCESS, 0}, - {QDMA_ERR_INV_PARAM, EINVAL}, - {QDMA_ERR_NO_MEM, ENOMEM}, - {QDMA_ERR_HWACC_BUSY_TIMEOUT, EBUSY}, - {QDMA_ERR_HWACC_INV_CONFIG_BAR, EINVAL}, - {QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR, EINVAL}, - {QDMA_ERR_HWACC_BAR_NOT_FOUND, EINVAL}, - {QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED, EINVAL}, - {QDMA_ERR_RM_RES_EXISTS, EPERM}, - {QDMA_ERR_RM_RES_NOT_EXISTS, EINVAL}, - {QDMA_ERR_RM_DEV_EXISTS, EPERM}, - {QDMA_ERR_RM_DEV_NOT_EXISTS, EINVAL}, - {QDMA_ERR_RM_NO_QUEUES_LEFT, EPERM}, - {QDMA_ERR_RM_QMAX_CONF_REJECTED, EPERM}, - {QDMA_ERR_MBOX_FMAP_WR_FAILED, EIO}, - {QDMA_ERR_MBOX_NUM_QUEUES, EINVAL}, - {QDMA_ERR_MBOX_INV_QID, EINVAL}, - {QDMA_ERR_MBOX_INV_RINGSZ, EINVAL}, - {QDMA_ERR_MBOX_INV_BUFSZ, EINVAL}, - {QDMA_ERR_MBOX_INV_CNTR_TH, EINVAL}, - {QDMA_ERR_MBOX_INV_TMR_TH, EINVAL}, - {QDMA_ERR_MBOX_INV_MSG, EINVAL}, - {QDMA_ERR_MBOX_SEND_BUSY, EBUSY}, - {QDMA_ERR_MBOX_NO_MSG_IN, EINVAL}, - {QDMA_ERR_MBOX_REG_READ_FAILED, EIO}, - {QDMA_ERR_MBOX_ALL_ZERO_MSG, EINVAL}, -}; - -/** - * mutex used for resource management APIs - */ -static DEFINE_MUTEX(res_mutex); - -void *qdma_calloc(uint32_t num_blocks, uint32_t size) -{ - return kzalloc((num_blocks * (size_t)size), GFP_KERNEL); -} - -void qdma_memfree(void *memptr) -{ - kfree(memptr); -} - -void qdma_udelay(u32 delay_us) -{ - udelay(delay_us); -} - -int qdma_reg_access_lock(void *dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - spin_lock(&xdev->hw_prg_lock); - - return 0; -} - -int qdma_reg_access_release(void *dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - spin_unlock(&xdev->hw_prg_lock); - - return 0; -} - -u32 qdma_reg_read(void *dev_hndl, u32 reg_offst) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - return readl(xdev->regs + reg_offst); -} - -void qdma_reg_write(void *dev_hndl, u32 reg_offst, u32 val) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - writel(val, xdev->regs + reg_offst); -} - -void qdma_resource_lock_take(void) -{ - mutex_lock(&res_mutex); -} - -void qdma_resource_lock_give(void) -{ - mutex_unlock(&res_mutex); -} - -void qdma_get_hw_access(void *dev_hndl, struct qdma_hw_access **hw) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - *hw = &xdev->hw; -} - -void qdma_strncpy(char *dest, const char *src, size_t n) -{ - strncpy(dest, src, n); -} - - -int qdma_get_err_code(int acc_err_code) -{ - acc_err_code *= -1; - return -(error_code_map_list[acc_err_code].err_code); -} - -int qdma_io_wmb(void) -{ - /* - * TODO: Write memory barrier(wmb) calls are happening differently - * for DPDK and Linux drivers. DPDK driver is calling wmb() before - * pidx/cmpt_cidx updates, where as linux driver calls wmb() after - * pidx/cmpt_cidx updates. As linux driver performance numbers - * are good with current changes, so keeping this function - * as place holder for furure changes related to memory barriers. - */ - return 0; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_platform_env.h b/QDMA/linux-kernel/driver/libqdma/qdma_platform_env.h deleted file mode 100755 index 6649bfc..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_platform_env.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ -#ifndef LIBQDMA_QDMA_PLATFORM_ENV_H_ -#define LIBQDMA_QDMA_PLATFORM_ENV_H_ - -#include <linux/types.h> -#include <linux/kernel.h> - -#define QDMA_SNPRINTF_S(arg1, arg2, arg3, ...) \ - snprintf(arg1, arg3, ##__VA_ARGS__) - -#define qdma_log_info(x_, ...) pr_info(x_, ##__VA_ARGS__) -#define qdma_log_warning(x_, ...) pr_warn(x_, ##__VA_ARGS__) -#define qdma_log_error(x_, ...) pr_err(x_, ##__VA_ARGS__) -#define qdma_log_debug(x_, ...) pr_debug(x_, ##__VA_ARGS__) - -#endif /* LIBQDMA_QDMA_PLATFORM_ENV_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_regs.c b/QDMA/linux-kernel/driver/libqdma/qdma_regs.c deleted file mode 100755 index 920176c..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_regs.c +++ /dev/null @@ -1,610 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "qdma_regs.h" - -#include <linux/version.h> -#include <linux/delay.h> -#include <linux/printk.h> -#include <linux/stddef.h> -#include <linux/string.h> - -#include "xdev.h" -#include "qdma_device.h" -#include "qdma_descq.h" -#include "qdma_st_c2h.h" -#include "qdma_access_common.h" -#include "qdma_resource_mgmt.h" - -int qdma_set_ring_sizes(struct xlnx_dma_dev *xdev, u8 index, - u8 count, u32 *glbl_rng_sz) -{ - int i = 0; - - if (!xdev || !glbl_rng_sz) - return -EINVAL; - - /* Adding 1 for the wrap around descriptor and status descriptor */ - for (i = index; i < (index + count); i++) - *(glbl_rng_sz + i) += 1; - - if (xdev->hw.qdma_global_csr_conf(xdev, index, count, glbl_rng_sz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_WRITE)) - return -EINVAL; - - return 0; -} - -int qdma_get_ring_sizes(struct xlnx_dma_dev *xdev, u8 index, - u8 count, u32 *glbl_rng_sz) -{ - int i = 0; - - if (!xdev || !glbl_rng_sz) - return -EINVAL; - - if (xdev->hw.qdma_global_csr_conf(xdev, index, count, glbl_rng_sz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ)) - return -EINVAL; - - /* Subtracting 1 for the wrap around descriptor and status descriptor */ - for (i = index; i < (index + count); i++) - *(glbl_rng_sz + i) -= 1; - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_device_read_config_register() - read dma config. register - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] reg_addr: register address - * @param[out] value: pointer to hold the read value - * - * Return: 0 for success and <0 for error - *****************************************************************************/ -int qdma_device_read_config_register(unsigned long dev_hndl, - unsigned int reg_addr, u32 *value) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - *value = readl(xdev->regs + reg_addr); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_device_write_config_register() - write dma config. register - * - * @param[in] dev_hndl: dev_hndl returned from qdma_device_open() - * @param[in] reg_addr: register address - * @param[in] value: register value to be writen - * - * Return: 0 for success and <0 for error - *****************************************************************************/ -int qdma_device_write_config_register(unsigned long dev_hndl, - unsigned int reg_addr, unsigned int val) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - pr_debug("%s reg 0x%x, w 0x%08x.\n", xdev->conf.name, reg_addr, val); - writel(val, xdev->regs + reg_addr); - - return 0; -} - - -#ifdef __QDMA_VF__ -#include "qdma_mbox.h" - -int qdma_csr_read(struct xlnx_dma_dev *xdev, struct global_csr_conf *csr) -{ - struct mbox_msg *m = qdma_mbox_msg_alloc(); - int rv, i; - struct qdma_csr_info csr_info; - - if (!m) - return -ENOMEM; - - memset(&csr_info, 0, sizeof(csr_info)); - - qdma_mbox_compose_csr_read(xdev->func_id, m->raw); - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) - goto free_msg; - - rv = qdma_mbox_vf_csr_get(m->raw, &csr_info); - if (!rv) { - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - csr->ring_sz[i] = (uint32_t)csr_info.ringsz[i]; - csr->c2h_buf_sz[i] = (uint32_t)csr_info.bufsz[i]; - csr->c2h_timer_cnt[i] = (uint32_t)csr_info.timer_cnt[i]; - csr->c2h_cnt_th[i] = (uint32_t)csr_info.cnt_thres[i]; - } - csr->wb_intvl = csr_info.wb_intvl; - } else { - pr_err("csr info read failed, rv = %d", rv); - rv = -EINVAL; - } - - -free_msg: - qdma_mbox_msg_free(m); - return rv; -} - -#ifdef QDMA_CSR_REG_UPDATE -int qdma_global_csr_set(unsigned long dev_hndl, u8 index, u8 count, - struct global_csr_conf *csr) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) - return -EINVAL; - - pr_info("VF %d setting csr NOT allowed.\n", xdev->func_id); - return -EINVAL; -} -#endif -#else /* ifdef __QDMA_VF__ */ - -static void qdma_sort_c2h_cntr_th_values(struct xlnx_dma_dev *xdev) -{ - uint8_t i, idx = 0, j = 0; - uint8_t c2h_cntr_val = xdev->csr_info.c2h_cnt_th[0]; - uint8_t least_max = 0; - int ref_idx = -1; - -get_next_idx: - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if ((ref_idx >= 0) && (ref_idx == i)) - continue; - if (xdev->csr_info.c2h_cnt_th[i] < least_max) - continue; - c2h_cntr_val = xdev->csr_info.c2h_cnt_th[i]; - idx = i; - break; - } - for (; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if ((ref_idx >= 0) && (ref_idx == i)) - continue; - if (xdev->csr_info.c2h_cnt_th[i] < least_max) - continue; - if (c2h_cntr_val >= xdev->csr_info.c2h_cnt_th[i]) { - c2h_cntr_val = xdev->csr_info.c2h_cnt_th[i]; - idx = i; - } - } - xdev->sorted_c2h_cntr_idx[j] = idx; - ref_idx = idx; - j++; - idx = j; - least_max = c2h_cntr_val; - if (j < QDMA_GLOBAL_CSR_ARRAY_SZ) - goto get_next_idx; -} - -int qdma_csr_read(struct xlnx_dma_dev *xdev, struct global_csr_conf *csr) -{ - int rv = 0; - - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, csr->ring_sz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ); - if (unlikely(rv < 0)) { - pr_err("Failed to read global ring sizes, err = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - rv = xdev->hw.qdma_global_writeback_interval_conf(xdev, - &csr->wb_intvl, - QDMA_HW_ACCESS_READ); - if (unlikely(rv < 0)) { - if (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED) { - pr_err("Failed to read write back interval, err = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - pr_warn("Hardware Feature not supported"); - } - - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, csr->c2h_buf_sz, - QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_READ); - if (unlikely(rv < 0)) { - if (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED) { - pr_err("Failed to read global buffer sizes, err = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - pr_warn("Hardware Feature not supported"); - } - - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, csr->c2h_timer_cnt, - QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_READ); - if (unlikely(rv < 0)) { - if (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED) { - pr_err("Failed to read global timer count, err = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - pr_warn("Hardware Feature not supported"); - } - - rv = xdev->hw.qdma_global_csr_conf(xdev, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, csr->c2h_cnt_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_READ); - if (unlikely(rv < 0)) { - if (rv != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED) { - pr_err("Failed to read global counter threshold, err = %d", - rv); - return xdev->hw.qdma_get_error_code(rv); - } - pr_warn("Hardware Feature not supported"); - } - qdma_sort_c2h_cntr_th_values(xdev); - return 0; -} - -#ifdef QDMA_CSR_REG_UPDATE -int qdma_global_csr_set(unsigned long dev_hndl, u8 index, u8 count, - struct global_csr_conf *csr) -{ - int rv = 0; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) - return -EINVAL; - - /** If qdma_get_active_queue_count() > 0, - * cannot modify global CSR. - */ - if (qdma_get_active_queue_count(xdev->dma_device_index)) { - pr_err("xdev %s, FMAP prog done, cannot modify global CSR\n", - xdev->mod_name); - return -EINVAL; - } - if (xdev->hw.qdma_global_writeback_interval_conf(xdev, csr->wb_intvl, - QDMA_HW_ACCESS_WRITE)) - return -EINVAL; - if (xdev->hw.qdma_global_csr_conf(xdev, index, count, csr->ring_sz, - QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_WRITE)) - return -EINVAL; - if (xdev->hw.qdma_global_csr_conf(xdev, index, count, - csr->c2h_timer_cnt, - QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_WRITE)) - return -EINVAL; - if (xdev->hw.qdma_global_csr_conf(xdev, index, count, csr->c2h_cnt_th, - QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_WRITE)) - return -EINVAL; - if (xdev->hw.qdma_global_csr_conf(xdev, index, count, csr->c2h_buf_sz, - QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_WRITE)) - return -EINVAL; - - rv = qdma_csr_read(xdev, &xdev->csr_info); - if (unlikely(rv < 0)) - return rv; - - return 0; -} -#endif -#endif - -int qdma_global_csr_get(unsigned long dev_hndl, u8 index, u8 count, - struct global_csr_conf *csr) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int i = 0; - - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if ((index + count) > QDMA_GLOBAL_CSR_ARRAY_SZ) { - pr_err("%s: Invalid index=%u and count=%u > %d", - __func__, index, count, - QDMA_GLOBAL_CSR_ARRAY_SZ); - return -EINVAL; - } - - /** If qdma_get_active_queue_count() > 0, - * read the stored xdev csr values. - */ - if (qdma_get_active_queue_count(xdev->dma_device_index)) - memcpy(csr, &xdev->csr_info, sizeof(struct global_csr_conf)); - else - qdma_csr_read(xdev, csr); - - /** Subtracting 1 for the wrap around descriptor and status descriptor - * This same logic is present in qdma_get/set_ring_sizes() API - * In case of any changes to this number, make sure to update in - * all these places - */ - for (i = index; i < (index + count); i++) - csr->ring_sz[i]--; - - return 0; -} - -int qdma_device_flr_quirk_set(struct pci_dev *pdev, unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv; - - if (!dev_hndl) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (xdev->conf.pdev != pdev) { - pr_err("Invalid pdev passed: pci_dev(0x%lx) != pdev(0x%lx)\n", - (unsigned long)xdev->conf.pdev, (unsigned long)pdev); - return -EINVAL; - } - - if (!xdev->dev_cap.flr_present) { - pr_info("FLR not present, therefore skipping FLR reset\n"); - return 0; - } - - if (!dev_hndl || xdev_check_hndl(__func__, pdev, dev_hndl) < 0) - return -EINVAL; - -#ifndef __QDMA_VF__ - rv = xdev->hw.qdma_initiate_flr(xdev, 0); -#else - rv = xdev->hw.qdma_initiate_flr(xdev, 1); -#endif - if (rv) - return -EINVAL; - - return 0; -} - -int qdma_device_flr_quirk_check(struct pci_dev *pdev, unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv; - uint8_t flr_done = 0; - - if (!dev_hndl) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (xdev->conf.pdev != pdev) { - pr_err("Invalid pdev passed: pci_dev(0x%lx) != pdev(0x%lx)\n", - (unsigned long)xdev->conf.pdev, (unsigned long)pdev); - return -EINVAL; - } - - if (!xdev->dev_cap.flr_present) { - pr_info("FLR not present, therefore skipping FLR reset status\n"); - return 0; - } - -#ifndef __QDMA_VF__ - rv = xdev->hw.qdma_is_flr_done(xdev, 0, &flr_done); -#else - rv = xdev->hw.qdma_is_flr_done(xdev, 1, &flr_done); -#endif - if (rv) - return -EINVAL; - - if (!flr_done) - pr_info("%s, flr status stuck\n", xdev->conf.name); - - return 0; -} - -int qdma_device_version_info(unsigned long dev_hndl, - struct qdma_version_info *version_info) -{ - int rv = 0; - struct qdma_hw_version_info info; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (!version_info) { - pr_err("version_info is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - memset(&info, 0, sizeof(info)); -#ifndef __QDMA_VF__ - rv = xdev->hw.qdma_get_version(xdev, QDMA_DEV_PF, &info); -#else - rv = xdev->hw.qdma_get_version(xdev, QDMA_DEV_VF, &info); -#endif - if (rv < 0) { - pr_err("failed to get version with error = %d", rv); - return xdev->hw.qdma_get_error_code(rv); - } - - strncpy(version_info->ip_str, info.qdma_ip_type_str, - sizeof(version_info->ip_str) - 1); - strncpy(version_info->rtl_version_str, info.qdma_rtl_version_str, - sizeof(version_info->rtl_version_str) - 1); - strncpy(version_info->vivado_release_str, - info.qdma_vivado_release_id_str, - sizeof(version_info->vivado_release_str) - 1); - strncpy(version_info->device_type_str, - info.qdma_device_type_str, - sizeof(version_info->device_type_str) - 1); - return 0; -} - -#ifndef __QDMA_VF__ -void qdma_device_attributes_get(struct xlnx_dma_dev *xdev) -{ - struct qdma_dev_attributes dev_info; - - memset(&dev_info, 0, sizeof(dev_info)); - - xdev->hw.qdma_get_device_attributes(xdev, &xdev->dev_cap); - - pr_info("%s: num_pfs:%d, num_qs:%d, flr_present:%d, st_en:%d, mm_en:%d, mm_cmpt_en:%d, mailbox_en:%d, mm_channel_max:%d, qid2vec_ctx:%d, cmpt_ovf_chk_dis:%d, mailbox_intr:%d, sw_desc_64b:%d, cmpt_desc_64b:%d, dynamic_bar:%d, legacy_intr:%d, cmpt_trig_count_timer:%d", - xdev->conf.name, - xdev->dev_cap.num_pfs, - xdev->dev_cap.num_qs, - xdev->dev_cap.flr_present, - xdev->dev_cap.st_en, - xdev->dev_cap.mm_en, - xdev->dev_cap.mm_cmpt_en, - xdev->dev_cap.mailbox_en, - xdev->dev_cap.mm_channel_max, - xdev->dev_cap.qid2vec_ctx, - xdev->dev_cap.cmpt_ovf_chk_dis, - xdev->dev_cap.mailbox_intr, - xdev->dev_cap.sw_desc_64b, - xdev->dev_cap.cmpt_desc_64b, - xdev->dev_cap.dynamic_bar, - xdev->dev_cap.legacy_intr, - xdev->dev_cap.cmpt_trig_count_timer); -} -#endif - -int qdma_queue_cmpl_ctrl(unsigned long dev_hndl, unsigned long id, - struct qdma_cmpl_ctrl *cctrl, bool set) -{ - int rv = 0; - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, NULL, 0, 1); - if (!descq) { - pr_err("Invalid qid: %ld", id); - return -EINVAL; - } - - if (set) { - lock_descq(descq); - - descq->cmpt_cidx_info.trig_mode = - descq->conf.cmpl_trig_mode = - cctrl->trigger_mode; - descq->cmpt_cidx_info.timer_idx = - descq->conf.cmpl_timer_idx = cctrl->timer_idx; - descq->cmpt_cidx_info.counter_idx = - descq->conf.cmpl_cnt_th_idx = cctrl->cnt_th_idx; - descq->cmpt_cidx_info.irq_en = - descq->conf.cmpl_en_intr = cctrl->cmpl_en_intr; - descq->cmpt_cidx_info.wrb_en = - descq->conf.cmpl_stat_en = cctrl->en_stat_desc; - - descq->cmpt_cidx_info.wrb_cidx = descq->cidx_cmpt; - rv = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - unlock_descq(descq); - return rv; - } - - unlock_descq(descq); - - } else { - lock_descq(descq); - /* read the setting */ - rv = queue_cmpt_cidx_read(descq->xdev, - descq->conf.qidx, &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to read cmpt cidx\n", - descq->conf.name); - unlock_descq(descq); - return rv; - } - - cctrl->trigger_mode = descq->conf.cmpl_trig_mode = - descq->cmpt_cidx_info.trig_mode; - cctrl->timer_idx = descq->conf.cmpl_timer_idx = - descq->cmpt_cidx_info.timer_idx; - cctrl->cnt_th_idx = descq->conf.cmpl_cnt_th_idx = - descq->cmpt_cidx_info.counter_idx; - cctrl->en_stat_desc = descq->conf.cmpl_stat_en = - descq->cmpt_cidx_info.wrb_en; - cctrl->cmpl_en_intr = descq->conf.cmpl_en_intr = - descq->cmpt_cidx_info.irq_en; - unlock_descq(descq); - } - - return 0; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_regs.h b/QDMA/linux-kernel/driver/libqdma/qdma_regs.h deleted file mode 100755 index 4e1d1bb..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_regs.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_REGS_H__ -#define __QDMA_REGS_H__ - -#include <linux/types.h> -#include "xdev.h" - -#define QDMA_REG_SZ_IN_BYTES 4 - -#define DESC_SZ_64B 3 -#define DESC_SZ_8B_BYTES 8 -#define DESC_SZ_16B_BYTES 16 -#define DESC_SZ_32B_BYTES 32 -#define DESC_SZ_64B_BYTES 64 - -#ifndef __QDMA_VF__ - -/* - * monitor - */ -#define QDMA_REG_C2H_STAT_AXIS_PKG_CMP 0xA94 - -#endif /* ifndef __QDMA_VF__ */ - -/* - * descriptor & writeback status - */ -/** - * @struct - qdma_mm_desc - * @brief memory mapped descriptor format - */ -struct qdma_mm_desc { - /** source address */ - __be64 src_addr; - /** flags */ - __be32 flag_len; - /** reserved 32 bits */ - __be32 rsvd0; - /** destination address */ - __be64 dst_addr; - /** reserved 64 bits */ - __be64 rsvd1; -}; - -#define S_DESC_F_DV 28 -#define S_DESC_F_SOP 29 -#define S_DESC_F_EOP 30 - - -#define S_H2C_DESC_F_SOP 1 -#define S_H2C_DESC_F_EOP 2 - - -#define S_H2C_DESC_NUM_GL 0 -#define M_H2C_DESC_NUM_GL 0x7U -#define V_H2C_DESC_NUM_GL(x) ((x) << S_H2C_DESC_NUM_GL) - -#define S_H2C_DESC_NUM_CDH 3 -#define M_H2C_DESC_NUM_CDH 0xFU -#define V_H2C_DESC_NUM_CDH(x) ((x) << S_H2C_DESC_NUM_CDH) - -#define S_H2C_DESC_F_ZERO_CDH 13 -#define S_H2C_DESC_F_EOT 14 -#define S_H2C_DESC_F_REQ_CMPL_STATUS 15 - -/* FIXME pld_len and flags members are part of custom descriptor format needed - * by example design for ST loopback and desc bypass - */ -/** - * @struct - qdma_h2c_desc - * @brief memory mapped descriptor format - */ -struct qdma_h2c_desc { - __be16 cdh_flags; /**< cdh flags */ - __be16 pld_len; /**< current packet length */ - __be16 len; /**< total packet length */ - __be16 flags; /**< descriptor flags */ - __be64 src_addr; /**< source address */ -}; - -/** - * @struct - qdma_c2h_desc - * @brief qdma c2h descriptor - */ -struct qdma_c2h_desc { - __be64 dst_addr; /**< destination address */ -}; - -/** - * @struct - qdma_desc_cmpl_status - * @brief qdma writeback descriptor - */ -struct qdma_desc_cmpl_status { - __be16 pidx; /**< producer index */ - __be16 cidx; /**< consumer index */ - __be32 rsvd; /**< reserved 32 bits */ -}; - -#define S_C2H_CMPT_ENTRY_F_FORMAT 0 -#define F_C2H_CMPT_ENTRY_F_FORMAT (1 << S_C2H_CMPT_ENTRY_F_FORMAT) -#define DFORMAT0_CMPL_MASK 0xF /* udd starts at bit 4 */ -#define DFORMAT1_CMPL_MASK 0xFFFFF /* udd starts at bit 20 */ - - -#define S_C2H_CMPT_ENTRY_F_COLOR 1 -#define F_C2H_CMPT_ENTRY_F_COLOR (1 << S_C2H_CMPT_ENTRY_F_COLOR) - -#define S_C2H_CMPT_ENTRY_F_ERR 2 -#define F_C2H_CMPT_ENTRY_F_ERR (1 << S_C2H_CMPT_ENTRY_F_ERR) - -#define S_C2H_CMPT_ENTRY_F_DESC_USED 3 -#define F_C2H_CMPT_ENTRY_F_DESC_USED (1 << S_C2H_CMPT_ENTRY_F_DESC_USED) - -#define S_C2H_CMPT_ENTRY_LENGTH 4 -#define M_C2H_CMPT_ENTRY_LENGTH 0xFFFFU -#define L_C2H_CMPT_ENTRY_LENGTH 16 -#define V_C2H_CMPT_ENTRY_LENGTH(x) \ - (((x) & M_C2H_CMPT_ENTRY_LENGTH) << S_C2H_CMPT_ENTRY_LENGTH) - -#define S_C2H_CMPT_ENTRY_F_EOT 20 -#define F_C2H_CMPT_ENTRY_F_EOT (1 << S_C2H_CMPT_ENTRY_F_EOT) - -#define S_C2H_CMPT_ENTRY_F_USET_INTR 21 - -#define S_C2H_CMPT_USER_DEFINED 22 -#define V_C2H_CMPT_USER_DEFINED(x) ((x) << S_C2H_CMPT_USER_DEFINED) - -#define M_C2H_CMPT_ENTRY_DMA_INFO 0xFFFFFF -#define L_C2H_CMPT_ENTRY_DMA_INFO 3 /* 20 bits */ -/** - * @struct - qdma_c2h_cmpt_cmpl_status - * @brief qdma completion data descriptor - */ -struct qdma_c2h_cmpt_cmpl_status { - __be16 pidx; /**< producer index */ - __be16 cidx; /**< consumer index */ - __be32 color_isr_status; /**< isr color and status */ -}; -#define S_C2H_CMPT_F_COLOR 0 - -#define S_C2H_CMPT_INT_STATE 1 -#define M_C2H_CMPT_INT_STATE 0x3U - -/* - * HW API - */ - -#include "xdev.h" - -#define __read_reg(xdev, reg_addr) (readl(xdev->regs + reg_addr)) -#ifdef DEBUG__ -#define __write_reg(xdev, reg_addr, val) \ - do { \ - pr_debug("%s, reg 0x%x, val 0x%x.\n", \ - xdev->conf.name, reg_addr, (u32)val); \ - writel(val, xdev->regs + reg_addr); \ - } while (0) -#else -#define __write_reg(xdev, reg_addr, val) (writel(val, xdev->regs + reg_addr)) -#endif /* #ifdef DEBUG__ */ - -#ifndef __QDMA_VF__ -void qdma_device_attributes_get(struct xlnx_dma_dev *xdev); - -#endif /* #ifndef __QDMA_VF__ */ - -#endif diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_sriov.c b/QDMA/linux-kernel/driver/libqdma/qdma_sriov.c deleted file mode 100755 index 4911bf8..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_sriov.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include <linux/kernel.h> -#include <linux/string.h> -#include <linux/errno.h> - -#include "xdev.h" -#include "qdma_mbox.h" -#include <linux/sched.h> - -#ifdef __QDMA_VF__ -int xdev_sriov_vf_offline(struct xlnx_dma_dev *xdev, u16 func_id) -{ - int rv; - struct mbox_msg *m = qdma_mbox_msg_alloc(); - - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_offline(xdev->func_id, m->raw); - /** For sending BYE message, retry to send multiple - * times before giving up by giving non-zero timeout value - */ - rv = qdma_mbox_msg_send(xdev, m, 0, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) - pr_info("%s, send bye failed %d.\n", xdev->conf.name, rv); - - return rv; -} - -int xdev_sriov_vf_reset_offline(struct xlnx_dma_dev *xdev) -{ - int rv; - struct mbox_msg *m = qdma_mbox_msg_alloc(); - - if (!m) - return -ENOMEM; - - qdma_mbox_compose_vf_reset_offline(xdev->func_id, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) - pr_err("%s, send reset bye failed %d.\n", xdev->conf.name, rv); - - qdma_mbox_msg_free(m); - return rv; -} -int xdev_sriov_vf_online(struct xlnx_dma_dev *xdev, u16 func_id) -{ - int rv; - int qbase = -1; - struct mbox_msg *m = qdma_mbox_msg_alloc(); - - if (!m) - return -ENOMEM; - - qmda_mbox_compose_vf_online(xdev->func_id, 0, &qbase, m->raw); - - rv = qdma_mbox_msg_send(xdev, m, 1, QDMA_MBOX_MSG_TIMEOUT_MS); - if (rv < 0) { - pr_err("%s, send hello failed %d.\n", xdev->conf.name, rv); - qdma_mbox_msg_free(m); - return rv; - } - - rv = qdma_mbox_vf_dev_info_get(m->raw, &xdev->dev_cap, - &xdev->dma_device_index); - if (rv < 0) { - pr_info("%s, failed to get dev info %d.\n", - xdev->conf.name, rv); - rv = -EINVAL; - } else { - pr_info("%s: num_pfs:%d, num_qs:%d, flr_present:%d, st_en:%d, mm_en:%d, mm_cmpt_en:%d, mailbox_en:%d, mm_channel_max:%d, qid2vec_ctx:%d, cmpt_ovf_chk_dis:%d, mailbox_intr:%d, sw_desc_64b:%d, cmpt_desc_64b:%d, dynamic_bar:%d, legacy_intr:%d, cmpt_trig_count_timer:%d", - xdev->conf.name, - xdev->dev_cap.num_pfs, - xdev->dev_cap.num_qs, - xdev->dev_cap.flr_present, - xdev->dev_cap.st_en, - xdev->dev_cap.mm_en, - xdev->dev_cap.mm_cmpt_en, - xdev->dev_cap.mailbox_en, - xdev->dev_cap.mm_channel_max, - xdev->dev_cap.qid2vec_ctx, - xdev->dev_cap.cmpt_ovf_chk_dis, - xdev->dev_cap.mailbox_intr, - xdev->dev_cap.sw_desc_64b, - xdev->dev_cap.cmpt_desc_64b, - xdev->dev_cap.dynamic_bar, - xdev->dev_cap.legacy_intr, - xdev->dev_cap.cmpt_trig_count_timer); - } - - qdma_mbox_msg_free(m); - return rv; -} - -#elif defined(CONFIG_PCI_IOV) - -void xdev_sriov_disable(struct xlnx_dma_dev *xdev) -{ - struct pci_dev *pdev = xdev->conf.pdev; - unsigned int sleep_timeout = (50 * xdev->vf_count); /* 50ms per vf */ - - if (!xdev->vf_count) - return; - - pci_disable_sriov(pdev); - - qdma_waitq_wait_event_timeout(xdev->wq, (xdev->vf_count == 0), - msecs_to_jiffies(sleep_timeout)); - - qdma_mbox_stop(xdev); - kfree(xdev->vf_info); - xdev->vf_info = NULL; - xdev->vf_count = 0; - -} - -int xdev_sriov_enable(struct xlnx_dma_dev *xdev, int num_vfs) -{ - struct pci_dev *pdev = xdev->conf.pdev; - int current_vfs = pci_num_vf(pdev); - struct qdma_vf_info *vf; - int i; - int rv; - - if (current_vfs) { - dev_err(&pdev->dev, "%d VFs already enabled!n", current_vfs); - return current_vfs; - } - - vf = kmalloc(num_vfs * (sizeof(struct qdma_vf_info)), GFP_KERNEL); - if (!vf) { - pr_info("%s failed to allocate memory for VFs, %d * %ld.\n", - xdev->conf.name, num_vfs, sizeof(struct qdma_vf_info)); - return -ENOMEM; - } - - for (i = 0; i < num_vfs; i++) - vf[i].func_id = QDMA_FUNC_ID_INVALID; - - qdma_waitq_init(&xdev->wq); - xdev->vf_count = num_vfs; - xdev->vf_info = vf; - - pr_debug("%s: req %d, current %d, assigned %d.\n", - xdev->conf.name, num_vfs, current_vfs, pci_vfs_assigned(pdev)); - - qdma_mbox_start(xdev); - - rv = pci_enable_sriov(pdev, num_vfs); - if (rv) { - pr_info("%s, enable sriov %d failed %d.\n", - xdev->conf.name, num_vfs, rv); - xdev_sriov_disable(xdev); - return 0; - } - - pr_debug("%s: done, req %d, current %d, assigned %d.\n", - xdev->conf.name, num_vfs, pci_num_vf(pdev), - pci_vfs_assigned(pdev)); - - return num_vfs; -} - -int qdma_device_sriov_config(struct pci_dev *pdev, unsigned long dev_hndl, - int num_vfs) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv; - - if (!dev_hndl) - return -EINVAL; - - rv = xdev_check_hndl(__func__, pdev, dev_hndl); - if (rv < 0) - return rv; - - /* if zero disable sriov */ - if (!num_vfs) { - xdev_sriov_disable(xdev); - return 0; - } - - if (!xdev->dev_cap.mailbox_en) { - dev_err(&pdev->dev, "Mailbox not enabled in this device"); - return -EPERM; - } - - rv = xdev_sriov_enable(xdev, num_vfs); - if (rv < 0) - return rv; - - return xdev->vf_count; -} - -void xdev_sriov_vf_offline(struct xlnx_dma_dev *xdev, u16 func_id) -{ - struct qdma_vf_info *vf = (struct qdma_vf_info *)xdev->vf_info; - int i; - - xdev->vf_count_online--; - for (i = 0; i < xdev->vf_count; i++, vf++) { - if (vf->func_id == func_id) { - /** func_id cannot be marked invalid in the PF FLR flow. - * This is because, after PF comes back up - * it should have valid func_id list to be able to - * send out the RESET_DONE msg - */ - if (xdev->reset_state == RESET_STATE_IDLE) - vf->func_id = QDMA_FUNC_ID_INVALID; - vf->qbase = 0; - vf->qmax = 0; - } - } - - qdma_waitq_wakeup(&xdev->wq); -} - -int xdev_sriov_vf_online(struct xlnx_dma_dev *xdev, u16 func_id) -{ - struct qdma_vf_info *vf = (struct qdma_vf_info *)xdev->vf_info; - int i; - - xdev->vf_count_online++; - - if (xdev->reset_state == RESET_STATE_IDLE) { - for (i = 0; i < xdev->vf_count; i++, vf++) { - if (vf->func_id == QDMA_FUNC_ID_INVALID) { - vf->func_id = func_id; - return 0; - } - } - pr_info("%s, func 0x%x, NO free slot.\n", xdev->conf.name, - func_id); - qdma_waitq_wakeup(&xdev->wq); - return -EINVAL; - } else - return 0; -} - -int xdev_sriov_vf_fmap(struct xlnx_dma_dev *xdev, u16 func_id, - unsigned short qbase, unsigned short qmax) -{ - struct qdma_vf_info *vf = (struct qdma_vf_info *)xdev->vf_info; - int i; - - for (i = 0; i < xdev->vf_count; i++, vf++) { - if (vf->func_id == func_id) { - vf->qbase = qbase; - vf->qmax = qmax; - return 0; - } - } - - pr_info("%s, func 0x%x, NO match.\n", xdev->conf.name, func_id); - return -EINVAL; -} - -#endif /* if defined(CONFIG_PCI_IOV) && !defined(__QDMA_VF__) */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_st_c2h.c b/QDMA/linux-kernel/driver/libqdma/qdma_st_c2h.c deleted file mode 100755 index 80a8d73..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_st_c2h.c +++ /dev/null @@ -1,1286 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "qdma_descq.h" - -#include <asm/cacheflush.h> -#include <linux/kernel.h> -#include <linux/delay.h> - -#include "qdma_device.h" -#include "qdma_intr.h" -#include "qdma_regs.h" -#include "qdma_thread.h" -#include "qdma_context.h" -#include "thread.h" -#include "qdma_compat.h" -#include "qdma_st_c2h.h" -#include "qdma_access_common.h" -#include "qdma_ul_ext.h" -#include "version.h" - -/* - * ST C2H descq (i.e., freelist) RX buffers - */ - -static inline void flq_free_one(struct qdma_sw_sg *sdesc, - struct qdma_c2h_desc *desc) -{ - if (sdesc) { - if (sdesc->dma_addr) { - desc->dst_addr = 0UL; - sdesc->dma_addr = 0UL; - } - - if (sdesc->pg) { - sdesc->pg = NULL; - sdesc->offset = 0; - } - } else - pr_err("%s: sdesc is NULL", __func__); - -} - -static inline int flq_fill_one(struct qdma_descq *descq, - struct qdma_sw_sg *sdesc, - struct qdma_c2h_desc *desc) -{ - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - struct qdma_sw_pg_sg *pg_sdesc; - unsigned int pg_idx = 0; - unsigned int buf_sz; - - if (!flq) { - pr_err("%s: flq is NULL", __func__); - return -EINVAL; - } - - if (flq->num_pages == 0) { - pr_err("%s: flq->num_pages is NULL", __func__); - return -EINVAL; - } - - buf_sz = flq->desc_buf_size; - pg_idx = (flq->alloc_idx & flq->num_pgs_mask); - - if (pg_idx >= flq->num_pages) { - pr_err("%s: pg_idx %d is Invalid", - __func__, - pg_idx); - return -EINVAL; - } - - pg_sdesc = flq->pg_sdesc + pg_idx; - if (!pg_sdesc || !pg_sdesc->pg_base) { - pr_err("%s: pg_sdesc is NULL", __func__); - return -EINVAL; - } - - if (pg_sdesc->pg_offset + buf_sz > flq->max_pg_offset) { - pr_err("%s: memory full, alloc_idx %u, recycle_idx = %u offset = %u, pg_idx = %u", - __func__, - flq->alloc_idx, - flq->recycle_idx, - pg_sdesc->pg_offset, - pg_idx); - return -ENOMEM; - } - - - sdesc->pg = pg_sdesc->pg_base; - sdesc->offset = pg_sdesc->pg_offset; - sdesc->dma_addr = pg_sdesc->pg_dma_base_addr + pg_sdesc->pg_offset; - sdesc->len = descq->conf.c2h_bufsz; - desc->dst_addr = sdesc->dma_addr; -#if KERNEL_VERSION(4, 6, 0) < LINUX_VERSION_CODE - page_ref_inc(pg_sdesc->pg_base); -#else - atomic_inc(&(pg_sdesc->pg_base->_count)); -#endif - pg_sdesc->pg_offset += buf_sz; - - if ((pg_sdesc->pg_offset + buf_sz) > flq->max_pg_offset) - flq->alloc_idx++; - - return 0; -} - -static inline void flq_unmap_page_one(struct qdma_sw_pg_sg *pg_sdesc, - struct device *dev, - unsigned char pg_order) -{ - if (pg_sdesc && pg_sdesc->pg_dma_base_addr) { - dma_unmap_page(dev, pg_sdesc->pg_dma_base_addr, - PAGE_SIZE << pg_order, - DMA_FROM_DEVICE); - pg_sdesc->pg_dma_base_addr = 0UL; - } -} - -static inline void flq_free_page_one(struct qdma_sw_pg_sg *pg_sdesc, - struct device *dev, - unsigned char pg_order, - unsigned int pg_shift) -{ - unsigned int page_count = 0; - unsigned int i = 0; - - if (pg_sdesc && pg_sdesc->pg_base) { - /* +1 for dma_unmap*/ - page_count = (pg_sdesc->pg_offset >> pg_shift) + 1; - - flq_unmap_page_one(pg_sdesc, dev, pg_order); - - for (i = 0; i < page_count; i++) - put_page(pg_sdesc->pg_base); - - pg_sdesc->pg_base = NULL; - pg_sdesc->pg_dma_base_addr = 0UL; - } -} - -void descq_flq_free_page_resource(struct qdma_descq *descq) -{ - struct xlnx_dma_dev *xdev = descq->xdev; - struct device *dev = &xdev->conf.pdev->dev; - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - struct qdma_sw_pg_sg *pg_sdesc = flq->pg_sdesc; - unsigned char pg_order = flq->desc_pg_order; - int i; - - for (i = 0; i < flq->num_pages; i++, pg_sdesc++) - flq_free_page_one(pg_sdesc, dev, - pg_order, flq->desc_pg_shift); - - kfree(flq->pg_sdesc); - flq->pg_sdesc = NULL; - - memset(flq, 0, sizeof(struct qdma_flq)); -} - -void descq_flq_free_resource(struct qdma_descq *descq) -{ - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - struct qdma_sw_sg *sdesc = flq->sdesc; - struct qdma_c2h_desc *desc = flq->desc; - int i; - - /* It can never be null beyond this */ - if (!sdesc) { - pr_err("%s: sdesc is Invalid", - __func__); - return; - } - - for (i = 0; i < flq->size; i++, sdesc++, desc++) - flq_free_one(sdesc, desc); - - kfree(flq->sdesc); - flq->sdesc = NULL; - flq->sdesc_info = NULL; - -} - - -static inline int flq_fill_page_one(struct qdma_sw_pg_sg *pg_sdesc, - struct device *dev, - int node, unsigned char pg_order, gfp_t gfp) -{ - struct page *pg; - dma_addr_t mapping; - - pg = alloc_pages_node(node, __GFP_COMP | gfp, pg_order); - if (unlikely(!pg)) { - pr_err("%s: failed to allocate the pages, order %d.\n", - __func__, - pg_order); - return -ENOMEM; - } - - mapping = dma_map_page(dev, pg, 0, (PAGE_SIZE << pg_order), - DMA_FROM_DEVICE); - if (unlikely(dma_mapping_error(dev, mapping))) { - dev_err(dev, "page 0x%p mapping error 0x%llx.\n", - pg, (unsigned long long)mapping); - __free_pages(pg, pg_order); - return -EINVAL; - } - - pg_sdesc->pg_base = pg; - pg_sdesc->pg_dma_base_addr = mapping; - pg_sdesc->pg_offset = 0; - return 0; -} - -int descq_flq_alloc_resource(struct qdma_descq *descq) -{ - struct xlnx_dma_dev *xdev = descq->xdev; - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - struct device *dev = &xdev->conf.pdev->dev; - int node = dev_to_node(dev); - struct qdma_sw_pg_sg *pg_sdesc = NULL; - struct qdma_sw_sg *sdesc, *prev = NULL; - struct qdma_sdesc_info *sinfo, *sprev = NULL; - struct qdma_c2h_desc *desc = flq->desc; - int i; - int rv = 0; - /* find the most significant bit number */ - unsigned int div_bits = 0; - - div_bits = flq->desc_pg_shift; - flq->num_bufs_per_pg = - (flq->max_pg_offset >> div_bits); - - if (flq->num_bufs_per_pg == 0) { - pr_err("%s: conf_c2h_bufsz = %d, flq_c2h_buf_size = %d, flq->max_pg_offset = %d, flq->num_bufs_per_pg = %d, flq->desc_pg_order = %d, div_bits = %d", - __func__, - descq->conf.c2h_bufsz, - flq->desc_buf_size, - flq->max_pg_offset, - flq->num_bufs_per_pg, - flq->desc_pg_order, - div_bits); - return -EINVAL; - } - - flq->num_pages = (flq->size / flq->num_bufs_per_pg) + - ((flq->size % flq->num_bufs_per_pg) == 0 ? 0 : 1); - flq->num_pages = get_next_powof2(flq->num_pages); - /* without this, alloc_idx and recycle_idx - * will toeing each other creating a mess - */ - if (flq->num_pages < flq->size) - flq->num_pages = (flq->num_pages << 1); - flq->num_pgs_mask = (flq->num_pages - 1); - - pr_debug("%s: conf_c2h_bufsz = %d, flq_c2h_buf_size = %d, num_bufs_per_pg = %d, num_pages = %d, flq->size = %d", - __func__, - descq->conf.c2h_bufsz, - flq->desc_buf_size, - flq->num_bufs_per_pg, - flq->num_pages, - flq->size); - - pg_sdesc = kzalloc_node(flq->num_pages * - (sizeof(struct qdma_sw_pg_sg)), - GFP_KERNEL, node); - - if (!pg_sdesc) { - pr_err("%s: OOM, sz %d * %ld.\n", - __func__, - flq->num_pages, - (sizeof(struct qdma_sw_pg_sg))); - return -ENOMEM; - } - flq->pg_sdesc = pg_sdesc; - - for (pg_sdesc = flq->pg_sdesc, i = 0; - i < flq->num_pages; i++, pg_sdesc++) { - rv = flq_fill_page_one(pg_sdesc, dev, node, - flq->desc_pg_order, GFP_KERNEL); - if (rv < 0) { - descq_flq_free_page_resource(descq); - return rv; - } - } - - sdesc = kzalloc_node(flq->size * (sizeof(struct qdma_sw_sg) + - sizeof(struct qdma_sdesc_info)), - GFP_KERNEL, node); - if (!sdesc) { - pr_err("%s: OOM, sz %d * %ld.\n", - __func__, - flq->size, - ((sizeof(struct qdma_sw_sg) + - sizeof(struct qdma_sdesc_info)))); - descq_flq_free_page_resource(descq); - return -ENOMEM; - } - - flq->sdesc = sdesc; - flq->sdesc_info = sinfo = (struct qdma_sdesc_info *)(sdesc + flq->size); - flq->alloc_idx = 0; - - /* make the flq to be a linked list ring */ - for (i = 0; i < flq->size; i++, prev = sdesc, sdesc++, - sprev = sinfo, sinfo++) { - if (prev) - prev->next = sdesc; - if (sprev) - sprev->next = sinfo; - } - - /* last entry's next points to the first entry */ - prev->next = flq->sdesc; - sprev->next = flq->sdesc_info; - - for (sdesc = flq->sdesc, i = 0; i < flq->size; i++, sdesc++, desc++) { - rv = flq_fill_one(descq, sdesc, desc); - if (rv < 0) { - descq_flq_free_resource(descq); - descq_flq_free_page_resource(descq); - return rv; - } - } - - return 0; -} - -static inline int flq_refill_pages(struct qdma_descq *descq, - int count, bool recycle, gfp_t gfp) -{ - struct xlnx_dma_dev *xdev = descq->xdev; - struct device *dev = &xdev->conf.pdev->dev; - int node = dev_to_node(dev); - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - unsigned int n_recycle_index = flq->recycle_idx; - /* find the most significant bit number */ - unsigned int div_bits = flq->desc_pg_shift; - struct qdma_sw_pg_sg *pg_sdesc = flq->pg_sdesc; - unsigned int free_bufs_in_pg; - unsigned int i = 0, j = 0; - int rv; - - for (i = 0; i < count; ) { - pg_sdesc = flq->pg_sdesc + - (n_recycle_index & flq->num_pgs_mask); - - if (!pg_sdesc) { - pr_err("pg_sdesc is NULL"); - return -EINVAL; - } - - free_bufs_in_pg = (pg_sdesc->pg_offset >> div_bits); - free_bufs_in_pg = - min_t(unsigned int, free_bufs_in_pg, count - i); - for (j = 0; j < free_bufs_in_pg; j++) { - pg_sdesc->pg_offset -= flq->desc_buf_size; - if (!recycle && !descq->conf.fp_descq_c2h_packet) - put_page(pg_sdesc->pg_base); - } - i += free_bufs_in_pg; - BUG_ON(i > count); - if (!pg_sdesc->pg_offset) - n_recycle_index++; - } - - if (recycle) - flq->recycle_idx = n_recycle_index; - else { - while (1) { - pg_sdesc = flq->pg_sdesc + - (flq->recycle_idx & flq->num_pgs_mask); - - if (!pg_sdesc) { - pr_err("pg_sdesc is NULL"); - return -EINVAL; - } - - /** Stop the allocation when the pg_offset of - * the page is not 0 and - * recycle index is less than the alloc index - */ - if (pg_sdesc->pg_offset || - flq->recycle_idx == flq->alloc_idx) - break; - - flq_unmap_page_one(pg_sdesc, dev, flq->desc_pg_order); - put_page(pg_sdesc->pg_base); - rv = flq_fill_page_one(pg_sdesc, - dev, node, flq->desc_pg_order, gfp); - if (rv < 0) - break; - - flq->recycle_idx++; - } - } - - return 0; -} - -static int qdma_flq_refill(struct qdma_descq *descq, int idx, int count, - int recycle, gfp_t gfp) -{ - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - struct qdma_sw_sg *sdesc = flq->sdesc + idx; - struct qdma_c2h_desc *desc = flq->desc + idx; - struct qdma_sdesc_info *sinfo = flq->sdesc_info + idx; - int i; - int rv; - - if (!recycle) { - rv = flq_refill_pages(descq, count, recycle, gfp); - if (unlikely(rv < 0)) { - pr_err("%s: flq_refill_pages failed rv %d error", - descq->conf.name, rv); - } - } - - for (i = 0; i < count; i++, idx++, sdesc++, desc++, sinfo++) { - if (idx == flq->size) { - idx = 0; - sdesc = flq->sdesc; - desc = flq->desc; - sinfo = flq->sdesc_info; - } - - if (recycle) { - sdesc->len = descq->conf.c2h_bufsz; - } else { - flq_free_one(sdesc, desc); - rv = flq_fill_one(descq, sdesc, desc); - if (unlikely(rv < 0)) { - pr_err("%s: rv %d error", - descq->conf.name, rv); - if (rv == -ENOMEM) - flq->alloc_fail++; - else - flq->mapping_err++; - - break; - } - } - sinfo->fbits = 0; - descq->avail++; - } - - if (list_empty(&descq->work_list) && - list_empty(&descq->pend_list)) { - descq->pend_list_empty = 1; - if (descq->q_stop_wait) - qdma_waitq_wakeup(&descq->pend_list_wq); - } - - return i; -} - -/* - * - */ -int descq_st_c2h_read(struct qdma_descq *descq, struct qdma_request *req, - bool update_pidx, bool refill) -{ - struct qdma_sgt_req_cb *cb = qdma_req_cb_get(req); - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - unsigned int pidx = flq->pidx_pend; - struct qdma_sw_sg *fsg = flq->sdesc + pidx; - struct qdma_sw_sg *tsg = req->sgl; - unsigned int fsgcnt = ring_idx_delta(descq->pidx, pidx, flq->size); - unsigned int tsgoff = cb->sg_offset; - unsigned int foff = 0; - int i = 0, j = 0; - int rv = 0; - unsigned int copied = 0; - - if (!fsgcnt) - return 0; - - if (cb->sg_idx) { - for (; tsg && j < cb->sg_idx; j++) - tsg = tsg->next; - - if (!tsg) { - pr_err("tsg error, index %u/%u.\n", - cb->sg_idx, req->sgcnt); - return -EINVAL; - } - } - - while ((i < fsgcnt) && tsg) { - unsigned int flen = fsg->len; - unsigned char *faddr = page_address(fsg->pg) + fsg->offset; - - foff = 0; - - while (flen && tsg) { - unsigned int toff = tsg->offset + tsgoff; - unsigned int copy = min_t(unsigned int, flen, - tsg->len - tsgoff); - u64 *pkt_tx_time = - (u64 *)(page_address(fsg->pg) + fsg->offset); - - if (!req->no_memcpy) { - memcpy(page_address(tsg->pg) + toff, - faddr, copy); - flush_dcache_page(tsg->pg); - } - if (descq->conf.ping_pong_en && - *pkt_tx_time == descq->ping_pong_tx_time) { - u64 latency; - - pr_debug("pkt tx_time=%llu\n", *pkt_tx_time); - - latency = descq->ping_pong_rx_time - - *pkt_tx_time; - - // calculate minimum latency - if (descq->xdev->ping_pong_lat_min > latency - || descq->xdev->ping_pong_lat_min == 0) { - pr_info("ping_pong_lat_min=%llu curr=%llu\n", - descq->xdev->ping_pong_lat_min, - latency); - descq->xdev->ping_pong_lat_min = - latency; - } - - // calculate max latency - if (descq->xdev->ping_pong_lat_max < latency - || descq->xdev->ping_pong_lat_max == 0) { - pr_info("ping_pong_lat_max=%llu curr=%llu\n", - descq->xdev->ping_pong_lat_max, - latency); - descq->xdev->ping_pong_lat_max = - latency; - } - - // sum of latencies for avg - descq->xdev->ping_pong_lat_total += latency; - } else if (descq->conf.ping_pong_en && - *pkt_tx_time != descq->ping_pong_tx_time) { - pr_err("Error: pkt tx=%llu descq->tx_time=%llu %p\n", - *pkt_tx_time, - descq->ping_pong_tx_time, - descq); - } - - - faddr += copy; - flen -= copy; - foff += copy; - tsgoff += copy; - copied += copy; - - if (tsgoff == tsg->len) { - tsg = tsg->next; - tsgoff = 0; - j++; - } - } - - if (foff == fsg->len) { - pidx = ring_idx_incr(pidx, 1, descq->conf.rngsz); - i++; - foff = 0; - fsg = fsg->next; - } - } - - incr_cmpl_desc_cnt(descq, i); - - if (refill && i) - qdma_flq_refill(descq, flq->pidx_pend, i, 1, GFP_ATOMIC); - - flq->pidx_pend = ring_idx_incr(flq->pidx_pend, i, flq->size); - if (foff) { - fsg->offset += foff; - fsg->len -= foff; - } - - if (i && update_pidx) { - i = ring_idx_decr(flq->pidx_pend, 1, flq->size); - descq->pidx_info.pidx = i; - rv = queue_pidx_update(descq->xdev, descq->conf.qidx, - descq->conf.q_type, &descq->pidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - return -EINVAL; - } - } - - cb->sg_idx = j; - cb->sg_offset = tsgoff; - cb->left -= copied; - - flq->pkt_dlen -= copied; - - return copied; -} - -static int qdma_c2h_packets_proc_dflt(struct qdma_descq *descq) -{ - struct qdma_sgt_req_cb *cb = NULL, *tmp = NULL; - - list_for_each_entry_safe(cb, tmp, &descq->pend_list, list) { - int rv; - - /* check for zero length dma */ - if (!cb->left) { - pr_debug("%s, cb 0x%p pending, zero len.\n", - descq->conf.name, cb); - - qdma_sgt_req_done(descq, cb, 0); - return 0; - } - - rv = descq_st_c2h_read(descq, (struct qdma_request *)cb, 0, 0); - if (rv < 0) { - pr_info("req 0x%p, error %d.\n", cb, rv); - qdma_sgt_req_done(descq, cb, rv); - continue; - } - - if (!cb->left) - qdma_sgt_req_done(descq, cb, 0); - else - break; /* no more data available */ - } - - return 0; -} - -void cmpt_next(struct qdma_descq *descq) -{ - u8 *desc_cmpt_cur = (u8 *)descq->desc_cmpt_cur + descq->cmpt_entry_len; - - descq->desc_cmpt_cur = desc_cmpt_cur; - if (unlikely(++descq->cidx_cmpt == descq->conf.rngsz_cmpt)) { - descq->cidx_cmpt = 0; - descq->color ^= 1; - descq->desc_cmpt_cur = descq->desc_cmpt; - } -} - -static inline bool is_new_cmpl_entry(struct qdma_descq *descq, - struct qdma_ul_cmpt_info *cmpl) -{ - return cmpl->f.color == descq->color; -} - -int parse_cmpl_entry(struct qdma_descq *descq, struct qdma_ul_cmpt_info *cmpl) -{ - __be64 *cmpt = (__be64 *)descq->desc_cmpt_cur; - - dma_rmb(); - -#if 0 - print_hex_dump(KERN_INFO, "cmpl entry ", DUMP_PREFIX_OFFSET, - 16, 1, (void *)cmpt, descq->cmpt_entry_len, - false); -#endif - - cmpl->entry = cmpt; - cmpl->f.format = (cmpt[0] & F_C2H_CMPT_ENTRY_F_FORMAT) ? 1 : 0; - cmpl->f.color = (cmpt[0] & F_C2H_CMPT_ENTRY_F_COLOR) ? 1 : 0; - cmpl->f.err = (cmpt[0] & F_C2H_CMPT_ENTRY_F_ERR) ? 1 : 0; - cmpl->f.eot = (cmpt[0] & F_C2H_CMPT_ENTRY_F_EOT) ? 1 : 0; - cmpl->f.desc_used = (cmpt[0] & F_C2H_CMPT_ENTRY_F_DESC_USED) ? 1 : 0; - if (!cmpl->f.format && cmpl->f.desc_used) { - cmpl->len = (cmpt[0] >> S_C2H_CMPT_ENTRY_LENGTH) & - M_C2H_CMPT_ENTRY_LENGTH; - /* zero length transfer allowed */ - } else - cmpl->len = 0; - - return 0; -} - -static int get_fl_nr(unsigned int len, - unsigned int c2h_bufsz, - unsigned int pg_shift, unsigned int pg_mask, - unsigned int *last_len) -{ - unsigned int l_len = len; - int l_fl_nr = 1; - - if ((len & (len-1)) == 0) { - /* pr_info("Len is ^2"); */ - l_fl_nr = len ? ((len + pg_mask) >> pg_shift) : 1; - l_len = (len & pg_mask); - if (l_len == 0) - l_len = c2h_bufsz; - } else { - /* pr_info("Len is non ^2"); */ - if (len) { - if (len <= c2h_bufsz) - l_fl_nr = 1; - else { - l_fl_nr = 0; - while (l_len >= c2h_bufsz) { - l_fl_nr++; - l_len -= c2h_bufsz; - } - - if (l_len) - l_fl_nr++; - else - l_len = c2h_bufsz; - } - } - - } - - *last_len = l_len; - return l_fl_nr; -} - -static int rcv_pkt(struct qdma_descq *descq, struct qdma_ul_cmpt_info *cmpl, - unsigned int len) -{ - unsigned int pidx = cmpl->pidx; - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - unsigned int pg_shift = flq->desc_pg_shift; - unsigned int pg_mask = (1 << pg_shift) - 1; - unsigned int rngsz = descq->conf.rngsz; - /* zero length still uses one descriptor */ - unsigned int l_len = 0; - int fl_nr = get_fl_nr(len, - descq->conf.c2h_bufsz, - pg_shift, pg_mask, &l_len); - unsigned int last = ring_idx_incr(cmpl->pidx, fl_nr - 1, rngsz); - unsigned int next = ring_idx_incr(last, 1, rngsz); - struct qdma_sw_sg *sdesc = flq->sdesc + last; - unsigned int cidx_next = ring_idx_incr(descq->cidx_cmpt, 1, - descq->conf.rngsz_cmpt); - - if (!len) - sdesc->len = 0; - else - sdesc->len = l_len; - - if (descq->avail < fl_nr) - return -EBUSY; - - descq->avail -= fl_nr; - - - if (descq->conf.fp_descq_c2h_packet) { - int rv = descq->conf.fp_descq_c2h_packet(descq->q_hndl, - descq->conf.quld, len, fl_nr, flq->sdesc + pidx, - descq->conf.cmpl_udd_en ? - (unsigned char *)cmpl->entry : NULL); - - if (rv < 0) - return rv; - flq->pidx_pend = next; - } else { - int i; - struct qdma_sdesc_info *sinfo = flq->sdesc_info + pidx; - - for (i = 0; i < fl_nr; i++, sinfo = sinfo->next) { - WARN_ON(sinfo->f.valid); - sinfo->f.valid = 1; - sinfo->cidx = cidx_next; - } - - flq->sdesc_info[pidx].f.sop = 1; - flq->sdesc_info[last].f.eop = 1; - - flq->pkt_dlen += len; - if (descq->conf.cmpl_udd_en) - flq->udd_cnt++; - } - cmpl->pidx = next; - - return 0; -} - -int rcv_udd_only(struct qdma_descq *descq, struct qdma_ul_cmpt_info *cmpl) -{ -#ifdef XMP_DISABLE_ST_C2H_CMPL - __be64 cmpt_entry = cmpl->entry[0]; -#endif - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - - pr_debug("%s, rcv udd.\n", descq->conf.name); -#if 0 - print_hex_dump(KERN_INFO, "cmpl entry: ", DUMP_PREFIX_OFFSET, - 16, 1, (void *)cmpl->entry, descq->cmpt_entry_len, - false); -#endif - - /* udd only: no descriptor used */ - if (descq->conf.fp_descq_c2h_packet) { - return descq->conf.fp_descq_c2h_packet(descq->q_hndl, - descq->conf.quld, 0, 0, NULL, - (unsigned char *)cmpl->entry); - } -#ifdef XMP_DISABLE_ST_C2H_CMPL - if ((cmpt_entry & (1 << 20)) > 0) { - __be16 pkt_cnt = (cmpt_entry >> 32) & 0xFFFF; - __be16 pkt_len = (cmpt_entry >> 48) & 0xFFFF; - int i; - - pr_info("pkt %u * %u.\n", pkt_len, pkt_cnt); - for (i = 0; i < pkt_cnt; i++) { - int rv = rcv_pkt(descq, cmpl, pkt_len); - - if (rv < 0) - break; - } - } -#endif - flq->udd_cnt++; - - return 0; -} - -static void descq_adjust_c2h_cntr_avgs(struct qdma_descq *descq) -{ - int i; - struct xlnx_dma_dev *xdev = descq->xdev; - struct global_csr_conf *csr_info = &xdev->csr_info; - uint8_t latecy_optimized = descq->conf.latency_optimize; - - descq->c2h_pend_pkt_moving_avg = - csr_info->c2h_cnt_th[descq->cmpt_cidx_info.counter_idx]; - - if (descq->sorted_c2h_cntr_idx == (QDMA_GLOBAL_CSR_ARRAY_SZ - 1)) - i = xdev->sorted_c2h_cntr_idx[descq->sorted_c2h_cntr_idx]; - else - i = xdev->sorted_c2h_cntr_idx[descq->sorted_c2h_cntr_idx + 1]; - - if (latecy_optimized) - descq->c2h_pend_pkt_avg_thr_hi = (csr_info->c2h_cnt_th[i] + - csr_info->c2h_cnt_th[i]); - else - descq->c2h_pend_pkt_avg_thr_hi = - (descq->c2h_pend_pkt_moving_avg + - csr_info->c2h_cnt_th[i]); - - if (descq->sorted_c2h_cntr_idx > 0) - i = xdev->sorted_c2h_cntr_idx[descq->sorted_c2h_cntr_idx - 1]; - else - i = xdev->sorted_c2h_cntr_idx[descq->sorted_c2h_cntr_idx]; - if (latecy_optimized) - descq->c2h_pend_pkt_avg_thr_lo = (csr_info->c2h_cnt_th[i] + - csr_info->c2h_cnt_th[i]); - else - descq->c2h_pend_pkt_avg_thr_lo = - (descq->c2h_pend_pkt_moving_avg + - csr_info->c2h_cnt_th[i]); - - descq->c2h_pend_pkt_avg_thr_hi >>= 1; - descq->c2h_pend_pkt_avg_thr_lo >>= 1; - pr_debug("q%u: c2h_cntr_idx = %u %u %u", descq->conf.qidx, - descq->cmpt_cidx_info.counter_idx, - descq->c2h_pend_pkt_avg_thr_lo, - descq->c2h_pend_pkt_avg_thr_hi); -} - -static void descq_incr_c2h_cntr_th(struct qdma_descq *descq) -{ - unsigned char i, c2h_cntr_idx; - unsigned char c2h_cntr_val_new; - unsigned char c2h_cntr_val_curr; - - if (descq->sorted_c2h_cntr_idx == - (QDMA_GLOBAL_CSR_ARRAY_SZ - 1)) - return; - descq->c2h_cntr_monitor_cnt = 0; - i = descq->sorted_c2h_cntr_idx; - c2h_cntr_idx = descq->xdev->sorted_c2h_cntr_idx[i]; - c2h_cntr_val_curr = descq->xdev->csr_info.c2h_cnt_th[c2h_cntr_idx]; - i++; - c2h_cntr_idx = descq->xdev->sorted_c2h_cntr_idx[i]; - c2h_cntr_val_new = descq->xdev->csr_info.c2h_cnt_th[c2h_cntr_idx]; - - if ((c2h_cntr_val_new >= descq->c2h_pend_pkt_moving_avg) && - (c2h_cntr_val_new - descq->c2h_pend_pkt_moving_avg) >= - (descq->c2h_pend_pkt_moving_avg - c2h_cntr_val_curr)) - return; /* choosing the closest */ - /* do not allow c2h c2ntr value go beyond half of cmpt rng sz*/ - if (c2h_cntr_val_new < (descq->conf.rngsz >> 1)) { - descq->cmpt_cidx_info.counter_idx = c2h_cntr_idx; - descq->sorted_c2h_cntr_idx = i; - descq_adjust_c2h_cntr_avgs(descq); - } -} - -static void descq_decr_c2h_cntr_th(struct qdma_descq *descq, - unsigned int budget) -{ - unsigned char i, c2h_cntr_idx; - unsigned char c2h_cntr_val_new; - unsigned char c2h_cntr_val_curr; - - if (!descq->sorted_c2h_cntr_idx) - return; - descq->c2h_cntr_monitor_cnt = 0; - i = descq->sorted_c2h_cntr_idx; - c2h_cntr_idx = descq->xdev->sorted_c2h_cntr_idx[i]; - c2h_cntr_val_curr = descq->xdev->csr_info.c2h_cnt_th[c2h_cntr_idx]; - i--; - c2h_cntr_idx = descq->xdev->sorted_c2h_cntr_idx[i]; - - c2h_cntr_val_new = descq->xdev->csr_info.c2h_cnt_th[c2h_cntr_idx]; - - if ((c2h_cntr_val_new <= descq->c2h_pend_pkt_moving_avg) && - (descq->c2h_pend_pkt_moving_avg - c2h_cntr_val_new) >= - (c2h_cntr_val_curr - descq->c2h_pend_pkt_moving_avg)) - return; /* choosing the closest */ - - /* for better performance we do not allow c2h_cnt - * val below budget unless latency optimized - * '-2' is SW work around for HW bug - */ - if (!descq->conf.latency_optimize && - (c2h_cntr_val_new < (budget - 2))) - return; - - descq->cmpt_cidx_info.counter_idx = c2h_cntr_idx; - - descq->sorted_c2h_cntr_idx = i; - descq_adjust_c2h_cntr_avgs(descq); -} - - -#define MAX_C2H_CNTR_STAGNANT_CNT 16 - -static void descq_adjust_c2h_cntr_th(struct qdma_descq *descq, - unsigned int pend, unsigned int budget) -{ - descq->c2h_pend_pkt_moving_avg += pend; - descq->c2h_pend_pkt_moving_avg >>= 1; /* average */ - /* if avg > hi_th, increase the counter - * if avg < lo_th, decrease the counter - */ - if (descq->c2h_pend_pkt_avg_thr_hi <= descq->c2h_pend_pkt_moving_avg) - descq_incr_c2h_cntr_th(descq); - else if (descq->c2h_pend_pkt_avg_thr_lo >= - descq->c2h_pend_pkt_moving_avg) - descq_decr_c2h_cntr_th(descq, budget); - else { - descq->c2h_cntr_monitor_cnt++; - if (descq->c2h_cntr_monitor_cnt == MAX_C2H_CNTR_STAGNANT_CNT) { - /* go down on counter value to see if we actually are - * increasing latency by setting - * higher counter threshold - */ - descq_decr_c2h_cntr_th(descq, budget); - descq->c2h_cntr_monitor_cnt = 0; - } else - return; - } -} - -static int descq_cmpl_err_check(struct qdma_descq *descq, - struct qdma_ul_cmpt_info *cmpl) -{ - /* - * format = 1 does not have length field, so the driver cannot - * figure out how many descriptor is used - */ - if (unlikely(cmpl->f.format)) { - pr_err("%s: ERR cmpl. entry %u format=1.\n", - descq->conf.name, descq->cidx_cmpt); - goto err_out; - } - - if (unlikely(!cmpl->f.desc_used && !descq->conf.cmpl_udd_en)) { - pr_warn("%s, ERR cmpl entry %u, desc_used 0, udd_en 0.\n", - descq->conf.name, descq->cidx_cmpt); - goto err_out; - } - - if (unlikely(cmpl->f.err)) { - pr_warn("%s, ERR cmpl entry %u error set\n", - descq->conf.name, descq->cidx_cmpt); - goto err_out; - } - - return 0; -err_out: - descq->err = 1; - print_hex_dump(KERN_INFO, "cmpl entry: ", DUMP_PREFIX_OFFSET, - 16, 1, (void *)cmpl, descq->cmpt_entry_len, - false); - return -EINVAL; - -} - -int descq_process_completion_st_c2h(struct qdma_descq *descq, int budget, - bool upd_cmpl) -{ - struct xlnx_dma_dev *xdev = descq->xdev; - struct qdma_c2h_cmpt_cmpl_status *cs = - (struct qdma_c2h_cmpt_cmpl_status *) - descq->desc_cmpt_cmpl_status; - struct qdma_queue_conf *qconf = &descq->conf; - unsigned int rngsz_cmpt = qconf->rngsz_cmpt; - unsigned int pidx = descq->pidx; - unsigned int cidx_cmpt = descq->cidx_cmpt; - unsigned int pidx_cmpt = cs->pidx; - struct qdma_flq *flq = (struct qdma_flq *)descq->flq; - unsigned int pidx_pend = flq->pidx_pend; - bool uld_handler = descq->conf.fp_descq_c2h_packet ? true : false; - unsigned char is_ul_ext = (qconf->desc_bypass && - qconf->fp_proc_ul_cmpt_entry) ? 1 : 0; - int pend, ret = 0; - int proc_cnt = 0; - int rv = 0; - int read_weight = budget; - - /* once an error happens, stop processing of the Q */ - if (descq->err) { - pr_err("%s: err.\n", descq->conf.name); - return -EINVAL; - } - - dma_rmb(); - pend = ring_idx_delta(pidx_cmpt, cidx_cmpt, rngsz_cmpt); - if (!pend) { - /* SW work around where next interrupt could be missed when - * there are no entries as of now - */ - if (descq->xdev->conf.qdma_drv_mode != POLL_MODE) { - rv = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, - &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - return -EINVAL; - } - } - return -ENODATA; - } - -#if 0 - print_hex_dump(KERN_INFO, "cmpl status: ", DUMP_PREFIX_OFFSET, - 16, 1, (void *)cs, sizeof(*cs), - false); - pr_info("cmpl status: pidx 0x%x, cidx %x, color %d, int_state 0x%x.\n", - cs->pidx, cs->cidx, cs->color_isr_status & 0x1, - (cs->color_isr_status >> 1) & 0x3); -#endif - - flq->pkt_cnt = pend; - - if (!budget || budget > pend) - budget = pend; - - while (likely(proc_cnt < budget)) { - struct qdma_ul_cmpt_info cmpl; - int rv; - - memset(&cmpl, 0, sizeof(struct qdma_ul_cmpt_info)); - if (is_ul_ext) - rv = qconf->fp_proc_ul_cmpt_entry(descq->desc_cmpt_cur, - &cmpl); - else - rv = parse_cmpl_entry(descq, &cmpl); - /* completion entry error, q is halted */ - if (rv < 0) - return rv; - rv = descq_cmpl_err_check(descq, &cmpl); - if (rv < 0) - return rv; - - if (!is_new_cmpl_entry(descq, &cmpl)) - break; - - cmpl.pidx = pidx; - - if (cmpl.f.desc_used) { - rv = rcv_pkt(descq, &cmpl, cmpl.len); - } else if (descq->conf.cmpl_udd_en) { - /* udd only: no descriptor used */ - rv = rcv_udd_only(descq, &cmpl); - } - - if (rv < 0) /* cannot process now, stop */ - break; - - pidx = cmpl.pidx; - - cmpt_next(descq); - proc_cnt++; - } - - flq->pkt_cnt -= proc_cnt; - - if ((xdev->conf.intr_moderation) && - (descq->cmpt_cidx_info.trig_mode == - TRIG_MODE_COMBO)) { - pend = ring_idx_delta(cs->pidx, descq->cidx_cmpt, rngsz_cmpt); - flq->pkt_cnt = pend; - - /* we dont need interrupt if packets available for next read */ - if (read_weight && (flq->pkt_cnt > read_weight)) - descq->cmpt_cidx_info.irq_en = 0; - else - descq->cmpt_cidx_info.irq_en = 1; - - /* if we use just then at right value of c2h_cntr - * the average goes down as there - * will not be many pend packet. - */ - if (descq->conf.adaptive_rx) - descq_adjust_c2h_cntr_th(descq, pend + proc_cnt, - read_weight); - } - - if (proc_cnt) { - descq->pidx_cmpt = pidx_cmpt; - descq->pidx = pidx; - descq->cmpt_cidx_info.wrb_cidx = descq->cidx_cmpt; - if (!descq->conf.fp_descq_c2h_packet) { - rv = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - return -EINVAL; - } - qdma_c2h_packets_proc_dflt(descq); - } - - flq->pkt_cnt = ring_idx_delta(cs->pidx, descq->cidx_cmpt, - rngsz_cmpt); - - /* some descq entries have been consumed */ - if (flq->pidx_pend != pidx_pend) { - pend = ring_idx_delta(flq->pidx_pend, pidx_pend, - flq->size); - qdma_flq_refill(descq, pidx_pend, pend, - uld_handler ? 0 : 1, GFP_ATOMIC); - - if (upd_cmpl && !descq->q_stop_wait) { - pend = ring_idx_decr(flq->pidx_pend, 1, - flq->size); - descq->pidx_info.pidx = pend; - if (!descq->conf.fp_descq_c2h_packet) { - ret = queue_pidx_update(descq->xdev, - descq->conf.qidx, - descq->conf.q_type, - &descq->pidx_info); - if (unlikely(ret < 0)) { - pr_err("%s: Failed to update pidx\n", - descq->conf.name); - return -EINVAL; - } - } - } - } - } - - return 0; -} - -int qdma_queue_c2h_peek(unsigned long dev_hndl, unsigned long id, - unsigned int *udd_cnt, unsigned int *pkt_cnt, - unsigned int *data_len) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - struct qdma_flq *flq; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - descq = qdma_device_get_descq_by_id(xdev, id, NULL, 0, 0); - if (!descq) { - pr_err("Invalid qid(%ld)", id); - return -EINVAL; - } - - flq = (struct qdma_flq *)descq->flq; - *udd_cnt = flq->udd_cnt; - *pkt_cnt = flq->pkt_cnt; - *data_len = flq->pkt_dlen; - - return 0; -} - -int qdma_queue_packet_read(unsigned long dev_hndl, unsigned long id, - struct qdma_request *req, struct qdma_cmpl_ctrl *cctrl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - struct qdma_descq *descq; - struct qdma_sgt_req_cb *cb = NULL; - int rv = 0; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (!req) { - pr_err("req is NULL"); - return -EINVAL; - } - cb = qdma_req_cb_get(req); - - descq = qdma_device_get_descq_by_id(xdev, id, NULL, 0, 1); - if (!descq) { - pr_err("Invalid qid(%ld)", id); - return -EINVAL; - } - - if (!descq->conf.st || (descq->conf.q_type != Q_C2H)) { - pr_info("%s: st %d, type %d.\n", - descq->conf.name, descq->conf.st, descq->conf.q_type); - return -EINVAL; - } - - if (cctrl) { - lock_descq(descq); - - descq->cmpt_cidx_info.trig_mode = - descq->conf.cmpl_trig_mode = cctrl->trigger_mode; - descq->cmpt_cidx_info.timer_idx = - descq->conf.cmpl_timer_idx = cctrl->timer_idx; - descq->cmpt_cidx_info.counter_idx = - descq->conf.cmpl_cnt_th_idx = cctrl->cnt_th_idx; - descq->cmpt_cidx_info.irq_en = - descq->conf.cmpl_en_intr = cctrl->cmpl_en_intr; - descq->cmpt_cidx_info.wrb_en = - descq->conf.cmpl_stat_en = cctrl->en_stat_desc; - - descq->cmpt_cidx_info.wrb_cidx = descq->cidx_cmpt; - - rv = queue_cmpt_cidx_update(descq->xdev, - descq->conf.qidx, &descq->cmpt_cidx_info); - if (unlikely(rv < 0)) { - pr_err("%s: Failed to update cmpt cidx\n", - descq->conf.name); - unlock_descq(descq); - return -EINVAL; - } - - unlock_descq(descq); - } - - memset(cb, 0, QDMA_REQ_OPAQUE_SIZE); - - qdma_waitq_init(&cb->wq); - - lock_descq(descq); - descq_st_c2h_read(descq, req, 1, 1); - unlock_descq(descq); - - return req->count - cb->left; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_st_c2h.h b/QDMA/linux-kernel/driver/libqdma/qdma_st_c2h.h deleted file mode 100755 index 1d6971f..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_st_c2h.h +++ /dev/null @@ -1,227 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_ST_C2H_H__ -#define __QDMA_ST_C2H_H__ -/** - * @file - * @brief This file contains the declarations for qdma st c2h processing - * - */ -#include <linux/spinlock_types.h> -#include <linux/types.h> -#include "qdma_descq.h" -#ifdef ERR_DEBUG -#include "qdma_nl.h" -#endif - -/** - * @struct - qdma_sdesc_info - * @brief qdma descriptor information - */ -struct qdma_sdesc_info { - /** pointer to next descriptor */ - struct qdma_sdesc_info *next; - /** - * @union - desciptor flags - */ - union { - /** 8 flag bits */ - u8 fbits; - /** - * @struct - flags - * @brief desciptor flags - */ - struct flags { - /** is descriptor valid */ - u8 valid:1; - /** start of the packet */ - u8 sop:1; - /** end of the packet */ - u8 eop:1; - /** filler for 5 bits */ - u8 filler:5; - } f; - }; - /** reserved 3 bits */ - u8 rsvd[3]; - /** consumer index */ - unsigned int cidx; -}; - -/** - * struct qdma_sw_pg_sg - qdma page scatter gather request - * - */ -struct qdma_sw_pg_sg { - /** @pg_base: pointer to current page */ - struct page *pg_base; - /** @pg_dma_base_addr: dma address of the allocated page */ - dma_addr_t pg_dma_base_addr; - /** @pg_offset: page offset for all pages */ - unsigned int pg_offset; -}; - -/** - * @struct - qdma_flq - * @brief qdma free list q page allocation book keeping - */ -struct qdma_flq { - /** RO: size of the decriptor */ - unsigned int size; - /** RO: c2h buffer size */ - unsigned int desc_buf_size; - /** RO: number of pages */ - unsigned int num_pages; - /** RO: Mask for number of pages */ - unsigned int num_pgs_mask; - /** RO: number of buffers per page */ - unsigned int num_bufs_per_pg; - /** RO: number of currently allocated page index */ - unsigned int alloc_idx; - /** RO: number of currently recycled page index */ - unsigned int recycle_idx; - /** RO: max page offset */ - unsigned int max_pg_offset; - /** RO: page order */ - unsigned int buf_pg_mask; - /** RO: desc page order */ - unsigned char desc_pg_order; - /** RO: desc page shift */ - unsigned char desc_pg_shift; - /** RO: page shift */ - unsigned char buf_pg_shift; - /** RO: pointer to qdma c2h decriptor */ - struct qdma_c2h_desc *desc; - - /** RW: total # of udd outstanding */ - unsigned int udd_cnt; - /** RW: total # of packet outstanding */ - unsigned int pkt_cnt; - /** RW: total # of pkt payload length outstanding */ - unsigned int pkt_dlen; - /** RW: # of available Rx buffers */ - unsigned int avail; - /** RW: # of times buffer allocation failed */ - unsigned long alloc_fail; - /** RW: # of RX Buffer DMA Mapping failures */ - unsigned long mapping_err; - /** RW: consumer index */ - unsigned int cidx; - /** RW: producer index */ - unsigned int pidx; - /** RW: pending pidxes */ - unsigned int pidx_pend; - /** RW: Page list */ - struct qdma_sw_pg_sg *pg_sdesc; - /** RW: sw scatter gather list */ - struct qdma_sw_sg *sdesc; - /** RW: sw descriptor info */ - struct qdma_sdesc_info *sdesc_info; -}; - -/*****************************************************************************/ -/** - * qdma_descq_rxq_read() - read from the rx queue - * - * @param[in] descq: pointer to qdma_descq - * @param[in] req: queue request - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_rxq_read(struct qdma_descq *descq, struct qdma_request *req); - -/** - * qdma_descq_dump_cmpt() - dump the completion queue descriptors - * - * @param[in] descq: pointer to qdma_descq - * @param[in] start: start completion descriptor index - * @param[in] end: end completion descriptor index - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_descq_dump_cmpt(struct qdma_descq *descq, int start, int end, - char *buf, int buflen); - -/*****************************************************************************/ -/** - * incr_cmpl_desc_cnt() - update the interrupt cidx - * - * @param[in] descq: pointer to qdma_descq - * @param[in] cnt: increment value - * - *****************************************************************************/ -void incr_cmpl_desc_cnt(struct qdma_descq *descq, unsigned int cnt); - -/*****************************************************************************/ -/** - * descq_flq_free_resource() - handler to free the pages for the request - * - * @param[in] descq: pointer to qdma_descq - * - * @return none - *****************************************************************************/ -void descq_flq_free_resource(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * descq_flq_alloc_resource() - handler to allocate the pages for the request - * - * @param[in] descq: pointer to qdma_descq - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int descq_flq_alloc_resource(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * descq_process_completion_st_c2h() - handler to process the st c2h - * completion request - * - * @param[in] descq: pointer to qdma_descq - * @param[in] budget: number of descriptors to process - * @param[in] upd_cmpl: if update completion required - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int descq_process_completion_st_c2h(struct qdma_descq *descq, int budget, - bool upd_cmpl); - -/*****************************************************************************/ -/** - * descq_st_c2h_read() - handler to process the st c2h read request - * - * @param[in] descq: pointer to qdma_descq - * @param[in] req: pointer to read request - * @param[in] update_pidx: flag to update the request - * @param[in] refill: flag to indicate whether to refill the flq - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int descq_st_c2h_read(struct qdma_descq *descq, struct qdma_request *req, - bool update_pidx, bool refill); - -#endif /* ifndef __QDMA_ST_C2H_H__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_thread.c b/QDMA/linux-kernel/driver/libqdma/qdma_thread.c deleted file mode 100755 index cf96fd2..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_thread.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "qdma_thread.h" - -#include <linux/kernel.h> - -#include "qdma_descq.h" -#include "thread.h" -#include "xdev.h" - -/* ********************* global variables *********************************** */ - -static unsigned int thread_cnt; -/** completion status threads */ -static struct qdma_kthread *cs_threads; - -static spinlock_t qcnt_lock; -static unsigned int cpu_count; -static unsigned int *per_cpu_qcnt; - -/* ********************* static function declarations *********************** */ - -static int qdma_thread_cmpl_status_pend(struct list_head *work_item); -static int qdma_thread_cmpl_status_proc(struct list_head *work_item); - -/* ********************* static function definitions ************************ */ -static int qdma_thread_cmpl_status_pend(struct list_head *work_item) -{ - struct qdma_descq *descq = list_entry(work_item, struct qdma_descq, - cmplthp_list); - int pend = 0; - - lock_descq(descq); - pend = !list_empty(&descq->pend_list) || !list_empty(&descq->work_list); - unlock_descq(descq); - - return pend; -} - -static int qdma_thread_cmpl_status_proc(struct list_head *work_item) -{ - struct qdma_descq *descq; - - descq = list_entry(work_item, struct qdma_descq, cmplthp_list); - qdma_descq_service_cmpl_update(descq, 0, 1); - return 0; -} - -/* ********************* public function definitions ************************ */ - -void qdma_thread_remove_work(struct qdma_descq *descq) -{ - struct qdma_kthread *cmpl_thread; - int cpu_idx = cpu_count; - - - lock_descq(descq); - cmpl_thread = descq->cmplthp; - descq->cmplthp = NULL; - - if (descq->cpu_assigned) { - descq->cpu_assigned = 0; - cpu_idx = descq->intr_work_cpu; - } - - pr_debug("%s removing from thread %s, %u.\n", - descq->conf.name, cmpl_thread ? cmpl_thread->name : "?", - cpu_idx); - - unlock_descq(descq); - - if (cpu_idx < cpu_count) { - spin_lock(&qcnt_lock); - per_cpu_qcnt[cpu_idx]--; - spin_unlock(&qcnt_lock); - } - - if (cmpl_thread) { - lock_thread(cmpl_thread); - list_del(&descq->cmplthp_list); - cmpl_thread->work_cnt--; - unlock_thread(cmpl_thread); - } -} - -void qdma_thread_add_work(struct qdma_descq *descq) -{ - struct qdma_kthread *thp = cs_threads; - unsigned int v = 0; - int i, idx = thread_cnt; - - if (descq->xdev->conf.qdma_drv_mode != POLL_MODE) { - spin_lock(&qcnt_lock); - idx = cpu_count - 1; - v = per_cpu_qcnt[idx]; - for (i = idx - 1; i >= 0 && v; i--) { - if (per_cpu_qcnt[i] < v) { - idx = i; - v = per_cpu_qcnt[i]; - } - } - - per_cpu_qcnt[idx]++; - spin_unlock(&qcnt_lock); - - lock_descq(descq); - descq->cpu_assigned = 1; - descq->intr_work_cpu = idx; - unlock_descq(descq); - - pr_debug("%s 0x%p assigned to cpu %u.\n", - descq->conf.name, descq, idx); - - return; - } - - /* Polled mode only */ - for (i = 0; i < thread_cnt; i++, thp++) { - lock_thread(thp); - if (idx == thread_cnt) { - v = thp->work_cnt; - idx = i; - } else if (!thp->work_cnt) { - idx = i; - unlock_thread(thp); - break; - } else if (thp->work_cnt < v) - idx = i; - unlock_thread(thp); - } - - thp = cs_threads + idx; - lock_thread(thp); - list_add_tail(&descq->cmplthp_list, &thp->work_list); - descq->intr_work_cpu = idx; - thp->work_cnt++; - unlock_thread(thp); - - pr_debug("%s 0x%p assigned to cmpl status thread %s,%u.\n", - descq->conf.name, descq, thp->name, thp->work_cnt); - - lock_descq(descq); - descq->cmplthp = thp; - unlock_descq(descq); -} - -int qdma_threads_create(unsigned int num_threads) -{ - struct qdma_kthread *thp; - int i; - int rv; - - if (thread_cnt) { - pr_warn("threads already created!"); - return 0; - } - spin_lock_init(&qcnt_lock); - - cpu_count = num_online_cpus(); - per_cpu_qcnt = kzalloc(cpu_count * sizeof(unsigned int), GFP_KERNEL); - if (!per_cpu_qcnt) - return -ENOMEM; - - thread_cnt = (num_threads == 0) ? cpu_count : num_threads; - - cs_threads = kzalloc(thread_cnt * sizeof(struct qdma_kthread), - GFP_KERNEL); - if (!cs_threads) - return -ENOMEM; - - /* N dma writeback monitoring threads */ - thp = cs_threads; - for (i = 0; i < thread_cnt; i++, thp++) { - thp->cpu = i; - thp->kth_timeout = 0; - rv = qdma_kthread_start(thp, "qdma_cmpl_status_th", i); - if (rv < 0) - goto cleanup_threads; - thp->fproc = qdma_thread_cmpl_status_proc; - thp->fpending = qdma_thread_cmpl_status_pend; - } - - return 0; - -cleanup_threads: - kfree(cs_threads); - cs_threads = NULL; - thread_cnt = 0; - - return rv; -} - -void qdma_threads_destroy(void) -{ - int i; - struct qdma_kthread *thp; - - if (per_cpu_qcnt) { - spin_lock(&qcnt_lock); - kfree(per_cpu_qcnt); - per_cpu_qcnt = NULL; - spin_unlock(&qcnt_lock); - } - - if (!thread_cnt) - return; - - /* N dma writeback monitoring threads */ - thp = cs_threads; - for (i = 0; i < thread_cnt; i++, thp++) - if (thp->fproc) - qdma_kthread_stop(thp); - - kfree(cs_threads); - cs_threads = NULL; - thread_cnt = 0; -} diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_thread.h b/QDMA/linux-kernel/driver/libqdma/qdma_thread.h deleted file mode 100755 index 48b2680..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_thread.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef LIBQDMA_QDMA_THREAD_H_ -#define LIBQDMA_QDMA_THREAD_H_ -/** - * @file - * @brief This file contains the declarations for qdma thread handlers - * - */ - -/** qdma_descq forward declaration */ -struct qdma_descq; - -/*****************************************************************************/ -/** - * qdma_threads_create() - create qdma threads - * This functions creates two threads for each cpu in the system or number of - * number of thread requested by param num_threads and assigns the - * thread handlers - * 1: queue processing thread - * 2: queue completion handler thread - * - * @param[in] num_threads - number of threads to be created - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_threads_create(unsigned int num_threads); - -/*****************************************************************************/ -/** - * qdma_threads_destroy() - destroy all the qdma threads created - * during system initialization - * - * @return none - *****************************************************************************/ -void qdma_threads_destroy(void); - -/*****************************************************************************/ -/** - * qdma_thread_remove_work() - handler to remove the attached work thread - * - * @param[in] descq: pointer to qdma_descq - * - * @return none - *****************************************************************************/ -void qdma_thread_remove_work(struct qdma_descq *descq); - -/*****************************************************************************/ -/** - * qdma_thread_add_work() - handler to add a work thread - * - * @param[in] descq: pointer to qdma_descq - * - * @return none - *****************************************************************************/ -void qdma_thread_add_work(struct qdma_descq *descq); - -#endif /* LIBQDMA_QDMA_THREAD_H_ */ diff --git a/QDMA/linux-kernel/driver/libqdma/qdma_ul_ext.h b/QDMA/linux-kernel/driver/libqdma/qdma_ul_ext.h deleted file mode 100755 index ae69938..0000000 --- a/QDMA/linux-kernel/driver/libqdma/qdma_ul_ext.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef QDMA_UL_EXT_H__ -#define QDMA_UL_EXT_H__ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -/** - * @file - * @brief This file provides the interface definitions for bypass extension - * modules to be plugged in - */ - -#include "libqdma_export.h" - -/** - * struct qdma_q_desc_list - descriptor list - */ -struct qdma_q_desc_list { - /** @desc: pointer to the descriptor */ - void *desc; - /** @next: pointer to the next list element */ - struct qdma_q_desc_list *next; -}; - -/*****************************************************************************/ -/** - * qdma_sgl_find_offset() - find the sgl offset for the request under process - * - * @req: request under process - * @sg_p: pointer to the entry in the sgl list - * @sg_offset: offset in the entry of sgl list - * - * Return: 0: success; <0: on any error - * - *****************************************************************************/ -int qdma_sgl_find_offset(struct qdma_request *req, struct qdma_sw_sg **sg_p, - unsigned int *sg_offset); - -/*****************************************************************************/ -/** - * qdma_update_request() - update the request current processed info - * - * @q_hndl: handle to the q with which bypass module can request descriptors - * @req: request under process - * @num_desc: number of descriptors consumed consumed in the process - * @data_cnt: amount of data processed in the request - * @sg_offset: offset in the @sg - * @sg: next sg to be serviced - * - *****************************************************************************/ -void qdma_update_request(void *q_hndl, struct qdma_request *req, - unsigned int num_desc, - unsigned int data_cnt, - unsigned int sg_offset, - void *sg); - -/*****************************************************************************/ -/** - * qdma_q_desc_get() - request @desc_cnt number of descriptors for the q - * specified by @q_hndl - * - * @q_hndl: handle to the q with which bypass module can request descriptors - * @desc_cnt: number of descriptors required - * @desc_list: list of descriptors to be provided for this request - * - * Return: 0: success; <0: if number of requested descriptors not available - * - *****************************************************************************/ -int qdma_q_desc_get(void *q_hndl, const unsigned int desc_cnt, - struct qdma_q_desc_list **desc_list); - -/*****************************************************************************/ -/** - * qdma_q_init_pointers() - update the pidx/cidx pointers of the q specified - * by @q_hndl - * - * @q_hndl: handle to the q with which bypass module can request descriptors - * - * Return: 0: success; <0: on failure - * - *****************************************************************************/ -int qdma_q_init_pointers(void *q_hndl); - -#endif /* QDMA_UL_EXT_H__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/thread.c b/QDMA/linux-kernel/driver/libqdma/thread.c deleted file mode 100755 index d0c0909..0000000 --- a/QDMA/linux-kernel/driver/libqdma/thread.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "thread.h" - -#include <linux/kernel.h> - -/* - * kernel thread function wrappers - */ -int qdma_kthread_dump(struct qdma_kthread *thp, char *buf, int buflen, - int detail) -{ - int len = 0; - - if (!buf || !buflen) - return 0; - - lock_thread(thp); - len += snprintf(buf, buflen, "%s, cpu %u, work %u.\n", - thp->name, thp->cpu, thp->work_cnt); - - if (detail) - ; - - unlock_thread(thp); - - buf[len] = '\0'; - return len; -} - -static inline int xthread_work_pending(struct qdma_kthread *thp) -{ - struct list_head *work_item, *next; - - /* any work items assigned to this thread? */ - if (list_empty(&thp->work_list)) - return 0; - - - /* any work item has pending work to do? */ - list_for_each_safe(work_item, next, &thp->work_list) { - if (thp->fpending && thp->fpending(work_item)) - return 1; - - } - return 0; -} - -static inline void xthread_reschedule(struct qdma_kthread *thp) -{ - if (thp->kth_timeout) { - pr_debug_thread("%s rescheduling for %u seconds", - thp->name, thp->kth_timeout); - qdma_waitq_wait_event_timeout( - thp->waitq, thp->schedule, - msecs_to_jiffies(thp->kth_timeout)); - } else { - pr_debug_thread("%s rescheduling", thp->name); - qdma_waitq_wait_event(thp->waitq, thp->schedule); - } -} - -static int xthread_main(void *data) -{ - struct qdma_kthread *thp = (struct qdma_kthread *)data; - - pr_debug_thread("%s UP.\n", thp->name); - - disallow_signal(SIGPIPE); - - if (thp->finit) - thp->finit(thp); - - - while (!kthread_should_stop()) { - - struct list_head *work_item, *next; - - pr_debug_thread("%s interruptible\n", thp->name); - - /* any work to do? */ - lock_thread(thp); - if (!xthread_work_pending(thp)) { - unlock_thread(thp); - xthread_reschedule(thp); - lock_thread(thp); - } - thp->schedule = 0; - - if (thp->work_cnt) { - pr_debug_thread("%s processing %u work items\n", - thp->name, thp->work_cnt); - /* do work */ - list_for_each_safe(work_item, next, &thp->work_list) { - thp->fproc(work_item); - } - } - unlock_thread(thp); - schedule(); - } - - pr_debug_thread("%s, work done.\n", thp->name); - - - if (thp->fdone) - thp->fdone(thp); - - pr_debug_thread("%s, exit.\n", thp->name); - return 0; -} - -int qdma_kthread_start(struct qdma_kthread *thp, char *name, int id) -{ - int len; - - if (thp->task) { - pr_warn("kthread %s task already running?\n", thp->name); - return -EINVAL; - } - -#ifdef __QDMA_VF__ - len = snprintf(thp->name, sizeof(thp->name), "%s_vf_%d", name, id); - if (len < 0) - return -EINVAL; -#else - len = snprintf(thp->name, sizeof(thp->name), "%s%d", name, id); - if (len < 0) - return -EINVAL; -#endif - thp->id = id; - - spin_lock_init(&thp->lock); - INIT_LIST_HEAD(&thp->work_list); - qdma_waitq_init(&thp->waitq); - - thp->task = kthread_create_on_node(xthread_main, (void *)thp, - cpu_to_node(thp->cpu), "%s", thp->name); - if (IS_ERR(thp->task)) { - pr_err("kthread %s, create task failed: 0x%lx\n", - thp->name, (unsigned long)IS_ERR(thp->task)); - thp->task = NULL; - return -EFAULT; - } - - kthread_bind(thp->task, thp->cpu); - - pr_debug_thread("kthread 0x%p, %s, cpu %u, task 0x%p.\n", - thp, thp->name, thp->cpu, thp->task); - - wake_up_process(thp->task); - return 0; -} - -int qdma_kthread_stop(struct qdma_kthread *thp) -{ - int rv; - - if (!thp->task) { - pr_debug_thread("kthread %s, already stopped.\n", thp->name); - return 0; - } - - thp->schedule = 1; - rv = kthread_stop(thp->task); - if (rv < 0) { - pr_warn("kthread %s, stop err %d.\n", thp->name, rv); - return rv; - } - - pr_debug_thread("kthread %s, 0x%p, stopped.\n", thp->name, thp->task); - thp->task = NULL; - - return 0; -} - diff --git a/QDMA/linux-kernel/driver/libqdma/thread.h b/QDMA/linux-kernel/driver/libqdma/thread.h deleted file mode 100755 index 56346ce..0000000 --- a/QDMA/linux-kernel/driver/libqdma/thread.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XDMA_KTHREAD_H__ -#define __XDMA_KTHREAD_H__ -/** - * @file - * @brief This file contains the declarations for qdma kernel threads - * - */ -#include <linux/version.h> -#include <linux/spinlock.h> -#include <linux/kthread.h> -#include <linux/cpuset.h> -#include <linux/signal.h> -#include "qdma_compat.h" - -/** - * @struct - qdma_kthread - * @brief qdma thread book keeping parameters - */ -struct qdma_kthread { - /** thread lock*/ - spinlock_t lock; - /** name of the thread */ - char name[26]; - /** cpu number for which the thread associated with */ - unsigned short cpu; - /** thread id */ - unsigned short id; - /** thread sleep timeout value */ - unsigned int kth_timeout; - /** flags for thread */ - unsigned long flag; - /** thread wait queue */ - qdma_wait_queue waitq; - /* flag to indicate scheduling of thread */ - unsigned int schedule; - /** kernel task structure associated with thread*/ - struct task_struct *task; - /** thread work list count */ - unsigned int work_cnt; - /** thread work list count */ - struct list_head work_list; - /** thread initialization handler */ - int (*finit)(struct qdma_kthread *thp); - /** thread pending handler */ - int (*fpending)(struct list_head *work_item); - /** thread peocessing handler */ - int (*fproc)(struct list_head *work_item); - /** thread done handler */ - int (*fdone)(struct qdma_kthread *thp); -}; - -/*****************************************************************************/ -/** - * qdma_kthread_dump() - handler to dump the thread information - * - * @param[in] thp: pointer to qdma_kthread - * @param[in] detail: flag to indicate whether details required or not - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return length of the buffer - *****************************************************************************/ -int qdma_kthread_dump(struct qdma_kthread *thp, char *buf, int buflen, - int detail); - -#ifdef DEBUG_THREADS -#define lock_thread(thp) \ - do { \ - pr_debug("locking thp %s ...\n", (thp)->name); \ - spin_lock(&(thp)->lock); \ - } while (0) - -#define unlock_thread(thp) \ - do { \ - pr_debug("unlock thp %s ...\n", (thp)->name); \ - spin_unlock(&(thp)->lock); \ - } while (0) - -#define qdma_kthread_wakeup(thp) \ - do { \ - pr_debug("signaling thp %s ...\n", (thp)->name); \ - thp->schedule = 1; \ - qdma_waitq_wakeup(&thp->waitq); \ - } while (0) - -#define pr_debug_thread(fmt, ...) pr_debug(fmt, __VA_ARGS__) - -#else -/** lock thread macro */ -#define lock_thread(thp) spin_lock(&(thp)->lock) -/** un lock thread macro */ -#define unlock_thread(thp) spin_unlock(&(thp)->lock) -/** macro to wake up the qdma k thread */ -#define qdma_kthread_wakeup(thp) \ - do { \ - thp->schedule = 1; \ - qdma_waitq_wakeup(&thp->waitq); \ - } while (0) -/** pr_debug_thread */ -#define pr_debug_thread(fmt, ...) -#endif - -/*****************************************************************************/ -/** - * qdma_kthread_start() - handler to start the kernel thread - * - * @param[in] thp: pointer to qdma_kthread - * @param[in] name: name for the thread - * @param[in] id: thread id - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_kthread_start(struct qdma_kthread *thp, char *name, int id); - -/*****************************************************************************/ -/** - * qdma_kthread_stop() - handler to stop the kernel thread - * - * @param[in] thp: pointer to qdma_kthread - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_kthread_stop(struct qdma_kthread *thp); - -#endif /* #ifndef __XDMA_KTHREAD_H__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/version.h b/QDMA/linux-kernel/driver/libqdma/version.h deleted file mode 100755 index 5b6e332..0000000 --- a/QDMA/linux-kernel/driver/libqdma/version.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __LIBQDMA_VERSION_H__ -#define __LIBQDMA_VERSION_H__ - -#define LIBQDMA_MODULE_NAME "libqdma" -#define LIBQDMA_MODULE_DESC "Xilinx QDMA Library" - -#define LIBQDMA_VERSION_MAJOR 2023 -#define LIBQDMA_VERSION_MINOR 2 -#define LIBQDMA_VERSION_PATCH 0 - -#define LIBQDMA_VERSION_STR \ - __stringify(LIBQDMA_VERSION_MAJOR) "." \ - __stringify(LIBQDMA_VERSION_MINOR) "." \ - __stringify(LIBQDMA_VERSION_PATCH) - -#define LIBQDMA_VERSION \ - ((LIBQDMA_VERSION_MAJOR)*10000 + \ - (LIBQDMA_VERSION_MINOR)*1000 + \ - LIBQDMA_VERSION_PATCH) - -#endif /* ifndef __LIBQDMA_VERSION_H__ */ diff --git a/QDMA/linux-kernel/driver/libqdma/xdev.c b/QDMA/linux-kernel/driver/libqdma/xdev.c deleted file mode 100755 index 19880a5..0000000 --- a/QDMA/linux-kernel/driver/libqdma/xdev.c +++ /dev/null @@ -1,1535 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -/** - * @file - * @brief This file contains the declarations for QDMA PCIe device - * - */ -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include <linux/version.h> -#include <linux/kernel.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/errno.h> -#include <linux/sched.h> -#include <linux/vmalloc.h> -#include <linux/delay.h> - -#include "qdma_regs.h" -#include "xdev.h" -#include "qdma_mbox.h" -#include "qdma_intr.h" -#include "qdma_resource_mgmt.h" -#include "qdma_access_common.h" -#ifdef DEBUGFS -#include "qdma_debugfs_dev.h" -#endif -#ifdef __XRT__ -#include "qdma_access_errors.h" -#endif - -#ifdef __LIST_NEXT_ENTRY__ -#define list_next_entry(pos, member) \ - list_entry((pos)->member.next, typeof(*(pos)), member) -#endif - -#ifndef __QDMA_VF__ -#ifndef QDMA_QBASE -#define QDMA_QBASE 0 -#endif -#ifndef QDMA_TOTAL_Q -/** - * CPM5 supports 4095 Qs & all other designs supports 2048 Qs. - * Though the number here is given as 2K Qs, - * actual qmax is extracted from dev cap. - */ -#define QDMA_TOTAL_Q 2048 -#endif -#endif - -/** - * qdma device management - * maintains a list of the qdma devices - */ -static LIST_HEAD(xdev_list); - -/** - * mutex defined for qdma device management - */ -static DEFINE_MUTEX(xdev_mutex); - -#ifndef list_last_entry -#define list_last_entry(ptr, type, member) \ - list_entry((ptr)->prev, type, member) -#endif - -struct qdma_resource_lock { - struct list_head node; - struct mutex lock; -}; - -/*****************************************************************************/ -/** - * pci_dma_mask_set() - check the pci capability of the dma device - * - * @param[in] pdev: pointer to struct pci_dev - * - * - * @return 0: on success - * @return <0: on failure - *****************************************************************************/ -static int pci_dma_mask_set(struct pci_dev *pdev) -{ - /** 64-bit addressing capability for XDMA? */ - - if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) { - /** use 64-bit DMA for descriptors */ - dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); - /** use 64-bit DMA, 32-bit for consistent */ - } else if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) { - dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); - /** use 32-bit DMA */ - dev_info(&pdev->dev, "Using a 32-bit DMA mask.\n"); - } else { - /** use 32-bit DMA */ - dev_info(&pdev->dev, "No suitable DMA possible.\n"); - return -EINVAL; - } - - return 0; -} - -#if KERNEL_VERSION(3, 5, 0) <= LINUX_VERSION_CODE -static void pci_enable_relaxed_ordering(struct pci_dev *pdev) -{ - pcie_capability_set_word(pdev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN); -} - -static void pci_disable_relaxed_ordering(struct pci_dev *pdev) -{ - pcie_capability_clear_word(pdev, PCI_EXP_DEVCTL, - PCI_EXP_DEVCTL_RELAX_EN); -} - -static void pci_enable_extended_tag(struct pci_dev *pdev) -{ - pcie_capability_set_word(pdev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_EXT_TAG); -} - -static void pci_disable_extended_tag(struct pci_dev *pdev) -{ - pcie_capability_clear_word(pdev, PCI_EXP_DEVCTL, - PCI_EXP_DEVCTL_EXT_TAG); -} - -#else -static void pci_enable_relaxed_ordering(struct pci_dev *pdev) -{ - u16 v; - int pos; - - pos = pci_pcie_cap(pdev); - if (pos > 0) { - pci_read_config_word(pdev, pos + PCI_EXP_DEVCTL, &v); - v |= PCI_EXP_DEVCTL_RELAX_EN; - pci_write_config_word(pdev, pos + PCI_EXP_DEVCTL, v); - } -} - -static void pci_disable_relaxed_ordering(struct pci_dev *pdev) -{ - u16 v; - int pos; - - pos = pci_pcie_cap(pdev); - if (pos > 0) { - pci_read_config_word(pdev, pos + PCI_EXP_DEVCTL, &v); - v &= ~(PCI_EXP_DEVCTL_RELAX_EN); - pci_write_config_word(pdev, pos + PCI_EXP_DEVCTL, v); - } -} - -static void pci_enable_extended_tag(struct pci_dev *pdev) -{ - u16 v; - int pos; - - pos = pci_pcie_cap(pdev); - if (pos > 0) { - pci_read_config_word(pdev, pos + PCI_EXP_DEVCTL, &v); - v |= PCI_EXP_DEVCTL_EXT_TAG; - pci_write_config_word(pdev, pos + PCI_EXP_DEVCTL, v); - } -} - -static void pci_disable_extended_tag(struct pci_dev *pdev) -{ - u16 v; - int pos; - - pos = pci_pcie_cap(pdev); - if (pos > 0) { - pci_read_config_word(pdev, pos + PCI_EXP_DEVCTL, &v); - v &= ~(PCI_EXP_DEVCTL_EXT_TAG); - pci_write_config_word(pdev, pos + PCI_EXP_DEVCTL, v); - } -} -#endif - - -#if defined(__QDMA_VF__) -static void xdev_reset_work(struct work_struct *work) -{ - struct xlnx_dma_dev *xdev = container_of(work, struct xlnx_dma_dev, - reset_work); - struct pci_dev *pdev = xdev->conf.pdev; - int rv = 0; - - if (xdev->reset_state == RESET_STATE_RECV_PF_RESET_REQ) { - - qdma_device_offline(pdev, (unsigned long)xdev, XDEV_FLR_ACTIVE); - pci_disable_extended_tag(pdev); - pci_disable_relaxed_ordering(pdev); - pci_release_regions(pdev); - pci_disable_device(pdev); - -#ifndef __XRT__ - rv = pci_request_regions(pdev, "qdma-vf"); - if (rv) { - pr_err("cannot obtain PCI resources\n"); - return; - } -#endif - - rv = pci_enable_device(pdev); - if (rv) { - pr_err("cannot enable PCI device\n"); -#ifndef __XRT__ - pci_release_regions(pdev); -#endif - return; - } - - /* enable relaxed ordering */ - pci_enable_relaxed_ordering(pdev); - - /* enable extended tag */ - pci_enable_extended_tag(pdev); - - /* enable bus master capability */ - pci_set_master(pdev); - - pci_dma_mask_set(pdev); - - pcie_set_readrq(pdev, 512); - - qdma_device_online(pdev, (unsigned long)xdev, XDEV_FLR_ACTIVE); - - if (xdev->reset_state == RESET_STATE_RECV_PF_RESET_DONE) - xdev->reset_state = RESET_STATE_IDLE; - } else if (xdev->reset_state == RESET_STATE_RECV_PF_OFFLINE_REQ) { - qdma_device_offline(pdev, (unsigned long)xdev, - XDEV_FLR_INACTIVE); - } -} -#endif - -/*****************************************************************************/ -/** - * xdev_list_first() - handler to return the first xdev entry from the list - * - * @return pointer to first xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -struct xlnx_dma_dev *xdev_list_first(void) -{ - struct xlnx_dma_dev *xdev; - - mutex_lock(&xdev_mutex); - xdev = list_first_entry(&xdev_list, struct xlnx_dma_dev, list_head); - mutex_unlock(&xdev_mutex); - - return xdev; -} - -/*****************************************************************************/ -/** - * xdev_list_next() - handler to return the next xdev entry from the list - * - * @param[in] xdev: pointer to current xdev - * - * @return pointer to next xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -struct xlnx_dma_dev *xdev_list_next(struct xlnx_dma_dev *xdev) -{ - struct xlnx_dma_dev *next; - - mutex_lock(&xdev_mutex); - next = list_next_entry(xdev, list_head); - mutex_unlock(&xdev_mutex); - - return next; -} - -/*****************************************************************************/ -/** - * xdev_list_dump() - list the dma device details - * - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return pointer to next xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -int xdev_list_dump(char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev, *tmp; - int len = 0; - - mutex_lock(&xdev_mutex); - list_for_each_entry_safe(xdev, tmp, &xdev_list, list_head) { - len += snprintf(buf + len, buflen - len, - "qdma%05x\t%02x:%02x.%02x\n", - xdev->conf.bdf, xdev->conf.pdev->bus->number, - PCI_SLOT(xdev->conf.pdev->devfn), - PCI_FUNC(xdev->conf.pdev->devfn)); - if (len >= buflen) - break; - } - mutex_unlock(&xdev_mutex); - - buf[len] = '\0'; - return len; -} - -/*****************************************************************************/ -/** - * xdev_list_add() - add a new node to the xdma device lsit - * - * @param[in] xdev: pointer to current xdev - * - * @return none - *****************************************************************************/ -static inline void xdev_list_add(struct xlnx_dma_dev *xdev) -{ - u32 bdf = 0; - struct xlnx_dma_dev *_xdev, *tmp; - u32 last_bus = 0; - u32 last_dev = 0; - - mutex_lock(&xdev_mutex); - bdf = ((xdev->conf.pdev->bus->number << PCI_SHIFT_BUS) | - (PCI_SLOT(xdev->conf.pdev->devfn) << PCI_SHIFT_DEV) | - PCI_FUNC(xdev->conf.pdev->devfn)); - xdev->conf.bdf = bdf; - list_add_tail(&xdev->list_head, &xdev_list); - - /* - * Iterate through the list of devices. Increment cfg_done, to - * get the mulitplier for initial configuration of queues. A - * '0' indicates queue is already configured. < 0, indicates - * config done using sysfs entry - */ - - list_for_each_entry_safe(_xdev, tmp, &xdev_list, list_head) { - - /*are we dealing with a different card?*/ -#ifdef __QDMA_VF__ - /** for VF check only bus number, as dev number can change - * in a single card - */ - if (last_bus != _xdev->conf.pdev->bus->number) -#else - if ((last_bus != _xdev->conf.pdev->bus->number) || - (last_dev != PCI_SLOT(_xdev->conf.pdev->devfn))) -#endif - xdev->conf.idx = 0; - xdev->conf.idx++; - last_bus = _xdev->conf.pdev->bus->number; - last_dev = PCI_SLOT(xdev->conf.pdev->devfn); - } - mutex_unlock(&xdev_mutex); -} - - -#undef list_last_entry -/*****************************************************************************/ -/** - * xdev_list_add() - remove a node from the xdma device lsit - * - * @param[in] xdev: pointer to current xdev - * - * @return none - *****************************************************************************/ -static inline void xdev_list_remove(struct xlnx_dma_dev *xdev) -{ - mutex_lock(&xdev_mutex); - list_del(&xdev->list_head); - mutex_unlock(&xdev_mutex); -} - -/*****************************************************************************/ -/** - * xdev_find_by_pdev() - find the xdev using struct pci_dev - * - * @param[in] pdev: pointer to struct pci_dev - * - * @return pointer to xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -struct xlnx_dma_dev *xdev_find_by_pdev(struct pci_dev *pdev) -{ - struct xlnx_dma_dev *xdev, *tmp; - - mutex_lock(&xdev_mutex); - list_for_each_entry_safe(xdev, tmp, &xdev_list, list_head) { - if (xdev->conf.pdev == pdev) { - mutex_unlock(&xdev_mutex); - return xdev; - } - } - mutex_unlock(&xdev_mutex); - return NULL; -} - -/*****************************************************************************/ -/** - * xdev_find_by_idx() - find the xdev using the index value - * - * @param[in] idx: index value in the xdev list - * - * @return pointer to xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -struct xlnx_dma_dev *xdev_find_by_idx(int idx) -{ - struct xlnx_dma_dev *xdev, *tmp; - - mutex_lock(&xdev_mutex); - list_for_each_entry_safe(xdev, tmp, &xdev_list, list_head) { - if (xdev->conf.bdf == idx) { - mutex_unlock(&xdev_mutex); - return xdev; - } - } - mutex_unlock(&xdev_mutex); - return NULL; -} - -/*****************************************************************************/ -/** - * xdev_check_hndl() - helper function to validate the device handle - * - * @param[in] pdev: pointer to struct pci_dev - * @param[in] hndl: device handle - * - * @return 0: success - * @return <0: on failure - *****************************************************************************/ -int xdev_check_hndl(const char *fname, struct pci_dev *pdev, unsigned long hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)hndl; - - if (!pdev) - return -EINVAL; - - if (xdev->magic != QDMA_MAGIC_DEVICE) { - pr_err("%s xdev->magic %ld != %ld\n", - fname, xdev->magic, QDMA_MAGIC_DEVICE); - return -EINVAL; - } - - if (xdev->conf.pdev != pdev) { - pr_err("pci_dev(0x%lx) != pdev(0x%lx)\n", - (unsigned long)xdev->conf.pdev, - (unsigned long)pdev); - return -EINVAL; - } - - return 0; -} - -/********************************************************************** - * PCI-level Functions - **********************************************************************/ - -/*****************************************************************************/ -/** - * xdev_unmap_bars() - Unmap the BAR regions that had been mapped - * earlier using map_bars() - * - * @param[in] xdev: pointer to current xdev - * @param[in] pdev: pointer to struct pci_dev - * - * @return none - *****************************************************************************/ -static void xdev_unmap_bars(struct xlnx_dma_dev *xdev, struct pci_dev *pdev) -{ - if (xdev->regs) { - /* unmap BAR */ - pci_iounmap(pdev, xdev->regs); - /* mark as unmapped */ - xdev->regs = NULL; - } -} - -/*****************************************************************************/ -/** - * xdev_map_bars() - map device regions into kernel virtual address space - * earlier using map_bars() - * - * @param[in] xdev: pointer to current xdev - * @param[in] pdev: pointer to struct pci_dev - * - * Map the device memory regions into kernel virtual address space after - * verifying their sizes respect the minimum sizes needed - * - * @return length of the bar on success - * @return 0 on failure - *****************************************************************************/ -static int xdev_map_bars(struct xlnx_dma_dev *xdev, struct pci_dev *pdev) -{ - int map_len; - - map_len = pci_resource_len(pdev, (int)xdev->conf.bar_num_config); - if (map_len > QDMA_MAX_BAR_LEN_MAPPED) - map_len = QDMA_MAX_BAR_LEN_MAPPED; - - xdev->regs = pci_iomap(pdev, xdev->conf.bar_num_config, map_len); - if (!xdev->regs || - map_len < QDMA_MIN_BAR_LEN_MAPPED) { - pr_err("%s unable to map config bar %d.\n", xdev->conf.name, - xdev->conf.bar_num_config); - return -EINVAL; - } - - return 0; -} - -/*****************************************************************************/ -/** - * xdev_identify_bars() - identifies the AXI Master Lite bar - * and AXI Bridge Master bar - * - * @param[in] xdev: pointer to current xdev - * @param[in] pdev: pointer to struct pci_dev\ - * - * @return 0 on success, -ve on failure - *****************************************************************************/ -static int xdev_identify_bars(struct xlnx_dma_dev *xdev, struct pci_dev *pdev) -{ - int bar_idx = 0; - int rv = 0; - u8 num_bars_present = 0; - int bar_id_list[QDMA_BAR_NUM]; - int bar_id_idx = 0; - - /* Find out the number of bars present in the design */ - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - int map_len = 0; - - map_len = pci_resource_len(pdev, bar_idx); - if (!map_len) - continue; - - bar_id_list[bar_id_idx] = bar_idx; - bar_id_idx++; - num_bars_present++; - } - - if (num_bars_present > 1) { - - /* AXI Master Lite BAR IDENTIFICATION */ - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - (xdev->version_info.device_type == - QDMA_DEVICE_VERSAL_CPM4)) - xdev->conf.bar_num_user = DEFAULT_USER_BAR; - else { -#ifndef __QDMA_VF__ - rv = xdev->hw.qdma_get_user_bar(xdev, 0, - xdev->func_id, - (uint8_t *)&xdev->conf.bar_num_user); -#else - rv = xdev->hw.qdma_get_user_bar(xdev, 1, - xdev->func_id_parent, - (uint8_t *)&xdev->conf.bar_num_user); -#endif - } - - if (rv < 0) { - pr_err("get AXI Master Lite bar failed with error = %d", - rv); -#ifdef __XRT__ - /** This change is for XRT application, - * when there is no user BAR in desin - */ - rv = QDMA_ERR_HWACC_BAR_NOT_FOUND; -#else - return xdev->hw.qdma_get_error_code(rv); -#endif - } - - pr_info("AXI Master Lite BAR %d.\n", - xdev->conf.bar_num_user); - - /* AXI Bridge Master BAR IDENTIFICATION */ - if (num_bars_present > 2) { - for (bar_idx = 0; bar_idx < num_bars_present; - bar_idx++) { - if ((bar_id_list[bar_idx] != - xdev->conf.bar_num_user) && - (bar_id_list[bar_idx] != - xdev->conf.bar_num_config)) { - xdev->conf.bar_num_bypass = - bar_id_list[bar_idx]; - pr_info("AXI Bridge Master BAR %d.\n", - xdev->conf.bar_num_bypass); - break; - } - } - } - } - return rv; -} - -/*****************************************************************************/ -/** - * xdev_alloc() - allocate the dma device - * - * @param[in] conf: qdma device configuration - * - * - * @return pointer to dma device - * @return NULL on failure - *****************************************************************************/ -static struct xlnx_dma_dev *xdev_alloc(struct qdma_dev_conf *conf) -{ - struct xlnx_dma_dev *xdev; - - /* allocate zeroed device book keeping structure */ - xdev = kzalloc(sizeof(struct xlnx_dma_dev), GFP_KERNEL); - if (!xdev) - return NULL; - - spin_lock_init(&xdev->hw_prg_lock); - spin_lock_init(&xdev->lock); - - /* create a driver to device reference */ - memcpy(&xdev->conf, conf, sizeof(*conf)); - - xdev->magic = QDMA_MAGIC_DEVICE; - - /* !! FIXME default to enabled for everything */ - xdev->dev_cap.flr_present = 1; - xdev->dev_cap.st_en = 1; - xdev->dev_cap.mm_en = 1; - xdev->dev_cap.mm_channel_max = 1; - - return xdev; -} - -#ifndef __QDMA_VF__ -static void qdma_err_mon(struct work_struct *work) -{ - struct delayed_work *dwork = container_of(work, - struct delayed_work, work); - struct xlnx_dma_dev *xdev = container_of(dwork, - struct xlnx_dma_dev, err_mon); - - if (!xdev) { - pr_err("Invalid xdev"); - return; - } - spin_lock(&xdev->err_lock); - - if (xdev->err_mon_cancel == 0) { - xdev->hw.qdma_hw_error_process(xdev); - schedule_delayed_work(dwork, msecs_to_jiffies(1000));/* 1 sec */ - } - spin_unlock(&xdev->err_lock); -} -#endif - - - -/*****************************************************************************/ -/** - * qdma_device_offline() - set the dma device in offline mode - * - * @param[in] pdev: pointer to struct pci_dev - * @param[in] dev_hndl: device handle - * @param[in] reset: 0/1 function level reset active or not - * - * @return 0: on success - * @return <0: on failure - *****************************************************************************/ -int qdma_device_offline(struct pci_dev *pdev, unsigned long dev_hndl, - int reset) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (xdev->conf.pdev != pdev) { - pr_err("Invalid pdev passed: pci_dev(0x%lx) != pdev(0x%lx)\n", - (unsigned long)xdev->conf.pdev, (unsigned long)pdev); - return -EINVAL; - } - - if (xlnx_dma_device_flag_check(xdev, XDEV_FLAG_OFFLINE)) { -#ifdef __QDMA_VF__ - if (xdev->workq != NULL) { - pr_debug("destroy workq\n"); - destroy_workqueue(xdev->workq); - xdev->workq = NULL; - } -#endif - return 0; - } - -#ifdef __QDMA_VF__ - if (xdev->reset_state == RESET_STATE_PF_OFFLINE_REQ_PROCESSING) { - int retry_cnt = 10; - - while (!xlnx_dma_device_flag_check(xdev, XDEV_FLAG_OFFLINE)) { - mdelay(100); - if (retry_cnt == 0) - break; - retry_cnt--; - } - if (xdev->workq != NULL) { - destroy_workqueue(xdev->workq); - xdev->workq = NULL; - } - return 0; - } -#endif - /* Canceling the error poll thread which was started - * in the poll mode - */ -#ifndef __QDMA_VF__ - if ((xdev->conf.master_pf) && - (xdev->conf.qdma_drv_mode == POLL_MODE)) { - pr_debug("Cancelling delayed work"); - spin_lock(&xdev->err_lock); - xdev->err_mon_cancel = 1; - cancel_delayed_work_sync(&xdev->err_mon); - spin_unlock(&xdev->err_lock); - } -#endif - - qdma_device_cleanup(xdev); - qdma_device_interrupt_cleanup(xdev); - qdma_mbox_stop(xdev); - intr_teardown(xdev); - xdev->flags &= ~(XDEV_FLAG_IRQ); - - /* - * When the FLR is done to parent PF , it's associated VFs - * and it's resources are no more active. The - * interrupt state of the VF goes bad. That's why switching - * from mbox's interrupt mode to poll mode - */ - qdma_mbox_poll_start(xdev); -#ifdef __QDMA_VF__ - if (reset) { - if (xdev->reset_state == RESET_STATE_RECV_PF_RESET_REQ) { - - xdev_sriov_vf_reset_offline(xdev); - - /** Wait for the PF to send the PF Reset Done*/ - qdma_waitq_wait_event_timeout(xdev->wq, - (xdev->reset_state == - RESET_STATE_RECV_PF_RESET_DONE), - 10 * QDMA_MBOX_MSG_TIMEOUT_MS); - - if (xdev->reset_state != RESET_STATE_RECV_PF_RESET_DONE) - xdev->reset_state = RESET_STATE_INVALID; - } else - xdev_sriov_vf_offline(xdev, 0); - - } else { - if (xdev->reset_state == RESET_STATE_RECV_PF_OFFLINE_REQ) { - xdev_sriov_vf_offline(xdev, 0); - xdev->reset_state = - RESET_STATE_PF_OFFLINE_REQ_PROCESSING; - } else { - xdev_sriov_vf_offline(xdev, 0); - destroy_workqueue(xdev->workq); - xdev->workq = NULL; - } - } - qdma_mbox_stop(xdev); -#elif defined(CONFIG_PCI_IOV) - if (!reset) { - qdma_pf_trigger_vf_offline((unsigned long)xdev); - xdev_sriov_disable(xdev); - } else if (xdev->vf_count_online != 0) { - qdma_pf_trigger_vf_reset((unsigned long)xdev); - qdma_mbox_stop(xdev); - } - -#endif - - if (reset) { - /* Free the allocated resources if FLR process running*/ - if (xdev->conf.fp_flr_free_resource) - xdev->conf.fp_flr_free_resource((unsigned long)xdev); - } - - if (xdev->conf.qdma_drv_mode != POLL_MODE) - xdev->mbox.rx_poll = 0; - - xdev_flag_set(xdev, XDEV_FLAG_OFFLINE); - if (xdev->dev_cap.mailbox_en) - qdma_mbox_cleanup(xdev); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_device_online() - set the dma device in online mode - * - * @param[in] pdev: pointer to struct pci_dev - * @param[in] dev_hndl: device handle - * @param[in] reset: 0/1 function level reset active or not - * - * @return 0: on success - * @return <0: on failure - *****************************************************************************/ -int qdma_device_online(struct pci_dev *pdev, unsigned long dev_hndl, int reset) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - int rv; -#if !defined(__QDMA_VF__) - struct qdma_vf_info *vf; -#endif - if (!xdev) { - pr_err("Invalid device handle received"); - return -EINVAL; - } - - - if (xdev_check_hndl(__func__, pdev, dev_hndl) < 0) { - pr_err("Invalid device"); - return -EINVAL; - } - - if (xdev->conf.pdev != pdev) { - pr_err("pci_dev(0x%lx) != pdev(0x%lx)\n", - (unsigned long)xdev->conf.pdev, (unsigned long)pdev); - } - -#if defined(__QDMA_VF__) - pr_info("reset_state = %d", xdev->reset_state); - if (reset && xdev->reset_state == RESET_STATE_INVALID) { - pr_info("returning"); - return -EINVAL; - } -#endif - - if (xdev->conf.qdma_drv_mode != POLL_MODE && - xdev->conf.qdma_drv_mode != LEGACY_INTR_MODE) { - - if ((xdev->flags & XDEV_FLAG_IRQ) == 0x0) { - rv = intr_setup(xdev); - if (rv) { - pr_err("Failed to setup interrupts, err %d", - rv); - return -EINVAL; - } - } - xdev->flags |= XDEV_FLAG_IRQ; - } - -#ifndef __QDMA_VF__ - if (xdev->dev_cap.mailbox_en) - qdma_mbox_init(xdev); -#else - qdma_mbox_init(xdev); - if (!reset) { - qdma_waitq_init(&xdev->wq); - INIT_WORK(&xdev->reset_work, xdev_reset_work); - xdev->workq = create_singlethread_workqueue("Reset Work Queue"); - } -#endif - rv = qdma_device_init(xdev); - if (rv < 0) { - pr_warn("qdma_init failed %d.\n", rv); - return rv; - } - xdev_flag_clear(xdev, XDEV_FLAG_OFFLINE); -#ifdef __QDMA_VF__ - qdma_mbox_start(xdev); - /* PF mbox will start when vf > 0 */ - rv = xdev_sriov_vf_online(xdev, 0); - if (rv < 0) - return rv; -#endif - rv = qdma_device_interrupt_setup(xdev); - if (rv < 0) { - pr_err("Failed to setup device interrupts"); - return rv; - } - - /* Starting a error poll thread in Poll mode */ -#ifndef __QDMA_VF__ - if ((xdev->conf.master_pf) && - (xdev->conf.qdma_drv_mode == POLL_MODE)) { - - rv = xdev->hw.qdma_hw_error_enable(xdev, - xdev->hw.qdma_max_errors); - if (rv < 0) { - pr_err("Failed to enable error interrupts"); - return -EINVAL; - } - - spin_lock_init(&xdev->err_lock); - xdev->err_mon_cancel = 0; - INIT_DELAYED_WORK(&xdev->err_mon, qdma_err_mon); - schedule_delayed_work(&xdev->err_mon, - msecs_to_jiffies(1000)); - } - - /** - * Send the RESET_DONE message to VF - */ - if (reset && xdev->vf_count != 0) { - int i = 0; - - vf = (struct qdma_vf_info *)xdev->vf_info; - - if (!vf) { - pr_err("Invalid vf handle received"); - return -EINVAL; - } - - qdma_mbox_start(xdev); - for (i = 0; i < xdev->vf_count; i++) { - struct mbox_msg *m = NULL; - u8 vf_count_online = xdev->vf_count_online; - - m = qdma_mbox_msg_alloc(); - if (!m) { - pr_err("Failed to allocate mbox msg\n"); - return -ENOMEM; - } - qdma_mbox_compose_pf_reset_done_message(m->raw, - xdev->func_id, vf[i].func_id); - qdma_mbox_msg_send(xdev, m, 1, - QDMA_MBOX_MSG_TIMEOUT_MS); - - qdma_waitq_wait_event_timeout(xdev->wq, - (xdev->vf_count_online == - (vf_count_online + 1)), - QDMA_MBOX_MSG_TIMEOUT_MS); - } - } - -#endif - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_device_open() - open the dma device - * - * @param[in] mod_name: name of the dma device - * @param[in] conf: device configuration - * @param[in] dev_hndl: device handle - * - * - * @return 0: on success - * @return <0: on failure - *****************************************************************************/ -int qdma_device_open(const char *mod_name, struct qdma_dev_conf *conf, - unsigned long *dev_hndl) -{ - struct pci_dev *pdev = NULL; - struct xlnx_dma_dev *xdev = NULL; - int rv = 0; -#ifndef __QDMA_VF__ - int qbase = QDMA_QBASE; - int qmax = QDMA_TOTAL_Q; -#endif - - *dev_hndl = 0UL; - - if (!mod_name) { - pr_err("%s: mod_name is NULL.\n", __func__); - return -EINVAL; - } - - if (!conf) { - pr_err("%s: queue_conf is NULL.\n", mod_name); - return -EINVAL; - } - - if (conf->qdma_drv_mode > LEGACY_INTR_MODE) { - pr_err("%s: driver mode passed in Invalid.\n", mod_name); - return -EINVAL; - } - - pdev = conf->pdev; - - if (!pdev) { - pr_err("%s: pci device NULL.\n", mod_name); - return -EINVAL; - } - pr_info("%s, %02x:%02x.%02x, pdev 0x%p, 0x%x:0x%x.\n", - mod_name, pdev->bus->number, PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn), pdev, pdev->vendor, pdev->device); - - xdev = xdev_find_by_pdev(pdev); - if (xdev) { - pr_warn("%s, device %s already attached!\n", - mod_name, dev_name(&pdev->dev)); - return -EINVAL; - } - -#ifndef __XRT__ - rv = pci_request_regions(pdev, mod_name); - if (rv) { - /* Just info, some other driver may have claimed the device. */ - dev_info(&pdev->dev, "cannot obtain PCI resources\n"); - return rv; - } -#endif - - rv = pci_enable_device(pdev); - if (rv) { - dev_err(&pdev->dev, "cannot enable PCI device\n"); - goto release_regions; - } - - /* enable relaxed ordering */ - pci_enable_relaxed_ordering(pdev); - - /* enable extended tag */ - pci_enable_extended_tag(pdev); - - /* enable bus master capability */ - pci_set_master(pdev); - - rv = pci_dma_mask_set(pdev); - if (rv) { - pr_err("Failed to set the dma mask"); - goto disable_device; - } - - if (pcie_get_readrq(pdev) < 512) - pcie_set_readrq(pdev, 512); - - /* allocate zeroed device book keeping structure */ - xdev = xdev_alloc(conf); - if (!xdev) { - pr_err("Failed to allocate xdev"); - goto disable_device; - } - - strncpy(xdev->mod_name, mod_name, QDMA_DEV_NAME_MAXLEN - 1); - - xdev_flag_set(xdev, XDEV_FLAG_OFFLINE); - xdev_list_add(xdev); - - rv = snprintf(xdev->conf.name, QDMA_DEV_NAME_MAXLEN, - "qdma%05x-p%s", - xdev->conf.bdf, dev_name(&xdev->conf.pdev->dev)); - xdev->conf.name[rv] = '\0'; - - /* Mapping bars */ - rv = xdev_map_bars(xdev, pdev); - if (rv) { - pr_err("Failed to map the bars"); - goto unmap_bars; - } - - /* Get HW access */ -#ifndef __QDMA_VF__ - rv = qdma_hw_access_init(xdev, 0, &xdev->hw); - if (rv != QDMA_SUCCESS) { - rv = -EINVAL; - goto unmap_bars; - } - - rv = xdev->hw.qdma_get_version(xdev, 0, &xdev->version_info); - if (rv != QDMA_SUCCESS) { - rv = xdev->hw.qdma_get_error_code(rv); - pr_err("Failed to get the HW Version"); - goto unmap_bars; - } - - /* get the device attributes */ - qdma_device_attributes_get(xdev); - qmax = xdev->dev_cap.num_qs; - if (pdev->bus->parent) - rv = qdma_master_resource_create(pdev->bus->number, - pci_bus_max_busnr(pdev->bus->parent), qbase, - qmax, &xdev->dma_device_index); - else - rv = qdma_master_resource_create(pdev->bus->number, - pdev->bus->number, qbase, - qmax, &xdev->dma_device_index); - - if (rv == -QDMA_ERR_NO_MEM) { - pr_err("master_resource_create failed, err = %d", rv); - rv = -ENOMEM; - goto unmap_bars; - } -#else - rv = qdma_hw_access_init(xdev, 1, &xdev->hw); - if (rv != QDMA_SUCCESS) - goto unmap_bars; - rv = xdev->hw.qdma_get_version(xdev, 1, &xdev->version_info); - if (rv != QDMA_SUCCESS) - goto unmap_bars; -#endif - - pr_info("Vivado version = %s\n", - xdev->version_info.qdma_vivado_release_id_str); - -#ifndef __QDMA_VF__ - rv = xdev->hw.qdma_get_function_number(xdev, &xdev->func_id); - if (rv < 0) { - pr_err("get function number failed, err = %d", rv); - rv = -EINVAL; - goto unmap_bars; - } - - rv = qdma_dev_qinfo_get(xdev->dma_device_index, xdev->func_id, - &xdev->conf.qsets_base, - &xdev->conf.qsets_max); - if (rv < 0) { - rv = qdma_dev_entry_create(xdev->dma_device_index, - xdev->func_id); - if (rv < 0) { - pr_err("Failed to create device entry, err = %d", rv); - rv = -ENODEV; - goto unmap_bars; - } - } - - rv = qdma_dev_update(xdev->dma_device_index, xdev->func_id, - xdev->conf.qsets_max, &xdev->conf.qsets_base); - if (rv < 0) { - pr_err("qdma_dev_update function call failed, err = %d\n", rv); - rv = xdev->hw.qdma_get_error_code(rv); - goto unmap_bars; - } - - if (!xdev->dev_cap.mm_en && !xdev->dev_cap.st_en) { - pr_err("None of the modes ( ST or MM) are enabled\n"); - rv = -EINVAL; - goto unmap_bars; - } -#endif - -#ifdef __QDMA_VF__ - if ((conf->qdma_drv_mode != POLL_MODE) && - (xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - (xdev->version_info.device_type == QDMA_DEVICE_VERSAL_CPM4)) { - pr_warn("VF is not supported in %s mode\n", - mode_name_list[conf->qdma_drv_mode].name); - pr_info("Switching VF to poll mode\n"); - xdev->conf.qdma_drv_mode = POLL_MODE; - } -#endif - - if ((conf->qdma_drv_mode == LEGACY_INTR_MODE) && - (!xdev->dev_cap.legacy_intr)) { - dev_err(&pdev->dev, "Legacy mode interrupts are not supported\n"); - goto unmap_bars; - } - - rv = qdma_device_online(pdev, (unsigned long)xdev, XDEV_FLR_INACTIVE); - if (rv < 0) { - pr_warn("Failed to set the dma device online, err = %d", rv); - goto cleanup_qdma; - } - - rv = xdev_identify_bars(xdev, pdev); - if (rv < 0) { - pr_err("Failed to identify bars, err %d", rv); - goto unmap_bars; - } - - memcpy(conf, &xdev->conf, sizeof(*conf)); - - pr_info("%s, %05x, pdev 0x%p, xdev 0x%p, ch %u, q %u, vf %u.\n", - dev_name(&pdev->dev), xdev->conf.bdf, pdev, xdev, - xdev->dev_cap.mm_channel_max, conf->qsets_max, conf->vf_max); - -#ifdef DEBUGFS - /** time to clean debugfs */ - dbgfs_dev_init(xdev); -#endif - - *dev_hndl = (unsigned long)xdev; - - return rv; - -cleanup_qdma: - qdma_device_offline(pdev, (unsigned long)xdev, XDEV_FLR_INACTIVE); - -unmap_bars: - xdev_unmap_bars(xdev, pdev); - xdev_list_remove(xdev); - kfree(xdev); - -disable_device: - pci_disable_extended_tag(pdev); - pci_disable_relaxed_ordering(pdev); - pci_disable_device(pdev); - -release_regions: -#ifndef __XRT__ - pci_release_regions(pdev); -#endif - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_device_close() - close the dma device - * - * @param[in] pdev: pointer to struct pci_dev - * @param[in] dev_hndl: device handle - * - * @return 0: on success - * @return <0: on failure - *****************************************************************************/ -int qdma_device_close(struct pci_dev *pdev, unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - if (!dev_hndl) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - if (xdev->conf.pdev != pdev) { - pr_err("Invalid pdev passed: pci_dev(0x%lx) != pdev(0x%lx)\n", - (unsigned long)xdev->conf.pdev, (unsigned long)pdev); - return -EINVAL; - } - - qdma_device_offline(pdev, dev_hndl, XDEV_FLR_INACTIVE); - -#ifdef DEBUGFS - /** time to clean debugfs */ - dbgfs_dev_exit(xdev); -#endif -#ifndef __QDMA_VF__ - qdma_dev_entry_destroy(xdev->dma_device_index, xdev->func_id); - qdma_master_resource_destroy(xdev->dma_device_index); -#endif - - xdev_unmap_bars(xdev, pdev); - - pci_disable_relaxed_ordering(pdev); - pci_disable_extended_tag(pdev); -#ifndef __XRT__ - pci_release_regions(pdev); -#endif - pci_disable_device(pdev); - - xdev_list_remove(xdev); - - kfree(xdev); - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_device_get_config() - get the device configuration - * - * @param[in] dev_hndl: device handle - * @param[out] conf: dma device configuration - * @param[out] buf, buflen: - * error message buffer, can be NULL/0 (i.e., optional) - * - * - * @return none - *****************************************************************************/ -int qdma_device_get_config(unsigned long dev_hndl, struct qdma_dev_conf *conf, - char *buf, int buflen) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - if (buf && buflen) - snprintf(buf, buflen, "dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - if (buf && buflen) - snprintf(buf, buflen, "Invalid dev_hndl passed"); - return -EINVAL; - } - - memcpy(conf, &xdev->conf, sizeof(*conf)); - - if (buf && buflen) - snprintf(buf, buflen, - "Device %s configuration is stored in conf param", - xdev->conf.name); - - return 0; -} - -int qdma_device_clear_stats(unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *) dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - xdev->total_mm_h2c_pkts = 0; - xdev->total_mm_c2h_pkts = 0; - xdev->total_st_h2c_pkts = 0; - xdev->total_st_c2h_pkts = 0; - xdev->ping_pong_lat_max = 0; - xdev->ping_pong_lat_min = 0; - xdev->ping_pong_lat_total = 0; - - return 0; -} - -int qdma_device_get_mmh2c_pkts(unsigned long dev_hndl, - unsigned long long *mmh2c_pkts) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *) dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - *mmh2c_pkts = xdev->total_mm_h2c_pkts; - - return 0; -} - -int qdma_device_get_mmc2h_pkts(unsigned long dev_hndl, - unsigned long long *mmc2h_pkts) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *) dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - *mmc2h_pkts = xdev->total_mm_c2h_pkts; - - return 0; -} - -int qdma_device_get_sth2c_pkts(unsigned long dev_hndl, - unsigned long long *sth2c_pkts) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *) dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - *sth2c_pkts = xdev->total_st_h2c_pkts; - - return 0; -} - -int qdma_device_get_stc2h_pkts(unsigned long dev_hndl, - unsigned long long *stc2h_pkts) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *) dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - *stc2h_pkts = xdev->total_st_c2h_pkts; - - return 0; -} - -int qdma_device_get_ping_pong_min_lat(unsigned long dev_hndl, - unsigned long long *min_lat) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *) dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (!min_lat) { - pr_err("Min Lat is NULL\n"); - return -EINVAL; - } - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - *min_lat = xdev->ping_pong_lat_min; - - return 0; -} - -int qdma_device_get_ping_pong_max_lat(unsigned long dev_hndl, - unsigned long long *max_lat) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *) dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (!max_lat) { - pr_err("Max Lat is NULL\n"); - return -EINVAL; - } - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - *max_lat = xdev->ping_pong_lat_max; - - return 0; -} - -int qdma_device_get_ping_pong_tot_lat(unsigned long dev_hndl, - unsigned long long *lat_total) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *) dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (!lat_total) { - pr_err("Total Lat is NULL\n"); - return -EINVAL; - } - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) { - pr_err("Invalid dev_hndl passed"); - return -EINVAL; - } - - *lat_total = xdev->ping_pong_lat_total; - - return 0; -} -/*****************************************************************************/ -/** - * qdma_device_set_config() - set the device configuration - * - * @param[in] dev_hndl: device handle - * @param[in] conf: dma device configuration to set - * - * @return 0 on success ,<0 on failure - *****************************************************************************/ -int qdma_device_set_config(unsigned long dev_hndl, struct qdma_dev_conf *conf) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)dev_hndl; - - /** make sure that the dev_hndl passed is Valid */ - if (!xdev) { - pr_err("dev_hndl is NULL"); - return -EINVAL; - } - - if (!conf) { - pr_err("conf is NULL"); - return -EINVAL; - } - - if (xdev_check_hndl(__func__, xdev->conf.pdev, dev_hndl) < 0) - return -EINVAL; - - memcpy(&xdev->conf, conf, sizeof(*conf)); - - return 0; -} - diff --git a/QDMA/linux-kernel/driver/libqdma/xdev.h b/QDMA/linux-kernel/driver/libqdma/xdev.h deleted file mode 100755 index d79eb2b..0000000 --- a/QDMA/linux-kernel/driver/libqdma/xdev.h +++ /dev/null @@ -1,622 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XDEV_H__ -#define __XDEV_H__ -/** - * @file - * @brief This file contains the declarations for QDMA PCIe device - * - */ -#include <linux/types.h> -#include <linux/dma-mapping.h> -#include <linux/interrupt.h> -#include <linux/pci.h> - -#include "libqdma_export.h" -#include "qdma_mbox.h" -#include "qdma_access_errors.h" -#ifdef DEBUGFS -#include "qdma_debugfs.h" - -extern struct dentry *qdma_debugfs_root; -#endif - -#define DEFAULT_USER_BAR 2 - -/** - * QDMA bars - */ -#define QDMA_BAR_NUM 6 -/** - * QDMA config bar size - 64MB - */ -#define QDMA_MAX_BAR_LEN_MAPPED 0x4000000 -/** - * Min QDMA config bar size - 16K - */ -#define QDMA_MIN_BAR_LEN_MAPPED 0x4000 - -/* - *module_param_array: - *config_bar=<bus_num(16bits)><pf0_config_bar(4bits)><pf1_config_bar(4bits)> - * <pf2_config_bar(4bits)><pf3_config_bar(4bits)> - *config_bar=<bus_num(16bits)><vf_pf0_config_bar(4bits)> - * <vf_pf1_config_bar(4bits)><vf_pf2_config_bar(4bits)> - * <vf_pf3_config_bar(4bits)> - * - */ -#define BUS_NUM_MASK 0xFFFF0000 -#define BUS_NUM_SHIFT 16 - -#define PF_DEV_0_MASK 0x0000F000 -#define PF_DEV_0_SHIFT 12 -#define PF_DEV_1_MASK 0x00000F00 -#define PF_DEV_1_SHIFT 8 -#define PF_DEV_2_MASK 0x000000F0 -#define PF_DEV_2_SHIFT 4 -#define PF_DEV_3_MASK 0x0000000F -#define PF_DEV_3_SHIFT 0 - -#define VF_PF_IDENTIFIER_MASK 0xF -#define VF_PF_IDENTIFIER_SHIFT 8 - -#define QDMA_MAGIC_DEVICE 0xEEEEEEEEUL - -enum qdma_pf_devices { - PF_DEVICE_0 = 0, - PF_DEVICE_1, - PF_DEVICE_2, - PF_DEVICE_3 -}; - -/** - * number of bits to describe the DMA transfer descriptor - */ -#define QDMA_DESC_BLEN_BITS 28 -/** - * maximum size of a single DMA transfer descriptor - */ -#define QDMA_DESC_BLEN_MAX ((1 << (QDMA_DESC_BLEN_BITS)) - 1) - -#ifdef __XRT__ -/** - * number of bits to describe the SOFT DMA transfer descriptor - */ -#define SOFT_QDMA_DESC_BLEN_BITS 15 - -/** - * maximum size of a single SOFT DMA transfer descriptor - */ -#define SOFT_QDMA_DESC_BLEN_MAX (1 << (SOFT_QDMA_DESC_BLEN_BITS)) -#endif - -/** - * obtain the 32 most significant (high) bits of a 32-bit or 64-bit address - */ -#define PCI_DMA_H(addr) ((addr >> 16) >> 16) -/** - * obtain the 32 least significant (low) bits of a 32-bit or 64-bit address - */ -#define PCI_DMA_L(addr) (addr & 0xffffffffUL) - -/** - * Xiling DMA device forward declaration - */ -struct xlnx_dma_dev; - -/* XDMA PCIe device specific book-keeping */ -/** - * Flag for device offline - */ -#define XDEV_FLAG_OFFLINE 0x1 -/** - * Flag for IRQ - */ -#define XDEV_FLAG_IRQ 0x2 -/** - * Maximum number of interrupts supported per device - */ -#define XDEV_NUM_IRQ_MAX 8 - -/** - * Macro to indicate FLR flow is active - */ -#define XDEV_FLR_ACTIVE 1 -/** - * Macro to indicate FLR flow is not active - */ -#define XDEV_FLR_INACTIVE 0 -/** - * interrupt call back function handlers - */ -typedef irqreturn_t (*f_intr_handler)(int irq_index, int irq, void *dev_id); - -/** - * @struct - intr_coal_conf - * @brief interrut coalescing configuration - */ -struct intr_coal_conf { - /**< interrupt vector index */ - u16 vec_id; - /**< number of entries in interrupt ring per vector */ - u16 intr_rng_num_entries; - /**< interrupt ring base address */ - dma_addr_t intr_ring_bus; - union qdma_intr_ring *intr_ring_base; - /**< color value indicates the valid entry in the interrupt ring */ - u8 color; - /**< Interrupt cidx info to be written to INTR CIDX register */ - struct qdma_intr_cidx_reg_info intr_cidx_info; -}; - -/** - * Macros for Hardware Version info - */ -#define RTL1_VERSION 0 -#define RTL2_VERSION 1 -#define VIVADO_RELEASE_2018_3 0 -#define VIVADO_RELEASE_2018_2 1 - -/** - * intr_type_list - interrupt types - */ -enum intr_type_list { - INTR_TYPE_ERROR, /**< error interrupt */ - INTR_TYPE_USER, /**< user interrupt */ - INTR_TYPE_DATA, /**< data interrupt */ - INTR_TYPE_MBOX, /**< mail box interrupt */ - INTR_TYPE_MAX /**< max interrupt */ -}; - -/** - * reset_state - Keep track of state during FLR - */ -enum reset_state_t { - RESET_STATE_IDLE, - RESET_STATE_RECV_PF_RESET_REQ, - RESET_STATE_PF_WAIT_FOR_BYES, - RESET_STATE_RECV_PF_RESET_DONE, - RESET_STATE_RECV_PF_OFFLINE_REQ, - RESET_STATE_PF_OFFLINE_REQ_PROCESSING, - RESET_STATE_INVALID, -}; - - -/** - * @struct - intr_vec_map_type - * @brief interrupt vector map details - */ -struct intr_vec_map_type { - enum intr_type_list intr_type; /**< interrupt type */ - int intr_vec_index; /**< interrupt vector index */ - f_intr_handler intr_handler; /**< interrupt handler */ -}; - -/**< Interrupt info for MSI-X interrupt vectors per device */ -struct intr_info_t { - /**< msix_entry list for all vectors */ - char msix_name[QDMA_DEV_NAME_MAXLEN + 16]; - /**< queue list for each interrupt */ - struct list_head intr_list; - /**< number of queues assigned for each interrupt */ - int intr_list_cnt; - /**< interrupt vector map */ - struct intr_vec_map_type intr_vec_map; - /**< interrupt lock per vector */ - spinlock_t vec_q_list; -}; - -/** - * @struct - xlnx_dma_dev - * @brief Xilinx DMA device details - */ -struct xlnx_dma_dev { - unsigned long magic; /* structure ID for sanity checks */ - /**< Xilinx DMA device name */ - char mod_name[QDMA_DEV_NAME_MAXLEN]; - /**< Board id this device belongs to*/ - u32 dma_device_index; - /**< Keeping track of last updated descq - * Used only in case of auto and intr aggr driver mode - * This is required because HW might prematurely raise interrupt - * without actual new entries in the aggr ring and we need to - * provide some update to the sw_cidx of aggr ring so that - * interrupt gets triggered again - */ - struct qdma_descq *prev_descq; - /**< DMA device configuration */ - struct qdma_dev_conf conf; - /**< csr info */ - struct global_csr_conf csr_info; - /**< sorted c2h counter indexes */ - uint8_t sorted_c2h_cntr_idx[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /**< DMA device list */ - struct list_head list_head; - /**< DMA device lock to protects concurrent access */ - spinlock_t lock; - /**< DMA device hardware program lock */ - spinlock_t hw_prg_lock; - /**< device flags */ - unsigned int flags; - /**< device capabilities */ - struct qdma_dev_attributes dev_cap; - /**< sriov info */ - void *vf_info; - /**< number of virtual functions */ - u16 vf_count; - /**< number of online virtual functions */ - u8 vf_count_online; -#ifdef __QDMA_VF__ - /** work queue */ - struct workqueue_struct *workq; - /** work_struct to pass work to reset thread */ - struct work_struct reset_work; -#endif - /** Reset state */ - enum reset_state_t reset_state; - /**< wait q for vf offline */ - qdma_wait_queue wq; - /**< function id */ - u16 func_id; -#ifdef __QDMA_VF__ - /**< parent function id, valid only for virtual function */ - u16 func_id_parent; -#else - /**< number of physical functions */ - u8 pf_count; -#endif - /**< PCIe config. bar */ - void __iomem *regs; - /**< number of MSI-X interrupt vectors per device */ - int num_vecs; - /**< msix_entry list for all MSIx vectors associated for device */ - struct msix_entry *msix; - /**< interrupt info list for all MSIx vectors associated for device */ - struct intr_info_t *dev_intr_info_list; - /**< data vector start index */ - int dvec_start_idx; - /**< DMA private device to hold the qdma que details */ - void *dev_priv; - /**< list of interrupt coalescing configuration for each vector */ - struct intr_coal_conf *intr_coal_list; - /**< legacy interrupt vector */ - int vector_legacy; - /**< error lock */ - spinlock_t err_lock; - /**< flag to indicate the error minitor status */ - u8 err_mon_cancel; - /**< error minitor work handler */ - struct delayed_work err_mon; -#ifdef DEBUGFS - /** debugfs device root */ - struct dentry *dbgfs_dev_root; - /** debugfs queue root */ - struct dentry *dbgfs_queues_root; - /** debugfs intr ring root */ - struct dentry *dbgfs_intr_root; - /* lock for creating qidx directory */ - spinlock_t qidx_lock; -#endif - - /** number of packets processed in pf */ - struct qdma_mbox mbox; - unsigned long long total_mm_h2c_pkts; - unsigned long long total_mm_c2h_pkts; - unsigned long long total_st_h2c_pkts; - unsigned long long total_st_c2h_pkts; - /** max ping_pong latency */ - u64 ping_pong_lat_max; - /** min ping_pong latency */ - u64 ping_pong_lat_min; - /** avg ping_pong latency */ - u64 ping_pong_lat_total; - /**< for upper layer calling function */ - unsigned int dev_ulf_extra[0]; - - /* qdma_hw_access structure */ - struct qdma_hw_access hw; - /* qdma_hw_version_info structure */ - struct qdma_hw_version_info version_info; -}; - -struct qdma_vf_info { - unsigned short func_id; - unsigned short qbase; - unsigned short qmax; - unsigned short filler; -}; - -/*****************************************************************************/ -/** - * xlnx_dma_device_flag_check() - helper function to check the flag status - * - * @param[in] xdev: pointer to xilinx dma device - * @param[in] f: flag value - * - * - * @return 1 if the flag is on - * @return 0 if the flag is off - *****************************************************************************/ -static inline int xlnx_dma_device_flag_check(struct xlnx_dma_dev *xdev, - unsigned int f) -{ - unsigned long flags; - - spin_lock_irqsave(&xdev->lock, flags); - if (xdev->flags & f) { - spin_unlock_irqrestore(&xdev->lock, flags); - return 1; - } - spin_unlock_irqrestore(&xdev->lock, flags); - return 0; -} - -/*****************************************************************************/ -/** - * xlnx_dma_device_flag_test_n_set() - helper function to test n set the flag - * - * @param[in] xdev: pointer to xilinx dma device - * @param[in] f: flag value - * - * - * @return 1 if the flag is already enabled - * @return 0 if the flag is off - *****************************************************************************/ -static inline int xlnx_dma_device_flag_test_n_set(struct xlnx_dma_dev *xdev, - unsigned int f) -{ - unsigned long flags; - int rv = 0; - - spin_lock_irqsave(&xdev->lock, flags); - if (xdev->flags & f) - rv = 1; - else - xdev->flags |= f; - spin_unlock_irqrestore(&xdev->lock, flags); - return rv; -} - -/*****************************************************************************/ -/** - * xdev_flag_set() - helper function to set the device flag - * - * @param[in] xdev: pointer to xilinx dma device - * @param[in] f: flag value - * - * - * @return none - *****************************************************************************/ -static inline void xdev_flag_set(struct xlnx_dma_dev *xdev, unsigned int f) -{ - unsigned long flags; - - spin_lock_irqsave(&xdev->lock, flags); - xdev->flags |= f; - spin_unlock_irqrestore(&xdev->lock, flags); -} - -/*****************************************************************************/ -/** - * xlnx_dma_device_flag_test_n_set() - helper function to clear the device flag - * - * @param[in] xdev: pointer to xilinx dma device - * @param[in] f: flag value - * - * @return none - *****************************************************************************/ -static inline void xdev_flag_clear(struct xlnx_dma_dev *xdev, unsigned int f) -{ - unsigned long flags; - - spin_lock_irqsave(&xdev->lock, flags); - xdev->flags &= ~f; - spin_unlock_irqrestore(&xdev->lock, flags); -} - -/*****************************************************************************/ -/** - * xdev_find_by_pdev() - find the xdev using struct pci_dev - * - * @param[in] pdev: pointer to struct pci_dev - * - * @return pointer to xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -struct xlnx_dma_dev *xdev_find_by_pdev(struct pci_dev *pdev); - -/*****************************************************************************/ -/** - * xdev_find_by_idx() - find the xdev using the index value - * - * @param[in] idx: index value in the xdev list - * - * @return pointer to xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -struct xlnx_dma_dev *xdev_find_by_idx(int idx); - -/*****************************************************************************/ -/** - * xdev_list_first() - handler to return the first xdev entry from the list - * - * @return pointer to first xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -struct xlnx_dma_dev *xdev_list_first(void); - -/*****************************************************************************/ -/** - * xdev_list_next() - handler to return the next xdev entry from the list - * - * @param[in] xdev: pointer to current xdev - * - * @return pointer to next xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -struct xlnx_dma_dev *xdev_list_next(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * xdev_list_dump() - list the dma device details - * - * @param[in] buflen: length of the input buffer - * @param[out] buf: message buffer - * - * @return pointer to next xlnx_dma_dev on success - * @return NULL on failure - *****************************************************************************/ -int xdev_list_dump(char *buf, int buflen); - -/*****************************************************************************/ -/** - * xdev_check_hndl() - helper function to validate the device handle - * - * @param[in] fname: device name - * @param[in] pdev: pointer to struct pci_dev - * @param[in] hndl: device handle - * - * @return 0: success - * @return EINVAL: on failure - *****************************************************************************/ -int xdev_check_hndl(const char *fname, - struct pci_dev *pdev, unsigned long hndl); - - -#ifdef __QDMA_VF__ -/*****************************************************************************/ -/** - * xdev_sriov_vf_offline() - API to set the virtual function to offline mode - * - * @param[in] xdev: pointer to xdev - * @param[in] func_id: function identifier - * - * @return 0: success - * @return -1: on failure - *****************************************************************************/ -int xdev_sriov_vf_offline(struct xlnx_dma_dev *xdev, u16 func_id); - -/*****************************************************************************/ -/** - * xdev_sriov_vf_reset_offline() - API to set the virtual function to - * offline mode in FLR flow initiated by PF - * - * @param[in] xdev: pointer to xdev - * - * @return 0: success - * @return -1: on failure - *****************************************************************************/ -int xdev_sriov_vf_reset_offline(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * xdev_sriov_vf_online() - API to set the virtual function to online mode - * - * @param[in] xdev: pointer to xdev - * @param[in] func_id: function identifier - * - * @return 0: success - * @return -1: on failure - *****************************************************************************/ -int xdev_sriov_vf_online(struct xlnx_dma_dev *xdev, u16 func_id); -#elif defined(CONFIG_PCI_IOV) -/* SR-IOV */ -/*****************************************************************************/ -/** - * xdev_sriov_vf_online() - API to disable the virtual function - * - * @param[in] xdev: pointer to xdev - * - * @return none - *****************************************************************************/ -void xdev_sriov_disable(struct xlnx_dma_dev *xdev); - -/*****************************************************************************/ -/** - * xdev_sriov_vf_online() - API to enable the virtual function - * - * @param[in] xdev: pointer to xdev - * @param[in] func_id: function identifier - * - * @return number of vfs enabled on success - * @return -1: on failure - *****************************************************************************/ -int xdev_sriov_enable(struct xlnx_dma_dev *xdev, int num_vfs); - -/*****************************************************************************/ -/** - * xdev_sriov_vf_offline() - API to set the virtual function to offline mode - * - * @param[in] xdev: pointer to xdev - * @param[in] func_id: function identifier - * - * @return none - *****************************************************************************/ -void xdev_sriov_vf_offline(struct xlnx_dma_dev *xdev, u16 func_id); - -/*****************************************************************************/ -/** - * xdev_sriov_vf_offline() - API to set the virtual function to offline mode - * - * @param[in] xdev: pointer to xdev - * @param[in] func_id: function identifier - * - * @return 0: success - * @return -1: on failure - *****************************************************************************/ -int xdev_sriov_vf_online(struct xlnx_dma_dev *xdev, u16 func_id); - -/*****************************************************************************/ -/** - * xdev_sriov_vf_offline() - API to configure the fmap for virtual function - * - * @param[in] xdev: pointer to xdev - * @param[in] func_id: function identifier - * @param[in] qbase: queue start - * @param[in] qmax: queue max - * - * @return 0: success - * @return -1: on failure - *****************************************************************************/ -int xdev_sriov_vf_fmap(struct xlnx_dma_dev *xdev, u16 func_id, - unsigned short qbase, unsigned short qmax); - -#define xdev_sriov_vf_reset_offline(xdev) -#else -/** dummy declaration for xdev_sriov_disable() - * When virtual function is not enabled - */ -#define xdev_sriov_disable(xdev) -/** dummy declaration for xdev_sriov_enable() - * When virtual function is not enabled - */ -#define xdev_sriov_enable(xdev, num_vfs) -/** dummy declaration for xdev_sriov_vf_offline() - * When virtual function is not enabled - */ -#define xdev_sriov_vf_offline(xdev, func_id) -/** dummy declaration for xdev_sriov_vf_online() - * When virtual function is not enabled - */ -#define xdev_sriov_vf_online(xdev, func_id) -#define xdev_sriov_vf_reset_offline(xdev) -#endif - -#endif /* XDMA_LIB_H */ diff --git a/QDMA/linux-kernel/driver/make_rules/common_flags.mk b/QDMA/linux-kernel/driver/make_rules/common_flags.mk deleted file mode 100755 index 69bebde..0000000 --- a/QDMA/linux-kernel/driver/make_rules/common_flags.mk +++ /dev/null @@ -1,28 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - -#Build flags common to xdma/qdma - -ifeq ($(VF),1) - EXTRA_FLAGS += -D__QDMA_VF__ - PFVF_TYPE = -vf -else - PFVF_TYPE = -pf -endif - diff --git a/QDMA/linux-kernel/driver/make_rules/distro_check.mk b/QDMA/linux-kernel/driver/make_rules/distro_check.mk deleted file mode 100755 index 4689147..0000000 --- a/QDMA/linux-kernel/driver/make_rules/distro_check.mk +++ /dev/null @@ -1,132 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - -# -# distro. checks -# uses the same variables calculated from kernel_check.mk -# - -distro := -dmajor := -dminor := - -# kernel.org rc kernels -#ifneq ($(shell echo $(kextraversion) | $(grep) -c 'git'),0) -# distro := GIT -# dmajor := -# dminor := -#endif # kernel.org - -ifneq ($(shell $(grep) -c 'RHEL' $(VERSION_H)),0) - distro := RHEL -# distro_vmajor := $(shell $(grep) 'RHEL_MAJOR' $(VERSION_H) | cut -d' ' -f3) -# distro_vminor := $(shell $(grep) 'RHEL_MINOR' $(VERSION_H) | cut -d' ' -f3) - dmajor := $(word 3, $(shell $(grep) 'RHEL_MAJOR' $(VERSION_H))) - dminor := $(word 3, $(shell $(grep) 'RHEL_MINOR' $(VERSION_H))) - ifeq ($(dmajor),) - ifeq ($(dminor),) - $(error ERROR! RHEL distro version NOT specified, check version.h.) - endif - endif - ifeq ($(shell [ $(dmajor) -lt 5 ] && echo 1),1) - $(error ERROR! Unsupported RHEL version $(dmajor).$(dminor).) - endif - ifeq ($(dmajor),5) - ifeq ($(shell [ $(dmajor) -lt 4 ] && echo 1),1) - $(error ERROR! Unsupported RHEL version $(dmajor).$(dminor).) - endif - endif -endif # RHEL - -# SLES does not provide any release macros like RHEL. So we are -# setting Makefile flags for SLES releases based on the version -# and patchlevel obtained from /etc/SuSE-release file -ifneq ($(wildcard /etc/SuSE-release),) - distro := SLES - dmajor := $(shell cat /etc/SuSE-release | grep VERSION | awk '{print $$3}') - dminor := $(shell cat /etc/SuSE-release | grep PATCHLEVEL | awk '{print $$3}') -endif - -$(info "distro=$(distro), dmajor=$(dmajor) dminor=$(dminor) ") - -# assume this is kernel.org kernels -ifeq ($(distro),) - ifeq ($(kseries),2.6) - ifeq ($(shell [ $(ksublevel) -ge 32 ] && echo 1),1) - distro := GIT - else - $(error kernel version $(kbaseversion)$(kextraversion) NOT supported.) - $( kernel.org Requires >= 2.6.32.) - endif - endif - - ifeq ($(kversion),3) - ifeq ($(shell [ $(kpatchlevel) -ge 1 ] && echo 1),1) - distro := GIT - else - $(error kernel version $(kbaseversion)$(kextraversion) NOT supported.) - $( kernel.org Requires >= 3.1.) - endif - endif - - ifeq ($(kversion),4) - distro := GIT - endif - - ifeq ($(kversion),5) - distro := GIT - endif - - ifeq ($(kversion),6) - distro := GIT - endif -endif # assume kernel.org kernels - -ifeq ($(distro),) - $(error kernel version $(kbaseversion)$(kextraversion) NOT supported.) - $( kernel.org Requires >= 2.6.35.) -endif - -FLAGS += -D$(distro)$(dmajor)SP$(dminor) -FLAGS += -D$(distro)$(dmajor) -# special case for SLES 11 -ifeq ($(distro),SLES) - ifeq ($(dmajor),11) - ifeq ($(shell test $(dminor) -ge 1; echo $$?),0) - FLAGS += -DSLES_RELEASE_11_1 - endif - ifeq ($(shell test $(dminor) -ge 2; echo $$?),0) - FLAGS += -DSLES_RELEASE_11_2 - endif - ifeq ($(shell test $(dminor) -ge 3; echo $$?),0) - FLAGS += -DSLES_RELEASE_11_3 - endif - ifeq ($(shell test $(dminor) -ge 4; echo $$?),0) - FLAGS += -DSLES_RELEASE_11_4 - endif - else - FLAGS += -D$(distro)_RELEASE_$(dmajor)_$(dminor) - endif -endif - -$(info $(kbaseversion)$(kextraversion): $(distro),$(dmajor),$(dminor), $(FLAGS)) - -export distro -export dmajor -export dminor diff --git a/QDMA/linux-kernel/driver/make_rules/kernel_check.mk b/QDMA/linux-kernel/driver/make_rules/kernel_check.mk deleted file mode 100755 index ab2b369..0000000 --- a/QDMA/linux-kernel/driver/make_rules/kernel_check.mk +++ /dev/null @@ -1,351 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - -# Kernel directories. -KERNELRELEASE := $(shell uname -r) - -# If KSRC=<path> is specified on the command line, KOBJ=<path> must -# also be specified. This is to avoid mixups if the kernel object path -# differs from the source path. A shortcut (KSRC=KOBJ) is to use KDIR. -ifeq ($(KDIR),) - ifeq ($(KSRC),) - ifneq ($(KOBJ),) - $(warning When using KOBJ=<path>, the KSRC=<path> must also be defined.) - $(warning Use KDIR=<path> when KSRC and KOBJ are the same.) - $(error ERROR: kernel source path not specified) - endif - else - ifeq ($(KOBJ),) - $(warning When using KSRC=<path>, the KOBJ=<path> must also be defined.) - $(warning Use KDIR=<path> when KSRC and KOBJ are the same.) - $(error ERROR: KOBJ path not specified) - endif - endif -else - override KSRC := $(KDIR) - override KOBJ := $(KDIR) -endif - -# Only if KSRC/KOBJ were not defined on the command line. -KSRC ?= $(wildcard /lib/modules/$(KERNELRELEASE)/source) -KOBJ ?= $(wildcard /lib/modules/$(KERNELRELEASE)/build) -KINC = $(KSRC)/include - -#$(warning KDIR: $(KDIR).) - -ifeq ($(KSRC),) - KSRC = $(KOBJ) -endif - -# Define kernel files. -VERSION_H := $(KOBJ)/include/linux/version.h -AUTOCONF_H := $(KOBJ)/include/generated/autoconf.h -UTSRELEASE_H := $(KOBJ)/include/generated/utsrelease.h - -ifeq ($(wildcard $(VERSION_H)),) - VERSION_H := $(KOBJ)/include/generated/uapi/linux/version.h -endif -ifeq ($(wildcard $(AUTOCONF_H)),) - AUTOCONF_H := $(KOBJ)/include/linux/autoconf.h -endif -ifeq ($(wildcard $(UTSRELEASE_H)),) - UTSRELEASE_H := $(KOBJ)/include/linux/utsrelease.h -endif -#ifeq ($(wildcard $(UTSRELEASE_H)),) -# $(error NO utsrelease) -#endif - -# Define architecture and target(for RPM). -ARCH := $(shell uname -m) -target := $(ARCH) -override ARCH := $(shell echo $(ARCH) | sed 's/i.86/i386/') -ifeq ($(USER_ARCH),) - - ifeq ($(ARCH),ppc64le) - ifeq ($(wildcard $(KOBJ)/arch/$(ARCH)),) - override ARCH := powerpc - endif - endif - - ifeq ($(ARCH),ppc64) - # Check if the kernel wants ppc64 or powerpc. - ifeq ($(wildcard $(KOBJ)/arch/$(ARCH)),) - override ARCH := powerpc - endif - endif -else - # Honor the value of ARCH if specified by user. - override ARCH := $(USER_ARCH) -endif - -# Functions. -define path_check -$(if $(wildcard $(1)),$(1),) -endef -define reverse_sort -$(shell echo -e `echo "$(strip $(1))" |\ - sed 's/[[:space:]]/\\\n/g'` | sort -r) -endef -define version_code -$(shell let x=`sed '/^\#define[[:space:]]*LINUX_VERSION_CODE/!d;\ - s/.*LINUX_VERSION_CODE[[:space:]]*//' < $(1)\ - 2>/dev/null`;\ - let a="$$x >> 16";\ - let x="$$x - ($$a << 16)";\ - let b="$$x >> 8";\ - let x="$$x - ($$b << 8)";\ - echo "$$a $$b $$x") -endef - -# Checks for kernel source and object directories. -ifeq ($(call path_check,$(KSRC)),) - $(warning Be sure the kernel source is properly installed or \ - try specifying the kernel source tree using 'make KSRC=<path>') - $(error ERROR: missing kernel source) -endif -ifeq ($(call path_check,$(KOBJ)),) - $(warning Try specifying the kernel build tree using 'make KOBJ=<path>'.) - $(error ERROR: missing kernel build) -endif - -# Check kernel source and build directories are somewhat likely to be correct. -ifneq ($(notdir $(wildcard $(KSRC)/Makefile)),Makefile) - $(warning There seems to be a problem with the kernel \ - source [$(KSRC)] directory.) - $(error ERROR: missing kernel Makefile) -endif -ifneq ($(notdir $(wildcard $(KOBJ)/Makefile)),Makefile) - $(warning There seems to be a problem with the kernel \ - build [$(KOBJ)] directory.) - $(error ERROR: missing kernel Makefile) -endif - -# Get kernel version code info. -KERNELVERSION := $(strip $(call version_code,$(VERSION_H))) -ifneq ($(words $(KERNELVERSION)), 3) - $(error ERROR: unexpected kernel version \ - '$(shell echo $(KERNELVERSION) | sed 's/[[:space:]]/./g')') -endif - -# Define kernel version details. -kversion := $(word 1, $(KERNELVERSION)) -kpatchlevel := $(word 2, $(KERNELVERSION)) -ksublevel := $(word 3, $(KERNELVERSION)) - -# The kernel base version, excluding the EXTRAVERSION string. -kbaseversion := $(kversion).$(kpatchlevel).$(ksublevel) - -# The kernel series version. -kseries := $(kversion).$(kpatchlevel) - -# Fix for variation of Module.symvers naming (thanks 2.6.17!). -# I need to know the file name of the module symver generated by the kernel -# during an external module build (MODPOST). Also used for kernels that don't -# automatically generate the module symver file during MODPOST (2.6.0-2.6.17?). -ifeq ($(shell $(grep) -c '^modulesymfile[[:space:]]*:\?=' \ - $(KSRC)/scripts/Makefile.modpost),1) - modulesymfile := $(shell $(grep) '^modulesymfile[[:space:]]*:\?=' \ - $(KSRC)/scripts/Makefile.modpost) - kernelsymfile := $(shell $(grep) '^kernelsymfile[[:space:]]*:\?=' \ - $(KSRC)/scripts/Makefile.modpost) -else - ifeq ($(shell $(grep) -c '^symverfile[[:space:]]*:\?=' \ - $(KSRC)/scripts/Makefile.modpost),1) - symverfile := $(shell $(grep) '^symverfile[[:space:]]*:\?=' \ - $(KSRC)/scripts/Makefile.modpost) - kernelsymfile := $(subst symverfile,kernelsymfile,$(symverfile)) - endif -endif -modulesymfile ?= $(symverfile) -ifeq ($(modulesymfile),) - $(warning The parsing of $(KSRC)/scripts/Makefile.modpost \ - is not making sense.) - $(error ERROR cannot determine module symvers file) -endif - -# Gnu make (3.80) bug #1516, $(eval ...) inside conditionals causes errors. -# This is fixed in v3.81 and some v3.80 (RHEL4/5) but not on SLES10. -# Workaround: include a separate makefile that does the eval. -ifeq ($(shell echo '$(modulesymfile)' | $(grep) -c '^[[:alnum:]_]\+[[:space:]]*:\?=[[:space:]]*.\+'),1) - $(shell echo '$$(eval $$(modulesymfile))' > eval.mak) - include eval.mak -else - modulesymfile = -endif -ifeq ($(shell echo '$(kernelsymfile)' | $(grep) -c '^[[:alnum:]_]\+[[:space:]]*:\?=[[:space:]]*.\+'),1) - $(shell echo '$$(eval $$(kernelsymfile))' > eval.mak) - include eval.mak -else - kernelsymfile = -endif -modulesymfile := $(notdir $(modulesymfile)) -kernelsymfile := $(notdir $(kernelsymfile)) -$(shell [ -f eval.mak ] && /bin/rm -f eval.mak) - -ifneq ($(words $(modulesymfile)),1) - $(warning The parsing of $(KSRC)/scripts/Makefile.modpost \ - is not making sense.) - $(warning You can try passing 'modulesymfile=Module.symvers' or \ - similar to make.) - $(error ERROR cannot determine module symvers file) -endif - - -# Check for configured kernel. -ifeq ($(wildcard $(AUTOCONF_H)),) - $(warning The kernel is not properly configured, try running \ - 'make menuconfig' on your kernel.) - $(error ERROR: kernel missing autoconf.h) -endif -# Check for built kernel. -ifeq ($(wildcard $(VERSION_H)),) - $(warning The kernel has not been compiled. Try building your kernel \ - before building this driver.) - $(error ERROR: kernel missing version.h) -endif - -# Check that kernel supports modules. -ifneq ($(shell $(grep) -c '^\#define[[:space:]]\+CONFIG_MODULES[[:space:]]\+1' $(AUTOCONF_H)),1) - $(warning The kernel has not been configured for module support.) - $(warning Try configuring the kernel to allow external modules and \ - recompile.) - $(error ERROR: kernel CONFIG_MODULES not defined) -endif - -# Get kernel UTS_RELEASE info. -ifneq ($(wildcard $(UTSRELEASE_H)),) - ifneq ($(shell $(grep) -c '^\#define[[:space:]]\+UTS_RELEASE' \ - $(UTSRELEASE_H)),0) - utsrelease := $(UTSRELEASE_H) - endif -else - ifneq ($(wildcard $(KOBJ)/include/linux/version.h),) - ifneq ($(shell $(grep) -c '^\#define[[:space:]]\+UTS_RELEASE' \ - $(KOBJ)/include/linux/version.h),0) - utsrelease := $(KOBJ)/include/linux/version.h - endif - endif -endif -ifeq ($(utsrelease),) - $(error ERROR: cannot locate kernel UTS_RELEASE) -endif -# Getting the UTS_RELEASE on RHEL3 had problems due to the multiple defines -# within the file. I can run this file through the C pre-processor and get -# the actual UTS_RELEASE definition. This has only been tested on gcc, other -# compilers may not work. -utsrelease := $(strip $(shell $(CC) -E -dM -I $(KSRC)/include $(utsrelease) \ - 2>/dev/null| sed '/^\#define[[:space:]]*UTS_RELEASE/!d;\ - s/^\#define UTS_RELEASE[[:space:]]*"//;\ - s/"//g')) - -# The kernel local version string if defined in config. -klocalversion := $(shell sed '/^CONFIG_LOCALVERSION=/!d;\ - s/^CONFIG_LOCALVERSION="//;s/"//g'\ - 2>/dev/null < $(KOBJ)/.config) -# The complete kernel EXTRAVERSION string. -kextraversion := $(subst $(kbaseversion),,$(utsrelease)) -# The full kernel version should be the same as uts_release. -kernelversion := $(utsrelease) - -# The kernel EXTRAVERSION creates a unique problem, especially since -# kernel versioning extended into the EXTRAVERSION and distributions -# add strings such as smp, largesmp, xen, etc or when additional minor -# version numbers are appended. -# Some code that we supply is dependent on the kernel version and -# parts of the EXTRAVERSION, but not dependent on some of the additional -# flags. This requires that I have a list of kernel version strings that -# could map to the source version we require. For example, if the -# kernel version is 2.6.9-67.ELsmp, we only care about the "2.6.9-67" -# part, therefore, I need to split the EXTRAVERSION accordingly. -# Another problem is when a user builds their own kernel, say 2.6.21.4 -# and adds an additional string to EXTRAVERSION. The EXTRAVERSION is -# now ".4-custom" and I have to parse this with hopes of extracting -# only the ".4" part, resulting in the needed "2.6.21.4" version. -# Adding a BUGFIX version (int) field would be very helpfull! - -# EXTRAVERSION as defined only in the Makefile. -extraversion1 := $(strip $(shell sed '/^EXTRAVERSION/!d;\ - s/^EXTRAVERSION[[:space:]]*=//;s/"//g'\ - < $(KSRC)/Makefile 2>/dev/null)) -# SLES9 likes to put make code in their EXTRAVERSION define. Let the -# variables expand out to nothing, because the code will cause problems. -extraversion1 := $(shell echo $(extraversion1)) -# EXTRAVERSION without local version. -extraversion2 := $(strip $(subst $(klocalversion),,$(kextraversion))) -# EXTRAVERSION with only the kernel .version (hopefully). -extraversion3 := $(strip $(shell echo $(kextraversion) |\ - sed 's/\(^\.[0-9]*\).*/\1/')) -# EXTRAVERSION without the Redhat EL tag. -extraversion4 := $(strip $(shell echo $(kextraversion) |\ - sed 's/\.EL.*//i')) -# EXTRAVERSION with the Redhat EL tag, but nothing else after. -extraversion5 := $(strip $(shell echo $(kextraversion) |\ - sed 's/\(\.EL\).*/\1/i')) -# EXTRAVERSION with the Redhat EL tag, including a number (el5). -extraversion6 := $(strip $(shell echo $(kextraversion) |\ - sed 's/\(\.EL[[:digit:]]*\).*/\1/i')) -# EXTRAVERSION without the Redhat hotfix/update kernel version number. -extraversion7 := $(strip $(shell echo $(kextraversion) |\ - sed 's/\(.*\-[[:digit:]]*\)\..*\(\.EL\).*/\1\2/i')) -# EXTRAVERSION without the Redhat hotfix/update kernel version number with Redhat EL tag, including the number (el5). -extraversion8 := $(strip $(shell echo $(kextraversion) |\ - sed 's/\(.*\-[[:digit:]]*\)\..*\(\.EL[[:digit:]]\).*/\1\2/i')) -# EXTRAVERSION with only the RHEL distro version -extraversion9 := $(strip $(shell echo $(kextraversion) |\ - sed 's/\(.*\-[[:digit:]]*\)\..*\.EL[[:digit:]].*/\1/i')) - -# All known EXTRAVERSION strings, duplicates removed. -extraversions := $(strip $(sort $(kextraversion) \ - $(extraversion1) \ - $(extraversion2) \ - $(extraversion3) \ - $(extraversion4) \ - $(extraversion5) \ - $(extraversion6) \ - $(extraversion7) \ - $(extraversion8) \ - $(extraversion9))) - -# List of all possible kernel version names for target kernel. -all_kernels := $(sort $(kbaseversion) \ - $(foreach a,$(extraversions),$(kbaseversion)$(a))) - -# A reverse ordered list. This is used primarily to search source code -# directory names to match the target kernel version. -kversions := $(call reverse_sort, $(all_kernels)) - -# Special cases for 2.4 series kernels. -ifeq ($(kseries),2.4) - $(error ERROR: 2.4 kernel NOT supported.) -endif -# Note: Define only FLAGS here. These will convert to CFLAGS in the sub-make. -# If the environment variable FLAGS is defined with make, things will break, -# use CFLAGS instead. -# General compiler flags. -# Kernel version 3.3+ moved include/asm to include/generated, which breaks -# outbox kernel drivers. Fix to include the new generated without code change. -ifeq ($(kversion),3) - ifeq ($(shell [ $(kpatchlevel) -gt 2 ] && echo 1),1) - override CARCH := $(ARCH) - ifeq ($(CARCH),x86_64) - override CARCH := x86 - endif - FLAGS += -I$(KSRC)/arch/$(CARCH)/include/generated - endif -endif diff --git a/QDMA/linux-kernel/driver/src/Makefile b/QDMA/linux-kernel/driver/src/Makefile deleted file mode 100755 index 1b5b9bd..0000000 --- a/QDMA/linux-kernel/driver/src/Makefile +++ /dev/null @@ -1,147 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - -SHELL = /bin/bash - -export topdir -export bin_dir - -# The top-level makefile defines required variables and flags. -ifneq ($(shell [[ $(MAKELEVEL) -ge 1 ]] && echo 1),1) - $(error Please use the top-level Makefile to build this driver) -endif - -ifneq ($(wildcard /etc/lsb-release),) - ifneq ($(shell $(grep) "Ubuntu" /etc/lsb-release),) - FLAGS += -DUBUNTU_VERSION_CODE - endif -endif - -include $(srcdir)/../make_rules/common_flags.mk - -$(info srcdir = $(srcdir).) -$(info KSRC = $(KSRC).) -$(info VF = $(VF).) -$(info CROSS_COMPILE_FLAG = $(CROSS_COMPILE_FLAG).) -$(info ARCH = $(ARCH).) - - -MOD_NAME := qdma$(PFVF_TYPE) - -EXTRA_CFLAGS += -DLINUX -D__KERNEL__ -DMODULE -O2 -pipe -Wall -Werror -EXTRA_CFLAGS += $(FLAGS) $(CPPFLAGS) $(EXTRA_FLAGS) -EXTRA_CFLAGS += -I$(srcdir)/../include -EXTRA_CFLAGS += -I$(KSRC)/../include -EXTRA_CFLAGS += -I$(srcdir)/../libqdma/qdma_access/qdma_soft_access -EXTRA_CFLAGS += -I$(srcdir)/../libqdma/qdma_access/eqdma_soft_access -EXTRA_CFLAGS += -I$(srcdir)/../libqdma/qdma_access/eqdma_cpm5_access -EXTRA_CFLAGS += -I$(srcdir)/../libqdma/qdma_access/qdma_cpm4_access -EXTRA_CFLAGS += -I. - -# linux >= 3.13 genl_ops become part of the genl_family. And although -# genl_register_family_with_ops() is still retained until kernel 4.10, -# its prototype changed from a extern function to a define. -# -ifneq ($(shell $(grep) -c 'int genl_register_family_with_ops' $(KINC)/net/genetlink.h),0) - ccflags-y += -D__GENL_REG_FAMILY_OPS_FUNC__ -endif - -# linux <= 3.13 pci_msix_vec_count is not defined. -# -ifeq ($(shell $(grep) -c 'int pci_msix_vec_count' $(KINC)/linux/pci.h),0) - ccflags-y += -D__PCI_MSI_VEC_COUNT__ -endif - -# linux < 3.13 list_next_entry is not defined. -# -ifeq ($(shell $(grep) -c 'list_next_entry' $(KINC)/linux/list.h),0) - ccflags-y += -D__LIST_NEXT_ENTRY__ -endif - -# linux < 3.18.13 READ_ONCE is not defined. -# -ifneq ($(shell $(grep) -c 'READ_ONCE' $(KINC)/linux/compiler.h),0) - ccflags-y += -D__READ_ONCE_DEFINED__ -endif - -$(info EXTRA_FLAGS = $(EXTRA_FLAGS).) -$(info ccflags-y = $(ccflags-y).) -#EXTRA_CFLAGS += -DDEBUG - -#For Kernel Images > 4.9.199 with CONFIG_STACK_VALIDATION=y and GCC version > 8 compiler throws spurious warnings -#related to sibling calls and frame pointer save/setup. To supress these warnings -#enable the OBJECT_FILES_NON_STANDARD option below -#If in case, the flag name changes in future linux kernel releases, please refer -#https://github.com/torvalds/linux/blob/master/tools/objtool/Documentation/stack-validation.txt -#to get the correct flag name -#OBJECT_FILES_NON_STANDARD := y - -ifneq ($(modulesymfile),) - override symverfile = symverfile="$(topdir)/$(modulesymfile) \ - -o $(drvdir)/$(modulesymfile)" -else - override symverfile = -endif - -DRV_OBJS := nl.o cdev.o qdma_mod.o - -LIBQDMA_OBJS := libqdma/qdma_mbox.o libqdma/qdma_intr.o libqdma/qdma_st_c2h.o \ - libqdma/qdma_thread.o libqdma/libqdma_export.o libqdma/qdma_context.o \ - libqdma/qdma_sriov.o libqdma/qdma_platform.o libqdma/qdma_descq.o libqdma/qdma_regs.o \ - libqdma/qdma_debugfs.o libqdma/qdma_debugfs_dev.o libqdma/qdma_debugfs_queue.o \ - libqdma/libqdma_config.o libqdma/qdma_device.o libqdma/xdev.o libqdma/thread.o - -QDMA_ACCESS_OBJS := libqdma/qdma_access/qdma_mbox_protocol.o libqdma/qdma_access/qdma_list.o \ - libqdma/qdma_access/qdma_access_common.o libqdma/qdma_access/qdma_resource_mgmt.o \ - libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_access.o \ - libqdma/qdma_access/qdma_cpm4_access/qdma_cpm4_reg_dump.o \ - libqdma/qdma_access/qdma_soft_access/qdma_soft_access.o \ - libqdma/qdma_access/eqdma_soft_access/eqdma_soft_access.o \ - libqdma/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.o \ - libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_access.o \ - libqdma/qdma_access/eqdma_cpm5_access/eqdma_cpm5_reg_dump.o - - - -obj-m += $(MOD_NAME).o -$(MOD_NAME)-objs += $(DRV_OBJS) -$(MOD_NAME)-objs += $(LIBQDMA_OBJS) -$(MOD_NAME)-objs += $(QDMA_ACCESS_OBJS) - -ifeq ($(ARCH),aarch64) - ARCH=arm64 -endif - -.PHONY: bin -bin: - @mkdir -p -m 755 $(bin_dir) - @rm -f $(MOD_NAME).ko $(bin_dir)/$(MOD_NAME).ko -ifeq ($(CROSS_COMPILE_FLAG),) - @$(MAKE) symverfile=$(symverfile) KBUILD_EXTRA_SYMBOLS=$(extra_symb) -C $(KOBJ) M=$(shell pwd) modules -else - @$(MAKE) symverfile=$(symverfile) KBUILD_EXTRA_SYMBOLS=$(extra_symb) -C $(KOBJ) CROSS_COMPILE=$(CROSS_COMPILE_FLAG) SUBDIRS=$(shell pwd) modules -endif - @cp $(MOD_NAME).ko $(bin_dir) - -.PHONY: clean -clean: - @-/bin/rm -rf *.ko* ?odule* .tmp_versions *.mod.* *.o *.o.* .*.o.* .*.cmd - @-/bin/rm -rf */*.o */*.o.* */.*.o.* */.*.cmd - @-/bin/rm -rf $(bin_dir)/*.ko - @-/bin/rm -f $(srcdir)/drv/libqdma diff --git a/QDMA/linux-kernel/driver/src/cdev.c b/QDMA/linux-kernel/driver/src/cdev.c deleted file mode 100755 index bd7d681..0000000 --- a/QDMA/linux-kernel/driver/src/cdev.c +++ /dev/null @@ -1,819 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "cdev.h" - -#include <asm/cacheflush.h> -#include <linux/device.h> -#include <linux/errno.h> -#include <linux/fs.h> -#include <linux/kernel.h> -#include <linux/pci.h> -#include <linux/slab.h> -#include <linux/types.h> -#include <linux/uaccess.h> -#include <linux/slab.h> -#include <linux/aio.h> -#include <linux/sched.h> -#include <linux/wait.h> -#include <linux/kthread.h> -#include <linux/version.h> -#if KERNEL_VERSION(3, 16, 0) <= LINUX_VERSION_CODE -#include <linux/uio.h> -#endif - -#include "qdma_mod.h" -#include "libqdma/xdev.h" - -/* - * @struct - xlnx_phy_dev - * @brief xilinx board device data members - */ -struct xlnx_phy_dev { - struct list_head list_head; /**< board list */ - unsigned int major; /**< major number per board */ - unsigned int device_bus; /**< PCIe device bus number per board */ - unsigned int dma_device_index; -}; - -static LIST_HEAD(xlnx_phy_dev_list); -static DEFINE_MUTEX(xlnx_phy_dev_mutex); - -struct cdev_async_io { - ssize_t res2; - unsigned long req_count; - unsigned long cmpl_count; - unsigned long err_cnt; - struct qdma_io_cb *qiocb; - struct qdma_request **reqv; - struct kiocb *iocb; - struct work_struct wrk_itm; -}; - -enum qdma_cdev_ioctl_cmd { - QDMA_CDEV_IOCTL_NO_MEMCPY, - QDMA_CDEV_IOCTL_CMDS -}; - -static struct class *qdma_class; -static struct kmem_cache *cdev_cache; - -static ssize_t cdev_gen_read_write(struct file *file, char __user *buf, - size_t count, loff_t *pos, bool write); -static void unmap_user_buf(struct qdma_io_cb *iocb, bool write); -static inline void iocb_release(struct qdma_io_cb *iocb); - -static inline void xlnx_phy_dev_list_remove(struct xlnx_phy_dev *phy_dev) -{ - if (!phy_dev) - return; - - mutex_lock(&xlnx_phy_dev_mutex); - list_del(&phy_dev->list_head); - mutex_unlock(&xlnx_phy_dev_mutex); -} - -static inline void xlnx_phy_dev_list_add(struct xlnx_phy_dev *phy_dev) -{ - if (!phy_dev) - return; - - mutex_lock(&xlnx_phy_dev_mutex); - list_add_tail(&phy_dev->list_head, &xlnx_phy_dev_list); - mutex_unlock(&xlnx_phy_dev_mutex); -} - -static int qdma_req_completed(struct qdma_request *req, - unsigned int bytes_done, int err) -{ - struct qdma_io_cb *qiocb = container_of(req, - struct qdma_io_cb, - req); - struct cdev_async_io *caio = NULL; - bool free_caio = false; - ssize_t res, res2; - - - if (qiocb) { - caio = (struct cdev_async_io *)qiocb->private; - } else { - pr_err("Invalid Data structure. Probable memory corruption"); - return -EINVAL; - } - - if (!caio) { - pr_err("Invalid Data structure. Probable memory corruption"); - return -EINVAL; - } - - unmap_user_buf(qiocb, req->write); - iocb_release(qiocb); - caio->res2 |= (err < 0) ? err : 0; - if (caio->res2) - caio->err_cnt++; - caio->cmpl_count++; - if (caio->cmpl_count == caio->req_count) { - res = caio->cmpl_count - caio->err_cnt; - res2 = caio->res2; -#ifdef RHEL_RELEASE_VERSION -#if RHEL_RELEASE_VERSION(9, 0) < RHEL_RELEASE_CODE - caio->iocb->ki_complete(caio->iocb, res); -#elif RHEL_RELEASE_VERSION(8, 0) < RHEL_RELEASE_CODE - caio->iocb->ki_complete(caio->iocb, res, res2); -#else - aio_complete(caio->iocb, res, res2); -#endif -#else -#if KERNEL_VERSION(5, 16, 0) <= LINUX_VERSION_CODE - caio->iocb->ki_complete(caio->iocb, res); -#elif KERNEL_VERSION(4, 1, 0) <= LINUX_VERSION_CODE - caio->iocb->ki_complete(caio->iocb, res, res2); -#else - aio_complete(caio->iocb, res, res2); -#endif -#endif - kfree(caio->qiocb); - free_caio = true; - } - if (free_caio) - kmem_cache_free(cdev_cache, caio); - - return 0; -} - -/* - * character device file operations - */ -static int cdev_gen_open(struct inode *inode, struct file *file) -{ - struct qdma_cdev *xcdev = container_of(inode->i_cdev, struct qdma_cdev, - cdev); - file->private_data = xcdev; - - if (xcdev->fp_open_extra) - return xcdev->fp_open_extra(xcdev); - - return 0; -} - -static int cdev_gen_close(struct inode *inode, struct file *file) -{ - struct qdma_cdev *xcdev = (struct qdma_cdev *)file->private_data; - - if (xcdev && xcdev->fp_close_extra) - return xcdev->fp_close_extra(xcdev); - - return 0; -} - -static loff_t cdev_gen_llseek(struct file *file, loff_t off, int whence) -{ - struct qdma_cdev *xcdev = (struct qdma_cdev *)file->private_data; - - loff_t newpos = 0; - - switch (whence) { - case 0: /* SEEK_SET */ - newpos = off; - break; - case 1: /* SEEK_CUR */ - newpos = file->f_pos + off; - break; - case 2: /* SEEK_END, @TODO should work from end of address space */ - newpos = UINT_MAX + off; - break; - default: /* can't happen */ - return -EINVAL; - } - if (newpos < 0) - return -EINVAL; - file->f_pos = newpos; - - pr_debug("%s: pos=%lld\n", xcdev->name, (signed long long)newpos); - - return newpos; -} - -static long cdev_gen_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct qdma_cdev *xcdev = (struct qdma_cdev *)file->private_data; - - switch (cmd) { - case QDMA_CDEV_IOCTL_NO_MEMCPY: - get_user(xcdev->no_memcpy, (unsigned char *)arg); - return 0; - default: - break; - } - if (xcdev->fp_ioctl_extra) - return xcdev->fp_ioctl_extra(xcdev, cmd, arg); - - pr_err("%s ioctl NOT supported.\n", xcdev->name); - return -EINVAL; -} - -/* - * cdev r/w - */ -static inline void iocb_release(struct qdma_io_cb *iocb) -{ - if (iocb->pages) - iocb->pages = NULL; - kfree(iocb->sgl); - iocb->sgl = NULL; - iocb->buf = NULL; -} - -static void unmap_user_buf(struct qdma_io_cb *iocb, bool write) -{ - int i; - - if (!iocb->pages || !iocb->pages_nr) - return; - - for (i = 0; i < iocb->pages_nr; i++) { - if (iocb->pages[i]) { - if (!write) - set_page_dirty(iocb->pages[i]); - put_page(iocb->pages[i]); - } else - break; - } - - if (i != iocb->pages_nr) - pr_err("sgl pages %d/%u.\n", i, iocb->pages_nr); - - iocb->pages_nr = 0; -} - -static int map_user_buf_to_sgl(struct qdma_io_cb *iocb, bool write) -{ - unsigned long len = iocb->len; - char *buf = iocb->buf; - struct qdma_sw_sg *sg; - unsigned int pg_off = offset_in_page(buf); - unsigned int pages_nr = (len + pg_off + PAGE_SIZE - 1) >> PAGE_SHIFT; - int i; - int rv; - - if (len == 0) - pages_nr = 1; - if (pages_nr == 0) - return -EINVAL; - - iocb->pages_nr = 0; - sg = kmalloc(pages_nr * (sizeof(struct qdma_sw_sg) + - sizeof(struct page *)), GFP_KERNEL); - if (!sg) { - pr_err("sgl allocation failed for %u pages", pages_nr); - return -ENOMEM; - } - memset(sg, 0, pages_nr * (sizeof(struct qdma_sw_sg) + - sizeof(struct page *))); - iocb->sgl = sg; - - iocb->pages = (struct page **)(sg + pages_nr); - rv = get_user_pages_fast((unsigned long)buf, pages_nr, 1/* write */, - iocb->pages); - /* No pages were pinned */ - if (rv < 0) { - pr_err("unable to pin down %u user pages, %d.\n", - pages_nr, rv); - goto err_out; - } - /* Less pages pinned than wanted */ - if (rv != pages_nr) { - pr_err("unable to pin down all %u user pages, %d.\n", - pages_nr, rv); - iocb->pages_nr = rv; - rv = -EFAULT; - goto err_out; - } - - for (i = 1; i < pages_nr; i++) { - if (iocb->pages[i - 1] == iocb->pages[i]) { - pr_err("duplicate pages, %d, %d.\n", - i - 1, i); - iocb->pages_nr = pages_nr; - rv = -EFAULT; - goto err_out; - } - } - - sg = iocb->sgl; - for (i = 0; i < pages_nr; i++, sg++) { - unsigned int offset = offset_in_page(buf); - unsigned int nbytes = min_t(unsigned int, PAGE_SIZE - offset, - len); - struct page *pg = iocb->pages[i]; - - flush_dcache_page(pg); - - sg->next = sg + 1; - sg->pg = pg; - sg->offset = offset; - sg->len = nbytes; - sg->dma_addr = 0UL; - - buf += nbytes; - len -= nbytes; - } - - iocb->sgl[pages_nr - 1].next = NULL; - iocb->pages_nr = pages_nr; - return 0; - -err_out: - unmap_user_buf(iocb, write); - iocb_release(iocb); - - return rv; -} - -static ssize_t cdev_gen_read_write(struct file *file, char __user *buf, - size_t count, loff_t *pos, bool write) -{ - struct qdma_cdev *xcdev = (struct qdma_cdev *)file->private_data; - struct qdma_io_cb iocb; - struct qdma_request *req = &iocb.req; - ssize_t res = 0; - int rv; - unsigned long qhndl; - - if (!xcdev) { - pr_err("file 0x%p, xcdev NULL, 0x%p,%llu, pos %llu, W %d.\n", - file, buf, (u64)count, (u64)*pos, write); - return -EINVAL; - } - - if (!xcdev->fp_rw) { - pr_err("file 0x%p, %s, NO rw, 0x%p,%llu, pos %llu, W %d.\n", - file, xcdev->name, buf, (u64)count, (u64)*pos, write); - return -EINVAL; - } - - qhndl = write ? xcdev->h2c_qhndl : xcdev->c2h_qhndl; - - pr_debug("%s, priv 0x%lx: buf 0x%p,%llu, pos %llu, W %d.\n", - xcdev->name, qhndl, buf, (u64)count, (u64)*pos, - write); - - memset(&iocb, 0, sizeof(struct qdma_io_cb)); - iocb.buf = buf; - iocb.len = count; - rv = map_user_buf_to_sgl(&iocb, write); - if (rv < 0) - return rv; - - req->sgcnt = iocb.pages_nr; - req->sgl = iocb.sgl; - req->write = write ? 1 : 0; - req->dma_mapped = 0; - req->udd_len = 0; - req->ep_addr = (u64)*pos; - req->count = count; - req->timeout_ms = 10 * 1000; /* 10 seconds */ - req->fp_done = NULL; /* blocking */ - req->h2c_eot = 1; /* set to 1 for STM tests */ - - res = xcdev->fp_rw(xcdev->xcb->xpdev->dev_hndl, qhndl, req); - - unmap_user_buf(&iocb, write); - iocb_release(&iocb); - - return res; -} - -static ssize_t cdev_gen_write(struct file *file, const char __user *buf, - size_t count, loff_t *pos) -{ - return cdev_gen_read_write(file, (char *)buf, count, pos, 1); -} - -static ssize_t cdev_gen_read(struct file *file, char __user *buf, - size_t count, loff_t *pos) -{ - return cdev_gen_read_write(file, (char *)buf, count, pos, 0); -} - -static ssize_t cdev_aio_write(struct kiocb *iocb, const struct iovec *io, - unsigned long count, loff_t pos) -{ - struct qdma_cdev *xcdev = - (struct qdma_cdev *)iocb->ki_filp->private_data; - struct cdev_async_io *caio; - int rv = 0; - unsigned long i; - unsigned long qhndl; - - if (!xcdev) { - pr_err("file 0x%p, xcdev NULL, %llu, pos %llu, W %d.\n", - iocb->ki_filp, (u64)count, (u64)pos, 1); - return -EINVAL; - } - - if (!xcdev->fp_rw) { - pr_err("No Read write handler assigned\n"); - return -EINVAL; - } - - caio = kmem_cache_alloc(cdev_cache, GFP_KERNEL); - if (!caio) { - pr_err("Failed to allocate caio"); - return -ENOMEM; - } - memset(caio, 0, sizeof(struct cdev_async_io)); - caio->qiocb = kzalloc(count * (sizeof(struct qdma_io_cb) + - sizeof(struct qdma_request *)), GFP_KERNEL); - if (!caio->qiocb) { - pr_err("failed to allocate qiocb"); - return -ENOMEM; - } - - caio->reqv = (struct qdma_request **)(caio->qiocb + count); - for (i = 0; i < count; i++) { - caio->qiocb[i].private = caio; - caio->reqv[i] = &(caio->qiocb[i].req); - caio->qiocb[i].buf = io[i].iov_base; - caio->qiocb[i].len = io[i].iov_len; - rv = map_user_buf_to_sgl(&(caio->qiocb[i]), true); - if (rv < 0) - break; - - caio->reqv[i]->write = 1; - caio->reqv[i]->sgcnt = caio->qiocb[i].pages_nr; - caio->reqv[i]->sgl = caio->qiocb[i].sgl; - caio->reqv[i]->dma_mapped = false; - caio->reqv[i]->udd_len = 0; - caio->reqv[i]->ep_addr = (u64)pos; - pos += io[i].iov_len; - caio->reqv[i]->no_memcpy = xcdev->no_memcpy ? 1 : 0; - caio->reqv[i]->count = io->iov_len; - caio->reqv[i]->timeout_ms = 10 * 1000; /* 10 seconds */ - caio->reqv[i]->fp_done = qdma_req_completed; - - } - if (i > 0) { - iocb->private = caio; - caio->iocb = iocb; - caio->req_count = i; - qhndl = xcdev->h2c_qhndl; - rv = xcdev->fp_aiorw(xcdev->xcb->xpdev->dev_hndl, qhndl, - caio->req_count, caio->reqv); - if (rv >= 0) - rv = -EIOCBQUEUED; - } else { - pr_err("failed with %d for %lu reqs", rv, caio->req_count); - kfree(caio->qiocb); - kmem_cache_free(cdev_cache, caio); - } - - return rv; -} - -static ssize_t cdev_aio_read(struct kiocb *iocb, const struct iovec *io, - unsigned long count, loff_t pos) -{ - struct qdma_cdev *xcdev = - (struct qdma_cdev *)iocb->ki_filp->private_data; - struct cdev_async_io *caio; - int rv = 0; - unsigned long i; - unsigned long qhndl; - - if (!xcdev) { - pr_err("file 0x%p, xcdev NULL, %llu, pos %llu, W %d.\n", - iocb->ki_filp, (u64)count, (u64)pos, 1); - return -EINVAL; - } - - if (!xcdev->fp_rw) { - pr_err("No Read write handler assigned\n"); - return -EINVAL; - } - - caio = kmem_cache_alloc(cdev_cache, GFP_KERNEL); - if (!caio) { - pr_err("failed to allocate qiocb"); - return -ENOMEM; - } - memset(caio, 0, sizeof(struct cdev_async_io)); - caio->qiocb = kzalloc(count * (sizeof(struct qdma_io_cb) + - sizeof(struct qdma_request *)), GFP_KERNEL); - if (!caio->qiocb) { - pr_err("failed to allocate qiocb"); - return -ENOMEM; - } - - caio->reqv = (struct qdma_request **)(caio->qiocb + count); - for (i = 0; i < count; i++) { - caio->qiocb[i].private = caio; - caio->reqv[i] = &(caio->qiocb[i].req); - caio->qiocb[i].buf = io[i].iov_base; - caio->qiocb[i].len = io[i].iov_len; - rv = map_user_buf_to_sgl(&(caio->qiocb[i]), false); - if (rv < 0) - break; - - caio->reqv[i]->write = 0; - caio->reqv[i]->sgcnt = caio->qiocb[i].pages_nr; - caio->reqv[i]->sgl = caio->qiocb[i].sgl; - caio->reqv[i]->dma_mapped = false; - caio->reqv[i]->udd_len = 0; - caio->reqv[i]->ep_addr = (u64)pos; - pos += io[i].iov_len; - caio->reqv[i]->no_memcpy = xcdev->no_memcpy ? 1 : 0; - caio->reqv[i]->count = io->iov_len; - caio->reqv[i]->timeout_ms = 10 * 1000; /* 10 seconds */ - caio->reqv[i]->fp_done = qdma_req_completed; - } - if (i > 0) { - iocb->private = caio; - caio->iocb = iocb; - caio->req_count = i; - qhndl = xcdev->c2h_qhndl; - rv = xcdev->fp_aiorw(xcdev->xcb->xpdev->dev_hndl, qhndl, - caio->req_count, caio->reqv); - if (rv >= 0) - rv = -EIOCBQUEUED; - } else { - pr_err("failed with %d for %lu reqs", rv, caio->req_count); - kfree(caio->qiocb); - kmem_cache_free(cdev_cache, caio); - } - - return rv; -} - -#if KERNEL_VERSION(3, 16, 0) <= LINUX_VERSION_CODE -static ssize_t cdev_write_iter(struct kiocb *iocb, struct iov_iter *io) -{ - return cdev_aio_write(iocb, io->iov, io->nr_segs, iocb->ki_pos); -} - -static ssize_t cdev_read_iter(struct kiocb *iocb, struct iov_iter *io) -{ - return cdev_aio_read(iocb, io->iov, io->nr_segs, iocb->ki_pos); -} -#endif - -static const struct file_operations cdev_gen_fops = { - .owner = THIS_MODULE, - .open = cdev_gen_open, - .release = cdev_gen_close, - .write = cdev_gen_write, -#if KERNEL_VERSION(3, 16, 0) <= LINUX_VERSION_CODE - .write_iter = cdev_write_iter, -#else - .aio_write = cdev_aio_write, -#endif - .read = cdev_gen_read, -#if KERNEL_VERSION(3, 16, 0) <= LINUX_VERSION_CODE - .read_iter = cdev_read_iter, -#else - .aio_read = cdev_aio_read, -#endif - .unlocked_ioctl = cdev_gen_ioctl, - .llseek = cdev_gen_llseek, -}; - -/* - * xcb: per pci device character device control info. - * xcdev: per queue character device - */ -void qdma_cdev_destroy(struct qdma_cdev *xcdev) -{ - - if (!xcdev) { - pr_err("xcdev is NULL.\n"); - return; - } - pr_debug("destroying cdev %p", xcdev); - - if (xcdev->sys_device) - device_destroy(qdma_class, xcdev->cdevno); - - cdev_del(&xcdev->cdev); - - kfree(xcdev); -} - -int qdma_cdev_create(struct qdma_cdev_cb *xcb, struct pci_dev *pdev, - struct qdma_queue_conf *qconf, unsigned int minor, - unsigned long qhndl, struct qdma_cdev **xcdev_pp, - char *ebuf, int ebuflen) -{ - struct qdma_cdev *xcdev; - int rv; - unsigned long *priv_data; - - xcdev = kzalloc(sizeof(struct qdma_cdev) + strlen(qconf->name) + 1, - GFP_KERNEL); - if (!xcdev) { - pr_err("%s failed to allocate cdev %lu.\n", - qconf->name, sizeof(struct qdma_cdev)); - if (ebuf && ebuflen) { - rv = snprintf(ebuf, ebuflen, - "%s failed to allocate cdev %lu.\n", - qconf->name, sizeof(struct qdma_cdev)); - ebuf[rv] = '\0'; - - } - return -ENOMEM; - } - - xcdev->cdev.owner = THIS_MODULE; - xcdev->xcb = xcb; - priv_data = (qconf->q_type == Q_C2H) ? - &xcdev->c2h_qhndl : &xcdev->h2c_qhndl; - *priv_data = qhndl; - xcdev->dir_init = (1 << qconf->q_type); - strcpy(xcdev->name, qconf->name); - - xcdev->minor = minor; - if (xcdev->minor >= xcb->cdev_minor_cnt) { - pr_err("%s: no char dev. left.\n", qconf->name); - if (ebuf && ebuflen) { - rv = snprintf(ebuf, ebuflen, "%s cdev no cdev left.\n", - qconf->name); - ebuf[rv] = '\0'; - } - rv = -ENOSPC; - goto err_out; - } - xcdev->cdevno = MKDEV(xcb->cdev_major, xcdev->minor); - - cdev_init(&xcdev->cdev, &cdev_gen_fops); - - /* bring character device live */ - rv = cdev_add(&xcdev->cdev, xcdev->cdevno, 1); - if (rv < 0) { - pr_err("cdev_add failed %d, %s.\n", rv, xcdev->name); - if (ebuf && ebuflen) { - int l = snprintf(ebuf, ebuflen, - "%s cdev add failed %d.\n", - qconf->name, rv); - ebuf[l] = '\0'; - } - goto err_out; - } - - /* create device on our class */ - if (qdma_class) { - xcdev->sys_device = device_create(qdma_class, &(pdev->dev), - xcdev->cdevno, NULL, "%s", xcdev->name); - if (IS_ERR(xcdev->sys_device)) { - rv = PTR_ERR(xcdev->sys_device); - pr_err("%s device_create failed %d.\n", - xcdev->name, rv); - if (ebuf && ebuflen) { - int l = snprintf(ebuf, ebuflen, - "%s device_create failed %d.\n", - qconf->name, rv); - ebuf[l] = '\0'; - } - goto del_cdev; - } - } - - xcdev->fp_rw = qdma_request_submit; - xcdev->fp_aiorw = qdma_batch_request_submit; - - *xcdev_pp = xcdev; - return 0; - -del_cdev: - cdev_del(&xcdev->cdev); - -err_out: - kfree(xcdev); - return rv; -} - -/* - * per device initialization & cleanup - */ -void qdma_cdev_device_cleanup(struct qdma_cdev_cb *xcb) -{ - if (!xcb->cdev_major) - return; - - xcb->cdev_major = 0; -} - -int qdma_cdev_device_init(struct qdma_cdev_cb *xcb) -{ - dev_t dev; - int rv; - struct xlnx_phy_dev *phy_dev, *tmp, *new_phy_dev; - struct xlnx_dma_dev *xdev = NULL; - - spin_lock_init(&xcb->lock); - - xcb->cdev_minor_cnt = QDMA_MINOR_MAX; - - if (xcb->cdev_major) { - pr_warn("major %d already exist.\n", xcb->cdev_major); - return -EINVAL; - } - - /* Check if same bus id device is added in global list - * If found then assign same major number - */ - mutex_lock(&xlnx_phy_dev_mutex); - xdev = (struct xlnx_dma_dev *)xcb->xpdev->dev_hndl; - list_for_each_entry_safe(phy_dev, tmp, &xlnx_phy_dev_list, list_head) { - if (phy_dev->device_bus == xcb->xpdev->pdev->bus->number && - phy_dev->dma_device_index == xdev->dma_device_index) { - xcb->cdev_major = phy_dev->major; - mutex_unlock(&xlnx_phy_dev_mutex); - return 0; - } - } - mutex_unlock(&xlnx_phy_dev_mutex); - - /* allocate a dynamically allocated char device node */ - rv = alloc_chrdev_region(&dev, 0, xcb->cdev_minor_cnt, - QDMA_CDEV_CLASS_NAME); - if (rv) { - pr_err("unable to allocate cdev region %d.\n", rv); - return rv; - } - xcb->cdev_major = MAJOR(dev); - - new_phy_dev = kzalloc(sizeof(struct xlnx_phy_dev), GFP_KERNEL); - if (!new_phy_dev) { - pr_err("unable to allocate xlnx_dev.\n"); - return -ENOMEM; - } - - new_phy_dev->major = xcb->cdev_major; - new_phy_dev->device_bus = xcb->xpdev->pdev->bus->number; - new_phy_dev->dma_device_index = xdev->dma_device_index; - xlnx_phy_dev_list_add(new_phy_dev); - - return 0; -} - -/* - * driver-wide Initialization & cleanup - */ - -int qdma_cdev_init(void) -{ - qdma_class = class_create(THIS_MODULE, QDMA_CDEV_CLASS_NAME); - if (IS_ERR(qdma_class)) { - pr_err("%s: failed to create class 0x%lx.", - QDMA_CDEV_CLASS_NAME, (unsigned long)qdma_class); - qdma_class = NULL; - return -ENODEV; - } - /* using kmem_cache_create to enable sequential cleanup */ - cdev_cache = kmem_cache_create("cdev_cache", - sizeof(struct cdev_async_io), - 0, - SLAB_HWCACHE_ALIGN, - NULL); - if (!cdev_cache) { - pr_err("failed to allocate cdev_cache\n"); - return -ENOMEM; - } - - return 0; -} - -void qdma_cdev_cleanup(void) -{ - struct xlnx_phy_dev *phy_dev, *tmp; - - list_for_each_entry_safe(phy_dev, tmp, &xlnx_phy_dev_list, list_head) { - unregister_chrdev_region(MKDEV(phy_dev->major, 0), - QDMA_MINOR_MAX); - xlnx_phy_dev_list_remove(phy_dev); - kfree(phy_dev); - } - - kmem_cache_destroy(cdev_cache); - if (qdma_class) - class_destroy(qdma_class); - -} diff --git a/QDMA/linux-kernel/driver/src/cdev.h b/QDMA/linux-kernel/driver/src/cdev.h deleted file mode 100755 index 371e528..0000000 --- a/QDMA/linux-kernel/driver/src/cdev.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_CDEV_H__ -#define __QDMA_CDEV_H__ -/** - * @file - * @brief This file contains the declarations for qdma pcie kernel module - * - */ -#include <linux/cdev.h> -#include "version.h" -#include <linux/spinlock_types.h> - -#include "libqdma/libqdma_export.h" -#include <linux/workqueue.h> - -/** QDMA character device class name */ -#define QDMA_CDEV_CLASS_NAME DRV_MODULE_NAME -/** QDMA character device max minor number to support 4k queues */ -#define QDMA_MINOR_MAX (4096) - -/* per pci device control */ -/** - * @struct - qdma_cdev_cb - * @brief QDMA character device call back data - */ -struct qdma_cdev_cb { - /** pointer to xilinx pcie device */ - struct xlnx_pci_dev *xpdev; - /** character device lock */ - spinlock_t lock; - /** character device major number */ - int cdev_major; - /** character device minor number count */ - int cdev_minor_cnt; -}; - -/** - * @struct - qdma_cdev - * @brief QDMA character device book keeping parameters - */ -struct qdma_cdev { - /** lsit of qdma character devices */ - struct list_head list_head; - /** minor number */ - int minor; - /** character device number */ - dev_t cdevno; - /** pointer to qdma character device call back data */ - struct qdma_cdev_cb *xcb; - /** pointer to kernel device(struct device) */ - struct device *sys_device; - /** pointer to kernel cdev(struct cdev) */ - struct cdev cdev; - /** c2h queue handle */ - unsigned long c2h_qhndl; - /** hec queue handle */ - unsigned long h2c_qhndl; - /** direction */ - unsigned short dir_init; - /* flag to indicate if memcpy is required */ - unsigned char no_memcpy; - /** call back function for open a device */ - int (*fp_open_extra)(struct qdma_cdev *xcdev); - /** call back function for close a device */ - int (*fp_close_extra)(struct qdma_cdev *xcdev); - /** call back function to handle ioctl message */ - long (*fp_ioctl_extra)(struct qdma_cdev *xcdev, unsigned int cmd, - unsigned long arg); - /** call back function to handle read write request*/ - ssize_t (*fp_rw)(unsigned long dev_hndl, unsigned long qhndl, - struct qdma_request *req); - ssize_t (*fp_aiorw)(unsigned long dev_hndl, unsigned long qhndl, - unsigned long count, struct qdma_request **reqv); - /** name of the character device*/ - char name[0]; -}; - -/** - * @struct - qdma_io_cb - * @brief QDMA character device io call back book keeping parameters - */ -struct qdma_io_cb { - void *private; - /** user buffer */ - void __user *buf; - /** length of the user buffer */ - size_t len; - /** page number */ - unsigned int pages_nr; - /** scatter gather list */ - struct qdma_sw_sg *sgl; - /** pages allocated to accommodate the scatter gather list */ - struct page **pages; - /** qdma request */ - struct qdma_request req; -}; - -/*****************************************************************************/ -/** - * qdma_cdev_destroy() - handler to destroy the character device - * - * @param[in] xcdev: pointer to character device - * - * @return none - *****************************************************************************/ -void qdma_cdev_destroy(struct qdma_cdev *xcdev); - -/*****************************************************************************/ -/** - * qdma_cdev_create() - handler to create a character device - * - * @param[in] xcb: pointer to qdma character device call back data - * @param[in] pdev: pointer to struct pci_dev - * @param[in] qconf: queue configurations - * @param[in] minor: character device minor number - * @param[in] ebuflen: buffer length - * @param[in] qhndl: queue handle - * @param[out] xcdev_pp: pointer to struct qdma_cdev - * @param[out] ebuf: - * error message buffer, can be NULL/0 (i.e., optional) - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_cdev_create(struct qdma_cdev_cb *xcb, struct pci_dev *pdev, - struct qdma_queue_conf *qconf, unsigned int minor, - unsigned long qhndl, struct qdma_cdev **xcdev_pp, - char *ebuf, int ebuflen); - -/*****************************************************************************/ -/** - * qdma_cdev_device_cleanup() - handler to clean up a character device - * - * @param[in] xcb: pointer to qdma character device call back data - * - * @return none - *****************************************************************************/ -void qdma_cdev_device_cleanup(struct qdma_cdev_cb *xcb); - -/*****************************************************************************/ -/** - * qdma_cdev_device_init() - handler to initialize a character device - * - * @param[in] xcb: pointer to qdma character device call back data - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_cdev_device_init(struct qdma_cdev_cb *xcb); - -/*****************************************************************************/ -/** - * qdma_cdev_cleanup() - character device cleanup handler - * - *****************************************************************************/ -void qdma_cdev_cleanup(void); - -/*****************************************************************************/ -/** - * qdma_cdev_init() - character device initialization handler - * - *****************************************************************************/ -int qdma_cdev_init(void); - -#endif /* ifndef __QDMA_CDEV_H__ */ diff --git a/QDMA/linux-kernel/driver/src/nl.c b/QDMA/linux-kernel/driver/src/nl.c deleted file mode 100755 index 5a3da36..0000000 --- a/QDMA/linux-kernel/driver/src/nl.c +++ /dev/null @@ -1,2902 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include <linux/version.h> -#include <linux/kernel.h> -#include <linux/pci.h> -#include <net/genetlink.h> - -#include "libqdma/libqdma_export.h" -#include "qdma_mod.h" -#include "qdma_nl.h" -#include "nl.h" -#include "version.h" - -#define QDMA_C2H_DEFAULT_BUF_SZ (4096) -#define DUMP_LINE_SZ (81) -#define QDMA_Q_DUMP_MAX_QUEUES (100) -#define QDMA_Q_DUMP_LINE_SZ (25 * 1024) -#define QDMA_Q_LIST_LINE_SZ (200) - -static int xnl_dev_list(struct sk_buff *skb2, struct genl_info *info); - -#ifdef RHEL_RELEASE_VERSION -#if RHEL_RELEASE_VERSION(8, 3) > RHEL_RELEASE_CODE -static struct nla_policy xnl_policy[XNL_ATTR_MAX] = { - [XNL_ATTR_GENMSG] = { .type = NLA_NUL_STRING }, - - [XNL_ATTR_DRV_INFO] = { .type = NLA_NUL_STRING }, - - [XNL_ATTR_DEV_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_PCI_BUS] = { .type = NLA_U32 }, - [XNL_ATTR_PCI_DEV] = { .type = NLA_U32 }, - [XNL_ATTR_PCI_FUNC] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_CFG_BAR] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_USR_BAR] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_QSET_MAX] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_QSET_QBASE] = { .type = NLA_U32 }, - - [XNL_ATTR_VERSION_INFO] = { .type = NLA_NUL_STRING }, - [XNL_ATTR_DEVICE_TYPE] = { .type = NLA_NUL_STRING }, - [XNL_ATTR_IP_TYPE] = { .type = NLA_NUL_STRING }, - [XNL_ATTR_DEV_NUMQS] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_NUM_PFS] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_MM_CHANNEL_MAX] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_MAILBOX_ENABLE] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_FLR_PRESENT] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_ST_ENABLE] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_MM_ENABLE] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_MM_CMPT_ENABLE] = { .type = NLA_U32 }, - - [XNL_ATTR_REG_BAR_NUM] = { .type = NLA_U32 }, - [XNL_ATTR_REG_ADDR] = { .type = NLA_U32 }, - [XNL_ATTR_REG_VAL] = { .type = NLA_U32 }, - - [XNL_ATTR_QIDX] = { .type = NLA_U32 }, - [XNL_ATTR_NUM_Q] = { .type = NLA_U32 }, - [XNL_ATTR_QFLAG] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_DESC_SIZE] = { .type = NLA_U32 }, - [XNL_ATTR_SW_DESC_SIZE] = { .type = NLA_U32 }, - [XNL_ATTR_QRNGSZ_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_C2H_BUFSZ_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_TIMER_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_CNTR_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_MM_CHANNEL] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_TRIG_MODE] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_ENTRIES_CNT] = { .type = NLA_U32 }, - [XNL_ATTR_RANGE_START] = { .type = NLA_U32 }, - [XNL_ATTR_RANGE_END] = { .type = NLA_U32 }, - - [XNL_ATTR_INTR_VECTOR_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_PIPE_GL_MAX] = { .type = NLA_U32 }, - [XNL_ATTR_PIPE_FLOW_ID] = { .type = NLA_U32 }, - [XNL_ATTR_PIPE_SLR_ID] = { .type = NLA_U32 }, - [XNL_ATTR_PIPE_TDEST] = { .type = NLA_U32 }, - - [XNL_ATTR_DEV_STM_BAR] = { .type = NLA_U32 }, - [XNL_ATTR_Q_STATE] = { .type = NLA_U32 }, - [XNL_ATTR_ERROR] = { .type = NLA_U32 }, - [XNL_ATTR_PING_PONG_EN] = { .type = NLA_U32 }, - [XNL_ATTR_DEV] = { .type = NLA_BINARY, - .len = QDMA_DEV_ATTR_STRUCT_SIZE, }, - [XNL_ATTR_GLOBAL_CSR] = { .type = NLA_BINARY, - .len = QDMA_DEV_GLOBAL_CSR_STRUCT_SIZE, }, -#ifdef ERR_DEBUG - [XNL_ATTR_QPARAM_ERR_INFO] = { .type = NLA_U32 }, -#endif -}; -#endif -#else -#if ((KERNEL_VERSION(5, 2, 0) > LINUX_VERSION_CODE) || (LINUX_VERSION_CODE > \ - KERNEL_VERSION(5, 9, 0))) -static struct nla_policy xnl_policy[XNL_ATTR_MAX] = { - [XNL_ATTR_GENMSG] = { .type = NLA_NUL_STRING }, - - [XNL_ATTR_DRV_INFO] = { .type = NLA_NUL_STRING }, - - [XNL_ATTR_DEV_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_PCI_BUS] = { .type = NLA_U32 }, - [XNL_ATTR_PCI_DEV] = { .type = NLA_U32 }, - [XNL_ATTR_PCI_FUNC] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_CFG_BAR] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_USR_BAR] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_QSET_MAX] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_QSET_QBASE] = { .type = NLA_U32 }, - - [XNL_ATTR_VERSION_INFO] = { .type = NLA_NUL_STRING }, - [XNL_ATTR_DEVICE_TYPE] = { .type = NLA_NUL_STRING }, - [XNL_ATTR_IP_TYPE] = { .type = NLA_NUL_STRING }, - [XNL_ATTR_DEV_NUMQS] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_NUM_PFS] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_MM_CHANNEL_MAX] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_MAILBOX_ENABLE] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_FLR_PRESENT] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_ST_ENABLE] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_MM_ENABLE] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_MM_CMPT_ENABLE] = { .type = NLA_U32 }, - - [XNL_ATTR_REG_BAR_NUM] = { .type = NLA_U32 }, - [XNL_ATTR_REG_ADDR] = { .type = NLA_U32 }, - [XNL_ATTR_REG_VAL] = { .type = NLA_U32 }, - - [XNL_ATTR_CSR_INDEX] = { .type = NLA_U32 }, - [XNL_ATTR_CSR_COUNT] = { .type = NLA_U32 }, - - [XNL_ATTR_QIDX] = { .type = NLA_U32 }, - [XNL_ATTR_NUM_Q] = { .type = NLA_U32 }, - [XNL_ATTR_QFLAG] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_DESC_SIZE] = { .type = NLA_U32 }, - [XNL_ATTR_SW_DESC_SIZE] = { .type = NLA_U32 }, - [XNL_ATTR_QRNGSZ_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_C2H_BUFSZ_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_TIMER_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_CNTR_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_MM_CHANNEL] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_TRIG_MODE] = { .type = NLA_U32 }, - [XNL_ATTR_CMPT_ENTRIES_CNT] = { .type = NLA_U32 }, - [XNL_ATTR_RANGE_START] = { .type = NLA_U32 }, - [XNL_ATTR_RANGE_END] = { .type = NLA_U32 }, - - [XNL_ATTR_INTR_VECTOR_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_INTR_VECTOR_START_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_INTR_VECTOR_END_IDX] = { .type = NLA_U32 }, - [XNL_ATTR_RSP_BUF_LEN] = { .type = NLA_U32 }, - [XNL_ATTR_PIPE_GL_MAX] = { .type = NLA_U32 }, - [XNL_ATTR_PIPE_FLOW_ID] = { .type = NLA_U32 }, - [XNL_ATTR_PIPE_SLR_ID] = { .type = NLA_U32 }, - [XNL_ATTR_PIPE_TDEST] = { .type = NLA_U32 }, - - [XNL_ATTR_DEV_STM_BAR] = { .type = NLA_U32 }, - [XNL_ATTR_Q_STATE] = { .type = NLA_U32 }, - [XNL_ATTR_ERROR] = { .type = NLA_U32 }, - [XNL_ATTR_PING_PONG_EN] = { .type = NLA_U32 }, - [XNL_ATTR_APERTURE_SZ] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_STAT_PING_PONG_LATMIN1] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_STAT_PING_PONG_LATMIN2] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_STAT_PING_PONG_LATMAX1] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_STAT_PING_PONG_LATMAX2] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_STAT_PING_PONG_LATAVG1] = { .type = NLA_U32 }, - [XNL_ATTR_DEV_STAT_PING_PONG_LATAVG2] = { .type = NLA_U32 }, - [XNL_ATTR_DEV] = { .type = NLA_BINARY, - .len = QDMA_DEV_ATTR_STRUCT_SIZE, }, - [XNL_ATTR_GLOBAL_CSR] = { .type = NLA_BINARY, - .len = QDMA_DEV_GLOBAL_CSR_STRUCT_SIZE, }, -#ifdef ERR_DEBUG - [XNL_ATTR_QPARAM_ERR_INFO] = { .type = NLA_U32 }, -#endif -}; -#endif -#endif - -static int xnl_respond_buffer_cmpt(struct genl_info *info, char *buf, - int buflen, int error, long int cmpt_entries); - -static int xnl_dev_info(struct sk_buff *, struct genl_info *); -static int xnl_dev_version_capabilities(struct sk_buff *skb2, - struct genl_info *info); -static int xnl_dev_stat(struct sk_buff *, struct genl_info *); -static int xnl_dev_stat_clear(struct sk_buff *, struct genl_info *); -static int xnl_q_list(struct sk_buff *, struct genl_info *); -static int xnl_q_add(struct sk_buff *, struct genl_info *); -static int xnl_q_start(struct sk_buff *, struct genl_info *); -static int xnl_q_stop(struct sk_buff *, struct genl_info *); -static int xnl_q_del(struct sk_buff *, struct genl_info *); -static int xnl_q_dump(struct sk_buff *, struct genl_info *); -static int xnl_q_dump_desc(struct sk_buff *, struct genl_info *); -static int xnl_q_dump_cmpt(struct sk_buff *, struct genl_info *); -static int xnl_config_reg_dump(struct sk_buff *, struct genl_info *); -static int xnl_q_read_pkt(struct sk_buff *, struct genl_info *); -static int xnl_q_read_udd(struct sk_buff *, struct genl_info *); -static int xnl_q_cmpt_read(struct sk_buff *, struct genl_info *); -static int xnl_intr_ring_dump(struct sk_buff *, struct genl_info *); -static int xnl_register_read(struct sk_buff *, struct genl_info *); -static int xnl_register_write(struct sk_buff *, struct genl_info *); -static int xnl_get_global_csr(struct sk_buff *skb2, struct genl_info *info); -static int xnl_get_queue_state(struct sk_buff *, struct genl_info *); -static int xnl_config_reg_info_dump(struct sk_buff *, struct genl_info *); - -#ifdef TANDEM_BOOT_SUPPORTED -static int xnl_en_st(struct sk_buff *skb2, struct genl_info *info); -#endif - -#ifdef ERR_DEBUG -static int xnl_err_induce(struct sk_buff *skb2, struct genl_info *info); -#endif - -#ifdef RHEL_RELEASE_VERSION -#if RHEL_RELEASE_VERSION(8, 3) > RHEL_RELEASE_CODE -#define GENL_OPS_POLICY -#endif -#else -#if ((KERNEL_VERSION(5, 2, 0) > LINUX_VERSION_CODE) || (LINUX_VERSION_CODE > \ - KERNEL_VERSION(5, 9, 0))) -#define GENL_OPS_POLICY -#endif -#endif - -#ifdef GENL_OPS_POLICY -static struct genl_ops xnl_ops[] = { - { - .cmd = XNL_CMD_DEV_LIST, - .policy = xnl_policy, - .doit = xnl_dev_list, - }, - { - .cmd = XNL_CMD_DEV_CAP, - .policy = xnl_policy, - .doit = xnl_dev_version_capabilities, - }, - { - .cmd = XNL_CMD_DEV_INFO, - .policy = xnl_policy, - .doit = xnl_dev_info, - }, - { - .cmd = XNL_CMD_DEV_STAT, - .policy = xnl_policy, - .doit = xnl_dev_stat, - }, - { - .cmd = XNL_CMD_DEV_STAT_CLEAR, - .policy = xnl_policy, - .doit = xnl_dev_stat_clear, - }, - { - .cmd = XNL_CMD_Q_LIST, - .policy = xnl_policy, - .doit = xnl_q_list, - }, - { - .cmd = XNL_CMD_Q_ADD, - .policy = xnl_policy, - .doit = xnl_q_add, - }, - { - .cmd = XNL_CMD_Q_START, - .policy = xnl_policy, - .doit = xnl_q_start, - }, - { - .cmd = XNL_CMD_Q_STOP, - .policy = xnl_policy, - .doit = xnl_q_stop, - }, - { - .cmd = XNL_CMD_Q_DEL, - .policy = xnl_policy, - .doit = xnl_q_del, - }, - { - .cmd = XNL_CMD_Q_DUMP, - .policy = xnl_policy, - .doit = xnl_q_dump, - }, - { - .cmd = XNL_CMD_Q_DESC, - .policy = xnl_policy, - .doit = xnl_q_dump_desc, - }, - { - .cmd = XNL_CMD_REG_DUMP, - .policy = xnl_policy, - .doit = xnl_config_reg_dump, - }, - { - .cmd = XNL_CMD_REG_INFO_READ, - .policy = xnl_policy, - .doit = xnl_config_reg_info_dump, - }, - { - .cmd = XNL_CMD_Q_CMPT, - .policy = xnl_policy, - .doit = xnl_q_dump_cmpt, - }, - { - .cmd = XNL_CMD_Q_UDD, - .policy = xnl_policy, - .doit = xnl_q_read_udd, - }, - { - .cmd = XNL_CMD_Q_RX_PKT, - .policy = xnl_policy, - .doit = xnl_q_read_pkt, - }, - { - .cmd = XNL_CMD_Q_CMPT_READ, - .policy = xnl_policy, - .doit = xnl_q_cmpt_read, - }, - { - .cmd = XNL_CMD_INTR_RING_DUMP, - .policy = xnl_policy, - .doit = xnl_intr_ring_dump, - }, - { - .cmd = XNL_CMD_REG_RD, - .policy = xnl_policy, - .doit = xnl_register_read, - }, - { - .cmd = XNL_CMD_REG_WRT, - .policy = xnl_policy, - .doit = xnl_register_write, - }, - { - .cmd = XNL_CMD_GLOBAL_CSR, - .policy = xnl_policy, - .doit = xnl_get_global_csr, - }, - { - .cmd = XNL_CMD_GET_Q_STATE, - .policy = xnl_policy, - .doit = xnl_get_queue_state, - }, - -#ifdef TANDEM_BOOT_SUPPORTED - { - .cmd = XNL_CMD_EN_ST, - .policy = xnl_policy, - .doit = xnl_en_st, - }, -#endif - -#ifdef ERR_DEBUG - { - .cmd = XNL_CMD_Q_ERR_INDUCE, - .policy = xnl_policy, - .doit = xnl_err_induce, - } -#endif -}; -#else -static struct genl_ops xnl_ops[] = { - { - .cmd = XNL_CMD_DEV_LIST, - .doit = xnl_dev_list, - }, - { - .cmd = XNL_CMD_DEV_CAP, - .doit = xnl_dev_version_capabilities, - }, - { - .cmd = XNL_CMD_DEV_INFO, - .doit = xnl_dev_info, - }, - { - .cmd = XNL_CMD_DEV_STAT, - .doit = xnl_dev_stat, - }, - { - .cmd = XNL_CMD_DEV_STAT_CLEAR, - .doit = xnl_dev_stat_clear, - }, - { - .cmd = XNL_CMD_Q_LIST, - .doit = xnl_q_list, - }, - { - .cmd = XNL_CMD_Q_ADD, - .doit = xnl_q_add, - }, - { - .cmd = XNL_CMD_Q_START, - .doit = xnl_q_start, - }, - { - .cmd = XNL_CMD_Q_STOP, - .doit = xnl_q_stop, - }, - { - .cmd = XNL_CMD_Q_DEL, - .doit = xnl_q_del, - }, - { - .cmd = XNL_CMD_Q_DUMP, - .doit = xnl_q_dump, - }, - { - .cmd = XNL_CMD_Q_DESC, - .doit = xnl_q_dump_desc, - }, - { - .cmd = XNL_CMD_REG_DUMP, - .doit = xnl_config_reg_dump, - }, - { - .cmd = XNL_CMD_REG_INFO_READ, - .doit = xnl_config_reg_info_dump, - }, - { - .cmd = XNL_CMD_Q_CMPT, - .doit = xnl_q_dump_cmpt, - }, - { - .cmd = XNL_CMD_Q_UDD, - .doit = xnl_q_read_udd, - }, - { - .cmd = XNL_CMD_Q_RX_PKT, - .doit = xnl_q_read_pkt, - }, - { - .cmd = XNL_CMD_Q_CMPT_READ, - .doit = xnl_q_cmpt_read, - }, - { - .cmd = XNL_CMD_INTR_RING_DUMP, - .doit = xnl_intr_ring_dump, - }, - { - .cmd = XNL_CMD_REG_RD, - .doit = xnl_register_read, - }, - { - .cmd = XNL_CMD_REG_WRT, - .doit = xnl_register_write, - }, - { - .cmd = XNL_CMD_GLOBAL_CSR, - .doit = xnl_get_global_csr, - }, - { - .cmd = XNL_CMD_GET_Q_STATE, - .doit = xnl_get_queue_state, - }, - -#ifdef TANDEM_BOOT_SUPPORTED - { - .cmd = XNL_CMD_EN_ST, - .doit = xnl_en_st, - }, -#endif - -#ifdef ERR_DEBUG - { - .cmd = XNL_CMD_Q_ERR_INDUCE, - .doit = xnl_err_induce, - } -#endif -}; -#endif - -static struct genl_family xnl_family = { -#ifdef GENL_ID_GENERATE - .id = GENL_ID_GENERATE, -#endif - .hdrsize = 0, -#ifdef __QDMA_VF__ - .name = XNL_NAME_VF, -#else - .name = XNL_NAME_PF, -#endif -#ifndef __GENL_REG_FAMILY_OPS_FUNC__ - .ops = xnl_ops, - .n_ops = ARRAY_SIZE(xnl_ops), -#endif - .maxattr = XNL_ATTR_MAX - 1, -}; - -static struct sk_buff *xnl_msg_alloc(enum xnl_op_t op, int min_sz, - void **hdr, struct genl_info *info) -{ - struct sk_buff *skb; - void *p; - unsigned long sz = min_sz < NLMSG_GOODSIZE ? NLMSG_GOODSIZE : min_sz; - - skb = genlmsg_new(sz, GFP_KERNEL); - if (!skb) { - pr_err("failed to allocate skb %lu.\n", sz); - return NULL; - } - - p = genlmsg_put(skb, 0, info->snd_seq + 1, &xnl_family, 0, op); - if (!p) { - pr_err("skb too small.\n"); - nlmsg_free(skb); - return NULL; - } - - *hdr = p; - return skb; -} - -static inline int xnl_msg_add_attr_str(struct sk_buff *skb, - enum xnl_attr_t type, char *s) -{ - int rv; - - rv = nla_put_string(skb, type, s); - if (rv != 0) { - pr_err("nla_put_string return %d.\n", rv); - return -EINVAL; - } - return 0; -} - -static inline int xnl_msg_add_attr_data(struct sk_buff *skb, - enum xnl_attr_t type, void *s, unsigned int len) -{ - int rv; - - rv = nla_put(skb, type, len, s); - if (rv != 0) { - pr_err("nla_put return %d.\n", rv); - return -EINVAL; - } - return 0; -} - - -static inline int xnl_msg_add_attr_uint(struct sk_buff *skb, - enum xnl_attr_t type, u32 v) -{ - int rv; - - rv = nla_put_u32(skb, type, v); - if (rv != 0) { - pr_err("nla add dev_idx failed %d.\n", rv); - return -EINVAL; - } - return 0; -} - -static inline int xnl_msg_send(struct sk_buff *skb_tx, void *hdr, - struct genl_info *info) -{ - int rv; - - genlmsg_end(skb_tx, hdr); - - rv = genlmsg_unicast(genl_info_net(info), skb_tx, info->snd_portid); - if (rv) - pr_err("send portid %d failed %d.\n", info->snd_portid, rv); - - return 0; -} - -#ifdef DEBUG -static int xnl_dump_attrs(struct genl_info *info) -{ - int i; - - pr_info("snd_seq 0x%x, portid 0x%x.\n", - info->snd_seq, info->snd_portid); -#if 0 - print_hex_dump_bytes("nlhdr", DUMP_PREFIX_OFFSET, info->nlhdr, - sizeof(struct nlmsghdr)); - pr_info("\n"); { - print_hex_dump_bytes("genlhdr", DUMP_PREFIX_OFFSET, info->genlhdr, - sizeof(struct genlmsghdr)); - pr_info("\n"); -#endif - - pr_info("nlhdr: len %u, type %u, flags 0x%x, seq 0x%x, pid %u.\n", - info->nlhdr->nlmsg_len, - info->nlhdr->nlmsg_type, - info->nlhdr->nlmsg_flags, - info->nlhdr->nlmsg_seq, - info->nlhdr->nlmsg_pid); - pr_info("genlhdr: cmd 0x%x %s, version %u, reserved 0x%x.\n", - info->genlhdr->cmd, xnl_op_str[info->genlhdr->cmd], - info->genlhdr->version, - info->genlhdr->reserved); - - for (i = 0; i < XNL_ATTR_MAX; i++) { - struct nlattr *na = info->attrs[i]; - - if (na) { -#if ((KERNEL_VERSION(5, 2, 0) > LINUX_VERSION_CODE) || (LINUX_VERSION_CODE > \ - KERNEL_VERSION(5, 9, 0))) - if (xnl_policy[i].type == NLA_NUL_STRING) { -#else - if (1) { -#endif - - char *s = (char *)nla_data(na); - - if (s) - pr_info("attr %d, %s, str %s.\n", - i, xnl_attr_str[i], s); - else - pr_info("attr %d, %s, str NULL.\n", - i, xnl_attr_str[i]); - - } else { - u32 v = nla_get_u32(na); - - pr_info("attr %s, u32 0x%x.\n", - xnl_attr_str[i], v); - } - } - } - - return 0; -} -#else -#define xnl_dump_attrs(info) -#endif - -static int xnl_respond_buffer_cmpt(struct genl_info *info, char *buf, - int buflen, int error, long int cmpt_entries) -{ - struct sk_buff *skb; - void *hdr; - int rv; - - skb = xnl_msg_alloc(info->genlhdr->cmd, buflen, &hdr, info); - if (!skb) - return -ENOMEM; - - rv = xnl_msg_add_attr_str(skb, XNL_ATTR_GENMSG, buf); - if (rv != 0) { - pr_err("xnl_msg_add_attr_str() failed: %d", rv); - nlmsg_free(skb); - return rv; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_ERROR, error); - if (rv != 0) { - pr_err("xnl_msg_add_attr_str() failed: %d", rv); - nlmsg_free(skb); - return rv; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_CMPT_ENTRIES_CNT, - cmpt_entries); - if (rv != 0) { - pr_err("xnl_msg_add_attr_str() failed: %d", rv); - nlmsg_free(skb); - return rv; - } - - rv = xnl_msg_send(skb, hdr, info); - - return rv; -} - -int xnl_respond_buffer(struct genl_info *info, char *buf, int buflen, int error) -{ - struct sk_buff *skb; - void *hdr; - int rv; - - skb = xnl_msg_alloc(info->genlhdr->cmd, buflen, &hdr, info); - if (!skb) - return -ENOMEM; - - rv = xnl_msg_add_attr_str(skb, XNL_ATTR_GENMSG, buf); - if (rv != 0) { - pr_err("xnl_msg_add_attr_str() failed: %d", rv); - nlmsg_free(skb); - return rv; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_ERROR, error); - if (rv != 0) { - pr_err("xnl_msg_add_attr_str() failed: %d", rv); - nlmsg_free(skb); - return rv; - } - - rv = xnl_msg_send(skb, hdr, info); - - return rv; -} - -static int xnl_respond_data(struct genl_info *info, void *buf, int buflen) -{ - struct sk_buff *skb; - void *hdr; - int rv; - - skb = xnl_msg_alloc(info->genlhdr->cmd, buflen, &hdr, info); - if (!skb) - return -ENOMEM; - - rv = xnl_msg_add_attr_data(skb, XNL_ATTR_GLOBAL_CSR, buf, buflen); - if (rv != 0) { - pr_err("xnl_msg_add_attr_data() failed: %d", rv); - return rv; - } - - rv = xnl_msg_send(skb, hdr, info); - return rv; -} - -static char *xnl_mem_alloc(int l, struct genl_info *info) -{ - char ebuf[XNL_ERR_BUFLEN]; - char *buf = kmalloc(l, GFP_KERNEL); - int rv; - - if (buf) { - memset(buf, 0, l); - return buf; - } - - pr_err("xnl OOM %d.\n", l); - - rv = snprintf(ebuf, XNL_ERR_BUFLEN, "ERR! xnl OOM %d.\n", l); - - xnl_respond_buffer(info, ebuf, XNL_ERR_BUFLEN, rv); - - return NULL; -} - -static struct xlnx_pci_dev *xnl_rcv_check_xpdev(struct genl_info *info) -{ - u32 idx; - struct xlnx_pci_dev *xpdev; - char err[XNL_ERR_BUFLEN]; - int rv = 0; - - if (info == NULL) - return NULL; - - if (!info->attrs[XNL_ATTR_DEV_IDX]) { - snprintf(err, sizeof(err), - "command %s missing attribute XNL_ATTR_DEV_IDX", - xnl_op_str[info->genlhdr->cmd]); - rv = -EINVAL; - goto respond_error; - } - - idx = nla_get_u32(info->attrs[XNL_ATTR_DEV_IDX]); - - xpdev = xpdev_find_by_idx(idx, err, sizeof(err)); - if (!xpdev) { - rv = -EINVAL; - /* err buffer populated by xpdev_find_by_idx*/ - goto respond_error; - } - - return xpdev; - -respond_error: - xnl_respond_buffer(info, err, strlen(err), rv); - return NULL; -} - -static int qconf_get(struct qdma_queue_conf *qconf, struct genl_info *info, - char *err, int errlen, unsigned char *is_qp) -{ - u32 f = 0; - - if (!qconf || !info) - return -EINVAL; - - if (!info->attrs[XNL_ATTR_QFLAG]) { - snprintf(err, errlen, "Missing attribute 'XNL_ATTR_QFLAG'\n"); - goto respond_error; - } - f = nla_get_u32(info->attrs[XNL_ATTR_QFLAG]); - if ((f & XNL_F_QMODE_ST) && (f & XNL_F_QMODE_MM)) { - snprintf(err, errlen, "ERR! Both ST and MM mode set.\n"); - goto respond_error; - } else if (!(f & XNL_F_QMODE_ST) && !(f & XNL_F_QMODE_MM)) { - /* default to MM */ - f |= XNL_F_QMODE_MM; - } - - if (!(f & XNL_F_QDIR_H2C) && - !(f & XNL_F_QDIR_C2H) && !(f & XNL_F_Q_CMPL)) { - /* default to H2C */ - f |= XNL_F_QDIR_H2C; - } - - memset(qconf, 0, sizeof(*qconf)); - qconf->st = (f & XNL_F_QMODE_ST) ? 1 : 0; - - if (f & XNL_F_QDIR_H2C) - qconf->q_type = Q_H2C; - else if (f & XNL_F_QDIR_C2H) - qconf->q_type = Q_C2H; - else - qconf->q_type = Q_CMPT; - - *is_qp = ((f & XNL_F_QDIR_BOTH) == XNL_F_QDIR_BOTH) ? 1 : 0; - - if (!info->attrs[XNL_ATTR_QIDX]) { - snprintf(err, errlen, "Missing attribute 'XNL_ATTR_QIDX'"); - goto respond_error; - } - qconf->qidx = nla_get_u32(info->attrs[XNL_ATTR_QIDX]); - if (qconf->qidx == XNL_QIDX_INVALID) - qconf->qidx = QDMA_QUEUE_IDX_INVALID; - - return 0; - -respond_error: - - xnl_respond_buffer(info, err, strlen(err), 0); - return -EINVAL; -} - -static struct xlnx_qdata *xnl_rcv_check_qidx(struct genl_info *info, - struct xlnx_pci_dev *xpdev, - struct qdma_queue_conf *qconf, char *buf, - int buflen) -{ - char ebuf[XNL_ERR_BUFLEN]; - struct xlnx_qdata *qdata = xpdev_queue_get(xpdev, qconf->qidx, - qconf->q_type, 1, ebuf, XNL_ERR_BUFLEN); - - if (!qdata) { - snprintf(ebuf, - XNL_ERR_BUFLEN, - "ERR! qidx %u invalid.\n", - qconf->qidx); - xnl_respond_buffer(info, ebuf, XNL_ERR_BUFLEN, 0); - } - - return qdata; -} - -static int xnl_chk_attr(enum xnl_attr_t xnl_attr, struct genl_info *info, - unsigned short qidx, char *buf, int buflen) -{ - int rv = 0; - - if (!info->attrs[xnl_attr]) { - if (buf) { - rv += snprintf(buf, buflen, - "Missing attribute %s for qidx = %u\n", - xnl_attr_str[xnl_attr], - qidx); - } - rv = -1; - } - - return rv; -} - -static void xnl_extract_extra_config_attr(struct genl_info *info, - struct qdma_queue_conf *qconf) -{ - u32 f = nla_get_u32(info->attrs[XNL_ATTR_QFLAG]); - - qconf->desc_bypass = (f & XNL_F_DESC_BYPASS_EN) ? 1 : 0; - qconf->pfetch_bypass = (f & XNL_F_PFETCH_BYPASS_EN) ? 1 : 0; - qconf->pfetch_en = (f & XNL_F_PFETCH_EN) ? 1 : 0; - qconf->wb_status_en = (f & XNL_F_CMPL_STATUS_EN) ? 1 : 0; - qconf->cmpl_status_acc_en = (f & XNL_F_CMPL_STATUS_ACC_EN) ? 1 : 0; - qconf->cmpl_status_pend_chk = (f & XNL_F_CMPL_STATUS_PEND_CHK) ? 1 : 0; - qconf->fetch_credit = (f & XNL_F_FETCH_CREDIT) ? 1 : 0; - qconf->cmpl_stat_en = (f & XNL_F_CMPL_STATUS_DESC_EN) ? 1 : 0; - qconf->cmpl_en_intr = (f & XNL_F_C2H_CMPL_INTR_EN) ? 1 : 0; - qconf->cmpl_udd_en = (f & XNL_F_CMPL_UDD_EN) ? 1 : 0; - qconf->cmpl_ovf_chk_dis = (f & XNL_F_CMPT_OVF_CHK_DIS) ? 1 : 0; - - if (qconf->q_type == Q_CMPT) - qconf->cmpl_udd_en = 1; - - if (xnl_chk_attr(XNL_ATTR_QRNGSZ_IDX, info, qconf->qidx, NULL, 0) == 0) - qconf->desc_rng_sz_idx = qconf->cmpl_rng_sz_idx = - nla_get_u32(info->attrs[XNL_ATTR_QRNGSZ_IDX]); - if (xnl_chk_attr(XNL_ATTR_C2H_BUFSZ_IDX, info, - qconf->qidx, NULL, 0) == 0) - qconf->c2h_buf_sz_idx = - nla_get_u32(info->attrs[XNL_ATTR_C2H_BUFSZ_IDX]); - if (xnl_chk_attr(XNL_ATTR_CMPT_TIMER_IDX, info, - qconf->qidx, NULL, 0) == 0) - qconf->cmpl_timer_idx = - nla_get_u32(info->attrs[XNL_ATTR_CMPT_TIMER_IDX]); - if (xnl_chk_attr(XNL_ATTR_CMPT_CNTR_IDX, info, - qconf->qidx, NULL, 0) == 0) - qconf->cmpl_cnt_th_idx = - nla_get_u32(info->attrs[XNL_ATTR_CMPT_CNTR_IDX]); - if (xnl_chk_attr(XNL_ATTR_MM_CHANNEL, info, qconf->qidx, NULL, 0) == 0) - qconf->mm_channel = - nla_get_u32(info->attrs[XNL_ATTR_MM_CHANNEL]); - if (xnl_chk_attr(XNL_ATTR_CMPT_DESC_SIZE, - info, qconf->qidx, NULL, 0) == 0) - qconf->cmpl_desc_sz = - nla_get_u32(info->attrs[XNL_ATTR_CMPT_DESC_SIZE]); - if (xnl_chk_attr(XNL_ATTR_SW_DESC_SIZE, - info, qconf->qidx, NULL, 0) == 0) - qconf->sw_desc_sz = - nla_get_u32(info->attrs[XNL_ATTR_SW_DESC_SIZE]); - if (xnl_chk_attr(XNL_ATTR_PING_PONG_EN, - info, qconf->qidx, NULL, 0) == 0) - qconf->ping_pong_en = 1; - if (xnl_chk_attr(XNL_ATTR_APERTURE_SZ, - info, qconf->qidx, NULL, 0) == 0) - qconf->aperture_size = - nla_get_u32(info->attrs[XNL_ATTR_APERTURE_SZ]); - if (xnl_chk_attr(XNL_ATTR_CMPT_TRIG_MODE, info, - qconf->qidx, NULL, 0) == 0) - qconf->cmpl_trig_mode = - nla_get_u32(info->attrs[XNL_ATTR_CMPT_TRIG_MODE]); - else - qconf->cmpl_trig_mode = 1; -} - -static int xnl_dev_list(struct sk_buff *skb2, struct genl_info *info) -{ - char *buf; - int rv; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - buf = xnl_mem_alloc(XNL_RESP_BUFLEN_MAX, info); - if (!buf) - return -ENOMEM; - - rv = xpdev_list_dump(buf, XNL_RESP_BUFLEN_MAX); - if (rv < 0) { - pr_err("xpdev_list_dump() failed: %d", rv); - goto free_msg_buff; - } - - rv = xnl_respond_buffer(info, buf, strlen(buf), rv); - -free_msg_buff: - kfree(buf); - return rv; -} - -static int xnl_dev_info(struct sk_buff *skb2, struct genl_info *info) -{ - struct sk_buff *skb; - void *hdr; - struct xlnx_pci_dev *xpdev; - struct pci_dev *pdev; - struct qdma_dev_conf conf; - int rv; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return -EINVAL; - pdev = xpdev->pdev; - - rv = qdma_device_get_config(xpdev->dev_hndl, &conf, NULL, 0); - if (rv < 0) - return rv; - - skb = xnl_msg_alloc(XNL_CMD_DEV_INFO, 0, &hdr, info); - if (!skb) - return -ENOMEM; - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_PCI_BUS, - pdev->bus->number); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_PCI_DEV, - PCI_SLOT(pdev->devfn)); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_PCI_FUNC, - PCI_FUNC(pdev->devfn)); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_CFG_BAR, - conf.bar_num_config); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_USR_BAR, - conf.bar_num_user); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_QSET_MAX, conf.qsets_max); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_QSET_QBASE, - conf.qsets_base); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_send(skb, hdr, info); - - return rv; - -free_skb: - nlmsg_free(skb); - return rv; -} - -static int xnl_dev_version_capabilities(struct sk_buff *skb2, - struct genl_info *info) -{ - struct sk_buff *skb; - void *hdr; - struct xlnx_pci_dev *xpdev; - struct qdma_version_info ver_info; - struct qdma_dev_attributes dev_attr; - char buf[XNL_RESP_BUFLEN_MIN]; - int buflen = XNL_RESP_BUFLEN_MIN; - int rv = 0; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return -EINVAL; - - skb = xnl_msg_alloc(XNL_CMD_DEV_CAP, 0, &hdr, info); - if (!skb) - return -ENOMEM; - - rv = qdma_device_version_info(xpdev->dev_hndl, &ver_info); - if (rv < 0) { - pr_err("qdma_device_version_info() failed: %d", rv); - goto free_skb; - } - - rv = qdma_device_capabilities_info(xpdev->dev_hndl, &dev_attr); - if (rv < 0) { - pr_err("qdma_device_capabilities_info() failed: %d", rv); - goto free_skb; - } - - rv = snprintf(buf + rv, buflen, - "=============Hardware Version============\n\n"); - rv += snprintf(buf + rv, buflen - rv, - "RTL Version : %s\n", ver_info.rtl_version_str); - rv += snprintf(buf + rv, - buflen - rv, - "Vivado ReleaseID : %s\n", - ver_info.vivado_release_str); - rv += snprintf(buf + rv, - buflen - rv, - "QDMA Device Type : %s\n", - ver_info.device_type_str); - - rv += snprintf(buf + rv, - buflen - rv, - "QDMA IP Type : %s\n", - ver_info.ip_str); - - rv += snprintf(buf + rv, - buflen - rv, - "============Software Version============\n\n"); - rv += snprintf(buf + rv, - buflen - rv, - "qdma driver version : %s\n\n", - DRV_MODULE_VERSION); - - rv = xnl_msg_add_attr_str(skb, XNL_ATTR_VERSION_INFO, buf); - if (rv != 0) { - pr_err("xnl_msg_add_attr_str() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_str(skb, XNL_ATTR_DEVICE_TYPE, - ver_info.device_type_str); - if (rv != 0) { - pr_err("xnl_msg_add_attr_str() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_str(skb, XNL_ATTR_IP_TYPE, ver_info.ip_str); - if (rv != 0) { - pr_err("xnl_msg_add_attr_str() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_MM_ENABLE, dev_attr.mm_en); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_ST_ENABLE, dev_attr.st_en); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_MM_CMPT_ENABLE, - dev_attr.mm_cmpt_en); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_NUMQS, - dev_attr.num_qs); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_NUM_PFS, dev_attr.num_pfs); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_MM_CHANNEL_MAX, - dev_attr.mm_channel_max); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_MAILBOX_ENABLE, - dev_attr.mailbox_en); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_FLR_PRESENT, - dev_attr.flr_present); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEBUG_EN, - dev_attr.debug_mode); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DESC_ENGINE_MODE, - dev_attr.desc_eng_mode); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - goto free_skb; - } - - rv = xnl_msg_add_attr_data(skb, XNL_ATTR_DEV, - (void *)&dev_attr, sizeof(struct qdma_dev_attributes)); - if (rv != 0) { - pr_err("xnl_msg_add_attr_data() failed: %d", rv); - return rv; - } - - rv = xnl_msg_send(skb, hdr, info); - return rv; - -free_skb: - nlmsg_free(skb); - return rv; -} - -static int xnl_dev_stat(struct sk_buff *skb2, struct genl_info *info) -{ - struct sk_buff *skb; - void *hdr; - struct xlnx_pci_dev *xpdev; - int rv; - unsigned long long mmh2c_pkts = 0; - unsigned long long mmc2h_pkts = 0; - unsigned long long sth2c_pkts = 0; - unsigned long long stc2h_pkts = 0; - unsigned long long min_ping_pong_lat = 0; - unsigned long long max_ping_pong_lat = 0; - unsigned long long total_ping_pong_lat = 0; - unsigned long long avg_ping_pong_lat = 0; - unsigned int pkts; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return -EINVAL; - - skb = xnl_msg_alloc(XNL_CMD_DEV_STAT, 0, &hdr, info); - if (!skb) - return -ENOMEM; - - qdma_device_get_mmh2c_pkts(xpdev->dev_hndl, &mmh2c_pkts); - qdma_device_get_mmc2h_pkts(xpdev->dev_hndl, &mmc2h_pkts); - qdma_device_get_sth2c_pkts(xpdev->dev_hndl, &sth2c_pkts); - qdma_device_get_stc2h_pkts(xpdev->dev_hndl, &stc2h_pkts); - qdma_device_get_ping_pong_min_lat(xpdev->dev_hndl, - &min_ping_pong_lat); - qdma_device_get_ping_pong_max_lat(xpdev->dev_hndl, - &max_ping_pong_lat); - qdma_device_get_ping_pong_tot_lat(xpdev->dev_hndl, - &total_ping_pong_lat); - - pkts = mmh2c_pkts; - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_STAT_MMH2C_PKTS1, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = (mmh2c_pkts >> 32); - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_STAT_MMH2C_PKTS2, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = mmc2h_pkts; - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_STAT_MMC2H_PKTS1, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = (mmc2h_pkts >> 32); - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_STAT_MMC2H_PKTS2, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = sth2c_pkts; - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_STAT_STH2C_PKTS1, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = (sth2c_pkts >> 32); - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_STAT_STH2C_PKTS2, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = stc2h_pkts; - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_STAT_STC2H_PKTS1, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = (stc2h_pkts >> 32); - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_DEV_STAT_STC2H_PKTS2, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = min_ping_pong_lat; - rv = xnl_msg_add_attr_uint(skb, - XNL_ATTR_DEV_STAT_PING_PONG_LATMIN1, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = (min_ping_pong_lat >> 32); - rv = xnl_msg_add_attr_uint(skb, - XNL_ATTR_DEV_STAT_PING_PONG_LATMIN2, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = min_ping_pong_lat; - rv = xnl_msg_add_attr_uint(skb, - XNL_ATTR_DEV_STAT_PING_PONG_LATMIN1, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = (min_ping_pong_lat >> 32); - rv = xnl_msg_add_attr_uint(skb, - XNL_ATTR_DEV_STAT_PING_PONG_LATMIN2, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = max_ping_pong_lat; - rv = xnl_msg_add_attr_uint(skb, - XNL_ATTR_DEV_STAT_PING_PONG_LATMAX1, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = (max_ping_pong_lat >> 32); - rv = xnl_msg_add_attr_uint(skb, - XNL_ATTR_DEV_STAT_PING_PONG_LATMAX2, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - - if (stc2h_pkts != 0) - avg_ping_pong_lat = total_ping_pong_lat / stc2h_pkts; - else - pr_err("No C2H packets to calculate avg\n"); - - pkts = avg_ping_pong_lat; - rv = xnl_msg_add_attr_uint(skb, - XNL_ATTR_DEV_STAT_PING_PONG_LATAVG1, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - pkts = (avg_ping_pong_lat >> 32); - rv = xnl_msg_add_attr_uint(skb, - XNL_ATTR_DEV_STAT_PING_PONG_LATAVG2, pkts); - if (rv < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - rv = xnl_msg_send(skb, hdr, info); - - return rv; -} - -static int xnl_dev_stat_clear(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - int rv; - char *buf; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return -EINVAL; - buf = xnl_mem_alloc(XNL_RESP_BUFLEN_MIN, info); - if (!buf) - return -ENOMEM; - - qdma_device_clear_stats(xpdev->dev_hndl); - - buf[0] = '\0'; - - rv = xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MAX, 0); - - kfree(buf); - return rv; -} - - - -static int xnl_get_queue_state(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - char buf[XNL_RESP_BUFLEN_MIN]; - struct xlnx_qdata *qdata; - int rv = 0; - unsigned char is_qp; - unsigned int q_flags; - struct sk_buff *skb; - void *hdr; - struct qdma_q_state qstate; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - skb = xnl_msg_alloc(XNL_CMD_DEV_STAT, 0, &hdr, info); - if (!skb) - return -ENOMEM; - - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) { - nlmsg_free(skb); - return -EINVAL; - } - - rv = qconf_get(&qconf, info, buf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) { - nlmsg_free(skb); - return -EINVAL; - } - if (is_qp) - return -EINVAL; - - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf, - XNL_RESP_BUFLEN_MIN); - if (!qdata) { - nlmsg_free(skb); - return -EINVAL; - } - - rv = qdma_get_queue_state(xpdev->dev_hndl, qdata->qhndl, &qstate, - buf, XNL_RESP_BUFLEN_MIN); - if (rv < 0) { - xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MAX, rv); - nlmsg_free(skb); - pr_err("qdma_get_queue_state() failed: %d", rv); - return rv; - } - - q_flags = 0; - - if (qstate.st) - q_flags |= XNL_F_QMODE_ST; - else - q_flags |= XNL_F_QMODE_MM; - - - if (qstate.q_type == Q_C2H) - q_flags |= XNL_F_QDIR_C2H; - else if (qstate.q_type == Q_H2C) - q_flags |= XNL_F_QDIR_H2C; - else - q_flags |= XNL_F_Q_CMPL; - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_QFLAG, q_flags); - if (rv < 0) { - nlmsg_free(skb); - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_QIDX, qstate.qidx); - if (rv < 0) { - nlmsg_free(skb); - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - - rv = xnl_msg_add_attr_uint(skb, XNL_ATTR_Q_STATE, qstate.qstate); - if (rv < 0) { - nlmsg_free(skb); - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return rv; - } - - - rv = xnl_msg_send(skb, hdr, info); - - return rv; - -} - -static int xnl_q_list(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - char *buf; - int rv = 0; - char ebuf[XNL_RESP_BUFLEN_MIN]; - struct qdma_queue_conf qconf; - unsigned char is_qp; - uint32_t qmax = 0; - uint32_t buflen = 0, max_buflen = 0; - struct qdma_queue_count q_count; - unsigned int qidx, num_q; - struct xlnx_qdata *qdata; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return -EINVAL; - - buf = xnl_mem_alloc(XNL_RESP_BUFLEN_MIN, info); - if (!buf) - return -ENOMEM; - buflen = XNL_RESP_BUFLEN_MIN; - rv = qconf_get(&qconf, info, ebuf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - return rv; - - qidx = qconf.qidx; - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - rv = qdma_get_queue_count(xpdev->dev_hndl, &q_count, buf, buflen); - if (rv < 0) { - rv += snprintf(buf, XNL_RESP_BUFLEN_MIN, - "Failed to get queue count\n"); - goto send_rsp; - } - - qmax = q_count.h2c_qcnt + q_count.c2h_qcnt; - if (!qmax) { - rv += snprintf(buf, 8, "Zero Qs\n\n"); - goto send_rsp; - } - - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf, buflen); - if (!qdata) - goto send_rsp; - - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - if (num_q > QDMA_Q_DUMP_MAX_QUEUES) { - pr_err("Can not dump more than %d queues\n", - QDMA_Q_DUMP_MAX_QUEUES); - rv += snprintf(buf, 40, "Can not dump more than %d queues\n", - QDMA_Q_DUMP_MAX_QUEUES); - goto send_rsp; - } - - kfree(buf); - max_buflen = (num_q * 2 * QDMA_Q_LIST_LINE_SZ); - buf = xnl_mem_alloc(max_buflen, info); - if (!buf) - return -ENOMEM; - - buflen = max_buflen; - rv = qdma_queue_list(xpdev->dev_hndl, qidx, num_q, buf, buflen); - if (rv < 0) { - pr_err("qdma_queue_list() failed: %d", rv); - goto send_rsp; - } - -send_rsp: - rv = xnl_respond_buffer(info, buf, max_buflen, rv); - kfree(buf); - return rv; -} - -static int xnl_q_add(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev = NULL; - struct qdma_queue_conf qconf; - char *buf, *cur, *end; - int rv = 0; - int rv2 = 0; - unsigned char is_qp; - unsigned int num_q; - unsigned int i; - unsigned short qidx; - unsigned char dir; - int buf_len = XNL_RESP_BUFLEN_MAX; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return -EINVAL; - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - - buf = xnl_mem_alloc(buf_len, info); - if (!buf) - return -ENOMEM; - cur = buf; - end = buf + buf_len; - - if (unlikely(!qdma_get_qmax(xpdev->dev_hndl))) { - pr_info("0 sized Qs\n"); - rv += snprintf(cur, end - cur, "Zero Qs\n"); - goto send_resp; - } - rv = qconf_get(&qconf, info, cur, end - cur, &is_qp); - if (rv < 0) - goto free_buf; - - qidx = qconf.qidx; - - rv = xnl_chk_attr(XNL_ATTR_NUM_Q, info, qidx, cur, end - cur); - if (rv < 0) - goto send_resp; - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - if (qconf.q_type > Q_CMPT) { - pr_err("Invalid q type received"); - rv += snprintf(cur, end - cur, "Invalid q type received"); - goto send_resp; - } - - dir = qconf.q_type; - for (i = 0; i < num_q; i++) { - if (qconf.q_type != Q_CMPT) - qconf.q_type = dir; -add_q: - if (qidx != QDMA_QUEUE_IDX_INVALID) - qconf.qidx = qidx + i; - rv = xpdev_queue_add(xpdev, &qconf, cur, end - cur); - if (rv < 0) { - pr_err("xpdev_queue_add() failed: %d\n", rv); - goto send_resp; - } - cur = buf + strlen(buf); - if (qconf.q_type != Q_CMPT) { - if (is_qp && (dir == qconf.q_type)) { - qconf.q_type = (~qconf.q_type) & 0x1; - goto add_q; - } - } - } -/* Suppress Q additions prints if num_q's greater than 2048. - * And print only consolidated Q's added, to overcome attr failure. - * TODO: This is a workaround. Need to comeup with proper fix. - */ - if (num_q > 2048) { - memset(buf, 0, strlen(buf) + 1); - snprintf(buf, 25, "Added %u Queues.\n", i); - } else { - cur += snprintf(cur, end - cur, "Added %u Queues.\n", i); - } - -send_resp: - rv2 = xnl_respond_buffer(info, buf, strlen(buf), rv); -free_buf: - kfree(buf); - return rv < 0 ? rv : rv2; -} - -static int xnl_q_buf_idx_get(struct xlnx_pci_dev *xpdev) -{ - struct global_csr_conf csr; - int i, rv; - - memset(&csr, 0, sizeof(struct global_csr_conf)); - rv = qdma_global_csr_get(xpdev->dev_hndl, 0, - QDMA_GLOBAL_CSR_ARRAY_SZ, - &csr); - if (rv < 0) - return 0; - - for (i = 0; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) { - if (csr.c2h_buf_sz[i] == QDMA_C2H_DEFAULT_BUF_SZ) - return i; - } - - return 0; -} - -static int xnl_q_start(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - struct qdma_queue_conf qconf_old; - char buf[XNL_RESP_BUFLEN_MIN]; - struct xlnx_qdata *qdata; - int rv = 0; - unsigned char is_qp; - unsigned short num_q; - unsigned int i; - unsigned short qidx; - unsigned char dir; - unsigned char is_bufsz_idx = 1; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - if (unlikely(!qdma_get_qmax(xpdev->dev_hndl))) { - rv += snprintf(buf, 8, "Zero Qs\n"); - goto send_resp; - } - rv = qconf_get(&qconf, info, buf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - goto send_resp; - - qidx = qconf.qidx; - - rv = xnl_chk_attr(XNL_ATTR_NUM_Q, info, qidx, buf, XNL_RESP_BUFLEN_MIN); - if (rv < 0) - goto send_resp; - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - xnl_extract_extra_config_attr(info, &qconf); - - if (qconf.st && (qconf.q_type == Q_CMPT)) { - rv += snprintf(buf, 40, "MM CMPL is valid only for MM Mode"); - goto send_resp; - } - - if (qconf.q_type > Q_CMPT) { - pr_err("Invalid q type received"); - rv += snprintf(buf, 40, "Invalid q type received"); - goto send_resp; - } - - if (!info->attrs[XNL_ATTR_C2H_BUFSZ_IDX]) - is_bufsz_idx = 0; - - if (!info->attrs[XNL_ATTR_MM_CHANNEL]) - qconf.mm_channel = 0; - - dir = qconf.q_type; - for (i = qidx; i < (qidx + num_q); i++) { - if (qconf.q_type != Q_CMPT) - qconf.q_type = dir; -reconfig: - qconf.qidx = i; - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf, - XNL_RESP_BUFLEN_MIN); - if (!qdata) - goto send_resp; - rv = qdma_queue_get_config(xpdev->dev_hndl, qdata->qhndl, - &qconf_old, buf, XNL_RESP_BUFLEN_MIN); - if (rv < 0) - goto send_resp; - - if (qconf.q_type != Q_CMPT) { - if (qconf_old.st && qconf_old.q_type && !is_bufsz_idx) - qconf.c2h_buf_sz_idx = xnl_q_buf_idx_get(xpdev); - } - rv = qdma_queue_config(xpdev->dev_hndl, qdata->qhndl, - &qconf, buf, XNL_RESP_BUFLEN_MIN); - if (rv < 0) { - pr_err("qdma_queue_config failed: %d", rv); - goto send_resp; - } - if (qconf.q_type != Q_CMPT) { - if (is_qp && (dir == qconf.q_type)) { - qconf.q_type = (~qconf.q_type) & 0x1; - goto reconfig; - } - } - } - - rv = xpdev_nl_queue_start(xpdev, info, is_qp, qconf.q_type, - qidx, num_q); - if (rv < 0) { - snprintf(buf, XNL_RESP_BUFLEN_MIN, "qdma%05x OOM.\n", - xpdev->idx); - goto send_resp; - } - - return 0; - -send_resp: - rv = xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MIN, rv); - - return rv; -} - -static int xnl_q_stop(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - char buf[XNL_RESP_BUFLEN_MIN]; - struct xlnx_qdata *qdata; - int rv = 0, rv2 = 0; - unsigned char is_qp; - unsigned short num_q; - unsigned int i; - unsigned short qidx; - unsigned char dir; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - if (unlikely(!qdma_get_qmax(xpdev->dev_hndl))) { - rv += snprintf(buf, 8, "Zero Qs\n"); - goto send_resp; - } - rv = qconf_get(&qconf, info, buf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - goto send_resp; - - if (!info->attrs[XNL_ATTR_NUM_Q]) { - pr_warn("Missing attribute 'XNL_ATTR_NUM_Q'"); - return -1; - } - - if (qconf.q_type > Q_CMPT) { - pr_err("Invalid q type received"); - rv += snprintf(buf, 40, "Invalid q type received"); - goto send_resp; - } - - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - qidx = qconf.qidx; - dir = qconf.q_type; - for (i = qidx; i < (qidx + num_q); i++) { - if (qconf.q_type != Q_CMPT) - qconf.q_type = dir; -stop_q: - qconf.qidx = i; - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf, - XNL_RESP_BUFLEN_MIN); - if (!qdata) - goto send_resp; - rv = qdma_queue_stop(xpdev->dev_hndl, qdata->qhndl, - buf, XNL_RESP_BUFLEN_MIN); - if (rv < 0) { - pr_err("qdma_queue_stop() failed: %d", rv); - goto send_resp; - } - if (qconf.q_type != Q_CMPT) { - if (is_qp && (dir == qconf.q_type)) { - qconf.q_type = (~qconf.q_type) & 0x1; - goto stop_q; - } - } - } - rv2 = snprintf(buf + rv, XNL_RESP_BUFLEN_MIN - rv, - "Stopped Queues %u -> %u.\n", qidx, i - 1); -send_resp: - rv = xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MIN, rv); - return rv; -} - -static int xnl_q_del(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - char buf[XNL_RESP_BUFLEN_MIN]; - int rv = 0, rv2 = 0; - unsigned char is_qp; - unsigned short num_q; - unsigned int i; - unsigned short qidx; - unsigned char dir; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - if (unlikely(!qdma_get_qmax(xpdev->dev_hndl))) { - rv += snprintf(buf, 8, "Zero Qs\n"); - goto send_resp; - } - rv = qconf_get(&qconf, info, buf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - goto send_resp; - - if (qconf.q_type > Q_CMPT) { - pr_err("Invalid q type received"); - rv += snprintf(buf, 40, "Invalid q type received"); - goto send_resp; - } - - if (!info->attrs[XNL_ATTR_NUM_Q]) { - pr_warn("Missing attribute 'XNL_ATTR_NUM_Q'"); - return -1; - } - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - qidx = qconf.qidx; - - dir = qconf.q_type; - for (i = qidx; i < (qidx + num_q); i++) { - if (qconf.q_type != Q_CMPT) - qconf.q_type = dir; -del_q: - qconf.qidx = i; - rv = xpdev_queue_delete(xpdev, qconf.qidx, qconf.q_type, - buf, XNL_RESP_BUFLEN_MIN); - if (rv < 0) { - pr_err("xpdev_queue_delete() failed: %d", rv); - goto send_resp; - } - if (qconf.q_type != Q_CMPT) { - if (is_qp && (dir == qconf.q_type)) { - qconf.q_type = (~qconf.q_type) & 0x1; - goto del_q; - } - } - } - rv2 = snprintf(buf + rv, XNL_RESP_BUFLEN_MIN - rv, - "Deleted Queues %u -> %u.\n", qidx, i - 1); -send_resp: - rv = xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MIN, rv); - return rv; -} - -static int xnl_config_reg_dump(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - char *buf; - int buf_len = XNL_RESP_BUFLEN_MAX; - int rv = 0; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - buf = xnl_mem_alloc(buf_len, info); - if (!buf) - return -ENOMEM; - - qdma_config_reg_dump(xpdev->dev_hndl, buf, buf_len); - - rv = xnl_respond_buffer(info, buf, buf_len, rv); - - kfree(buf); - return rv; -} - -static int xnl_config_reg_info_dump - (struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - char *buf; - int buf_len = XNL_RESP_BUFLEN_MAX; - int rv = 0; - uint32_t reg_addr = 0; - uint32_t num_regs = 0; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - - if (info->attrs[XNL_ATTR_REG_ADDR]) - reg_addr = nla_get_u32(info->attrs[XNL_ATTR_REG_ADDR]); - - if (info->attrs[XNL_ATTR_NUM_REGS]) - num_regs = nla_get_u32(info->attrs[XNL_ATTR_NUM_REGS]); - - buf = xnl_mem_alloc(buf_len, info); - if (!buf) - return -ENOMEM; - - qdma_config_reg_info_dump(xpdev->dev_hndl, - reg_addr, num_regs, buf, buf_len); - - rv = xnl_respond_buffer(info, buf, buf_len, rv); - - kfree(buf); - return rv; -} - - -static int xnl_q_dump(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - struct xlnx_qdata *qdata; - char *buf; - char ebuf[XNL_RESP_BUFLEN_MIN]; - int rv; - unsigned char is_qp; - unsigned int num_q; - unsigned int i; - unsigned short qidx; - unsigned char dir; - int buf_len = XNL_RESP_BUFLEN_MAX; - unsigned int buf_idx = 0; - char banner[DUMP_LINE_SZ]; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - rv = qconf_get(&qconf, info, ebuf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - return rv; - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - - buf = xnl_mem_alloc(buf_len, info); - if (!buf) - return -ENOMEM; - - if (qconf.q_type > Q_CMPT) { - pr_err("Invalid q type received"); - rv += snprintf(buf, 40, "Invalid q type received"); - goto send_resp; - } - - if (!info->attrs[XNL_ATTR_NUM_Q]) { - pr_warn("Missing attribute 'XNL_ATTR_NUM_Q'"); - kfree(buf); - return -1; - } - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - if (num_q > QDMA_Q_DUMP_MAX_QUEUES) { - pr_err("Can not dump more than %d queues\n", - QDMA_Q_DUMP_MAX_QUEUES); - rv += snprintf(buf, 40, "Can not dump more than %d queues\n", - QDMA_Q_DUMP_MAX_QUEUES); - goto send_resp; - } - kfree(buf); - buf_len = (num_q * QDMA_Q_DUMP_LINE_SZ); - buf = xnl_mem_alloc(buf_len, info); - if (!buf) - return -ENOMEM; - - qidx = qconf.qidx; - dir = qconf.q_type; - - for (i = 0; i < DUMP_LINE_SZ - 5; i++) - snprintf(banner + i, DUMP_LINE_SZ - 5, "*"); - - for (i = qidx; i < (qidx + num_q); i++) { - if (qconf.q_type != Q_CMPT) - qconf.q_type = dir; - -dump_q: - qconf.qidx = i; - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf + buf_idx, - buf_len - buf_idx); - if (!qdata) - goto send_resp; - - buf_idx += snprintf(buf + buf_idx, - DUMP_LINE_SZ, "\n%s", banner); - - buf_idx += snprintf(buf + buf_idx, buf_len - buf_idx, -#ifndef __QDMA_VF__ - "\n%40s qdma%05x %s QID# %u\n", -#else - "\n%40s qdmavf%05x %s QID# %u\n", -#endif - "Context Dump for", - xpdev->idx, - q_type_list[qconf.q_type].name, - qconf.qidx); - - buf_idx += snprintf(buf + buf_idx, - buf_len - buf_idx, "\n%s\n", banner); - - rv = qdma_queue_dump(xpdev->dev_hndl, qdata->qhndl, - buf + buf_idx, - buf_len - buf_idx); - buf_idx = strlen(buf); - if (rv < 0) { - pr_err("qdma_queue_dump() failed: %d", rv); - goto send_resp; - } - if (qconf.q_type != Q_CMPT) { - if (is_qp && (dir == qconf.q_type)) { - qconf.q_type = (~qconf.q_type) & 0x1; - goto dump_q; - } - } - } - rv = snprintf(buf + buf_idx, buf_len - buf_idx, - "Dumped Queues %u -> %u.\n", qidx, i - 1); - buf_idx += rv; -send_resp: - rv = xnl_respond_buffer(info, buf, buf_len, rv); - kfree(buf); - return rv; -} - -static int xnl_q_dump_desc(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - struct xlnx_qdata *qdata; - u32 v1; - u32 v2; - char *buf; - char ebuf[XNL_RESP_BUFLEN_MIN]; - int rv; - unsigned char is_qp; - unsigned int num_q; - unsigned int i; - unsigned short qidx; - unsigned char dir; - int buf_len = XNL_RESP_BUFLEN_MAX; - unsigned int buf_idx = 0; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - v1 = nla_get_u32(info->attrs[XNL_ATTR_RANGE_START]); - v2 = nla_get_u32(info->attrs[XNL_ATTR_RANGE_END]); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - if (unlikely(!qdma_get_qmax(xpdev->dev_hndl))) - return 0; - rv = qconf_get(&qconf, info, ebuf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - return rv; - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - - buf = xnl_mem_alloc(buf_len, info); - if (!buf) { - rv = snprintf(ebuf, XNL_RESP_BUFLEN_MIN, - "%s OOM %d.\n", - __func__, buf_len); - xnl_respond_buffer(info, ebuf, XNL_RESP_BUFLEN_MIN, rv); - return -ENOMEM; - } - - if (!info->attrs[XNL_ATTR_NUM_Q]) { - pr_warn("Missing attribute 'XNL_ATTR_NUM_Q'"); - return -1; - } - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - - if (qconf.q_type > Q_CMPT) { - pr_err("Invalid q type received"); - rv += snprintf(buf, 40, "Invalid q type received"); - goto send_resp; - } - - qidx = qconf.qidx; - dir = qconf.q_type; - for (i = qidx; i < (qidx + num_q); i++) { - qconf.q_type = dir; -dump_q: - qconf.qidx = i; - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf + buf_idx, - buf_len - buf_idx); - if (!qdata) - goto send_resp; - rv = qdma_queue_dump_desc(xpdev->dev_hndl, - qdata->qhndl, v1, v2, - buf + buf_idx, buf_len - buf_idx); - buf_idx = strlen(buf); - - if (rv < 0) { - pr_err("qdma_queue_dump_desc() failed: %d", rv); - goto send_resp; - } - if (is_qp && (dir == qconf.q_type)) { - qconf.q_type = (~qconf.q_type) & 0x1; - goto dump_q; - } - } - - rv = snprintf(buf + buf_idx, buf_len - buf_idx, - "Dumped descs of queues %u -> %u.\n", - qidx, i - 1); -send_resp: - rv = xnl_respond_buffer(info, buf, buf_len, rv); - - kfree(buf); - return rv; -} - -static int xnl_q_dump_cmpt(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - struct xlnx_qdata *qdata; - u32 v1; - u32 v2; - char *buf; - char ebuf[XNL_RESP_BUFLEN_MIN]; - int rv; - unsigned char is_qp; - unsigned int num_q; - unsigned int i; - unsigned short qidx; - unsigned char dir; - int buf_len = XNL_RESP_BUFLEN_MAX; - unsigned int buf_idx = 0; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - v1 = nla_get_u32(info->attrs[XNL_ATTR_RANGE_START]); - v2 = nla_get_u32(info->attrs[XNL_ATTR_RANGE_END]); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - if (unlikely(!qdma_get_qmax(xpdev->dev_hndl))) - return 0; - - rv = qconf_get(&qconf, info, ebuf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - return rv; - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - - buf = xnl_mem_alloc(buf_len, info); - if (!buf) { - rv = snprintf(ebuf, XNL_RESP_BUFLEN_MIN, - "%s OOM %d.\n", - __func__, buf_len); - xnl_respond_buffer(info, ebuf, XNL_RESP_BUFLEN_MIN, rv); - return -ENOMEM; - } - - if (!info->attrs[XNL_ATTR_NUM_Q]) { - pr_warn("Missing attribute 'XNL_ATTR_NUM_Q'"); - return -1; - } - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - - if (qconf.q_type > Q_CMPT) { - pr_err("Invalid q type received"); - rv += snprintf(buf, 40, "Invalid q type received"); - goto send_resp; - } - - qidx = qconf.qidx; - - dir = qconf.q_type; - for (i = qidx; i < (qidx + num_q); i++) { - if (qconf.q_type != Q_CMPT) - qconf.q_type = dir; -dump_q: - qconf.qidx = i; - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf + buf_idx, - buf_len - buf_idx); - if (!qdata) - goto send_resp; - rv = qdma_queue_dump_cmpt(xpdev->dev_hndl, - qdata->qhndl, v1, v2, - buf + buf_idx, buf_len - buf_idx); - buf_idx = strlen(buf); - if (rv < 0) { - pr_err("qdma_queue_dump_cmpt() failed: %d", rv); - goto send_resp; - } - if (qconf.q_type != Q_CMPT) { - if (is_qp && (dir == qconf.q_type)) { - qconf.q_type = (~qconf.q_type) & 0x1; - goto dump_q; - } - } - } - rv = snprintf(buf + buf_idx, buf_len - buf_idx, - "Dumped descs of queues %u -> %u.\n", - qidx, i - 1); - buf_idx += rv; -send_resp: - rv = xnl_respond_buffer(info, buf, buf_len, rv); - - kfree(buf); - return rv; -} - -static int xnl_q_read_udd(struct sk_buff *skb2, struct genl_info *info) -{ - int rv = 0; - struct qdma_queue_conf qconf; - char *buf; - unsigned char is_qp; - struct xlnx_pci_dev *xpdev; - struct xlnx_qdata *qdata; - int buf_len = XNL_RESP_BUFLEN_MAX; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - buf = xnl_mem_alloc(XNL_RESP_BUFLEN_MAX, info); - if (!buf) - return -ENOMEM; - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) { - kfree(buf); - return -EINVAL; - } - - rv = qconf_get(&qconf, info, buf, XNL_RESP_BUFLEN_MAX, &is_qp); - if (rv < 0) - goto send_resp; - - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf, - XNL_RESP_BUFLEN_MAX); - if (!qdata) - goto send_resp; - - rv = qdma_descq_get_cmpt_udd(xpdev->dev_hndl, qdata->qhndl, buf, - XNL_RESP_BUFLEN_MAX); - if (rv < 0) - goto send_resp; - -send_resp: - rv = xnl_respond_buffer(info, buf, buf_len, rv); - - kfree(buf); - return rv; -} - -static int xnl_q_cmpt_read(struct sk_buff *skb2, struct genl_info *info) -{ - int rv = 0, err = 0; - struct qdma_queue_conf qconf; - char *buf = NULL; - unsigned char is_qp = 0; - struct xlnx_pci_dev *xpdev = NULL; - struct xlnx_qdata *qdata = NULL; - int buf_len = XNL_RESP_BUFLEN_MAX; - u32 num_entries = 0; - u8 *cmpt_entries = NULL, *cmpt_entry_list = NULL; - u32 cmpt_entry_len = 0; - u32 count = 0, diff_len = 0; - struct qdma_queue_conf qconf_attr; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return -EINVAL; - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - - buf = xnl_mem_alloc(buf_len, info); - if (!buf) - return -ENOMEM; - - rv = qconf_get(&qconf, info, buf, buf_len, &is_qp); - if (rv < 0) - goto send_resp; - - qconf.q_type = Q_CMPT; - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf, buf_len); - if (!qdata) - goto send_resp; - - rv = qdma_queue_get_config(xpdev->dev_hndl, qdata->qhndl, - &qconf_attr, buf, buf_len); - if (rv < 0) - goto send_resp; - - rv = qdma_descq_read_cmpt_data(xpdev->dev_hndl, - qdata->qhndl, - &num_entries, - &cmpt_entries, - buf, - buf_len); - if (rv < 0) - goto free_cmpt; - - if (num_entries != 0) { - memset(buf, '\0', buf_len); - cmpt_entry_list = cmpt_entries; - cmpt_entry_len = 8 << qconf_attr.cmpl_desc_sz; - for (count = 0; count < num_entries; count++) { - hex_dump_to_buffer(cmpt_entry_list, cmpt_entry_len, - 32, 4, buf + diff_len, - buf_len - diff_len, 0); - diff_len = strlen(buf); - if (cmpt_entry_len > 32) { - diff_len += snprintf(buf + diff_len, - buf_len - diff_len, - " "); - hex_dump_to_buffer(cmpt_entry_list + 32, - cmpt_entry_len, - 32, 4, buf + diff_len, - buf_len - diff_len, 0); - diff_len = strlen(buf); - } - buf[diff_len++] = '\n'; - cmpt_entry_list += cmpt_entry_len; - } - } - -free_cmpt: - kfree(cmpt_entries); -send_resp: - err = rv; - rv = xnl_respond_buffer_cmpt(info, buf, buf_len, - err, num_entries); - kfree(buf); - return rv; -} - - -#ifdef ERR_DEBUG -static int xnl_err_induce(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - struct xlnx_qdata *qdata; - char *buf; - char ebuf[XNL_RESP_BUFLEN_MIN]; - unsigned char is_qp; - int rv; - u32 err; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - rv = qconf_get(&qconf, info, ebuf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - return rv; - - buf = xnl_mem_alloc(XNL_RESP_BUFLEN_MAX, info); - if (!buf) { - rv = snprintf(ebuf, XNL_RESP_BUFLEN_MIN, "%s OOM %d.\n", - __func__, XNL_RESP_BUFLEN_MAX); - xnl_respond_buffer(info, ebuf, XNL_RESP_BUFLEN_MIN, rv); - return -ENOMEM; - } - - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf, - XNL_RESP_BUFLEN_MIN); - if (!qdata) - goto send_resp; - err = nla_get_u32(info->attrs[XNL_ATTR_QPARAM_ERR_INFO]); - - if (qdma_queue_set_err_induction(xpdev->dev_hndl, qdata->qhndl, err, - buf, XNL_RESP_BUFLEN_MAX)) { - rv += snprintf(buf + rv, XNL_RESP_BUFLEN_MAX, - "Failed to set induce err\n"); - goto send_resp; - } - rv += snprintf(buf + rv, XNL_RESP_BUFLEN_MAX, - "queue error induced\n"); - -send_resp: - rv = xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MAX, rv); - - kfree(buf); - return rv; -} -#endif - -static int xnl_q_read_pkt(struct sk_buff *skb2, struct genl_info *info) -{ -#if 0 - struct xlnx_pci_dev *xpdev; - struct qdma_queue_conf qconf; - struct xlnx_qdata *qdata; - char *buf; - char ebuf[XNL_RESP_BUFLEN_MIN]; - int rv; - unsigned char is_qp; - unsigned int num_q; - unsigned int i; - unsigned short qidx; - int buf_len = XNL_RESP_BUFLEN_MAX; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - rv = qconf_get(&qconf, info, ebuf, XNL_RESP_BUFLEN_MIN, &is_qp); - if (rv < 0) - return rv; - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - - buf = xnl_mem_alloc(buf_len, info); - if (!buf) { - rv = snprintf(ebuf, XNL_RESP_BUFLEN_MIN, - "%s OOM %d.\n", - __func__, buf_len); - xnl_respond_buffer(info, ebuf, XNL_RESP_BUFLEN_MIN, rv); - return -ENOMEM; - } - - if (!info->attrs[XNL_ATTR_NUM_Q]) { - pr_warn("Missing attribute 'XNL_ATTR_NUM_Q'"); - return -1; - } - num_q = nla_get_u32(info->attrs[XNL_ATTR_NUM_Q]); - - qidx = qconf.qidx; - for (i = qidx; i < (qidx + num_q); i++) { - qconf.q_type = 1; - qconf.qidx = i; - qdata = xnl_rcv_check_qidx(info, xpdev, &qconf, buf, - buf_len); - if (!qdata) - goto send_resp; - rv = qdma_queue_dump_rx_packet(xpdev->dev_hndl, qdata->qhndl, - buf, buf_len); - if (rv < 0) { - pr_err("qdma_queue_dump_rx_packet) failed: %d", rv); - goto send_resp; - } - } -send_resp: - rv = xnl_respond_buffer(info, buf, buf_len, rv); - - kfree(buf); - return rv; -#endif - pr_info("NOT supported.\n"); - return -EINVAL; -} - -static int xnl_intr_ring_dump(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - char *buf; - unsigned int vector_idx = 0; - int start_idx = 0, end_idx = 0; - int rv = 0; - int buf_len = XNL_RESP_BUFLEN_MAX; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - if (!info->attrs[XNL_ATTR_INTR_VECTOR_IDX]) { - pr_warn("Missing attribute 'XNL_ATTR_INTR_VECTOR_IDX'"); - return -1; - } - vector_idx = nla_get_u32(info->attrs[XNL_ATTR_INTR_VECTOR_IDX]); - start_idx = nla_get_u32(info->attrs[XNL_ATTR_INTR_VECTOR_START_IDX]); - end_idx = nla_get_u32(info->attrs[XNL_ATTR_INTR_VECTOR_END_IDX]); - - if (info->attrs[XNL_ATTR_RSP_BUF_LEN]) - buf_len = nla_get_u32(info->attrs[XNL_ATTR_RSP_BUF_LEN]); - - buf = xnl_mem_alloc(buf_len, info); - if (!buf) - return -ENOMEM; - - if (xpdev->idx == 0) { - if (vector_idx == 0) { - rv += snprintf(buf + rv, buf_len, - "vector_idx %u is for error interrupt\n", - vector_idx); - goto send_resp; - } else if (vector_idx == 1) { - rv += snprintf(buf + rv, buf_len, - "vector_idx %u is for user interrupt\n", - vector_idx); - goto send_resp; - } - } else { - if (vector_idx == 0) { - rv += snprintf(buf + rv, buf_len, - "vector_idx %u is for user interrupt\n", - vector_idx); - goto send_resp; - } - } - - rv = qdma_intr_ring_dump(xpdev->dev_hndl, - vector_idx, start_idx, - end_idx, buf, buf_len); - if (rv < 0) { - pr_err("qdma_intr_ring_dump() failed: %d", rv); - goto send_resp; - } - -send_resp: - rv = xnl_respond_buffer(info, buf, buf_len, rv); - - kfree(buf); - return rv; -} - -static int xnl_register_read(struct sk_buff *skb2, struct genl_info *info) -{ - struct sk_buff *skb; - void *hdr; - struct xlnx_pci_dev *xpdev; - struct qdma_dev_conf conf; - char buf[XNL_RESP_BUFLEN_MIN]; - unsigned int bar_num = 0, reg_addr = 0; - uint32_t reg_val = 0; - int rv = 0, err = 0; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - rv = qdma_device_get_config(xpdev->dev_hndl, &conf, NULL, 0); - if (rv < 0) - return rv; - - skb = xnl_msg_alloc(XNL_CMD_REG_RD, 0, &hdr, info); - if (!skb) - return -ENOMEM; - - if (!info->attrs[XNL_ATTR_REG_BAR_NUM]) { - pr_warn("Missing attribute 'XNL_ATTR_REG_BAR_NUM'"); - return -EINVAL; - } - - if (!info->attrs[XNL_ATTR_REG_ADDR]) { - pr_warn("Missing attribute 'XNL_ATTR_REG_ADDR'"); - return -EINVAL; - } - - bar_num = nla_get_u32(info->attrs[XNL_ATTR_REG_BAR_NUM]); - reg_addr = nla_get_u32(info->attrs[XNL_ATTR_REG_ADDR]); - - if (bar_num == conf.bar_num_config) { - rv = qdma_device_read_config_register(xpdev->dev_hndl, - reg_addr, ®_val); - if (rv < 0) { - pr_err("Config bar register read failed with error = %d\n", - rv); - return rv; - } - } else if (bar_num == conf.bar_num_user) { - rv = qdma_device_read_user_register(xpdev, reg_addr, ®_val); - if (rv < 0) { - pr_err("AXI Master Lite bar register read failed with error = %d\n", - rv); - return rv; - } - } else if (bar_num == conf.bar_num_bypass) { - rv = qdma_device_read_bypass_register(xpdev, - reg_addr, ®_val); - if (rv < 0) { - pr_err("AXI Bridge Master bar register read failed with error = %d\n", - rv); - return rv; - } - } else { - rv += snprintf(buf + rv, XNL_RESP_BUFLEN_MIN, - "Invalid bar number\n"); - goto send_resp; - } - - err = xnl_msg_add_attr_uint(skb, XNL_ATTR_REG_VAL, reg_val); - if (err < 0) { - pr_err("xnl_msg_add_attr_uint() failed: %d", rv); - return err; - } - - err = xnl_msg_send(skb, hdr, info); - return err; - -send_resp: - rv = xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MIN, err); - nlmsg_free(skb); - return rv; -} - -static int xnl_register_write(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - struct qdma_dev_conf conf; - char buf[XNL_RESP_BUFLEN_MIN]; - unsigned int bar_num = 0, reg_addr = 0; - uint32_t reg_val = 0; - int rv = 0; - - if (info == NULL) - return 0; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - rv = qdma_device_get_config(xpdev->dev_hndl, &conf, NULL, 0); - if (rv < 0) - return rv; - - if (!info->attrs[XNL_ATTR_REG_BAR_NUM]) { - pr_warn("Missing attribute 'XNL_ATTR_REG_BAR_NUM'"); - return -EINVAL; - } - - if (!info->attrs[XNL_ATTR_REG_ADDR]) { - pr_warn("Missing attribute 'XNL_ATTR_REG_ADDR'"); - return -EINVAL; - } - - if (!info->attrs[XNL_ATTR_REG_VAL]) { - pr_warn("Missing attribute 'XNL_ATTR_REG_VAL'"); - return -EINVAL; - } - - bar_num = nla_get_u32(info->attrs[XNL_ATTR_REG_BAR_NUM]); - reg_addr = nla_get_u32(info->attrs[XNL_ATTR_REG_ADDR]); - reg_val = nla_get_u32(info->attrs[XNL_ATTR_REG_VAL]); - - if (bar_num == conf.bar_num_config) { - rv = qdma_device_write_config_register(xpdev->dev_hndl, - reg_addr, reg_val); - if (rv < 0) { - pr_err("Config bar register write failed with error = %d\n", - rv); - return rv; - } - } else if (bar_num == conf.bar_num_user) { - rv = qdma_device_write_user_register(xpdev, reg_addr, reg_val); - if (rv < 0) { - pr_err("AXI Master Lite bar register write failed with error = %d\n", - rv); - return rv; - } - - } else if (bar_num == conf.bar_num_bypass) { - rv = qdma_device_write_bypass_register(xpdev, - reg_addr, reg_val); - if (rv < 0) { - pr_err("AXI Bridge Master bar register write failed with error = %d\n", - rv); - return rv; - } - } else { - rv += snprintf(buf + rv, XNL_RESP_BUFLEN_MIN, - "Invalid bar number\n"); - goto send_resp; - } - - -send_resp: - rv = xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MIN, rv); - return rv; -} - -static int xnl_get_global_csr(struct sk_buff *skb2, struct genl_info *info) -{ - struct global_csr_conf *csr; - struct xlnx_pci_dev *xpdev; - int rv; - u8 index = 0, count = 0; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return 0; - - csr = kmalloc(sizeof(struct global_csr_conf), GFP_KERNEL); - if (!csr) - return -ENOMEM; - - if (!info->attrs[XNL_ATTR_CSR_INDEX]) { - pr_warn("Missing attribute 'XNL_ATTR_CSR_INDEX'"); - kfree(csr); - return -EINVAL; - } - - if (!info->attrs[XNL_ATTR_CSR_COUNT]) { - pr_warn("Missing attribute 'XNL_ATTR_CSR_COUNT'"); - kfree(csr); - return -EINVAL; - } - - index = nla_get_u32(info->attrs[XNL_ATTR_CSR_INDEX]); - count = nla_get_u32(info->attrs[XNL_ATTR_CSR_COUNT]); - - rv = qdma_global_csr_get(xpdev->dev_hndl, index, count, csr); - if (rv < 0) { - pr_err("qdma_global_csr_get() failed: %d", rv); - goto free_msg_buff; - } - - rv = xnl_respond_data(info, - (void *)csr, sizeof(struct global_csr_conf)); - -free_msg_buff: - kfree(csr); - return rv; -} - -#ifdef TANDEM_BOOT_SUPPORTED -static int xnl_en_st(struct sk_buff *skb2, struct genl_info *info) -{ - struct xlnx_pci_dev *xpdev; - int rv; - char *buf; - - if (info == NULL) - return -EINVAL; - - xnl_dump_attrs(info); - - xpdev = xnl_rcv_check_xpdev(info); - if (!xpdev) - return -EINVAL; - buf = xnl_mem_alloc(XNL_RESP_BUFLEN_MIN, info); - if (!buf) - return -ENOMEM; - - qdma_init_st_ctxt(xpdev->dev_hndl, buf, XNL_RESP_BUFLEN_MAX); - rv = xnl_respond_buffer(info, buf, XNL_RESP_BUFLEN_MAX, 0); - - kfree(buf); - return rv; -} -#endif - -int xlnx_nl_init(void) -{ - int rv; -#ifdef __GENL_REG_FAMILY_OPS_FUNC__ - rv = genl_register_family_with_ops(&xnl_family, - xnl_ops, ARRAY_SIZE(xnl_ops)); -#else - rv = genl_register_family(&xnl_family); -#endif - if (rv) - pr_err("genl_register_family failed %d.\n", rv); - - return rv; -} - -void xlnx_nl_exit(void) -{ - int rv; - - rv = genl_unregister_family(&xnl_family); - if (rv) - pr_err("genl_unregister_family failed %d.\n", rv); -} diff --git a/QDMA/linux-kernel/driver/src/nl.h b/QDMA/linux-kernel/driver/src/nl.h deleted file mode 100755 index e1d4024..0000000 --- a/QDMA/linux-kernel/driver/src/nl.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_DRV_NL_H__ -#define __QDMA_DRV_NL_H__ -/** - * @file - * @brief This file contains the declarations for qdma netlink helper - * funnctions kernel module - * - */ -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include <net/genetlink.h> - -/*****************************************************************************/ -/** - * xnl_respond_buffer() - send a netlink string message - * - * @param[in] nl_info: pointer to netlink genl_info - * @param[in] buf: string buffer - * @param[in] buflen: length of the string buffer - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int xnl_respond_buffer(struct genl_info *info, char *buf, int buflen, - int error); - -int xlnx_nl_init(void); -void xlnx_nl_exit(void); - -#endif /* ifndef __QDMA_DRV_NL_H__ */ diff --git a/QDMA/linux-kernel/driver/src/pci_ids.h b/QDMA/linux-kernel/driver/src/pci_ids.h deleted file mode 100755 index 61a3da1..0000000 --- a/QDMA/linux-kernel/driver/src/pci_ids.h +++ /dev/null @@ -1,477 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XDMA_PCI_ID_H__ -#define __XDMA_PCI_ID_H__ -/** - * @file - * @brief This file contains the list of pcie devices supported for qdma driver - * - */ - -/** - * list of pcie devices supported for qdma driver - */ -static const struct pci_device_id pci_ids[] = { - -#ifdef __QDMA_VF__ - /** Gen 1 VF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xa011), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa111), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa211), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa311), }, /** VF on PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xa012), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa112), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa212), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa312), }, /** VF on PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xa014), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa114), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa214), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa314), }, /** VF on PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xa018), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa118), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa218), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa318), }, /** VF on PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xa01f), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa11f), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa21f), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa31f), }, /** VF on PF 3 */ - - /** Gen 2 VF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xa021), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa121), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa221), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa321), }, /** VF on PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xa022), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa122), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa222), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa322), }, /** VF on PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xa024), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa124), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa224), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa324), }, /** VF on PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xa028), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa128), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa228), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa328), }, /** VF on PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xa02f), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa12f), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa22f), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa32f), }, /** VF on PF 3 */ - - /** Gen 3 VF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xa031), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa131), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa231), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa331), }, /** VF on PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xa032), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa132), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa232), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa332), }, /** VF on PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xa034), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa134), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa234), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa334), }, /** VF on PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xa038), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa138), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa238), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa338), }, /** VF on PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xa03f), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa13f), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa23f), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa33f), }, /** VF on PF 3 */ - - /** Gen 4 VF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xa041), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa141), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa241), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa341), }, /** VF on PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xa042), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa142), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa242), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa342), }, /** VF on PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xa044), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa144), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa244), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa344), }, /** VF on PF 3 */ - { PCI_DEVICE(0x10ee, 0xa444), }, /** VF on PF 4 */ - { PCI_DEVICE(0x10ee, 0xa544), }, /** VF on PF 5 */ - { PCI_DEVICE(0x10ee, 0xa644), }, /** VF on PF 6 */ - { PCI_DEVICE(0x10ee, 0xa744), }, /** VF on PF 7 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xa048), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xa148), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xa248), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xa348), }, /** VF on PF 3 */ - - /** Gen 1 VF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xc011), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc111), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc211), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc311), }, /** VF on PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xc012), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc112), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc212), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc312), }, /** VF on PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xc014), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc114), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc214), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc314), }, /** VF on PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xc018), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc118), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc218), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc318), }, /** VF on PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xc01f), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc11f), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc21f), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc31f), }, /** VF on PF 3 */ - - /** Gen 2 VF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xc021), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc121), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc221), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc321), }, /** VF on PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xc022), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc122), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc222), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc322), }, /** VF on PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xc024), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc124), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc224), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc324), }, /** VF on PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xc028), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc128), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc228), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc328), }, /** VF on PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xc02f), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc12f), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc22f), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc32f), }, /** VF on PF 3 */ - - /** Gen 3 VF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xc031), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc131), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc231), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc331), }, /** VF on PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xc032), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc132), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc232), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc332), }, /** VF on PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xc034), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc134), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc234), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc334), }, /** VF on PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xc038), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc138), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc238), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc338), }, /** VF on PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xc03f), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc13f), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc23f), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc33f), }, /** VF on PF 3 */ - - /** Gen 4 VF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xc041), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc141), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc241), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc341), }, /** VF on PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xc042), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc142), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc242), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc342), }, /** VF on PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xc044), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc144), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc244), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc344), }, /** VF on PF 3 */ - { PCI_DEVICE(0x10ee, 0xc444), }, /** VF on PF 4 */ - { PCI_DEVICE(0x10ee, 0xc544), }, /** VF on PF 5 */ - { PCI_DEVICE(0x10ee, 0xc644), }, /** VF on PF 6 */ - { PCI_DEVICE(0x10ee, 0xc744), }, /** VF on PF 7 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xc048), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc148), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc248), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc348), }, /** VF on PF 3 */ - - /** Gen 5 VF */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xc058), }, /** VF on PF 0 */ - { PCI_DEVICE(0x10ee, 0xc158), }, /** VF on PF 1 */ - { PCI_DEVICE(0x10ee, 0xc258), }, /** VF on PF 2 */ - { PCI_DEVICE(0x10ee, 0xc358), }, /** VF on PF 3 */ -#else - /** Gen 1 PF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0x9011), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9111), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9211), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9311), }, /** PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0x9012), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9112), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9212), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9312), }, /** PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0x9014), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9114), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9214), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9314), }, /** PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0x9018), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9118), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9218), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9318), }, /** PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0x901f), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x911f), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x921f), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x931f), }, /** PF 3 */ - - /** Gen 2 PF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0x9021), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9121), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9221), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9321), }, /** PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0x9022), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9122), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9222), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9322), }, /** PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0x9024), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9124), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9224), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9324), }, /** PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0x9028), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9128), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9228), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9328), }, /** PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0x902f), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x912f), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x922f), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x932f), }, /** PF 3 */ - - /** Gen 3 PF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0x9031), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9131), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9231), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9331), }, /** PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0x9032), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9132), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9232), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9332), }, /** PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0x9034), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9134), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9234), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9334), }, /** PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0x9038), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9138), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9238), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9338), }, /** PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0x903f), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x913f), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x923f), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x933f), }, /** PF 3 */ - /* { PCI_DEVICE(0x10ee, 0x6a9f), }, */ /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x6aa0), }, /** PF 1 */ - - /** Gen 4 PF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0x9041), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9141), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9241), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9341), }, /** PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0x9042), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9142), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9242), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9342), }, /** PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0x9044), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9144), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9244), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9344), }, /** PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0x9048), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0x9148), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0x9248), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0x9348), }, /** PF 3 */ - - /** Gen 1 PF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xb011), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb111), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb211), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb311), }, /** PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xb012), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb112), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb212), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb312), }, /** PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xb014), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb114), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb214), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb314), }, /** PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xb018), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb118), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb218), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb318), }, /** PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xb01f), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb11f), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb21f), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb31f), }, /** PF 3 */ - - /** Gen 2 PF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xb021), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb121), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb221), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb321), }, /** PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xb022), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb122), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb222), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb322), }, /** PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xb024), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb124), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb224), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb324), }, /** PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xb028), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb128), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb228), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb328), }, /** PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xb02f), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb12f), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb22f), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb32f), }, /** PF 3 */ - - /** Gen 3 PF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xb031), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb131), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb231), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb331), }, /** PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xb032), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb132), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb232), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb332), }, /** PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xb034), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb134), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb234), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb334), }, /** PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xb038), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb138), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb238), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb338), }, /** PF 3 */ - /** PCIe lane width x16 */ - { PCI_DEVICE(0x10ee, 0xb03f), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb13f), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb23f), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb33f), }, /** PF 3 */ - - /** Gen 4 PF */ - /** PCIe lane width x1 */ - { PCI_DEVICE(0x10ee, 0xb041), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb141), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb241), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb341), }, /** PF 3 */ - /** PCIe lane width x2 */ - { PCI_DEVICE(0x10ee, 0xb042), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb142), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb242), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb342), }, /** PF 3 */ - /** PCIe lane width x4 */ - { PCI_DEVICE(0x10ee, 0xb044), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb144), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb244), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb344), }, /** PF 3 */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xb048), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb148), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb248), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb348), }, /** PF 3 */ - - /** Gen 5 PF */ - /** PCIe lane width x8 */ - { PCI_DEVICE(0x10ee, 0xb058), }, /** PF 0 */ - { PCI_DEVICE(0x10ee, 0xb158), }, /** PF 1 */ - { PCI_DEVICE(0x10ee, 0xb258), }, /** PF 2 */ - { PCI_DEVICE(0x10ee, 0xb358), }, /** PF 3 */ -#endif - - {0,} -}; - -/** module device table */ -MODULE_DEVICE_TABLE(pci, pci_ids); - -#endif /* ifndef __XDMA_PCI_ID_H__ */ diff --git a/QDMA/linux-kernel/driver/src/qdma_mod.c b/QDMA/linux-kernel/driver/src/qdma_mod.c deleted file mode 100755 index 11791f9..0000000 --- a/QDMA/linux-kernel/driver/src/qdma_mod.c +++ /dev/null @@ -1,1927 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ - -#include "qdma_mod.h" - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/version.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/pci.h> -#include <linux/aer.h> -#include <linux/vmalloc.h> - -#include "nl.h" -#include "libqdma/xdev.h" - -/* include early, to verify it depends only on the headers above */ -#include "version.h" - -#define QDMA_DEFAULT_TOTAL_Q 2048 - -static char version[] = - DRV_MODULE_DESC " v" DRV_MODULE_VERSION "\n"; - -MODULE_AUTHOR("Xilinx, Inc."); -MODULE_DESCRIPTION(DRV_MODULE_DESC); -MODULE_VERSION(DRV_MODULE_VERSION); -MODULE_LICENSE("Dual BSD/GPL"); - -static char mode[500] = {0}; -module_param_string(mode, mode, sizeof(mode), 0); -MODULE_PARM_DESC(mode, "Load the driver in different modes, dflt is auto mode, format is \"<bus_num>:<pf_num>:<mode>\" and multiple comma separated entries can be specified"); - -static char config_bar[500] = {0}; -module_param_string(config_bar, config_bar, sizeof(config_bar), 0); -MODULE_PARM_DESC(config_bar, "specify the config bar number, dflt is 0, format is \"<bus_num>:<pf_num>:<bar_num>\" and multiple comma separated entries can be specified"); - -static char master_pf[500] = {0}; -module_param_string(master_pf, master_pf, sizeof(master_pf), 0); -MODULE_PARM_DESC(master_pf, "specify the master_pf, dflt is 0, format is \"<bus_num>:<master_pf>\" and multiple comma separated entries can be specified"); - -static unsigned int num_threads; -module_param(num_threads, uint, 0644); -MODULE_PARM_DESC(num_threads, -"Number of threads to be created each for request and writeback processing"); - - -#include "pci_ids.h" - -/* - * xpdev helper functions - */ -static LIST_HEAD(xpdev_list); -static DEFINE_MUTEX(xpdev_mutex); - -static int xpdev_qdata_realloc(struct xlnx_pci_dev *xpdev, unsigned int qmax); - -static int xpdev_map_bar(struct xlnx_pci_dev *xpdev, - void __iomem **regs, u8 bar_num); -static void xpdev_unmap_bar(struct xlnx_pci_dev *xpdev, void __iomem **regs); - -#ifdef __QDMA_VF__ -void qdma_flr_resource_free(unsigned long dev_hndl); -#endif - -/*****************************************************************************/ -/** - * funcname() - handler to show the intr_rngsz configuration value - * - * @dev : PCIe device handle - * @attr: intr_rngsz configuration value - * @buf : buffer to hold the configured value - * - * Handler function to show the intr_rngsz - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t show_intr_rngsz(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct xlnx_pci_dev *xpdev; - int len; - unsigned int rngsz = 0; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - rngsz = qdma_get_intr_rngsz(xpdev->dev_hndl); - len = scnprintf(buf, PAGE_SIZE, "%u\n", rngsz); - if (len <= 0) - pr_err("copying rngsz to buffer failed with err: %d\n", len); - - return len; -} - -/*****************************************************************************/ -/** - * funcname() - handler to set the intr_rngsz configuration value - * - * @dev : PCIe device handle - * @attr: intr_rngsz configuration value - * @buf : buffer to hold the configured value - * @count : the number of bytes of data in the buffer - * - * Handler function to set the intr_rngsz - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t set_intr_rngsz(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - struct xlnx_pci_dev *xpdev; - unsigned int rngsz = 0; - int err = 0; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - err = kstrtouint(buf, 0, &rngsz); - if (err < 0) { - pr_err("failed to set interrupt ring size\n"); - return err; - } - - - err = qdma_set_intr_rngsz(xpdev->dev_hndl, (u32)rngsz); - return err ? err : count; -} - -/*****************************************************************************/ -/** - * funcname() - handler to show the qmax configuration value - * - * @dev : PCIe device handle - * @attr: qmax configuration value - * @buf : buffer to hold the configured value - * - * Handler function to show the qmax - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t show_qmax(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct xlnx_pci_dev *xpdev; - int len; - unsigned int qmax = 0; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - qmax = qdma_get_qmax(xpdev->dev_hndl); - len = scnprintf(buf, PAGE_SIZE, "%u\n", qmax); - if (len <= 0) - pr_err("copying qmax to buf failed with err: %d\n", len); - - return len; -} - -#ifndef __QDMA_VF__ -static ssize_t set_qmax(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - struct xlnx_pci_dev *xpdev; - unsigned int qmax = 0; - int err = 0; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - err = kstrtouint(buf, 0, &qmax); - if (err < 0) { - pr_err("failed to set qmax to %d\n", qmax); - return err; - } - err = qdma_set_qmax(xpdev->dev_hndl, -1, qmax); - - if (!err) - xpdev_qdata_realloc(xpdev, qmax); - - return err ? err : count; -} - -/*****************************************************************************/ -/** - * funcname() - handler to show the cmpl_status_acc configuration value - * - * @dev : PCIe device handle - * @attr: cmpl_status_acc configuration value - * @buf : buffer to hold the configured value - * - * Handler function to show the cmpl_status_acc - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t show_cmpl_status_acc(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct xlnx_pci_dev *xpdev; - int len; - unsigned int cmpl_status_acc = 0; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - cmpl_status_acc = qdma_get_wb_intvl(xpdev->dev_hndl); - len = scnprintf(buf, PAGE_SIZE, - "%u\n", cmpl_status_acc); - if (len <= 0) - pr_err("copying cmpl status acc value to buf failed with err: %d\n", - len); - - return len; -} - -/*****************************************************************************/ -/** - * funcname() - handler to set the cmpl_status_acc configuration value - * - * @dev : PCIe device handle - * @attr: cmpl_status_acc configuration value - * @buf : buffer to hold the configured value - * @count : the number of bytes of data in the buffer - * - * Handler function to set the cmpl_status_acc - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t set_cmpl_status_acc(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ -#ifdef QDMA_CSR_REG_UPDATE - struct pci_dev *pdev = to_pci_dev(dev); - struct xlnx_pci_dev *xpdev; - unsigned int cmpl_status_acc = 0; - int err = 0; - - if (!pdev) - return -EINVAL; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - err = kstrtoint(buf, 0, &cmpl_status_acc); - if (err < 0) { - pr_err("failed to set cmpl status accumulator to %d\n", - cmpl_status_acc); - return err; - } - - err = qdma_set_cmpl_status_acc(xpdev->dev_hndl, cmpl_status_acc); - return err ? err : count; -#else - pr_warn("QDMA CSR completion status accumulation update is not allowed\n"); - return -EPERM; -#endif -} - -/*****************************************************************************/ -/** - * funcname() - handler to show the buf_sz configuration value - * - * @dev : PCIe device handle - * @attr: buf_sz configuration value - * @buf : buffer to hold the configured value - * - * Handler function to show the buf_sz - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ - -static ssize_t show_c2h_buf_sz(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct xlnx_pci_dev *xpdev; - int len = 0; - int i; - unsigned int c2h_buf_sz[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - qdma_get_buf_sz(xpdev->dev_hndl, c2h_buf_sz); - - len += scnprintf(buf + len, PAGE_SIZE - len, "%u", c2h_buf_sz[0]); - for (i = 1; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) - len += scnprintf(buf + len, - PAGE_SIZE - len, " %u", c2h_buf_sz[i]); - len += scnprintf(buf + len, PAGE_SIZE - len, "%s", "\n\0"); - - return len; -} - -/*****************************************************************************/ -/** - * funcname() - handler to set the buf_sz configuration value - * - * @dev : PCIe device handle - * @attr: buf_sz configuration value - * @buf : buffer to hold the configured value - * @count : the number of bytes of data in the buffer - * - * Handler function to set the buf_sz - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ - -static ssize_t set_c2h_buf_sz(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ -#ifdef QDMA_CSR_REG_UPDATE - struct pci_dev *pdev = to_pci_dev(dev); - struct xlnx_pci_dev *xpdev; - int err = 0; - char *s = (char *)buf, *p = NULL; - const char *tc = " "; /* token character here is a "space" */ - unsigned int c2h_buf_sz[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - int i = 0; - - if (!pdev) - return -EINVAL; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - /* First read the values in to the register - * This helps to restore the values of entries if - * user configures lesser than 16 values - */ - qdma_get_buf_sz(xpdev->dev_hndl, c2h_buf_sz); - - while (((p = strsep(&s, tc)) != NULL) && - (i < QDMA_GLOBAL_CSR_ARRAY_SZ)) { - if (*p == 0) - continue; - - err = kstrtoint(p, 0, &c2h_buf_sz[i]); - if (err < 0) - goto input_err; - - i++; - } - - if (p) { - /* - * check if the number of entries are more than 16 ! - * if yes, ignore the extra values - */ - pr_warn("Found more than 16 buffer size entries. Ignoring extra entries\n"); - } - - err = qdma_set_buf_sz(xpdev->dev_hndl, c2h_buf_sz); - -input_err: - return err ? err : count; -#else - pr_warn("QDMA CSR C2H buffer size update is not allowed\n"); - return -EPERM; -#endif -} - -/*****************************************************************************/ -/** - * funcname() - handler to show the ring_sz configuration value - * - * @dev : PCIe device handle - * @attr: ring_sz configuration value - * @buf : buffer to hold the configured value - * - * Handler function to show the ring_sz - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ - -static ssize_t show_glbl_rng_sz(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct xlnx_pci_dev *xpdev; - struct xlnx_dma_dev *xdev = NULL; - int len = 0; - int i; - unsigned int glbl_ring_sz[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - xdev = (struct xlnx_dma_dev *)(xpdev->dev_hndl); - qdma_get_ring_sizes(xdev, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, glbl_ring_sz); - len += scnprintf(buf + len, PAGE_SIZE - len, "%u", glbl_ring_sz[0]); - for (i = 1; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) - len += scnprintf(buf + len, - PAGE_SIZE - len, - " %u", glbl_ring_sz[i]); - len += scnprintf(buf + len, PAGE_SIZE - len, "%s", "\n\0"); - - return len; -} - -/*****************************************************************************/ -/** - * funcname() - handler to set the glbl_ring_sz configuration value - * - * @dev : PCIe device handle - * @attr: buf_sz configuration value - * @buf : buffer to hold the configured value - * @count : the number of bytes of data in the buffer - * - * Handler function to set the glbl_ring_sz - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ - -static ssize_t set_glbl_rng_sz(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ -#ifdef QDMA_CSR_REG_UPDATE - struct pci_dev *pdev = to_pci_dev(dev); - struct xlnx_pci_dev *xpdev; - int err = 0; - char *s = (char *)buf, *p = NULL; - const char *tc = " "; /* token character here is a "space" */ - unsigned int glbl_ring_sz[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - int i = 0; - - if (!pdev) - return -EINVAL; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - /* First read the values in to the register - * This helps to restore the values of entries if - * user configures lesser than 16 values - */ - qdma_get_glbl_rng_sz(xpdev->dev_hndl, glbl_ring_sz); - - while (((p = strsep(&s, tc)) != NULL) && - (i < QDMA_GLOBAL_CSR_ARRAY_SZ)) { - if (*p == 0) - continue; - - err = kstrtoint(p, 0, &glbl_ring_sz[i]); - if (err < 0) - goto input_err; - - i++; - } - - if (p) { - /* - * check if the number of entries are more than 16 ! - * if yes, ignore the extra values - */ - pr_warn("Found more than 16 ring size entries. Ignoring extra entries"); - } - - err = qdma_set_glbl_rng_sz(xpdev->dev_hndl, glbl_ring_sz); - -input_err: - return err ? err : count; -#else - pr_warn("QDMA CSR global ring size update is not allowed\n"); - return -EPERM; -#endif -} - -/*****************************************************************************/ -/** - * funcname() - handler to show global csr c2h_timer_cnt configuration value - * - * @dev : PCIe device handle - * @attr: c2h_timer_cnt configuration value - * @buf : buffer to hold the configured value - * - * Handler function to show the global csr c2h_timer_cnt - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t show_c2h_timer_cnt(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct xlnx_pci_dev *xpdev; - int len = 0; - int i; - unsigned int c2h_timer_cnt[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - qdma_get_timer_cnt(xpdev->dev_hndl, c2h_timer_cnt); - - len += scnprintf(buf + len, PAGE_SIZE - len, "%u", c2h_timer_cnt[0]); - for (i = 1; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) - len += scnprintf(buf + len, - PAGE_SIZE - len, - " %u", c2h_timer_cnt[i]); - len += scnprintf(buf + len, PAGE_SIZE - len, "%s", "\n\0"); - - return len; -} - -/*****************************************************************************/ -/** - * set_c2h_timer_cnt() - handler to set global csr c2h_timer_cnt config - * - * @dev : PCIe device handle - * @attr: c2h_timer_cnt configuration value - * @buf : buffer containing new configuration - * @count : the number of bytes of data in the buffer - * - * Handler function to set the global csr c2h_timer_cnt - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t set_c2h_timer_cnt(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ -#ifdef QDMA_CSR_REG_UPDATE - struct pci_dev *pdev = to_pci_dev(dev); - struct xlnx_pci_dev *xpdev; - int err = 0; - char *s = (char *)buf, *p = NULL; - const char *tc = " "; /* token character here is a "space" */ - unsigned int c2h_timer_cnt[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - int i = 0; - - if (!pdev) - return -EINVAL; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - /* First read the values in to the register - * This helps to restore the values of entries if - * user configures lesser than 16 values - */ - qdma_get_timer_cnt(xpdev->dev_hndl, c2h_timer_cnt); - - while (((p = strsep(&s, tc)) != NULL) && - (i < QDMA_GLOBAL_CSR_ARRAY_SZ)) { - if (*p == 0) - continue; - - err = kstrtoint(p, 0, &c2h_timer_cnt[i]); - if (err < 0) - goto input_err; - - if (c2h_timer_cnt[i] > 255) { - pr_warn("timer cnt at index %d is %d - out of range [0-255]\n", - i, c2h_timer_cnt[i]); - err = -EINVAL; - goto input_err; - } - i++; - } - - if (p) { - /* - * check if the number of entries are more than 16 ! - * if yes, ignore the extra values - */ - pr_warn("Found more than 16 timer entries. Ignoring extra entries\n"); - } - err = qdma_set_timer_cnt(xpdev->dev_hndl, c2h_timer_cnt); - -input_err: - return err ? err : count; -#else - pr_warn("QDMA CSR C2H timer counter update is not allowed\n"); - return -EPERM; -#endif -} - -/*****************************************************************************/ -/** - * funcname() - handler to show global csr c2h_cnt_th_ configuration value - * - * @dev : PCIe device handle - * @attr: c2h_cnt_th configuration value - * @buf : buffer to hold the configured value - * - * Handler function to show the global csr c2h_cnt_th - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t show_c2h_cnt_th(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct xlnx_pci_dev *xpdev; - int len = 0; - int i; - unsigned int c2h_cnt_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - qdma_get_cnt_thresh(xpdev->dev_hndl, c2h_cnt_th); - - len += scnprintf(buf + len, - PAGE_SIZE - len, "%u", c2h_cnt_th[0]); - for (i = 1; i < QDMA_GLOBAL_CSR_ARRAY_SZ; i++) - len += scnprintf(buf + len, - PAGE_SIZE - len, " %u", c2h_cnt_th[i]); - len += scnprintf(buf + len, - PAGE_SIZE - len, "%s", "\n\0"); - - return len; -} - -/*****************************************************************************/ -/** - * set_c2h_cnt_th() - handler to set global csr c2h_cnt_th configuration - * - * @dev : PCIe device handle - * @attr: c2h_cnt_th configuration value - * @buf : buffer containing new configuration - * @count : the number of bytes of data in the buffer - * - * Handler function to set the global csr c2h_cnt_th - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ -static ssize_t set_c2h_cnt_th(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ -#ifdef QDMA_CSR_REG_UPDATE - struct pci_dev *pdev = to_pci_dev(dev); - struct xlnx_pci_dev *xpdev; - int err = 0; - char *s = (char *)buf, *p = NULL; - const char *tc = " "; /* token character here is a "space" */ - unsigned int c2h_cnt_th[QDMA_GLOBAL_CSR_ARRAY_SZ] = {0}; - int i = 0; - - if (!pdev) - return -EINVAL; - - xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!xpdev) - return -EINVAL; - - /* First read the values in to the register - * This helps to restore the values of entries if - * user configures lesser than 16 values - */ - qdma_get_cnt_thresh(xpdev->dev_hndl, c2h_cnt_th); - - while (((p = strsep(&s, tc)) != NULL) && - (i < QDMA_GLOBAL_CSR_ARRAY_SZ)) { - if (*p == 0) - continue; - - err = kstrtoint(p, 0, &c2h_cnt_th[i]); - if (err < 0) - goto input_err; - - if (c2h_cnt_th[i] > 255) { - pr_warn("counter threshold at index %d is %d - out of range [0-255]\n", - i, c2h_cnt_th[i]); - err = -EINVAL; - goto input_err; - } - i++; - } - - if (p) { - /* - * check if the number of entries are more than 16 ! - * if yes, ignore the extra values - */ - pr_warn("Found more than 16 counter entries. Ignoring extra entries\n"); - } - err = qdma_set_cnt_thresh(xpdev->dev_hndl, c2h_cnt_th); - -input_err: - return err ? err : count; -#else - pr_warn("QDMA CSR C2H counter threshold update is not allowed\n"); - return -EPERM; -#endif -} -#else /** For VF #ifdef __QDMA_VF__ */ -/*****************************************************************************/ -/** - * funcname() - handler to set the qmax configuration value - * - * @dev : PCIe device handle - * @attr: qmax configuration value - * @buf : buffer to hold the configured value - * - * Handler function to set the qmax - * - * @note none - * - * Return: Returns length of the buffer on success, <0 on failure - * - *****************************************************************************/ - -static ssize_t set_qmax(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - struct xlnx_pci_dev *_xpdev; - unsigned int qmax = 0; - int err = 0; - - _xpdev = (struct xlnx_pci_dev *)dev_get_drvdata(dev); - if (!_xpdev) - return -EINVAL; - - err = kstrtouint(buf, 0, &qmax); - if (err < 0) { - pr_err("Failed to set qmax\n"); - return err; - } - - err = qdma_vf_qconf(_xpdev->dev_hndl, qmax); - if (err < 0) - return err; - - if (!err) { - pr_debug("Succesfully reconfigured qdmavf%05x\n", _xpdev->idx); - xpdev_qdata_realloc(_xpdev, qmax); - } - - return err ? err : count; -} -#endif - -static DEVICE_ATTR(qmax, S_IWUSR | S_IRUGO, show_qmax, set_qmax); -static DEVICE_ATTR(intr_rngsz, S_IWUSR | S_IRUGO, - show_intr_rngsz, set_intr_rngsz); -#ifndef __QDMA_VF__ -static DEVICE_ATTR(buf_sz, S_IWUSR | S_IRUGO, - show_c2h_buf_sz, set_c2h_buf_sz); -static DEVICE_ATTR(glbl_rng_sz, S_IWUSR | S_IRUGO, - show_glbl_rng_sz, set_glbl_rng_sz); -static DEVICE_ATTR(c2h_timer_cnt, S_IWUSR | S_IRUGO, - show_c2h_timer_cnt, set_c2h_timer_cnt); -static DEVICE_ATTR(c2h_cnt_th, S_IWUSR | S_IRUGO, - show_c2h_cnt_th, set_c2h_cnt_th); -static DEVICE_ATTR(cmpl_status_acc, S_IWUSR | S_IRUGO, - show_cmpl_status_acc, set_cmpl_status_acc); -#endif - -static struct attribute *pci_device_attrs[] = { - &dev_attr_qmax.attr, - &dev_attr_intr_rngsz.attr, - NULL, -}; - -static struct attribute *pci_master_device_attrs[] = { - &dev_attr_qmax.attr, - &dev_attr_intr_rngsz.attr, -#ifndef __QDMA_VF__ - &dev_attr_buf_sz.attr, - &dev_attr_glbl_rng_sz.attr, - &dev_attr_c2h_timer_cnt.attr, - &dev_attr_c2h_cnt_th.attr, - &dev_attr_cmpl_status_acc.attr, -#endif - NULL, -}; - -static struct attribute_group pci_device_attr_group = { - .name = "qdma", - .attrs = pci_device_attrs, - -}; - -static struct attribute_group pci_master_device_attr_group = { - .name = "qdma", - .attrs = pci_master_device_attrs, - -}; - -static inline void xpdev_list_remove(struct xlnx_pci_dev *xpdev) -{ - mutex_lock(&xpdev_mutex); - list_del(&xpdev->list_head); - mutex_unlock(&xpdev_mutex); -} - -static inline void xpdev_list_add(struct xlnx_pci_dev *xpdev) -{ - mutex_lock(&xpdev_mutex); - list_add_tail(&xpdev->list_head, &xpdev_list); - mutex_unlock(&xpdev_mutex); -} - -int xpdev_list_dump(char *buf, int buflen) -{ - struct xlnx_pci_dev *xpdev, *tmp; - char *cur = buf; - char *const end = buf + buflen; - int base_end = 0; - int qmax_val = 0; - - if (!buf || !buflen) - return -EINVAL; - - mutex_lock(&xpdev_mutex); - list_for_each_entry_safe(xpdev, tmp, &xpdev_list, list_head) { - struct pci_dev *pdev; - struct qdma_dev_conf conf; - int rv; - - rv = qdma_device_get_config(xpdev->dev_hndl, &conf, NULL, 0); - if (rv < 0) { - cur += snprintf(cur, cur - end, - "ERR! unable to get device config for idx %05x\n", - xpdev->idx); - if (cur >= end) - goto handle_truncation; - break; - } - - pdev = conf.pdev; - - base_end = (int)(conf.qsets_base + conf.qsets_max - 1); - if (base_end < 0) - base_end = 0; - qmax_val = conf.qsets_max; - - if (qmax_val) { - cur += snprintf(cur, end - cur, -#ifdef __QDMA_VF__ - "qdmavf%05x\t%s\tmax QP: %d, %d~%d\n", -#else - "qdma%05x\t%s\tmax QP: %d, %d~%d\n", -#endif - xpdev->idx, dev_name(&pdev->dev), - qmax_val, conf.qsets_base, - base_end); - } else { - cur += snprintf(cur, end - cur, -#ifdef __QDMA_VF__ - "qdmavf%05x\t%s\tmax QP: 0, -~-\n", -#else - "qdma%05x\t%s\tmax QP: 0, -~-\n", -#endif - xpdev->idx, dev_name(&pdev->dev)); - } - if (cur >= end) - goto handle_truncation; - } - mutex_unlock(&xpdev_mutex); - - return cur - buf; - -handle_truncation: - mutex_unlock(&xpdev_mutex); - pr_warn("ERR! str truncated. req=%lu, avail=%u", cur - buf, buflen); - *buf = '\0'; - return cur - buf; -} - -/** - * Function to find the first PF device available in the card - */ -static bool is_first_pfdev(u8 bus_number) -{ - struct xlnx_pci_dev *_xpdev, *tmp; - - mutex_lock(&xpdev_mutex); - if (list_empty(&xpdev_list)) { - mutex_unlock(&xpdev_mutex); - return 1; - } - - list_for_each_entry_safe(_xpdev, tmp, &xpdev_list, list_head) { - struct pci_dev *pdev = _xpdev->pdev; - /** find first bus and device are matching */ - if (pdev->bus->number == bus_number) { - mutex_unlock(&xpdev_mutex); - /** if func matches, it returns 1, else 0*/ - return 0; - } - } - mutex_unlock(&xpdev_mutex); - - return 1; -} -/*****************************************************************************/ -/** - * extract_mod_param() - extract the device mode and config bar per function - * - * @param[in] pdev: pcie device - * @param[in] qdma_drv_mod_param_type: mod param type - * - * @return device mode - *****************************************************************************/ -static u8 extract_mod_param(struct pci_dev *pdev, - enum qdma_drv_mod_param_type param_type) -{ - char p[600]; - char *ptr, *mod; - - u8 dev_fn = PCI_FUNC(pdev->devfn); -#ifdef __QDMA_VF__ - u16 device_id = pdev->device; -#endif - - - /* Fetch param specified in the module parameter */ - ptr = p; - if (param_type == DRV_MODE) { - if (mode[0] == '\0') - return 0; - strncpy(p, mode, sizeof(p) - 1); - } else if (param_type == CONFIG_BAR) { - if (config_bar[0] == '\0') - return 0; - strncpy(p, config_bar, sizeof(p) - 1); - } else if (param_type == MASTER_PF) { - if (master_pf[0] == '\0') - return is_first_pfdev(pdev->bus->number); - strncpy(p, master_pf, sizeof(p) - 1); - } else { - pr_err("Invalid module param type received\n"); - return -EINVAL; - } - - while ((mod = strsep(&ptr, ","))) { - unsigned int bus_num, func_num, param = 0; - int fields; - - if (!strlen(mod)) - continue; - - if (param_type == MASTER_PF) { - fields = sscanf(mod, "%x:%x", &bus_num, ¶m); - - if (fields != 2) { - pr_warn("invalid mode string \"%s\"\n", mod); - continue; - } - - if ((bus_num == pdev->bus->number) && - (dev_fn == param)) - return 1; - } else { - fields = sscanf(mod, "%x:%x:%x", - &bus_num, &func_num, ¶m); - - if (fields != 3) { - pr_warn("invalid mode string \"%s\"\n", mod); - continue; - } - -#ifndef __QDMA_VF__ - if ((bus_num == pdev->bus->number) && - (func_num == dev_fn)) - return param; -#else - if ((bus_num == pdev->bus->number) && - (((device_id >> VF_PF_IDENTIFIER_SHIFT) & - VF_PF_IDENTIFIER_MASK) == func_num)) - return param; -#endif - } - } - - return 0; -} - -struct xlnx_pci_dev *xpdev_find_by_idx(unsigned int idx, char *buf, int buflen) -{ - struct xlnx_pci_dev *xpdev, *tmp; - - mutex_lock(&xpdev_mutex); - list_for_each_entry_safe(xpdev, tmp, &xpdev_list, list_head) { - if (xpdev->idx == idx) { - mutex_unlock(&xpdev_mutex); - return xpdev; - } - } - mutex_unlock(&xpdev_mutex); - - if (buf && buflen) - snprintf(buf, buflen, "NO device found at index %05x!\n", idx); - - return NULL; -} - -struct xlnx_qdata *xpdev_queue_get(struct xlnx_pci_dev *xpdev, - unsigned int qidx, u8 q_type, bool check_qhndl, - char *ebuf, int ebuflen) -{ - struct xlnx_qdata *qdata; - - if (qidx >= xpdev->qmax) { - pr_debug("qdma%05x QID %u too big, %05x.\n", - xpdev->idx, qidx, xpdev->qmax); - if (ebuf && ebuflen) { - snprintf(ebuf, ebuflen, "QID %u too big, %u.\n", - qidx, xpdev->qmax); - } - return NULL; - } - - qdata = xpdev->qdata + qidx; - if (q_type == Q_C2H) - qdata += xpdev->qmax; - if (q_type == Q_CMPT) - qdata += (2 * xpdev->qmax); - - if (check_qhndl && (!qdata->qhndl && !qdata->xcdev)) { - pr_debug("qdma%05x QID %u NOT configured.\n", xpdev->idx, qidx); - if (ebuf && ebuflen) { - snprintf(ebuf, ebuflen, - "QID %u NOT configured.\n", qidx); - } - - return NULL; - } - - return qdata; -} - -int xpdev_queue_delete(struct xlnx_pci_dev *xpdev, unsigned int qidx, u8 q_type, - char *ebuf, int ebuflen) -{ - struct xlnx_qdata *qdata = xpdev_queue_get(xpdev, qidx, q_type, 1, ebuf, - ebuflen); - int rv = 0; - - if (!qdata) - return -EINVAL; - - if (q_type != Q_CMPT) { - if (!qdata->xcdev) - return -EINVAL; - } - - if (qdata->qhndl != QDMA_QUEUE_IDX_INVALID) - rv = qdma_queue_remove(xpdev->dev_hndl, qdata->qhndl, - ebuf, ebuflen); - else - pr_err("qidx %u/%u, type %d, qhndl invalid.\n", - qidx, xpdev->qmax, q_type); - if (rv < 0) - goto exit; - - if (q_type != Q_CMPT) { - spin_lock(&xpdev->cdev_lock); - qdata->xcdev->dir_init &= ~(1 << (q_type ? 1 : 0)); - spin_unlock(&xpdev->cdev_lock); - - if (!qdata->xcdev->dir_init) - qdma_cdev_destroy(qdata->xcdev); - } - - memset(qdata, 0, sizeof(*qdata)); -exit: - return rv; -} - -#if KERNEL_VERSION(3, 16, 0) <= LINUX_VERSION_CODE -static void xpdev_queue_delete_all(struct xlnx_pci_dev *xpdev) -{ - int i; - - for (i = 0; i < xpdev->qmax; i++) { - xpdev_queue_delete(xpdev, i, 0, NULL, 0); - xpdev_queue_delete(xpdev, i, 1, NULL, 0); - } -} -#endif - -int xpdev_queue_add(struct xlnx_pci_dev *xpdev, struct qdma_queue_conf *qconf, - char *ebuf, int ebuflen) -{ - struct xlnx_qdata *qdata; - struct qdma_cdev *xcdev = NULL; - struct xlnx_qdata *qdata_tmp; - struct qdma_dev_conf dev_config; - u8 dir; - unsigned long qhndl; - int rv; - - rv = qdma_queue_add(xpdev->dev_hndl, qconf, &qhndl, ebuf, ebuflen); - if (rv < 0) - return rv; - - pr_debug("qdma%05x idx %u, st %d, q_type %s, added, qhndl 0x%lx.\n", - xpdev->idx, qconf->qidx, qconf->st, - q_type_list[qconf->q_type].name, qhndl); - - qdata = xpdev_queue_get(xpdev, qconf->qidx, qconf->q_type, 0, ebuf, - ebuflen); - if (!qdata) { - pr_err("q added 0x%lx, get failed, idx 0x%x.\n", - qhndl, qconf->qidx); - return rv; - } - - if (qconf->q_type != Q_CMPT) { - dir = (qconf->q_type == Q_C2H) ? 0 : 1; - spin_lock(&xpdev->cdev_lock); - qdata_tmp = xpdev_queue_get(xpdev, qconf->qidx, - dir, 0, NULL, 0); - if (qdata_tmp) { - /* only 1 cdev per queue pair */ - if (qdata_tmp->xcdev) { - unsigned long *priv_data; - - qdata->qhndl = qhndl; - qdata->xcdev = qdata_tmp->xcdev; - priv_data = (qconf->q_type == Q_C2H) ? - &qdata->xcdev->c2h_qhndl : - &qdata->xcdev->h2c_qhndl; - *priv_data = qhndl; - qdata->xcdev->dir_init |= (1 << qconf->q_type); - - spin_unlock(&xpdev->cdev_lock); - return 0; - } - } - spin_unlock(&xpdev->cdev_lock); - } - - rv = qdma_device_get_config(xpdev->dev_hndl, &dev_config, NULL, 0); - if (rv < 0) { - pr_err("Failed to get conf for qdma device '%05x'\n", - xpdev->idx); - return rv; - } - - /* always create the cdev - * Give HW QID as minor number with qsets_base calculation - */ - if (qconf->q_type != Q_CMPT) { - rv = qdma_cdev_create(&xpdev->cdev_cb, xpdev->pdev, qconf, - (dev_config.qsets_base + qconf->qidx), - qhndl, &xcdev, ebuf, ebuflen); - - qdata->xcdev = xcdev; - } - - qdata->qhndl = qhndl; - - return rv; -} - -static void nl_work_handler_q_start(struct work_struct *work) -{ - struct xlnx_nl_work *nl_work = container_of(work, struct xlnx_nl_work, - work); - struct xlnx_pci_dev *xpdev = nl_work->xpdev; - struct xlnx_nl_work_q_ctrl *qctrl = &nl_work->qctrl; - unsigned int qidx = qctrl->qidx; - u8 is_qp = qctrl->is_qp; - u8 q_type = qctrl->q_type; - int i; - char *ebuf = nl_work->buf; - int rv = 0; - - for (i = 0; i < qctrl->qcnt; i++, qidx++) { - struct xlnx_qdata *qdata; - -q_start: - qdata = xpdev_queue_get(xpdev, qidx, q_type, 1, ebuf, - nl_work->buflen); - if (!qdata) { - pr_err("%s, idx %u, q_type %s, get failed.\n", - dev_name(&xpdev->pdev->dev), qidx, - q_type_list[q_type].name); - snprintf(ebuf, nl_work->buflen, - "Q idx %u, q_type %s, get failed.\n", - qidx, q_type_list[q_type].name); - goto send_resp; - } - - rv = qdma_queue_start(xpdev->dev_hndl, qdata->qhndl, ebuf, - nl_work->buflen); - if (rv < 0) { - pr_err("%s, idx %u, q_type %s, start failed %d.\n", - dev_name(&xpdev->pdev->dev), qidx, - q_type_list[q_type].name, rv); - snprintf(ebuf, nl_work->buflen, - "Q idx %u, q_type %s, start failed %d.\n", - qidx, q_type_list[q_type].name, rv); - goto send_resp; - } - if (qctrl->q_type != Q_CMPT) { - if (is_qp && q_type == qctrl->q_type) { - q_type = !qctrl->q_type; - goto q_start; - } - - q_type = qctrl->q_type; - } - } - - snprintf(ebuf, nl_work->buflen, - "%u Queues started, idx %u ~ %u.\n", - qctrl->qcnt, qctrl->qidx, qidx - 1); - -send_resp: - nl_work->q_start_handled = 1; - nl_work->ret = rv; - wake_up_interruptible(&nl_work->wq); -} - -static struct xlnx_nl_work *xpdev_nl_work_alloc(struct xlnx_pci_dev *xpdev) -{ - struct xlnx_nl_work *nl_work; - - /* allocate work struct */ - nl_work = kzalloc(sizeof(*nl_work), GFP_ATOMIC); - if (!nl_work) { - pr_err("qdma%05x %s: OOM.\n", - xpdev->idx, dev_name(&xpdev->pdev->dev)); - return NULL; - } - - nl_work->xpdev = xpdev; - - return nl_work; -} - -int xpdev_nl_queue_start(struct xlnx_pci_dev *xpdev, void *nl_info, u8 is_qp, - u8 q_type, unsigned short qidx, unsigned short qcnt) -{ - struct xlnx_nl_work *nl_work = xpdev_nl_work_alloc(xpdev); - struct xlnx_nl_work_q_ctrl *qctrl; - char ebuf[XNL_EBUFLEN]; - int rv = 0; - - if (!nl_work) - return -ENOMEM; - - qctrl = &nl_work->qctrl; - qctrl->is_qp = is_qp; - qctrl->q_type = q_type; - qctrl->qidx = qidx; - qctrl->qcnt = qcnt; - - INIT_WORK(&nl_work->work, nl_work_handler_q_start); - init_waitqueue_head(&nl_work->wq); - nl_work->q_start_handled = 0; - nl_work->buf = ebuf; - nl_work->buflen = XNL_EBUFLEN; - queue_work(xpdev->nl_task_wq, &nl_work->work); - wait_event_interruptible(nl_work->wq, nl_work->q_start_handled); - rv = nl_work->ret; - kfree(nl_work); - xnl_respond_buffer(nl_info, ebuf, strlen(ebuf), rv); - - return rv; -} - -static void xpdev_free(struct xlnx_pci_dev *p) -{ - xpdev_list_remove(p); - - if (p->nl_task_wq) - destroy_workqueue(p->nl_task_wq); - - kfree(p->qdata); - kfree(p); -} - -static int xpdev_qdata_realloc(struct xlnx_pci_dev *xpdev, unsigned int qmax) -{ - if (!xpdev) - return -EINVAL; - - kfree(xpdev->qdata); - xpdev->qdata = NULL; - - if (!qmax) - return 0; - xpdev->qdata = kzalloc(qmax * 3 * sizeof(struct xlnx_qdata), - GFP_KERNEL); - if (!xpdev->qdata) { - pr_err("OMM, xpdev->qdata, sz %u.\n", qmax); - return -ENOMEM; - } - xpdev->qmax = qmax; - - return 0; -} - -static struct xlnx_pci_dev *xpdev_alloc(struct pci_dev *pdev, unsigned int qmax) -{ - int sz = sizeof(struct xlnx_pci_dev); - struct xlnx_pci_dev *xpdev = kzalloc(sz, GFP_KERNEL); - char name[80]; - - if (!xpdev) { - xpdev = vmalloc(sz); - if (xpdev) - memset(xpdev, 0, sz); - } - - if (!xpdev) { - pr_err("OMM, qmax %u, sz %u.\n", qmax, sz); - return NULL; - } - spin_lock_init(&xpdev->cdev_lock); - xpdev->pdev = pdev; - xpdev->qmax = qmax; - xpdev->idx = 0xFF; - if (qmax && (xpdev_qdata_realloc(xpdev, qmax) < 0)) - goto free_xpdev; - - snprintf(name, 80, "qdma_%s_nl_wq", dev_name(&pdev->dev)); - xpdev->nl_task_wq = create_singlethread_workqueue(name); - if (!xpdev->nl_task_wq) { - pr_err("%s failed to allocate nl_task_wq.\n", - dev_name(&pdev->dev)); - goto free_xpdev; - } - - xpdev_list_add(xpdev); - return xpdev; - -free_xpdev: - xpdev_free(xpdev); - return NULL; -} - -static int xpdev_map_bar(struct xlnx_pci_dev *xpdev, - void __iomem **regs, u8 bar_num) -{ - int map_len; - - /* map the AXI Master Lite bar */ - map_len = pci_resource_len(xpdev->pdev, (int)bar_num); - if (map_len > QDMA_MAX_BAR_LEN_MAPPED) - map_len = QDMA_MAX_BAR_LEN_MAPPED; - - *regs = pci_iomap(xpdev->pdev, bar_num, map_len); - if (!(*regs)) { - pr_err("unable to map bar %d.\n", bar_num); - return -ENOMEM; - } - - return 0; -} - -static void xpdev_unmap_bar(struct xlnx_pci_dev *xpdev, void __iomem **regs) -{ - /* unmap BAR */ - if (*regs) { - pci_iounmap(xpdev->pdev, *regs); - /* mark as unmapped */ - *regs = NULL; - } -} - -int qdma_device_read_user_register(struct xlnx_pci_dev *xpdev, - u32 reg_addr, u32 *value) -{ - struct xlnx_dma_dev *xdev = NULL; - int rv = 0; - - if (!xpdev) - return -EINVAL; - - xdev = (struct xlnx_dma_dev *)(xpdev->dev_hndl); - - if (xdev->conf.bar_num_user < 0) { - pr_err("AXI Master Lite bar is not present\n"); - return -EINVAL; - } - - /* map the AXI Master Lite bar */ - rv = xpdev_map_bar(xpdev, &xpdev->user_bar_regs, - xdev->conf.bar_num_user); - if (rv < 0) - return rv; - - *value = readl(xpdev->user_bar_regs + reg_addr); - - /* unmap the AXI Master Lite bar after accessing it */ - xpdev_unmap_bar(xpdev, &xpdev->user_bar_regs); - - return 0; -} - -int qdma_device_write_user_register(struct xlnx_pci_dev *xpdev, - u32 reg_addr, u32 value) -{ - struct xlnx_dma_dev *xdev = NULL; - int rv = 0; - - if (!xpdev) - return -EINVAL; - - xdev = (struct xlnx_dma_dev *)(xpdev->dev_hndl); - - if (xdev->conf.bar_num_user < 0) { - pr_err("AXI Master Lite bar is not present\n"); - return -EINVAL; - } - - /* map the AXI Master Lite bar */ - rv = xpdev_map_bar(xpdev, &xpdev->user_bar_regs, - xdev->conf.bar_num_user); - if (rv < 0) - return rv; - - - writel(value, xpdev->user_bar_regs + reg_addr); - - /* unmap the AXI Master Lite bar after accessing it */ - xpdev_unmap_bar(xpdev, &xpdev->user_bar_regs); - - return 0; -} - -int qdma_device_read_bypass_register(struct xlnx_pci_dev *xpdev, - u32 reg_addr, u32 *value) -{ - struct xlnx_dma_dev *xdev = NULL; - int rv = 0; - - if (!xpdev) - return -EINVAL; - - xdev = (struct xlnx_dma_dev *)(xpdev->dev_hndl); - - if (xdev->conf.bar_num_bypass < 0) { - pr_err("AXI Bridge Master bar is not present\n"); - return -EINVAL; - } - - /* map the AXI Bridge Master bar */ - rv = xpdev_map_bar(xpdev, &xpdev->bypass_bar_regs, - xdev->conf.bar_num_bypass); - if (rv < 0) - return rv; - - *value = readl(xpdev->bypass_bar_regs + reg_addr); - - /* unmap the AXI Bridge Master bar after accessing it */ - xpdev_unmap_bar(xpdev, &xpdev->bypass_bar_regs); - - return 0; -} - -int qdma_device_write_bypass_register(struct xlnx_pci_dev *xpdev, - u32 reg_addr, u32 value) -{ - struct xlnx_dma_dev *xdev = NULL; - int rv = 0; - - if (!xpdev) - return -EINVAL; - - xdev = (struct xlnx_dma_dev *)(xpdev->dev_hndl); - - if (xdev->conf.bar_num_bypass < 0) { - pr_err("AXI Bridge Master bar is not present\n"); - return -EINVAL; - } - - /* map the AXI Bridge Master bar */ - rv = xpdev_map_bar(xpdev, &xpdev->bypass_bar_regs, - xdev->conf.bar_num_bypass); - if (rv < 0) - return rv; - - writel(value, xpdev->bypass_bar_regs + reg_addr); - - /* unmap the AXI Bridge Master bar after accessing it */ - xpdev_unmap_bar(xpdev, &xpdev->bypass_bar_regs); - - return 0; -} - -static int probe_one(struct pci_dev *pdev, const struct pci_device_id *id) -{ - struct qdma_dev_conf conf; - struct xlnx_pci_dev *xpdev = NULL; - unsigned long dev_hndl; - int rv; -#ifdef __x86_64__ - pr_info("%s: func 0x%x, p/v %d/%d,0x%p.\n", - dev_name(&pdev->dev), PCI_FUNC(pdev->devfn), - pdev->is_physfn, pdev->is_virtfn, pdev->physfn); -#endif - memset(&conf, 0, sizeof(conf)); - - conf.qdma_drv_mode = (enum qdma_drv_mode)extract_mod_param(pdev, - DRV_MODE); - conf.vf_max = 0; /* enable via sysfs */ - -#ifndef __QDMA_VF__ - conf.master_pf = extract_mod_param(pdev, MASTER_PF); - if (conf.master_pf) - pr_info("Configuring '%02x:%02x:%x' as master pf\n", - pdev->bus->number, - PCI_SLOT(pdev->devfn), - PCI_FUNC(pdev->devfn)); - -#endif /* #ifdef __QDMA_VF__ */ - pr_info("Driver is loaded in %s(%d) mode\n", - mode_name_list[conf.qdma_drv_mode].name, - conf.qdma_drv_mode); - - if (conf.qdma_drv_mode == LEGACY_INTR_MODE) - intr_legacy_init(); - - conf.intr_rngsz = QDMA_INTR_COAL_RING_SIZE; - conf.pdev = pdev; - - /* initialize all the bar numbers with -1 */ - conf.bar_num_config = -1; - conf.bar_num_user = -1; - conf.bar_num_bypass = -1; - - conf.bar_num_config = extract_mod_param(pdev, CONFIG_BAR); - conf.qsets_max = 0; - conf.qsets_base = -1; - conf.msix_qvec_max = 32; - conf.user_msix_qvec_max = 1; -#ifdef __QDMA_VF__ - conf.fp_flr_free_resource = qdma_flr_resource_free; -#endif - if (conf.master_pf) - conf.data_msix_qvec_max = 5; - else - conf.data_msix_qvec_max = 6; - - rv = qdma_device_open(DRV_MODULE_NAME, &conf, &dev_hndl); - if (rv < 0) - return rv; - - xpdev = xpdev_alloc(pdev, conf.qsets_max); - if (!xpdev) { - rv = -EINVAL; - goto close_device; - } - - xpdev->dev_hndl = dev_hndl; - xpdev->idx = conf.bdf; - - xpdev->cdev_cb.xpdev = xpdev; - rv = qdma_cdev_device_init(&xpdev->cdev_cb); - if (rv < 0) - goto close_device; - - /* Create the files for attributes in sysfs */ - if (conf.master_pf) { - rv = sysfs_create_group(&pdev->dev.kobj, - &pci_master_device_attr_group); - if (rv < 0) - goto close_device; - } else { - rv = sysfs_create_group(&pdev->dev.kobj, - &pci_device_attr_group); - if (rv < 0) - goto close_device; - } - - dev_set_drvdata(&pdev->dev, xpdev); - - return 0; - -close_device: - qdma_device_close(pdev, dev_hndl); - - if (xpdev) - xpdev_free(xpdev); - - return rv; -} - -static void xpdev_device_cleanup(struct xlnx_pci_dev *xpdev) -{ - struct xlnx_qdata *qdata = xpdev->qdata; - struct xlnx_qdata *qmax = qdata + (xpdev->qmax * 2); /* h2c and c2h */ - - for (; qdata != qmax; qdata++) { - if (qdata->xcdev) { - /* if either h2c(1) or c2h(2) bit set, but not both */ - if (qdata->xcdev->dir_init == 1 || - qdata->xcdev->dir_init == 2) { - qdma_cdev_destroy(qdata->xcdev); - } else { /* both bits are set so remove one */ - spin_lock(&xpdev->cdev_lock); - qdata->xcdev->dir_init >>= 1; - spin_unlock(&xpdev->cdev_lock); - } - } - memset(qdata, 0, sizeof(*qdata)); - } -} - -static void remove_one(struct pci_dev *pdev) -{ - struct xlnx_dma_dev *xdev = NULL; - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&pdev->dev); - - if (!xpdev) { - pr_info("%s NOT attached.\n", dev_name(&pdev->dev)); - return; - } - - xdev = (struct xlnx_dma_dev *)(xpdev->dev_hndl); - - pr_info("%s pdev 0x%p, xdev 0x%p, hndl 0x%lx, qdma%05x.\n", - dev_name(&pdev->dev), pdev, xpdev, xpdev->dev_hndl, xpdev->idx); - - if (xdev->conf.master_pf) - sysfs_remove_group(&pdev->dev.kobj, - &pci_master_device_attr_group); - else - sysfs_remove_group(&pdev->dev.kobj, &pci_device_attr_group); - - qdma_cdev_device_cleanup(&xpdev->cdev_cb); - - xpdev_device_cleanup(xpdev); - - qdma_device_close(pdev, xpdev->dev_hndl); - - xpdev_free(xpdev); - - dev_set_drvdata(&pdev->dev, NULL); -} - -#if defined(CONFIG_PCI_IOV) && !defined(__QDMA_VF__) -static int sriov_config(struct pci_dev *pdev, int num_vfs) -{ - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&pdev->dev); - int total_vfs = pci_sriov_get_totalvfs(pdev); - - if (!xpdev) { - pr_info("%s NOT attached.\n", dev_name(&pdev->dev)); - return -EINVAL; - } - - pr_debug("%s pdev 0x%p, xdev 0x%p, hndl 0x%lx, qdma%05x.\n", - dev_name(&pdev->dev), pdev, xpdev, xpdev->dev_hndl, xpdev->idx); - - if (num_vfs > total_vfs) { - pr_info("%s, clamp down # of VFs %d -> %d.\n", - dev_name(&pdev->dev), num_vfs, total_vfs); - num_vfs = total_vfs; - } - - return qdma_device_sriov_config(pdev, xpdev->dev_hndl, num_vfs); -} -#endif - -static pci_ers_result_t qdma_error_detected(struct pci_dev *pdev, - pci_channel_state_t state) -{ - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&pdev->dev); - - switch (state) { - case pci_channel_io_normal: - return PCI_ERS_RESULT_CAN_RECOVER; - case pci_channel_io_frozen: - pr_warn("dev 0x%p,0x%p, frozen state error, reset controller\n", - pdev, xpdev); - pci_disable_device(pdev); - return PCI_ERS_RESULT_NEED_RESET; - case pci_channel_io_perm_failure: - pr_warn("dev 0x%p,0x%p, failure state error, req. disconnect\n", - pdev, xpdev); - return PCI_ERS_RESULT_DISCONNECT; - } - return PCI_ERS_RESULT_NEED_RESET; -} - -static pci_ers_result_t qdma_slot_reset(struct pci_dev *pdev) -{ - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&pdev->dev); - - if (!xpdev) { - pr_info("%s NOT attached.\n", dev_name(&pdev->dev)); - return PCI_ERS_RESULT_DISCONNECT; - } - - pr_info("0x%p restart after slot reset\n", xpdev); - if (pci_enable_device_mem(pdev)) { - pr_info("0x%p failed to renable after slot reset\n", xpdev); - return PCI_ERS_RESULT_DISCONNECT; - } - - pci_set_master(pdev); - pci_restore_state(pdev); - pci_save_state(pdev); - - return PCI_ERS_RESULT_RECOVERED; -} - -static void qdma_error_resume(struct pci_dev *pdev) -{ - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&pdev->dev); - - if (!xpdev) { - pr_info("%s NOT attached.\n", dev_name(&pdev->dev)); - return; - } - - pr_info("dev 0x%p,0x%p.\n", pdev, xpdev); -#ifdef RHEL_RELEASE_VERSION -#if RHEL_RELEASE_VERSION(8, 3) > RHEL_RELEASE_CODE - pci_cleanup_aer_uncorrect_error_status(pdev); -#else - pci_aer_clear_nonfatal_status(pdev); -#endif -#else -#if KERNEL_VERSION(5, 7, 0) <= LINUX_VERSION_CODE - pci_aer_clear_nonfatal_status(pdev); -#else - pci_cleanup_aer_uncorrect_error_status(pdev); -#endif -#endif -} - - -#ifdef __QDMA_VF__ -void qdma_flr_resource_free(unsigned long dev_hndl) -{ - struct xlnx_dma_dev *xdev = (struct xlnx_dma_dev *)(dev_hndl); - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&xdev->conf.pdev->dev); - - xpdev_device_cleanup(xpdev); - xdev->conf.qsets_max = 0; - xdev->conf.qsets_base = -1; -} -#endif - -#if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE -static void qdma_reset_prepare(struct pci_dev *pdev) -{ - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&pdev->dev); - struct xlnx_dma_dev *xdev = NULL; - - xdev = (struct xlnx_dma_dev *)(xpdev->dev_hndl); - pr_info("%s pdev 0x%p, xdev 0x%p, hndl 0x%lx, qdma%05x.\n", - dev_name(&pdev->dev), pdev, xpdev, xpdev->dev_hndl, xpdev->idx); - - qdma_device_offline(pdev, xpdev->dev_hndl, XDEV_FLR_ACTIVE); - - /* FLR setting is required for Versal Hard IP */ - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - (xdev->version_info.device_type == - QDMA_DEVICE_VERSAL_CPM4)) - qdma_device_flr_quirk_set(pdev, xpdev->dev_hndl); - xpdev_queue_delete_all(xpdev); - xpdev_device_cleanup(xpdev); - xdev->conf.qsets_max = 0; - xdev->conf.qsets_base = -1; - - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - (xdev->version_info.device_type == - QDMA_DEVICE_VERSAL_CPM4)) - qdma_device_flr_quirk_check(pdev, xpdev->dev_hndl); -} - -static void qdma_reset_done(struct pci_dev *pdev) -{ - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&pdev->dev); - - pr_info("%s pdev 0x%p, xdev 0x%p, hndl 0x%lx, qdma%05x.\n", - dev_name(&pdev->dev), pdev, xpdev, xpdev->dev_hndl, xpdev->idx); - qdma_device_online(pdev, xpdev->dev_hndl, XDEV_FLR_ACTIVE); -} - -#elif KERNEL_VERSION(3, 16, 0) <= LINUX_VERSION_CODE -static void qdma_reset_notify(struct pci_dev *pdev, bool prepare) -{ - struct xlnx_pci_dev *xpdev = dev_get_drvdata(&pdev->dev); - struct xlnx_dma_dev *xdev = NULL; - - xdev = (struct xlnx_dma_dev *)(xpdev->dev_hndl); - - pr_info("%s prepare %d, pdev 0x%p, xdev 0x%p, hndl 0x%lx, qdma%05x.\n", - dev_name(&pdev->dev), prepare, pdev, xpdev, xpdev->dev_hndl, - xpdev->idx); - - if (prepare) { - qdma_device_offline(pdev, xpdev->dev_hndl, XDEV_FLR_ACTIVE); - /* FLR setting is not required for 2018.3 IP */ - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - (xdev->version_info.device_type == - QDMA_DEVICE_VERSAL_CPM4)) - qdma_device_flr_quirk_set(pdev, xpdev->dev_hndl); - xpdev_queue_delete_all(xpdev); - xpdev_device_cleanup(xpdev); - xdev->conf.qsets_max = 0; - xdev->conf.qsets_base = -1; - - if ((xdev->version_info.ip_type == QDMA_VERSAL_HARD_IP) && - (xdev->version_info.device_type == - QDMA_DEVICE_VERSAL_CPM4)) - qdma_device_flr_quirk_check(pdev, xpdev->dev_hndl); - } else - qdma_device_online(pdev, xpdev->dev_hndl, XDEV_FLR_ACTIVE); -} -#endif -static const struct pci_error_handlers qdma_err_handler = { - .error_detected = qdma_error_detected, - .slot_reset = qdma_slot_reset, - .resume = qdma_error_resume, -#if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE - .reset_prepare = qdma_reset_prepare, - .reset_done = qdma_reset_done, -#elif KERNEL_VERSION(3, 16, 0) <= LINUX_VERSION_CODE - .reset_notify = qdma_reset_notify, -#endif -}; - -static struct pci_driver pci_driver = { - .name = DRV_MODULE_NAME, - .id_table = pci_ids, - .probe = probe_one, - .remove = remove_one, -/* .shutdown = shutdown_one, */ -#if defined(CONFIG_PCI_IOV) && !defined(__QDMA_VF__) - .sriov_configure = sriov_config, -#endif - .err_handler = &qdma_err_handler, -}; - -static int __init qdma_mod_init(void) -{ - int rv; - - pr_info("%s", version); - - rv = libqdma_init(num_threads, NULL); - if (rv < 0) - return rv; - - rv = xlnx_nl_init(); - if (rv < 0) - return rv; - - rv = qdma_cdev_init(); - if (rv < 0) - return rv; - - return pci_register_driver(&pci_driver); -} - -static void __exit qdma_mod_exit(void) -{ - /* unregister this driver from the PCI bus driver */ - pci_unregister_driver(&pci_driver); - - xlnx_nl_exit(); - - qdma_cdev_cleanup(); - - libqdma_exit(); -} - -module_init(qdma_mod_init); -module_exit(qdma_mod_exit); diff --git a/QDMA/linux-kernel/driver/src/qdma_mod.h b/QDMA/linux-kernel/driver/src/qdma_mod.h deleted file mode 100755 index 3cd04a5..0000000 --- a/QDMA/linux-kernel/driver/src/qdma_mod.h +++ /dev/null @@ -1,238 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_MODULE_H__ -#define __QDMA_MODULE_H__ -/** - * @file - * @brief This file contains the declarations for qdma pcie kernel module - * - */ -#include <linux/types.h> -#include <linux/pci.h> -#include <linux/workqueue.h> -#include <net/genetlink.h> - -#include "libqdma/libqdma_export.h" -#include "cdev.h" - - -/** - * enum qdma_drv_mod_param_type - Indicate the module parameter type - * - * QDMA PF/VF drivers takes module parameters mode and config bar is the same - * format, This enum is unsed to identify the parameter type - * - */ -enum qdma_drv_mod_param_type { - /** @DRV_MODE : Driver mode mod param */ - DRV_MODE, - /** @CONFIG_BAR : Config Bar mod param */ - CONFIG_BAR, - /** @MASTER_PF : Master PF mod param */ - MASTER_PF, -}; - -/** - * @struct - xlnx_qdata - * @brief queue data variables send while read/write request - */ -struct xlnx_qdata { - unsigned long qhndl; /**< Queue handle */ - struct qdma_cdev *xcdev; /**< qdma character device details */ -}; - -#define XNL_EBUFLEN 256 -struct xlnx_nl_work_q_ctrl { - unsigned short qidx; - unsigned short qcnt; - u8 is_qp:1; - u8 q_type:2; -}; - -struct xlnx_nl_work { - struct work_struct work; - struct xlnx_pci_dev *xpdev; - wait_queue_head_t wq; - unsigned int q_start_handled; - unsigned int buflen; - char *buf; - struct xlnx_nl_work_q_ctrl qctrl; - int ret; -}; - -/** - * @struct - xlnx_pci_dev - * @brief xilinx pcie device data members - */ -struct xlnx_pci_dev { - struct list_head list_head; /**< device list */ - struct pci_dev *pdev; /**< pointer to struct pci_dev */ - unsigned long dev_hndl; /**< device handle*/ - struct workqueue_struct *nl_task_wq; /**< netlink request work queue */ - struct qdma_cdev_cb cdev_cb; /**< character device call back data*/ - spinlock_t cdev_lock; /**< character device lock*/ - unsigned int qmax; /**< max number of queues for device*/ - unsigned int idx; /**< device index*/ - void __iomem *user_bar_regs; /**< PCIe AXI Master Lite bar */ - void __iomem *bypass_bar_regs; /**< PCIe AXI Bridge Master bar*/ - struct xlnx_qdata *qdata; /**< queue data*/ -}; - -/*****************************************************************************/ -/** - * xpdev_list_dump() - list the qdma devices - * - * @param[in] buflen: buffer length - * @param[out] buf: - * error message buffer, can be NULL/0 (i.e., optional) - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int xpdev_list_dump(char *buf, int buflen); - -/*****************************************************************************/ -/** - * xpdev_find_by_idx() - qdma pcie kernel module api to - * find the qdma device by index - * - * @param[in] idx: qdma device index - * @param[in] buflen: buffer length - * @param[out] buf: - * error message buffer, can be NULL/0 (i.e., optional) - * - * @return 0: pointer to xlnx_pci_dev - * @return NULL: failure - *****************************************************************************/ -struct xlnx_pci_dev *xpdev_find_by_idx(unsigned int idx, char *buf, - int buflen); - -/*****************************************************************************/ -/** - * xpdev_queue_get() - qdma pcie kernel module api to get a queue information - * - * @param[in] xpdev: pointer to xlnx_pci_dev - * @param[in] qidx: queue index - * @param[in] c2h: flag to indicate the queue direction (c2h/h2c) - * @param[in] check_qhndl: flag for validating the data - * @param[in] ebuflen: buffer length - * @param[out] ebuf: - * error message buffer, can be NULL/0 (i.e., optional) - * - * @return 0: queue information - * @return NULL: failure - *****************************************************************************/ -struct xlnx_qdata *xpdev_queue_get(struct xlnx_pci_dev *xpdev, - unsigned int qidx, u8 q_type, bool check_qhndl, - char *ebuf, int ebuflen); - -/*****************************************************************************/ -/** - * xpdev_queue_add() - qdma pcie kernel module api to add a queue - * - * @param[in] xpdev: pointer to xlnx_pci_dev - * @param[in] qconf: queue configuration - * @param[in] ebuflen: buffer length - * @param[out] ebuf: - * error message buffer, can be NULL/0 (i.e., optional) - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int xpdev_queue_add(struct xlnx_pci_dev *xpdev, struct qdma_queue_conf *qconf, - char *ebuf, int ebuflen); - -/*****************************************************************************/ -/** - * xpdev_queue_delete() - qdma pcie kernel module api to delete a queue - * - * @param[in] xpdev: pointer to xlnx_pci_dev - * @param[in] qidx: queue index - * @param[in] c2h: flag to indicate the queue direction (c2h/h2c) - * @param[in] ebuflen: buffer length - * @param[out] ebuf: - * error message buffer, can be NULL/0 (i.e., optional) - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int xpdev_queue_delete(struct xlnx_pci_dev *xpdev, unsigned int qidx, - u8 q_type, char *ebuf, int ebuflen); - -int xpdev_nl_queue_start(struct xlnx_pci_dev *xpdev, void *nl_info, u8 is_qp, - u8 q_type, unsigned short qidx, unsigned short qcnt); - -/*****************************************************************************/ -/** - * qdma_device_read_user_register() - read AXI Master Lite bar register - * - * @param[in] xpdev: pointer to xlnx_pci_dev - * @param[in] reg_addr: register address - * @param[out] value: pointer to hold the register value - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_device_read_user_register(struct xlnx_pci_dev *xpdev, - u32 reg_addr, u32 *value); - -/*****************************************************************************/ -/** - * qdma_device_write_user_register() - write AXI Master Lite bar register - * - * @param[in] xpdev: pointer to xlnx_pci_dev - * @param[in] reg_addr: register address - * @param[in] value: register value to be written - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_device_write_user_register(struct xlnx_pci_dev *xpdev, - u32 reg_addr, u32 value); - -/*****************************************************************************/ -/** - * qdma_device_read_bypass_register() - read AXI Bridge Master bar register - * - * @param[in] xpdev: pointer to xlnx_pci_dev - * @param[in] reg_addr: register address - * @param[out] value: pointer to hold the register value - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_device_read_bypass_register(struct xlnx_pci_dev *xpdev, - u32 reg_addr, u32 *value); - -/*****************************************************************************/ -/** - * qdma_device_write_bypass_register() - write AXI Bridge Master bar register - * - * @param[in] xpdev: pointer to xlnx_pci_dev - * @param[in] reg_addr: register address - * @param[in] value: register value to be written - * - * @return 0: success - * @return <0: failure - *****************************************************************************/ -int qdma_device_write_bypass_register(struct xlnx_pci_dev *xpdev, - u32 reg_addr, u32 value); - -#endif /* ifndef __QDMA_MODULE_H__ */ diff --git a/QDMA/linux-kernel/driver/src/version.h b/QDMA/linux-kernel/driver/src/version.h deleted file mode 100755 index 5727428..0000000 --- a/QDMA/linux-kernel/driver/src/version.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of the Xilinx DMA IP Core driver for Linux - * - * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. - * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __QDMA_VERSION_H__ -#define __QDMA_VERSION_H__ - -#include "libqdma/version.h" - -#ifdef __QDMA_VF__ -#define DRV_MODULE_NAME "qdma-vf" -#define DRV_MODULE_DESC "Xilinx QDMA VF Reference Driver" -#else -#define DRV_MODULE_NAME "qdma-pf" -#define DRV_MODULE_DESC "Xilinx QDMA PF Reference Driver" -#endif /* #ifdef __QDMA_VF__ */ -#define DRV_MODULE_RELDATE "Sept 2023" - -#define DRV_MOD_MAJOR 2023 -#define DRV_MOD_MINOR 2 -#define DRV_MOD_PATCHLEVEL 0 - -#define DRV_MODULE_VERSION \ - __stringify(DRV_MOD_MAJOR) "." \ - __stringify(DRV_MOD_MINOR) "." \ - __stringify(DRV_MOD_PATCHLEVEL) "." \ - __stringify(LIBQDMA_VERSION_PATCH) "." \ - -#define DRV_MOD_VERSION_NUMBER \ - ((DRV_MOD_MAJOR)*10000 + (DRV_MOD_MINOR)*1000 + DRV_MOD_PATCHLEVEL) - -#endif /* ifndef __QDMA_VERSION_H__ */ diff --git a/QDMA/linux-kernel/license.txt b/QDMA/linux-kernel/license.txt deleted file mode 100755 index 8eac7fb..0000000 --- a/QDMA/linux-kernel/license.txt +++ /dev/null @@ -1,14 +0,0 @@ -/* - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - diff --git a/QDMA/linux-kernel/scripts/datafile_16bit_pattern.bin b/QDMA/linux-kernel/scripts/datafile_16bit_pattern.bin deleted file mode 100755 index 1b50cdd57bcc0fb5c0e6ae027560cd03062b5434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262144 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≷E}*%fhPh_1)d2! z7kDA?Qs9-qYk@ZcZw1~7ychT&@KNBCz-NIk0$&Bb349m$A@Eb+m%wj<KLURR{t5gS zU=U;!WD;Z+WD#T)WD{f;<PhW(<Pzi-<Pqc*<P+o<6c7{?6cQ8`6cH2^6cZE|ln|5@ zloFH{lo6B_loON}R1j1YR1#DcR1s7aR1;Je)DYAZ)DqMd)DhGb)DzSfG!QftG!irx zG!ZlvG!rxzv=Fouv=X!yv=Ouwv=g)!bP#kDbP{wHbP;qFbQ5$J^bqtE^b+(I^bzzG z^b_<K3=j+y3=#|$3=s?!3=<3&j1Y_zj1r6%j1i0#j1!C(Ob|>IOcG2MOc6{KOcP8O z%n-~J%o5BN%n{5L%oEHPED$UdED|ghED<afEE6mjtPrdetP-pitP!jgtP`vkY!GY| zY!Yl1Y!Pe~Y!hr3>=5h}>=Nu2>=Eo0>=W!4oFF(+aFXC;!6|}M1*Zv47n~tDQ*f5x zY{5B#a|P!K&KF!DxKMDB;9|igf=dOL2`(30A-Ga-mEdZ@HG*pe*9oo{+#tA7aFgI> z!7YMY1-A)q7u+GZQ*f8yZoxf*dj<Ci?iV~Dcu??=;9<cdf=3092_6?bA$U^ol;CN> zGlFLY&k3FvydZc{@RHzV!7GAS1+NKS7rY^OQ}CAHZNWQ&cLnbW-WPlz_)zeX;A6oj zf=>mX2|gEmA^1}8mEdc^H-c{k-wD1K{2=&I@RQ(Y!7qYe1-}V?7yKdkQ}CDIZ^1u; ze+B;u{ug8rViaN$VisZ%VijT&Vi)2N;uPW%;uhi&;uYc(;ujJS5)={=5*88>5)~2? z5*LyXk`$5>k`|H?k`<B@k{41CQWR1WQWjDXQWa7YQWw$?(iGAX(iYMY(iPGZ(ibui zG88frG8QrsG8HltG8eKCvJ|osvKF!tvK6uuvKMj?aujkBau#wCausqDau@Ot@)YtC z@)q(D@)hzE@)rsa3KR+w3Kj|x3Ka?y3KxnHiWG_xiWZ6yiWQ0ziWf={N)$>GN)}2H zN)<{IN*Bry$`r~H$`;BI$`#5J$`>jSDikUbDi$gcDitadDi^8{suZdcsurpdsuije zsuyYyY7}Y`Y8Gk{Y87e|Y8UDd>J;h{>K5t|>J{n}>KB?IG*M`h&}5-0LQ{pN2~8K8 zAv9BHme6dWIYM)V<_XOgS|GGgXpzujp(R2~g_a2|7g`~-QfQUXYN0hkYlYSctryxL zv{7i2&}N}6LR*El32hhJA+%Fym(XsZJwkhh_6hA5Iv{jV=#bE1p(8>^g^mdw7djzy zQs|V>X`wShXNArQofo<wbW!M%&}E@3LRW>Z30)VuA#_vdme6gXJ3@Db?g`x&dLZ;r z=#kK4p(jF5g`NpL7kVM|Qs|Y?YoRwnZ-w3oy%+i*^ik-O&}X49LSKcx34Is(A@oz| zm(XvaKSF<n{t5jTVi0B&W)fx=W)Wr;W)o%?<`Cu-<`U)><`L!<<`d=@77!K`77`W~ z77-Q|784d1mJpT{mJ*g0mJyZ}mJ^m2RuEPcRuWbgRuNVeRufhi))3Yd))Lkh))Cef z))UqjHV`%xHWD@#HW4-zHWM}%wh*=ywi31$wh^`!wiC7&b`W+Hb`o|Lb`f?Jb`y3N z_7L_I_7e6M_7V0K_7nCO4iF9$4iXL)4iOF&4igR+ju4I%juMU*juDO(juVa-P7qEM zP7+QQP7zKOP7_WS&JfNN&JxZR&JoTP&J)fTE)XshE)p&lE)gyjE)y;nt`M#it`e>m zt`V*kt`n{oZV+x1ZW3-5ZV_%3ZWC@7?hx)2?h@`6?h)=4?i218o*+C?c#`mB;VHsX zg{KKm7oH(JQ+Sr}Y~eY=bA{&#&lg@Gyij<N@M7U5!b^ph2`?93A-qy}mGEleHNtC! z*9or|-XOeDc$4sE;Vr^jg|`WB7v3SfQ+Su~Zs9$`dxiH2?-xEGd{Fq1@L}O2!bgRV z2_F|eA$(H!l<;ZcGs0(u&k3Iwz94*2_>%Bt;VZ&dg|7);7rr5UQ}~wfZQ(n@cZKf> z-xq!${80Fj@MGa8!cT>t2|pKpA^cMKmGEofH^Og)-wD4L{viBO_>=Hw;V;5pg}(`Z z7ycpqQ}~zgZ{a_}e}(@E{}*NuVH9B!VHRN#VHIH$VHe>L;S}K#;TGW$;T7Q%;TI7Q z5fl*;5f%{<5fu>=5f_mVkra^<krt5=krj~>krz=AQ4~=UQ5I1VQ58`WQ5Vq=(G<}V z(H7AW(G}4X(HAigF%&TpF%~fqF%>ZrF&D8Au@tcqu@<oru@$isu@`X=aTIY9aTakA zaTReBaToCr@f7hA@fPtB@fGnC@fQgY2^0wu2^I+v2^9$w2^WbFi4=(vi57_wi4}<x zi5E!_Nfb#ENft>FNfk*GNf*fw$rQ;F$ri~G$rZ^H$rmXQDHJIZDHbUaDHSObDHo{_ zsT8RasTQdbsTHXcsTXMwX%uM^X%=Y_X%%S`X&31b=@jV_=@#h`=@sb{=@*$GGErob z$YhZzB2z`CiA)!nAu>~BmdI?8IU;jK=84P~Ss=1dWRb{XktHHaMV5&y7g-^)Qe>6L zYLPV}Yem+HtQXlJvQcD{$Yzl(B3nhaiEJ0yA+l3sm&k6BJtBKW_KEBlIUsUS<dDc= zks~5UMUIIa7datvQsk7#X^}G`XGPA5oENzua#7@x$Yqf$B3DJOiCh=CA#zjXmdI_9 zJ0f>Q?upzNc_8vo<dMi@ktZTgMV^T~7kMG_QskA$Ymql1Z$;jTychW(@=@fI$Y+r+ zB40(miF_CNA@Wn?m&k9CKO%oc{)zk-VGv~$WfEl;Wf5f+WfNr=<q+i*<r3u<<q_o- z<rC!>6%Z8^6%rK|6%iE`6%!Q~l@OH_l@gT}l@XN{l@pa0RS;DaRT5PeRS{JcRTEVg z)ezMb)e_Yf)e+Sd)f3ehH4rrvH4-%zH4!xxH4`-#wGg!wwGy=!wGp)ywG*`$br5wF zbrN+JbrE$HbrW?L^$_(G^%C_K^%3<I^%M0M4G;|!4H69&4G|3$4HFF)jS!6#jS`I( zjS-C%jT4O*O%P2KO%hEOO%Y8MO%qKQ%@EBL%@WNP%@NHN%@fTREf6gfEfOsjEfFmh zEfXyltq`pgtrD#ktr4vitrM*mZ4hk~Z4zx3Z4qr1Z4+%5?GWu0?Go)4?Gf!2?Gx=6 zogg|<bdu;~(J7)+MW=~Q7o8zGQ*@T-Y|%NQb4BNg&KF%Ex=?hH=wi_&qDw`Wi7ppi zA-Ym@mFQ~GHKJ=p*NLtd-5|PAbd%_2(Ji7|MYoA=7u_McQ*@W;ZqYrWdqww&?iW2E zdQkL`=wZ<#qDMuKi5?d{A$n5ul;~;EGooij&xxKFy&!r~^pfah(JP`?MX!lo7rh~R zQ}mYTZP7cTcSY}s-WPo!`cU+d=ws0*qEAJii9Q#7A^KAEmFR2HH==Jv--*5#{UG{L z^pogk(J!K3MZbxD7yTjnQ}mbUZ_z)Ze?|X^{ugBsV-#Z&V-{l(V-;f)V;AEP;}qi( z;}+u);}zo*;};VU6BH8?6BZK@6BQE^6Bm;ZlN6H@lNOT^lNFN_lNVDEQxsDYQx;PZ zQx#JaQy0?^(-hMZ(-zYa(-qSb(-$)kGZZrtGZr%uGZixvGZ(WEvlO!uvlg=vvlX)w zvlnv^a};wDa~5+Ea}{$Fa~Jav^Az(E^A__F^A+<G^A`&c3ls|y3l<9z3l$3!3m1zJ zixi6zix!I!ixrC#ix*1}OB72IOBPEJOBG8KOBc%!%M{BJ%NENK%N5HL%NHvUD-<gd zD;6seD-|mfD;KK}s}!pes}`#fs}-vgs~2k!YZPk|YZhw}YZYq~YZvPf>lEt}>lW(~ z>lN!0>ld3KHc@Pn*krLOVpGMYiA@)qAvRNNme_2uIbw6g=84T0TOhVjY?0Vvu_a<l z#g>UJ7h55=Qf!sjYOyt9YsJ=ytry!Mwoz=8*k-XUVq3+wiES6#A+}R&m)LHxJz{&s z_KEEmJ0NyY?2y=Du_Izf#g2&`7ds(#QtXu2X|Xe6XT{Emofo?xc2Vq-*k!RRVpqkk ziCq`FA$C*jme_5vJ7Ram?up$Odm#2u?2*`Gu_t0r#h!^h7keT0QtXx3Yq2+CZ^hn; zy%+l+_EGGU*k`dXVqe9+iG3IQA@)=3m)LKyKVpBy{)zn;V-RN)XA)-?XAx%=XA@@^ z=Md)<=Mv`@=Mm=>=M(1_7Z4W|7ZMj17ZDc~7ZVp3mk^f}mlBs2ml2m0mlKy4R}fbe zR}xniR}ohgR})tk*AUkf*Amwj*Adqh*Av$lHxM@zHxf4%HxV}#HxoA(w-C1!w-UD& zw-L7$w-dJ)cMx|JcM^9NcM*3LcN2FP_Yn6K_Y(IO_YwCM_Y?OQ4-gL&4-yX+4-pR) z4-*d;j}VU(j}ng-j}ea*j}wm<PY_QOPZCcSPZ3WQPZLiU&k)ZP&l1lT&k@fR&lArV zFAy&jFA^^nFA*;lFB2~puMn>kuM)2ouMw{muM@8qZxC-3ZxU}7ZxL@5Zxe49?-1`4 z?-K78?-B16?-TDApCCR_e3JNN@hRd{#ixl+7oQ<MQ+$^AZ1FkbbH(S0&lg`HzEFIT z_+s%T;!DMsi7yvlA-+<4mH2A$HR5Z<*NLwe-yptGe3STQ@h#$8#kYxX7vCYiQ+${B zZt*?hd&T#O?-xHHeo*|7_+jxQ;zz}gi60j~A%0T)l=x}!Gva5(&xxNGzaV~5{F3-( z@hjq2#jlB97r!BXQ~Z|rZSgzecg63C-xq%%{!sjp_+#-W;!nk&i9Z*AA^uYQmH2D% zH{x%_--*8${~-QR{FC@+@h{?E#lMMv7ylvtQ~a0sZ}C6kf5rca{}*SFV3c5zV3uH! zV3lB#V3**K;FRE!;FjQ#;FaK$;Fl1P5R?#-5S9>;5S0*<5SNgUkd%;;kd}~<kd=^= zke5)9P?S)TP?k`UP?b=VP?yk<(3H@U(3a4V(3Q}W(3dcfFqANoFqSZpFqJTqFqg29 zu#~Wpu$Hiqu$8cru$OR<aFlS8aF%e9aFuYAaF_6q@Rab9@RsnA@RjhB@RtaX2$Tqt z2$l$u2$cwv2$zVEh?Izuh?a<vh?R(wh?hu^NR&vDNR~*ENR>#FNSDZv$dt&E$d<^F z$d$;G$d@RPD3mCYD3&OZD3vIaD3_>^sFbLZsFtXasFkRbsF!GvXq0G@XqIS^Xq9M_ zXqV`a=#=P^=$7b_=#}V`=$DuvF;QZY#AJyn5>q9nNlcfRAu&^8mc(p{ITCXv=1I(# zSRk=bVv)pRi6s(CC6-AnmslaOQeu_FYKb)xYbDl6te4mzu~A}^#Ab;t5?dv<No<$c zA+b|pm&9&~Jra8*_DSrQI3RIQ;*i8)i6at6C5}lPmpCDDQsR`vX^AruXC=-_oR_#D zaZ%!u#AS&q5?3XzNnDq>A#qdUmc(s|I}&##?n&I2cp&jm;*rE-i6;_IC7ww<mv|xZ zQsR}wYl$}!ZzbMIyqEYO@loQF#Ak^w5?>|0Nqm?1A@Nh<m&9+0KN5c>{z?3oV31^# zWRhf-WRYZ*WRql<<dEc)<dWo;<dNi+<dfu=6p$2@6p|E{6p<8_6q6K}l#rB^l#-N| zl#!H`l#`T~RFG7ZRFYJdRFPDbRFhPf)R5Ga)RNSe)REMc)RWYgG>|luG?FxyG?6rw zG?O%!w2-uvw34)zw2`!xw3D=#bdYqEbdq$IbdhwGbdz+K^pNzF^pf<J^pW(H^po_L z43G?z43Z3%43P|#43i9(jF60!jFOC&jFF6$jFXI)Opr{JOp;8NOp#2LOp{EP%#h5K z%#zHO%#qBM%#+NQERZaeERrmiERiggER!sktdOjftdgvjtdXphtdp#lY>;e}Y?5r2 zY>{l0Y?Ex4?2zn~?2_!3?2+u1?33)5oFF+-a+2g^$tjXkC8tSFmz*IvQ*xH%Y{@y2 zb0z0V&X-&uxlnSE<YLJsl1n9*NiLUMA-Pg=mE>y4HIi#3*GaCI+#tD8a+Bm{$t{vw zCAUd#m)s$_Q*xK&Zpl58dnNZt?w33uc~J6@<YCDpl1C+vNgkIxA$d~rl;mm2Gm>W| z&q<z_ydZf|@{;6b$t#jqC9g?dm%Jf)Q}UMNZOJ>5cO~yh-j{qJ`B3ta<YUPvl20X{ zNj{f+A^B4BmE>#5H<E89-$}lg{2=*J@{{Ce$uE*$CBI32m;535Q}UPOZ^=KBe<lA( z{+DEsVw7T%VwPf&VwGZ(Vwd8O;*{c&;+Eo(;+5i);+GPT5|k2>5|$E?5|t8@5|@&Y zl9ZB?l9rN@l9iH^l9y7DQj}7XQkGJYQk7DZQkT+@(v;GY(w5SZ(v{Ma(w8!jGL$ls zGL|xtGL<ruGMBQDvXrutvX-)uvX!!vvX^p@a+GqCa+Y$Da+PwEa+mUu@|5zD@|N<E z@|E(F@|Oyb3X}?x3YH3y3Y7|z3YUtIij<0yik6Czij|6!ikC`|N|Z{HN|s8IN|j2J zN|(xz%9P5I%9hHJ%9YBK%9kpTDwHacDwZmdDwQgeDwnE|s+6jds+Oves+Fpfs+Vez zYLse{YL;q|YL#k}YM1Je>Xhn|>Xzz}>Xqt~>X(`zHBoAk)MTkCQd6a-NlllUAvIHK zmeg#iIZ|__=1I+$S|GJhYLV1psU=cNrItx8ms%mUQfigdYN<6+Yo*pnt(V#$wNYx5 z)MlwIQd_0ANo|+fA+=L#m(*^lJyLt6_DSuRIv{mW>X6i7sUuQHrH)A*mpUPJQtFh{ zX{j?(XQj?botL^Gby4b))McqFQdgy}NnMw^A$3#gmeg&jJ5qP0?n&L3dLZ>s>XFoA zsV7oTrJhMWmwF-fQtFk|YpFL<Z>8Qzy_fnR^-=1R)Mu$LQeUOMNqv|4A@x)0m(*{m zKT?0C{z?6pVvuH(W|C%>W|3x<W|L-@=8)!;=91=?=8@)==9A`^7LXQ{7Lpd07LgW} z7Lyj2mXMZ|mXem1mXVf~mXns3R*+VdR+3hhR*_bfR+Cnj){xee){@qi){)kg)|1wk zHjp-yHj*}$Hjy@!Hj_4&wve`zwvx7%wvo1#wv)D(c93?Ic9M3Mc9C|Kc9V9O_K^0J z_LBCN_L26L_LKIP4v-F%4w4R*4v`L(4wDX-j*yO&j*^a+j**U)j+2g;PLNKNPLfWR zPLWQPPLocT&XCTO&XUfS&XLZQ&XdlUE|4yiE|M;mE|D&kE|V^ou8^*ju9B{nu92>l zu9L2pZjf%2Zjx@6Zjo-4Zj)}8?vU=3?vn17?vd`5?vw79o*+F@dXn^H=_%4vrKd?x zm!2U#Q+k&4Z0R}DbEW4=&zD{xy-<3Q^kV5H(o3b6NiUaPA-z(1mGo-qHPUOP*GaFJ z-XOhEdXw~K=`GS*rMF3Mm);@0Q+k*5Zs|SJd!_eD@0UIxeNg(4^kL~E(nqC_NgtO! zA$?N%l=NxoGty_J&q<$`z94;3`jYfz=_}G#rLRd}m%br=Q~H+lZRtDGcct%1-<N(M z{ZRUm^keBK(odzINk5l<A^lSNmGo=rH_~sV-$}oh{viEP`jhl$=`Ye>rN2pkm;NFB zQ~H<mZ|OhMf2IFP|CeTvVU%H#VU}T$VU=N%VVB{M;gsQ$;g;c%;g#W&;g=DR5tI>< z5tb2=5tR{>5tosWk(7~=k(QB>k(H5?k(W`BQIt`VQI=7WQI%1XQJ2w>(Uj4W(U#GX z(UsAY(U&ohF_bZqF_tlrF_kfsF_*EBv6Qirv6iusv6Zotv6pd>ag=eAah7qBag}kC zahLIs@s#nB@s{zC@s;tD@s|mZ36u$v36=?w36%+x373hGiIj<wiI$0xiIs_yiI+)` zNt8*FNtQ{GNtH>HNtelx$&|^G$(G5H$(6~I$(JdRDU>OaDV8abDU~UcDVM2`sg$Xb zsg|jcsg<ddsh4SxX_RS_X_je`X_aY{X_x7c>6Gb`>6Yn{>6Ph|>6e)xGf`%e%w(A< zGE-%y$xN4-Av05EmdtFKIWlu)=E=;LSs=4eW|7QdnI$qyWtPb-msugRQf8IRYMC`M zYh~8Ste4p!vr%S~%x0M_GFxS~$!wR|A+u9vm&|UNJu-V`_Q~v*IUsXT=8()`nIkes zWsb=lmpLJGQs$J*X_+%JXJyXGoR_&Eb5Z7!%w?G?GFN4;$y}GYA#+pamdtILJ2H1= z?#bMjc_8yp=8?=}nI|$&WuD1Amw6%cQs$M+YneAPZ)M)eyqEbP^HJuL%x9S|GGArB z$$XdjA@ft_m&|XOKQe!1{>l88VUT5%Ws+r<Wszl-Ws_x><&fo+<&x!=<&ou;<&))? z6_6E_6_OQ}6_FK{6_XX0m5`N`m6DZ~m64T|m6Mg1RghJbRgzVfRgqPdRg+bh)sWSc z)soeg)sfYe)sxkiHIOxwHIg-!HIX%yHIp@$wUD)xwUV`#wUM=zwUf1%b&z$Gb&_?K zb&++Ib(3|M^^o<H^^*0L^^x_J^^^6N4Ui3#4U!F(4Ur9%4U-L*jgXC$jgpO)jggI& zjgyU+O^{8LO_EKPO_5ENO_NQR&5+HM&63TQ&5_NO&6CZSEs!mgEs`ykEs-siEt4&m zt&pvht&**lt&y#jt&^>nZIEr0ZIW%4ZINx2ZIf-6?U3!1?UL=5?UC)3?UU`7ogh0= zc9QI5*(tJ9Wv9tbmz^OyQ+Af@Y}q-ob7kkr&X-*vyHIwK>|)s^vP)%`$u5^&A-hs` zmF#NSHL`1E*U7Gz-5|SBc9ZO8*)6hLWw*(0m)#+|Q+Ai^ZrMGudu8{@?w36vdr<a} z>|xm>vPWf)$sU(IA$wBxl<aBQGqPu8&&i&by&!v0_LA&n*(<VFWv|Izm%Sl-Q}&kZ zZP`1rcV+L%-j{tK`%w0g>|@y{vQK57$v&5TA^TGHmF#QTH?nVK-^sq0{UG~M_LJ;q z*)OtRWxvUOm;E98Q}&naZ`nVxe`Wv4{+DHtW0Yf(W0qr)W0hl*W0&KQ<CNo)<Cf!* z<CWu+<ChbV6O<E@6P6Q^6O|K_6PJ^ala!N^la`Z_la-T`lb2JFQ<PJZQ<hVaQ<YPb zQ<u|_)0ESa)0Web)0NYc)0Z=lGn6xuGnO-vGnF%wGnccFvy`)vvzD`wvz4=xvzK#_ zbCh$EbCz?FbCq+GbC>gw^OW<F^Op0G^Of_H^Op;d3zQ3z3ziF!3zZ9#3zv(Ki<FC! zi<XO#i<OI$i<e7~OO#8JOO{KKOO;ELOP9-#%aqHK%a+TL%azNM%a<#VE0imeE0!yf zE0rsgE0?Q~tCXvftCp*gtCg#htCwq#Ym{q}YnE$~Yn5x0YnSVg>y+z~>z3=0>y_)1 z>zA7#H&Jeq++?{aa#Q7|$xWA=AvaTQmfUQ)IdXI5=E=>MTOhYkZjsz#xg~N-<(A1U zms=sXQf`&pYPmIXYvtC-t(V&%w^44B+-A8ga$DuL$!(Y0A-7X*m)vf-J#u^H_Q~y+ zJ0N#Z?vUJJxg&B%<&Mc6mpdVMQtp)8X}L3UXXVbxotL{HcTw(=+-12da#!W9$z7Mb zA$L>mmfUT*J92mB?#bPkdm#5v?vdPMxhHZ@<(|nsmwO@iQtp-9Yq>XaZ{^;}y_fqS z_fhVX+-JEja$n`X$$gjmA@@`6m)vi;KXQNN{>lB9V~}T*XOd@@XOU->XOm}_=aA== z=aT1^=aJ`?=ac7`7myc}7m^p27m*j07n2v4mynl~my(y3myws1my?&5SCChfSCUtj zSCLnhSCdzl*O1qg*OJ$k*OAwi*OS+mH;^}!H<CA&H<34$H<LG)w~)7#x01J(w~@D% zx0AP*caV3KcanFOcae9McawLQ_mKCL_mcOP_mTIN_mlUR50DR(50Vd-50MX*50ej< zkC2a)kCKm;kCBg+kCTs=PmoWPPm)iTPmxcRPm@oV&ydfQ&yvrU&ymlS&y&xWFOV;k zFOn~oFOe^mFOx5quaK{luad8puaU2nuamErZ;)@4Z<248Z;@}6Z<BAA?~w15?~?D9 z?~(77@00JBpCCU`ev<rT`6=>K<)_I{m!Ba&Q+}5GZ239zbLHpB&zD~yzfgXW{9^ef z@=N8H$uE~*A-__7mHcY?HS%la*U7J!-ypwHev|xW`7QEW<+sUim){}3Q+}8HZuvd( zd*%1Z@0ULye^CCA{9*Yc@<-*5$sd<LA%9Z-l>BM=GxBHU&&i*czaW26{*wG<`782Q z<*&(Km%kx@Q~s9xZTUO$cjfQN-<N+N|4{ys{A2ki@=xWT$v>BWA^%eTmHcb@H}Y@g z-^st1{~-TS{*(M?`7iQc<-f^)m;WLEQ~sCyZ}~s+f93zl|CeV_U{qjIU{+vJU{zpK zU{~N!;8fsJ;8x&K;8oyL;8ze(5L6IS5LOUT5LFOU5Lb{;kW`RTkXDdUkX4XVkXKMp zP*hM-P*zY;P*qS<P*>1U&{WV;&{oh<&{fb=&{r@}FjO#7Fjg>8FjX*9FjufpuvD;8 zuvV~9uvM^Auvc(Ua8z(oa8__pa8+<qa98k9@Ko?p@K*3q@Kx|r@K*>>2vi7C2v!JD z2vrDE2v>+uh*XGDh*pSEh*gMFh*wBZNK{BtNLENuNL5HvNLR>E$W+Ku$X3Wv$W_Qw z$X6&(C{!p?C{`#@C{-v^C|9UZs8py@s8*;^s8y&_s8?uEXjEuYXjW)ZXjN!aXjkY^ z=v3%Z=vL@a=vC-b=vSDaFi~NW!eoUh3R4xPDNI+Gp)gZnmcnd>ISO+X<|)iqSfH>_ zVUfaOg(V706_zP1S6HF2Qel<CYK1ilYZcZhtXJ5euu)-?!e)gn3R@MnDQs8Rp|De7 zm%?s^Jqmjj_9^UFIG}J);gG^%g(C__6^<z!S2&??QsI=sX@xTiXBEyVoL9J@a8cos z!exak3Re}bDO^{$p>R{-mcng?I|_Fd?kU_?c%bl5;gP~)g(nJ66`m<PS9qcDQsI@t zYlSxoZx!AtyjS?3@KNED!e@mq3SSkzDSTJ>q3~1Tm%?v_KMH>p{we%dU{GXKWKv{S zWKm>QWK(2U<WS^P<Wl5T<Wb~R<WuBV6i^gY6jBsc6j2ma6jKyelu(pZlv0#dlu?vb zlv9*fR8Uk@R8mw{R8dq_R8v$})KJt^)Kb(|)KSz`)Kk<~G*C2DG*UEHG*L8FG*dKJ zv{1BEv{JNIv{AHGv{STKbWn6ubW(IybWwCwbW?O!^icFv^iuRz^ilLx^i%X#3{VVI z3{nhM3{ebK3{wnOj8KeJj8cqNj8TkLj8lwPOi)ZzOj1l%Oi@f#OjAr(%uvi!%u>u& z%u&o$%u~!)EKn>|EK)31EKw{~EK@93tWc~}tWvC2tWm60tW&I4Y*1`eY*K7iY*B1g zY*TDk>`?4f>{9Gj>{0Ah>{IMloS-;SagyR>#VLwY6{jgqSDc|ZQ*oB!Y{fZ>a~0<) z&R1NZxKMGC;$p=mic1xjDK1xBp}10UmEvl}HHvE$*D0=7+@QEoag*X^#Vv|k6}KsF zSKOhvQ*oE#ZpA%{dlmO7?pHjZcu?_>;$g)jiboZXDIQlmp?Fg9l;UZ{Gm2*w&ncc) zyr6hd@si?Y#Vd+e6|X5?SG=KkQ}LGKZN)o^cNOm`-dB8}_)zhY;$y`picb}vDLz+x zq4-kqmEvo~H;Qi+-zmOV{Gj+z@sr|b#V?9q6~8HdSNx&)Q}LJLZ^b`~e--~J{#RsB zVpL*MVpd{NVpU>OVprl&;#A^N;#T5O;#J~P;#U$-5>ygW5>^sX5>*mY5?7K?l2npX zl2(#Yl2wvZl2=ktQdCk>QdUw?QdLq@QdiPY(p1t?(pJ(@(pAz^(pNH2GE_2BGFCEC zGF38DGFP%tvQ)BCvR1NDvQ@HEvR86Ya#V6sa#nIta#eCua#!+D@>KFt@>cRu@>TLv z@>dE_3RDVG3RVhH3RMbI3Rj9yid2eHidKqIidBkJidRZdN>oZxN>)lyN>xfzN>|EI z%2diy%2vuz%2mo!%2z5-DpV>`Dpo2{Dpe{|Dp#sds#K~{s#dB|s#U5}s#j`IYE)`c zYF27dYE^1eYFFw|>Qw4d>Q?Ge>Q(Af>Q|beG*M}i(qyG6N>i1lDNR?Jp)^xzmeOpc zIZAVt<|)lrTA;L0X_3-mr6o#Bm6j<jS6ZR8QfZaaYNa(wYn9e1tykKhv{7l3(q^SC zN?Vn-DQ#EUp|n$Jm(p&fJxY6(_9^XGI-qn=>5$T4r6Wp5m5wPLS303|Qt6b^X{9qt zXO+$=omaY`bW!P&(q*M9N>`PxDP32(p>$K}meOsdJ4$zz?kU|@dZ6@B>5<Z7r6)>H zm7Xa*S9+oJQt6e_Yo#|zZ<XFDy;u66^ik=P(r2YFN?(<}DScP^q4ZPfm(p*gKT3a< z{we)eVo+vOW>RKWW>IEUW>aQY=1}HT=2GTX=27NV=2PZZ7El&c7E%^g7Eu;e7E=~i zmQa>dmQt2hmQj{fmQ$8jR!~+{R#H}0R#8?}R#R42)=<_|)>771)=}0~)>GD3Hc&QH zHc~cLHc>WJHd8iNwotZIwo<lMwo$fKwo|rOc2IUyc2ag$c2Ra!c2jm&_E7dz_EPp% z_EGj#_EYv(4p0tM4pI(Q4p9zO4pR<Sj!=$Nj#7?Rj!}+Pj#G|TPEbx%PEt-*PEk%( zPE$@-&QQ)&&Qi`+&QZ=)&Qs1;E>JF1E>bR5E>SL3E>kX7u28O2u2Qa6u2HU4u2Zg8 zZcuJiZc=VmZc%PkZc}bo?ojSj?o#en?osYl?o;kpo}fHYd6M#E<tfTjm8U6BSDv9f zQ+by1Y~?x1bCu^Q&sSccyij?O@?zyB%1f1(DKA%Ep}bOgmGWxkHOgz1*D0@8-k`iu zd6V*H<t@rvmA5HxSKgt#Q+b#2Zsk47dzJSo?^iycd{Ft2@?qs8%14!tDIZrpp?p&L zl=5liGs<U`&ncf*zMy<j`I7Qw<txfpm9HsZSH7WqQ~8$iZRI=4ca`rc-&cO1{80Ik z@?+&E%1@P_DL+?!q5M+$mGW!lH_C67-zmRW{-FF(`IGWz<uA%#mA@%}SN@^=Q~8(j zZ{<JAf0h3!|5s*EVN_vKVOC*LVO3#MVOQZ$;Z)&L;a1^M;Z@;N;a3q*5mXUU5mpgV z5mgaW5m%8=kyMdVkyepWkyVjXkylYrQB+Y<QC3k=QB_e>QCHDW(Nxh=(N@t>(N)n? z(N{50F;p>9F;+2AF;y{BF;}rru~e~Au~xBBu~o5Cu~%_Waa3_qaaM6raaD0saaZwB z@l^3r@mBFs@m29t@mC2@2~-JE304VF2~`PG30H|wiBySFiB^eGiB*YHiC0NbNmNNv zNmfZwNmWTxNmt2G$yCWw$yUix$yLcy$yX^*DO4#^DOM>_DOD*`DOagbsZ^;_saB~` zsa2^{saI)GX;f)aX;x`bX;o=cX;<k`=~U@b=~n4c=~d}d=~tPcGErrc%4C%(DpOUa zsZ3Xyp)yltmdb3EIVy8i=BdnAS)j5|Ws%Bal_e@mRhFqNS6QL5Qe~COYLzuAYgN{% ztXJ8fvQcG|%4U@<DqB^ysccu-p|VqDm&$IHJt})u_NnYwIiPY-<&er@l_M%gRgS3~ zS2>|_QstD&X_Yf7XI0LroL9M^a#7`y%4L-+Dpysmsa#jNp>k8@mdb6FJ1Tco?y1~Y zd7$!8<&nx`l_x4sRi3FlS9ziGQstG(Yn3-DZ&lu@yjS_4@=@iJ%4d}?DqmH;seD)Y zq4HDZm&$LIKPrD!{;B*|VNhjMWm08UWl?2SWm9EW<xu5R<x=HV<x%BT<x}NX6;Ksa z6;c&e6;Tyc6;l;gl~9#bl~R>fl~I*dl~a{hRZvw_RZ>+}RZ&${RZ~@0)lk(`)l$_~ z)lt<|)l=11HBdEFHBvQJHBmKHHB&WLwNSNGwNkZKwNbTIwNtfMbx?Iwby9U!by0Oy zbyIa$^-%Rx^-}d#^-=Xz^;7j%4NwhK4N?tO4N(nM4O0zQjZlqLjZ%$PjZuwNjZ=+R zO;Al#O;Sx(O;Jr%O;b%*%}~u$%~H))%~8!&%~Q=+El@2~EmAF3Em191EmJL5tx&C0 ztx~O4tx>I2ty8U6ZBT7gZBlJkZBcDiZBuPm?NIGh?NaSl?NRMj?NjYnouE2Vb&~32 z)hVh|Ri~*=SDm3cQ+1Z=Y}Glcb5-Z5&R1Qax=?kI>SEO;s!LUusV-Mtp}JCamFjBM zHL7b>*Qu^o-JrTrb(895)h()9Rkx{bSKXnyQ+1c>Zq+@idsX+T?pHmadQkO{>S5I* zsz+6isUBB7p?XsFl<H~KGpc7*	hQy`Xwg^^)pk)hnu3Rj;XDSG}QnQ}veWZPh!f zcUAAH-dBB~`cU<e>SNU>s!vs)sXkYIq54wwmFjENH>z({->JS={h<0$^^@vn)i0`F zRllizSN);-Q}vhXZ`D7le^vjf{#RvCV^m{OV^(8PV^w2QV^`x)<5c5P<5uHQ<5lBR z<5v?<6I2sY6IK&Z6IBya6IYW^lT?#ZlU9>alU0*blUGwvQ&dw@Q&v+^Q&m$_Q&-ba z(^S(^(^k__(^b<`(^oT4GgLEDGgdQEGgUKFGgq@vvsANEvsSZFvsJTGvsZIab5wIu zb5?Uvb5(Owb64|F^HlRv^H%dw^HuXx^H&Q{3sehI3swtJ3snnK3s;L!i&TqJi&l$K zi&cwLi&slfOH@lzOIAx!OI1r#OIOQK%T&u!%T~)#%T>!$%U3H<D^x2|D^@E}D^)8~ zD_5&ft5mB}t5&N~t5vI0t5<7KYgB7eYgTJfYgKDgYgg+~>s0Gf>sISg>s9Mh>sOng zHc@So+GMpUYE#vwsZCd#p*B-(mfCE!Icjs&=BdqBTcEa3ZIRkywIymx)t0F(S6iXB zQf-ymYPB_LYt`1NtykNiwoz@9+Ge#aYFpK|scl!=p|(?Pm)dT%J!*T^_NnbxJD_$@ z?U34GwIgar)sCqhS39A0Qtg!5X|*$IXVuQBomab{c2Vt;+GVvXYFE{+sa;pQp>|X4 zmfCH#J8E~;?y22Zd!Y7E?UCAJwI^y%)t;$6S9_uMQtg%6Yqd9OZ`IzZy;u97_EGJV z+Gn*dYG2j9seM=bq4rblm)dW&KWcx~{;B;}V^C*QXHsWYXHjQWXH#ca=TPTV=ThfZ z=TYZX=Tqlb7f=^e7g85i7f}~g7gHBkmr$2fmr|Ejmr<8hms6KlS5Q|}S5jA2S5a40 zS5sG4*HG6~*HYJ3*HPD1*HhP5H&8cJH&QoNH&HiLH&ZuPw@|lKw^FxOw^6rMw^O%Q zcTjg!cT#s&cTsm$cT;y)_fYp#_fq#(_fhv%_fz**4^R(O4^j_S4^a<Q4^t0Uk5G?P zk5Z3Tk5P|Rk5i9VPf$-(Pf|}-Pf<@*Pg74<&rr`)&r;7;&r#1+&r{D=FHkR3FH$d7 zFHtX5FH<j9uTZa4uTrm8uTig6uT!sAZ%}VkZ&GhoZ&7bmZ&Pnq?@;el?^5qp?@{kn z?^EwrpP)WbeUkcQ^(pF8)u*XXSD&FiQ+<~DZ1p+nbJgdm&sSfdzEFLU`eOAZ>Pyv^ zsV`Swp}tammHKM+HR@~C*Qu{p-=MxxeUtiT^)2dK)wii{SKpz&Q+=2EZuLFtd)4=; z?^i#deo+08`eF4W>POX&sUKHAp?*^Rl=^A)GwNs6	kRzo33m{gV1+^(*RE)vu{v zSHGctQ~j3uZS_0qch&Ey-&cR2{!smq`eXGc>QB|5sXteLq5e|+mHKP-H|lTI->JV> z|DgU+{ge7<^)KpQ)xW8KSO1~@Q~j6vZ}mUwf7Sn~|5s<wVANpJVAf#KVAWvLVAtT# z;MCyK;MU;L;ML&M;MWk)5Y!OT5Y`aU5Y-UV5Z92<kkpXUkk*jVkkydWkk?SqP}ES; zP}We<P}NY=P}k7V(A3b<(ALn=(ACh>(AO}~Fw`*8FxD{9Fx4>AFxRlqu+*^9u-35A zu+^~Bu-9<VaMW<paMp0qaMf_raM$qA@YL|q@Ye9r@YV3s@Ye{?2-FDD2-XPE2-OJF z2-k?vh}4MEh}MYFh}DSGh}THaNYqHuNY+TvNYzNwNY}{F$kfQv$kxcw$koWx$k!;) zDAXv@DAp*^DAg#_DA%aasMM&^sMe^_sMV;`sMl!FXw+!ZXx3=aXw_)bXxHe_=+x-a z=+@}b=+)@c=+~H_F;QcZ#$=5t8dEi<X-wCcp)pfqmd0$2IT~{{=4s5=SfH^`W0A&U zjU^gOHI`{C*I1#kQe&0IYK=7-Yc<wstk>9}u~B1_#%7Hz8e28CX>8Znp|MkAm&R_5 zJsNv8_G#?bIG}M*<B-N-jUyUIHI8W<*EpeZQsb1yX^k@)XEn}goY%OZaZ%%v#$}Bw z8do*0X<XO1p>b2=md0(3I~sR2?rGfDc%bo6<B`T=jVBsUHJ)ia*Lb1vQsb4zYmGM= zZ#CX&yw~`k@loTG#%GN$8ecWOX?)lCq487Wm&R|6KN^2E{%QQzV9;dLWYT2TWYJ{R zWYc8V<j~~Q<kIBU<k95S<kRHW6wnmZ6w(yd6wwsb6w?&fl+cval+u*el+l#cl+%>g zRM1q^RMJ$|RMAw`RMS+~)X>z_)Y8<})X~({)YH`0G|)8EG}1KIG|@EGG}AQKw9vHF zw9>TJw9&NHw9~ZLbkKCvbkcOzbkTIxbklU#^w9Lw^wRX!^wIRy^wad$4A2bJ4AKnN z4ABhL4ATtPjL?kKjM9wOjM0qMjMI$QOwdf!Owvr&Owml$Ow&x)%+So#%+k!(%+bu% z%+t)*EYK{}EYd92EYU30EYmF4tkA5~tkSI3tkJC1tkbO5Y|w1fY|?DjY|(7hY}0Jl z?9lAg?9%Mk?9uGi?9=SmoS->TbCTv{%_*8wHK%D#*PNj_Q*)N)Y|S~Eb2aB_&evR^ zxlnVF=3>nynoBj8X)f1Xp}A6XmF8;AHJWQR*J-ZT+@QHpbCc#~%`KW+HMePQ*W97G zQ*)Q*Zp}TKdo}lI?$<n^c~J9^=3&hvnnyK{X&%=+p?OmCl;&y8Gn!{L&uO05yr6ke z^OELe%`2K$HLq!2*Sw*5Q}dSQZOuEHcQx;6-q(Df`B3wb=3~t#nol*KX+GC{q4`qt zmF8>BH=1uX-)X+r{Gj<!^ONRh%`ci?HNR<o*ZiURQ}dVRZ_PiNe>MMU{?}yCV$@>N zV%B2OV%1{PV%Or(;?&~O;@0BP;??5Q;@1+;64VmX64nyY64esZ64#Q@lGKvYlGc*Z zlGT#alGjquQq)q?Qr1$@Qq@w^QrFVZ($vz@($><^($&(_($_N3GSo8CGS)KDGSxEE zGS{-uvedHDvevTEvemNFve$CZa@2Cta@KOua@BIva@X?E^3?Lu^49Xv^40Rw^4AK` z3e*bH3f2nI3e^hJ3fGFziqwkIiq?wJiq(qKiq}feO4LfyO4drzO4Ul!O4rKJ%GAoz z%GS!!%GJu#%GWB;D%2{{D%L8|D%C2}D%Yyes?@5|s@AH}s@1B~s@H1JYSe1dYSwDe zYSn7fYS-$}>eTAe>elMf>ecGg>erf}HBoDl)?}?IT2r;AX-(Ifp*2%$mey>oIa+hI z=4s8>TA;O1YmwGsttDDZwU%iu*IJ>qQfrmgYOOU|Yqi#Ct=HP1wNY!6)@H3OT3fZY zX>Hfqp|w+Mm)35rJz9IU_G#_cI-qq>>yXxAts`1TwT@{W*E*qfQtOn~X{|F_XSL30 zo!7dcby4e*)@7|LT35BMX<gU4p><R1mey^pJ6d<O?rGiEdZ6`C>yg%DttVPfwVr7` z*LtD#QtOr0Yppk0Z?)cOz1RAn^-=4S)@Q9RT3@xkX?@rFq4iVim)38sKU#ma{%QT! zV$f#PX3}QXX3=KVX47WZ=FsNU=F;ZY=F#TW=F{fa7SI;d7Sa~h7SR^f7Sk5jme7{e zmeQ8imeH2gmeZEkR?t?|R?=41R?$|~R?}A3*3j0}*3#D2*3s70*3;J4HqbWIHqtiM zHqkcKHq$oOw$QfJw$irNw$ZlLw$rxPcF=azcG7m%cF}g#cGGs(_R#j!_R{v&_R;p$ z_S5#)4$uzN4$=<R4$%(P4$}_Tj?j+Oj?#|Sj?s?Qj?<3UPS8%&PSQ@+PSH-)PSZ}; z&d|=(&eG1-&e6`*&eP7<F3>L2F48X6F3~R4F4Hd8uF$U3uF|g7uF<a5uG6m9ZqRPj zZqjbnZqaVlZqshp?$GYk?$Yko?$Pem?$hqqo}fKZdy@8K?J3$*wWn!M*Pfw0Q+t;7 zZ0$MPbG7Gb&(~g{y-<6R_G0ZN+Do;UX)o7ap}kUjmG)}wHQH;n*J-cU-k`lvdz1EN z?Je3{wYO<+*WRJMQ+t>8ZtXqVd$spz@7F${eNg+5_F?TK+DEmIX&=`<p?y;Ol=f-u zGumgh&uO36zMy?k`;zu$?JL?>wXbPk*S?{BQ~Q?oZS6bSceU?n-`9Si{ZRXn_G9fQ z+E2BgX+PI~q5V?(mG*1xH`;Ht-)X<s{-FI)`;+!(?JwG2wZCb9*Z!gXQ~Q_pZ|y(Y zf3^Q<|JP>FVbo#LVb)>MVbx*NVb|f%;nd;M;nv~N;nm^O;nxw+5!4aV5!MmW5!DgX z5!aE>k<^jWk=BvXk=2pYk=IesQPfe=QPxq>QPok?QP<JX(bUn>(bmz?(bdt@(bqB1 zG1M{AG1f8BG1W2CG1sxsvDC5BvDUHCvDLBDvDb0Xany0ran^Csan*6tao6$C@zn9s z@z(Lt@zwFu@z)8^3DgPF3DybG3DpVH3D=3xiPVYGiPnkHiPeeIiPuTcNz_TwN!Cfx zN!3ZyN!Q8H$<)cx$=1oy$<@iz$=4~+Dby*_Db^{`Db*>{Dc7mcsnn^`sn)5{snw~| zsn==HY1C=bY1V1cY1L`dY1iq{>D1}c>DKAd>DB4e>DQT{Gf`)f&Sae_I#YF~=}gy| zp)*rwmd<RQIXZK7=IPAWS)j8}XOYfgoh3R;b(ZNY*IA*nQfHOUYMnJYYjxJ?tk>C~ zvr%W0&Ssr0I$L$N>1@~8p|ewGm(FgTJvw`J_UY``IiPb;=a9}}og+F&b&lyA*Eykc zQs<P;X`M4VXLZi$oY%Rab5ZA#&Sjk|I#+eB>0H;jp>tE`md<URJ34oD?&;jud7$%9 z=aJ51ohLd^b)M-w*Lk7yQs<S<Yn?YbZ*|`3yw~}l^HJxM&S#x3I$w3Z>3rAuq4QJc zm(FjUKRSPP{^|VJVbEpNWzuEVWzl8TWz%KX<<RBS<<jNW<<aHU<<sTY70?yb719;f z710&d71I^hmC%*cmC}{gmC=>emD82iRnS$`Rnk?~Rnb+|Rnt}1)zH<{)za10)zQ_} z)zj72HPAKGHPSWKHPJQIHPbcMwa~THwbHfLwb8ZJwbQlNb<lOxb<%a#b<uUzb<=g% z_0aXy_0sj$_0jd!_0#p&4bTnL4blzP4bctN4bu(RjnIwMjna+QjnR$Ojnj?SP0&r$ zP0~%)P0>x&P18-+&Ct!%&C<=*&C$)(&C|`-Ezm90Ez&L4EzvF2Ez>R6t<bI1t<tU5 zt<kO3t<$a7ZP0DhZPIPlZP9JjZPRVn?a=Mi?b7Ym?a}Sk?bGeoouE5WcarX8-6^_L zb*Jf0*PWp|Q+Jl`Y~4A!b9LwG&evU_yHIzL?qb~~x=VGJ=`Pn@p}SIdmF{ZYHM(nc z*Xgd;-JrWsca!dB-7UIXb+_qm*WIDJQ+Jo{Zrwe)dv*8e?$<q_dr<d~?qS^{x<_@7 z=^ocTp?gyIl<sNWGrDJW&*`4my`Xzh_mb{q-7C6Rb+74O*S(>8Q}>qcZQVP%cXjXS z-q(Gg`%w3h?ql62x=(eV=|0zeq5D$zmF{cZH@a_i-|4>B{h<3%_ml2t-7mUdb-(F; z*ZraUQ}>tdZ{0t-e|7)q{?}#DW7K2PW7cEQW7T8RW7p%*<J9BQ<JRNR<JIHS<JS|= z6VwyZ6V?;a6V(&b6W5c_lhl*alh%{blhu>clh;$wQ`A$^Q`S?_Q`J+`Q`ghb)6~<_ z)7I0`)78_{)7LZ5Gt@KEGuAWFGu1QGGuN}wv(&TFv(~fGv(>ZHv)6ObbJTOvbJlaw zbJcUxbJz3G^VIXw^Vajx^VRdy^VbW|3)BnJ3)TzK3)KtL3)hR#i`0wKi`I+Li`9$M zi`PrgOVmr!OV&%#OVvx$OV`WL%hb!#%ht=$%hk)%%hxN=E7U8}E7mK~E7dF0E7z;g ztJJH~tJbU0tJSO1tJiDLYt(DfYu0PgYt?JhYuD@0>(uMg>(=Yh>(%Si>(`s0H&Jhr z-ekQgdQ<hL=}p(0p*K@+mfmc=IeK&T=IPDXTcEd4Z;{?&y(M}}^_J-^*IS{tQg4;s zYP~gjYxUOYt=HS2w^47C-e$cmdRz6j>225Bp|?|Sm)>r@J$iff_UY}{JD_(^?~vYM zy(4-@^^WNs*E^wiQty=BX}vRgXZ6nMo!7gdcTw+>-etWjdRO(X>0Q^mp?6d7mfmf> zJ9>BZ?&;mvd!YAF?~&ePy(fB4^`7ZH*L$J&Qty@CYrQvmZ}r~kz1RDo_fhYY-e<ip zdSCUv>3!Gxq4!hom)>u^KYD-l{^|YKW6)>RXVPcZXVGWXXVYib=g{ZW=hEla=h5fY z=hNrc7tj~f7t$Bj7tt5h7t<Hlm(Z8gm(rKkm(iEim(!QmSI}3~SJGG3SJ7A1SJPM5 z*U;D0*V5P4*U{J2*VEV6H_$iKH_|uOH_<oMH`6!Qx6rrLx6-%Px6!xNx6`-RchGm# zchYy(chPs%chh&*_t5v$_tN*)_tE#&_tW>+56}<P57H0T577_R57Q6VkI;|QkJ69U zkI|3SkJFFWPtZ@)Pts4;Pti}+Pt#A=&(P1*&(hD<&(Y7-&(qJ>FVHX4FVZj8FVQd6 zFVipAuh6g5uhOs9uhFm7uhXyBZ_sblZ_;npZ_#hnZ_{tr@6hkm@6zwq@6qqo@6+$s zpP)Zcf0F)W{VDoW^{44i*Po$3Q-7BJZ2dX<bM@!x&(~j|zfgaX{$l+l`b+hf=`Yt` zp}$gpmHuk|HTrAy*Xgg<-=M!yf0O=Z{Vn=i^|$G7*WaPPQ-7EKZv8#_d-eC}@7F(| ze^CFB{$c$i`bYJT=^xiWp?^~Ul>TY`Gx}%s&*`7nzo36n|C0V?{VV!c^{?q)*T12E zQ~#F!ZT&m?clGb--`9Vj|4{#t{$u?o`cL(r=|9(hq5o3<mHun}H~Me&-|4^C|DgX- z|C9b_{V)1o^}p$V*Z-maQ~#I#Z~Z^|fA#<A|JP?QU^HMdU^ZYeU^QSfU^n0};56Ve z;5Ohf;5Fbg;5QI35Ht`n5H=7o5H%1p5I2x8kTj4okT#GpkTsAqkT*~;P&807P&QC8 zP&H69P&d#p&@|98&^FL9&^6FA&^ItJFf=eSFg7qTFf}kUFgLI;ur#nTur{zUur;tV zus3ipa5Qi-a5iu;a5Zo<a5wNU@HFr;@HX%<@HOx=@HYrB2s8*X2sQ{Y2sH>Z2sel@ zh%|^Yh&G5Zh&6~ah&M<uNHj<?NH$0@NHs_^NH@qZ$TY|@$Tr9^$Ti3_$Tui3C^RTC zC^jfDC^aZEC^x7us5GcDs5YoEs5PiFs5fXZXf$XtXf|juXf<dvXgBCE=rrgu=r-sv z=r!mw=r@>PFwtO=!DNFe22%~D8B8~rVKCERmceX;IR<kL<{8X4SYWWwV3EOMgCzz_ z4VD=!H&|h?(qNUrYJ)WfYYo;JtT)(Tu+d<X!DfRk23rlb8EiM$VX)I+m%(m>JqCLX z_8IIqIACzl;E=&#gChn<4UQQcH#lK%(%_WAX@fHcXARC7oHw{&aM9qB!DWLh23HNP z8C*BGVQ|ynmcea<I|g?R?it)Scwq3*;E};&gC_=04W1c1H+W(2(%_ZBYlAliZw=lV zyf^q@@X_Ft!DoXn244-n8GJYRVer%7m%(p?KL&pd{u%r?U@&AfWHMwnWHDqlWHV$p z<S^tk<TB(o<T2zm<TK<q6fhJt6fzVx6fqPv6f+bzlrWSulroeylrfYwlrxk!R4`OD zR5DaHR54UFR5MgJ)G*XE)H2jI)G^dG)HBpKG%z$YG%_?cG%++aG&3|ev@o<Zv@*0d zv@x_bv@^6fbTD)@bTV`{bTM=_bTf1}^f2@^^fL4|^fB}`^fUA~3@{8d3^EKh3^5Ef z3^NQjj4+Hej53Tij4_Ngj5CZkOfXC|OfpP1OfgI~OfyV3%rML}%reY2%rVS0%rne4 zEHErIEHW%MEHNxKEHf-OtT3!JtTL=NtTC)LtTU`PY%pvzY%**%Y%y##Y%^>(>@e&! z>@w^&>@n;$>@(~)oM1T7aFXF<!zqSS4W}7SH=JQO({PsIY{NN*a}DPi&Np0OxX^Hs z;bOxjhD!~X87?<mVYt$8mEmf`HHK>q*BP!i++euTaFgL?!!3qe4YwI?H{4;k({PvJ zZo@r>dkyy)?l(MOc+l{W;bFrghDQyL86G!0VR+K;l;LT^Glpjk&l#RKykL0I@RH$W z!z+eY4X+tqH@snZ)9{wzZNoc;cMb0u-Zy+;_|Wi?;bX%mhEENj89q0BVffPUmEmi{ zH->Kw-x<C){9yRe@RQ+Z!!L$k4Zj(FH~eAv)9{z!Z^J)^e+~Z`{x@VWVl-khVm4wi zVl`qjVmIP2;xyti;x^(j;x*zk;x`g75;PJr5;hVs5;YPt5;u}Ck~ESsk~Wetk~NYu zk~dN?QZ!OBQZ`aCQZ-UDQa92t(lpXC(l*jD(lydE(l;_NGBh$WGBz?XGBq+YGB>g? zvNW<XvNp0YvNf_ZvNv)tax`)>ayD`?ay4=@ayRlY@-*@?@;34@@-^}^@;3@F3N#8b z3N{Kc3N;Ed3O9-{iZqHciZ+TdiZzNeiZ@CyN;FC`N;XO{N;OI|N;k?d$~4L{$~MX| z$~DR}$~P)7Dl{rGDmE%HDm5xIDmSVysx+!Hsy3=Isx_)JsyAvdYBXvxYBp*yYBg#z zYB%aI>NM&y>Ne^z>NV;!>NlETG|_01(PX13MpKQZ8BI5uVKmcdmeFjZIYx7h<{8a5 zT41!$Xpzxkqa{X5jg}cLH(Ft|(rA^@YNItqYmL?!tvA|Ww9#mj(PpD9Mq7=x8ErS( zVYJg|m(gycJw|(t_8ILrI$(6r=#bH2qa#K~jgA=|H#%W-(&&`YX`?enXN}Gooj1B* zbkXRN(Pg76Mpuol8C^HJVRX~zmeFmaJ4Sbn?it-TdSLX>=#kN5qbEjBjh-1jH+o_8 z(&&}ZYoj+tZ;jp=y*K(`^wH>((PyJCMqiD-8GSeUVf54Jm(g#dKSqCz{u%u@VlZYj zW-?|rW-(?pW;13t<}l_o<}&6s<}v0q<}>Cu7BChx7BUt#7BLnz7Bdz%mN1qymNJ$$ zmNAw!mNS+&RxnmHRx(yLRxwsJRx?&N)-cvI)-u*M)-l#K)-%>OHZV3cHZnFgHZe9e zHZwLiwlKCdwlcOhwlTIfwllUjb})7{b~1K0b}@D}b~AQ2_AvG|_A>T1_A&M~_A~Z3 z4loWh4l)il4lxcj4l@onjxdfijxvrmjxmlkjx&xoPB2b1PBKn5PBBh3PBTt7&M?k2 z&N9w6&N0q4&NI$8E-)@ME;24QE-@}OE;BASt}w1Nt}?DRt}(7Pt~0JTZZK{%ZZd8* zZZU2(ZZmE-?lA5&?lSH+?lJB)?lbN;o?txDc#`pC<0-~dji(t;H=bcU(|DHgY~wk` zbB*U2&o^FRywG@&@nYj8#!HQt880_pVZ73KmGNrhHO6a=*BP%j-eA1Zc$4vF<1NNp zjkg(ZH{M~q(|DKhZsR@1dyV%Q?>9bRe9-ui@nPd5#z&2h86P)3VSLi~l<{ffGsb6) z&l#ULzF>UO_>%Eu<15BjjjtJBH@;zf)A*M0ZR0z}ca85E-#30>{LuK3@nhpB#!ro( z89z6EVf@ngmGNuiH^y&`-x<F*{$Tvk_>=Kx<1fZvjlUUxH~wM#)A*P1Z{t74e~tec z|2JkZVKiYfVK!kgVKrehVK?D0;WXhg;Wpth;Wgni;WrU55i}7p5jGJq5j7Dr5jT-A zku;Gqkv5Srku{MskvCB=Q8ZC9Q8rOAQ8iIBQ8&>r(KOLA(KgXB(KXRC(Kj(LF*GqU zF*Y$VF*PwWF*mU=u{5zVu{N<Wu{E(Xu{UuraWru<aW-)=aW!!>aX0ZW@ig%=@iy@> z@ip-?@iz%D2{Z{Z2{s8a2{j2b2{(x_i8P5ai8hHbi8YBci8o0wNi<0^Nj6C_Ni|6` zNjJ$b$u!9_$u`L`$u-F{$u}u5DKsfEDK;rFDK#lGDL1JwsWhoFsWz!GsWquHsW)jb zX*6jvX*OvwX*FpxX*cOG=``sw={D&x={4yy={K2RGSOs`$z+o$CR0tOnM^mCVKUQX zmdR|BIVN*W=9$blSzxlzWRb~YlO-lgO_rG~H(6n_(qxs%YLhi4YfaXftT)+Uve9Id z$!3!+CR<ImnQS-NVY1U?m&tCEJtlii_L=NAIbd?o<dDf>lOrZaO^%ryH#uQ)(&UuM zX_GT1XHCwToHw~(a?#|H$z_u(CRa_anOrxyVRF;tmdS0CJ0^Ec?wQ;-d0_I;<dMl^ zlP4xmO`e%NH+f<5(&UxNYm+x7Z%y8ryf^t^^3mjz$!C)<CSOgynS3|-Ve-@Dm&tFF zKPG=o{+awYVK8MhWin+pWie$nWiw?r<uK(m<uc_q<uT<o<um0s6)+Vv6*3hz6)_bx z6*Cn#l`xewl`@q!l`)kyl{1w$RWMaFRWemJRWVgHRWnsL)iBjG)iTvK)iKpI)ic#M zH83?aH8M3eH8C|cH8V9gwJ^0bwKBCfwK26dwKKIhbue`_bux7}buo1{bu)E0^)U4` z^)mG~^)dA|^)vN14KNKf4KfWj4KWQh4KocljWCTgjWUfkjWLZijWdlmO)yO~O)^b3 zO)*V1O*2h5%`nY0%`(k4%`we2%`?q6Eif%KEix@OEio-MEi)}QtuU=Ltun1Ptud`N ztuw7RZ7^*#Z8B{(Z82>%Z8L2*?J(^$?K15)?J?~&?KAB+onSiAbdu?0(<!D?O{bYo zH=SWR({z^UY|}ZWb4}-&&Np3Py3lly>0;9*rb|tinJzb7VY<?EmFa5JHKuD#*O{(2 z-C(-Wbd%|3(=Dc3O}CkDH{D^n({z{VZqq%cdrkM5?l(PPdeHQc>0#3&rbkVWnI1Pi zVS3W^l<8^HGp1)v&zYV#y<mFL^pfdi(<`P|O|O|=H@#tc)AW|<ZPPoZcTMk^-Zy<< z`q1=|>0{F;rcX_unLamtVfxbamFa8KH>Ph*-<iHQ{b2gh^pojl(=Vo9O~09bH~nGy z)AX0=Z__`fe@*|H{x@YXV>DwjV>V+kV>M$lV>jb4<22(k<2K_l<2B<m<2Ms96EqVt z6E+hu6Ezbv6E~AElQfeulQxqvlQokwlQ&Z^Q#4aDQ#MmEQ#DgFQ#aEv(=^jE(>BvF z(>2pG(>F6PGc+?YGd43ZGc_|aGdHs^voy0Zvo^Cavo*6bvo~`vb2M`@b2f7^b2W1_ zb2sxa^EC4^^EUG_^ELA`^EV4H3p5Kd3pNWe3pEQf3pa}}i!_Tei#Cffi#3Zgi#JO! zOEgO|OEya}OEpU~OE=3f%QVX}%Qnj~%Qee0%Qq`9D>N%ID>f@JD>W-KD>th!t2C=J zt2V1Kt2L`Lt2b*fYcy*zYc^{!Yc*>#Yd7mK>on^!>o)5#>ow~$>o=QVHqmU7*<`aR zW>d|knN2sFVK&ojmf38xIc9Us=9$emTVS@(Y?0Ywvn6Ir&6b%hH(O!0(rlI4YO^(F zYt7b~tvB0Xw$W^p*=DmXW?Rj+nQb@QVYbt3m)UN!J!X5&_L=QBJ79Lu?2y@Evm<6l z&5oHJH#=c=((IJkX|pqCXU)!;oj1E+cG2vT*=4gUW>?LwnO!%#VRqB(mf3ByJ7#yy z?wQ>;dtmm^?2*}HvnOUx&7PS(H+y0B((IMlYqK|IZ_VDBy*K+{_R;K<*=MsaW?#*| znSD3=VfNGPm)UQ#KW2Z;{+azZV=!klXEJ9tXEA3rXESFv=P>6q=Q8Iu=P~Cs=QHOw z7cdtz7cv(%7cmz#7c&<(moS$!mok?&mob+$mot|)S1?yJS29;NS20&LS2I^P*D%*K z*D}{O*D=>M*E82QH!wFeH!?RiH!(LgH#0Xkw=lOfw=%ajw=uUhw==glcQAJ}cQSW2 zcQJQ0cQbc4_b~S~_cHf3_c8Z1_cQl54=@ij4>Aun4>1ol4>J!pk1&rkk1~%ok1>xm zk28-qPcTn3Pclz7Pcct5Pcu(9&oIw4&oa+8&oR$6&oj?AFEB4OFETGSFEKAQFEcMU zuQ0DPuQIPTuQ9JRuQRVVZ!m8(Z!&K-Z!vE*Z!>Q<?=bH)?=tT;?=kN+?=$Z=pI|=G ze3JQO^C{+2&8L}9H=kiX(|nfsZ1XwhbIs?O&o^ISzR-M;`C{`W=1a|&nJ+hAVZPFQ zmHBG(HRfy0*O{+3-(bGce3SWR^DX9E&9|9vH{W5t(|nitZu33nd(HQm?>9eSe$f1o z`C;=T=10wsnIAVlVSdv5l=*4%Gv;T_&zYY$zhHjR{F3=)^DE|8&99kXH@{(i)BKkC zZSy<kcg^pa-#33?{?Po9`D61Z=1<L^nLjswVgAzmmHBJ)H|B56-<iKR|6u;n{FC`- z^DpLK&A*v{H~(S&)BKnDZ}UIqf6f1y|2Jo_V6<SeV76efV6|YgV7K6~;I!bf;I`ng z;I-hh;I|O45VR1o5VjDp5Va7q5Vw%9khGApkhYMqkhPGrkhf5<P_$68P_|I9P_<CA zP`A*q(6rF9(6-RA(6!LB(6=zKFtjkTFt#wUFtsqVFt@O<u(YtUu(q(Vu(hzWu(xoq zaI|o;aJF!<aJ6u=aJTTV@U-x<@V4-=@U`%>@V5xC2($>Y2(}2Z2(<{a2)Br^h_r~Z zh_;Bah_#5bh_^_vNVG_@NVZ6^NVQ0_NVmwa$h63^$hOF_$hF9`$hRo4D6}ZDD7GlE zD77fFD7UDvsI;iEsJ5uFsI{oGsJCdaXtZduXtrpvXtijwXt(IF=(Omv=(gyw=(Xsx z=(m_)G0|d@#bk>q7E>*zSxmQ>VKLKUmc?v~ITmv*=2^_QSYWZxVv)sSizOCIEtXj< zw^(7Z(qfgxYKt`%Yc1AUthd-;vC(3a#b%2w7F#X0S!}o1VX@O<m&I<2Jr;W{_F3$= zIAC$m;*iB*iz60CEsj|nw>V*O(&CiGX^S%!XD!ZIoVU1Oana(E#bt{t7FR8<SzNcc zVR6&qmc?z0I~I2>?pfTocwq6+;*rH;izgOOEuL9Cw|HUk(&ClHYl}A)Z!O+gytnvZ z@zLUw#b=8z7GEvCS$wznVe!-Am&I?3KNf#2{#pFDV6bGgWU^$oWU*wmWV2+q<gnzl z<g(<p<gw(n<g?_r6tEPu6tWby6tNVw6tfh!l(3Yvl(Lkzl(Cexl(Uq#RIpUERI*gI zRIyaGRI^mK)UedF)UwpJ)UnjH)U(vLG_W+ZG_o|dG_f?bG_y3fw6L_aw6e6ew6V0c zw6nCgbg*=^bh31|bg^``bhC7~^sw}_^s@A}^s)4{^t1H046qEe46+Qi46zKg46_Wk zjIfNfjIxZjjIoThjI)flOt4I}OtMV2OtDP0OtVb4%&^R~%(Be3%(2Y1%(Kk5EU+xJ zEV3-NEU_%LEVC@Ptgx)Ktg@`Otg)=Mth21QY_M#!Y_e>&Y_V*$Y_n{)?6B;#?6T~( z?6K^%?6d5*oM1W8a+2j_%PE#qEvH#dx13=)({h&OY|A;8b1mmt&bM4(xzKWv<zmYv zmP;*{SuVF+VY$+BmE~&7HI{2F*IBN&++exUa+Bp|%Pp2$Ew@>2x7=a5({h*PZp%HE zdoA}_?zcQ(dC>BZ<zdSsmPaj*Ssu4MVR_Q>l;vs5GnQv9&sm<gykL3J@{;9c%PW>w zEw5Q#x4dC_)AE+(ZOc2BcP;N(-nV>U`Oxx_<zveymQO98Sw6RXVfoVXmE~*8H<oWL z-&wx5{9yUf@{{Ff%P*E+Ex%cQxBOxG)AE<)Z_7WHe=Yx6{<mbXVzgqiVzy$jVzpwk zVz=V3;<Vzj;<n<k;<e(l;<pm860{Ps61Ebt615Vu61S4DlC+YtlD3kulC_evlDAT@ zQnXUCQnpgDQngaEQn%8u(zMdD(zepE(zVjF(zi0OGPE+XGPW|YGPN?ZGPkm@vb3_Y zvbM6ZvbD0avbS=ua<p=?a<+1@a<y`^a<}rZ^0e}@^0xA^^0o4_^0x}G3bYEc3bqQd z3bhKe3b%@|inNNdinfZeinWTfinmIzO0-I{O14U|O0`O}O1H|e%CyR|%C^d}%C*X~ z%C{=8DzqxHDz+-IDzz%JDz~bzs<f)Is<x`Js<o=Ks<&#eYP4#yYPM>zYPD*!YPagJ z>a^;z>bB~!>b2^#>bII;HPLF4)nuzFR#UB}SxvW^VKvigmep*lIaYJ6=2^|RT41%% zYLV4qt0h)Tt(I9Ww_0Jf(rT5}YO6I?YpvE<t+(1>wb5#m)n=<LR$HyMS#7u4VYSn0 zm(^~oJyv_I_F3(>I$(9s>X6l8t0PuNt&Uk8w>n{U((07eX{$3<XRXdzowvGRb<ygQ z)n%(IR#&aASzWifVRh5$mep;mJ63nC?pfWpdSLa?>XFrBt0z`Zt)5vuw|Zgq((0Af zYpXX_Z>`>0y|?;c_0j5+)n}_OR$r~YS$((qVfEAMm(_2pKUROO{#pIEVz6ekX0m3s zX0c|qX0v9u=CJ0p=CbCt=CS6r=CkIv7O)ny7P1z$7O@t!7PA(&mavwzma>+%ma&$# zma~?(R<KsIR<c&MR<TyKR<l;O*09#J*0R>N*0I*L*0a{PHn29dHnKLhHnBFfHnTRj zwy?Iewz9Uiwz0OgwzIakcCdD|cCvQ1cCmJ~cC&W3_OSM}_OkZ2_ObT0_Otf44zLci z4zdom4zUik4zmuoj<Aljj<Sxnj<Jrlj<b%pPOwh2PO?t6PO(n4PP0z8&alq3&a%$7 z&auw5&a=+9F0d}NF0wARF0n4PF0(GTuCT7OuClJSuCcDQuCuPUZm@2&ZnAE+Zn18) zZnJK;?y&B(?y~N-?y>H*?z8T<o?t!EdXn{I>nYY#t*2Q}x1M1=(|VTmZ0kAJbFJrD z&$nJ+z0i7*^<wKK)=RCISueL<VZG9NmGx@tHP&mb*IBQ(-eA4adXx2L>n+w>t+!ck zx87mB(|VWnZtFePd#(3b@3%f+ebD-l^<nEH)<><6Ss%APVSUp2l=W%rGuCIV&sm?h zzF>XP`jYi!>nqk*t*=>Mx4vP0)B2Y6ZR<PMcdhSP-?x5X{m}Z6^<(QN)=#aUSwFXa zVg1tjmGx`uH`Z^h-&w!6{$Tyl`jho%>o3+{t-o1+xBg-M)B2b7Z|gtSf35#n|F>qa zVYFegVYXqhVYOkiVYlJ1;k4nh;kMzi;kDtj;kOa65wsDq5w;Pr5w#Js5x0@Bk+hMr zk+zYsk+qStk+)H>QM6IAQMOUBQMFOCQMb{s(X`RB(YDdC(Y4XD(YG<MF|;wVF}5+W zF|{$XF}Ja>v9z(Wv9__Xv9+<YvA1!sakO!=akg=>akX)?akufX@wD->@wV}?@wM@@ z@wW-E3A72a3APEb3AG8c3Ac%`iL{BbiMENciM5HdiML6xNwi6_Nw!I`NwrC{Nw>+c z$+XF`$+pR{$+gL|$+s!6DYPlFDYhxGDYYrHDYvPxskEuGskW)HskN!IskdpcX|!pw zX|`#xX|-vyX}9UH>9pyx>9*;y>9y&z>9?6+Gtp*}&19P?HdAe;*-W>YVKdWamd$LN zIW}``=Gn}*Szxo!W|7Ten<X|&ZI;<Aw^?Dc(q@&-YMV7SYi-uqthd=<v(aXg&1Rb| zHd}4B*=)DjVYAa_m(6aQJvMu7_Sx*WIbd_p=8(-{n<F+yZI0O-w>e>R(&m)SX`3@P zXKl{eoVU4PbJ6CK&1IV_Hdk$~*<81|VRO^wmd$OOJ2rQ1?%CY8d0_L<=8?@~n<q9; zZJyaYw|Qan(&m-TYnwMVZ*AV$ytnya^U>y$&1ai0HeYSN*?hP8Ve`}Gm(6dRKQ@1D z{@MJuVX$SiWwK?qWwB+oWwT|s<*?<n<+A0r<+0_p<+J6t6|fbw6|xn!6|ohy6|)t$ zm9Ukxm9mw#m9dqzm9v$%Rj^gGRkBsKRk2mIRkKyM)v(pH)w0#L)v?vJ)w9*NHLx|b zHL^9fHL*3dHM2FhwXn6cwX(IgwXwCewX?Oib+C1`b+UD~b+L7|b+dK1^|1A{^|JN0 z^|AG}^|ST24X_Qg4YCck4Y3Wi4YLimjj)Zhjk1lljj@fjjkArnO|VV0O|nh4O|eb2 zO|wn6&9Ke1&9cq5&9Tk3&9lw7EwC-LEwU}PEwL@NEwe4Rt+1`Mt+K7Qt+B1Ot+TDS zZLn>$ZL)2)ZLw{&ZL@8+?Xc~%?XvB*?Xm5(?X&H-onSlBc9QL6+bOnFZKv5zx1C`- z({`5aY}+}ub8Y9@&bM7)yU=!#?PA*{wo7f7*)F$TVY||HmF;TVHMVPQ*V(SO-C(=X zc9ZR9+by<RZMWHOx7}g8({`8bZreS!du{jG?zcT)d(iff?P1#^wnuG`*&eq&VSCc{ zl<jHTGqz`K&)J^0y<mIM_LA*o+bgzLZLis0x4mI|)Ap9_ZQDDxcWv+4-nV^V`_T50 z?PJ>~woh%J**>>@Vf)hdmF;WWH@0tW-`T#m{b2ji_LJ>r+b_0XZNJ%mxBX%J)ApC` zZ`(h%e{KKS{<meYW3*$kW42?lW3^+mW4Gh5<Fw<l<F@0m<F(_n<F^yA6SNbu6Sfnv z6SWhw6StGFleCkvleUwwleLqxlebf_Q?ygEQ?^sFQ?*mGQ@7Kw)3npF)3(#G)3wvH z)3-CQGqf|ZGqy9aGqp3bGq<y_v$V6av$nIbv$eCcv$u1wbF_1^bGCD_bG37`bGP%b z^R)A_^S1M`^R@G{^S2AI3$zQe3$_cf3$+Wg3%84~i?oZfi?)lgi?xfhi?>U#OSDU} zOSVg~OSMb0OSj9g%e2d~%eKq0%eBk1%eO1AE3_-JE4C}KE43@LE4Qn#tF)`KtG27L ztF^1MtG8>gYqV>!Yqo2#Yqe{$Yq#sL>$K~#>$dB$>$U5%>$jU=H_>jA-DJBdc2n)9 z*-f{bVK>ummfdW-Id*gH=Go1+TVS`)Zjs$$yCrr@?Uvasw_9Pi(r%UAYP&UdYwgzA zt+(4?x6y8s-DbNjc3bVX*=@JmVYkz6m)&l=J$8HT_Sx;XJ79Ov?vUMKyCZf-?T*<U zw>x2X((aVqX}dFaXYJ0}owvJSchT;W-DSHgc317L*<H80VRzH+mfdZ;J9c;N?%Cb9 zdtmp_?vdSNyC-%}?Vi~^w|imt((aYrYr8jgZ|&aMy|?>d_tEZ?-DkTmc3<tj*?qVB zVfWMSm)&o>KX!lZ{@MMvW3XqmXR>FuXR&9sXR~Lw=dkCr=d$Ov=dtIt=d<Ux7qAz! z7qS<&7qJ($7qb_)m#~+#m$H|(m$8?%m$R3*SFl&KSF%^OSFu;MSF=~Q*Ra>L*Rt2P z*Rj{N*R$8RH?TLfH?lXjH?cRhH?udlx3IUgx3agkx3Raix3jmmcd&P~cd~c3cd>W1 zce8i5_ptZ0_p<l4_p$f2_p|r653mok53&!o53vum53>)qkFbxlkFt-pkFk%nkF$@r zPq0t4PqI(8Pq9z6PqR<A&#=$5&$7?9&#}+7&$G|BFR(APFS0MTFR?GRFS9SVuduJQ zud=VUud%PSud}bWZ?JE)Z?bQ;Z?SK+Z?kW=@38N*@3QZ<@3HT-@3Zf>pI|@Hev<uU z`ziKQ?WfsKx1V7@(|(ryZ2LL(bM5EZ&$nM-ztDb>{bKti_Dk)T*)O+WVZYLTmHle_ zHTG-m*V(VP-(bJdev|!X`z`ic?YG%)x8GsE(|(uzZu>p<d+qnx@3%i-f6)Gr{bBnf z_DAiH*&nw*VSm#8l>KS@Gxlfg&)J{1zhHmS{*wJ=`z!WW?XTHix4&V3)BcwIZTma+ zckS=l-?x8Y|Iq%C{bTzl_D}7f**~{`VgJ(pmHlh`H}-Gs-`T&n|6u>o{*(P@`!Dui z?Z4T7xBp@P)BczJZ~H&?f9?O-|F>swV02(|V0K_}V0B<~V0Ykf;B??};CA3~;C0}0 z;CB#k5Off75Oxr85Ool95O<JpkaUo8kam!9kaduAkatjUP;^joP<BvpP<2pqP<PO9 z&~(sp(00&q&~?yr(04F!Fmy0-Fm^C;Fm*6<Fn6$Uuyn9;uy(L<uywF=uy=59aCC5T zaCUHUaCLBVaCh)<@O1EU@OJQV@OAKW@OKDs2y_T?2zCf@2z3Z^2zQ8Zh;)c@h<1o^ zh;@i_h<8YENOVYYNOnkZNOeeaNO#C^$aKhZ$acta$aTnb$ag4kD0C=tD0V1uD0L`v zD0irEsC1}usCKAvsCB4wsCQ^^Xmn_DXm)6EXmx0FXm{vv=yd3E=yvFF=ym9G=y#al zFwtR>!(@jk4pSYbIZSt$;V{!-mcwj^ISz9j<~huFSm3bGVUfdPhb0b69hNyPcUa-D z(qWauYKJurYaP}(tasSpu+d?Y!)Avq4qF|zIc#^>;jq(Tm&0y{Jq~*v_Brf#IN)&5 z;gG{&ha(P09gaC1cR1m2(&3cDX@@foXC2NtoOih3aM9tC!)1pn4p$wnIb3(R;c(O8 zmcwm_I}Udp?m66dc;N8R;gQ2*hbInC9iBNncX;9O(&3fEYlk-uZynw_ym$EE@X_Iu z!)J#t4qqL<Ied5c;qcSpm&0#|KMsE#{yF@2U~pt~WO8J7WN~D5WOHP9<Z$G4<Z|S8 z<Z<M6<a6YA6mS%D6mk@H6mb-F6mt}JlyH=Elya1IlyQ`Glyj7KRB%*uRB}{yRB=>w zRC82!)Ns^v)N<5z)N#~x)N|B#G;lO@G;%a{G;uU_G;=g}v~aX^v~sj|v~jd`v~#p~ zbZ~TZbaHfdba8ZbbaQlf^l<ca^m6oe^l|ic^mFug3~&r|3~~&13~>x~408;3jBt!} zjB<>2jB$*0jB|{4OmIweOma+iOmR$gOmj?k%y7(f%yP_j%yG<h%yZ0lEO0DzEOIP% zEO9J#EORV(tZ=M!ta7Y&tZ}S$taGe)Y;bIJY;tUNY;kOLY;$aP>~QRK>~idO>~ZXM z>~rjQoZvXoagyU?$0?3e9j7@?cbwrk({YyLY{xl{a~<b7&UakkxX^Kt<6_4pj!PYv zIWBix;keRqmE&s1HI8c?*Ez0t+~By;ag*a_$1RRq9k)4dciiE)({Y#MZpS^2dmZ;V z?sq)kc+l~X<6*}mjz=AjIUaXB;ds*Vl;df~Gmd8+&pDoVyx@4z@si_Z$19Fk9j`fF zcf8?v)A5$$ZO1!~cOCCJ-gkW9_|Wl@<73Asj!zw*IX-uM;rP<=mE&v2H;!)|-#NZ_ z{NVV}@ss0c$1jdw9ltq#cl_b_)A5(%Z^u85e;xlh{&!?>Vsv71Vs>J2Vs&D3Vt3+j z;&kG2;&$S3;&tM4;&&2o5_A%B5_S@C5_J-D5_ghtl5~=Cl6I1Dl68`El6O*YQgl*s zQg%{tQgu>uQg_mD(sa^t(st5u(sj~v(swd&GITO>GIla?GIcU@GIz3YvUIX?vUaj@ zvURd^vUhTDa&&TXa&~fYa&>ZZa(D7@@^tcY@^<oZ@^$ia@^=bw3Umr`3U&%{3Uvx| z3U`Wdigb!{igt=|igk)}ig!wIN_0wcN_I+dN_9$eN_Wa|%5=(d%67_e%5}<f%6BSo zDs(DxDt0PyDs?JzDtD@Is&uMys&=Yzs&%S!s&{H|YIJIHYIbUIYISOJYIo{z>U8RI z>UQdJ>UHXK>UWypG|_32(`2V9PE(zxIZbz(;WX1}meXvfIZkt(<~hxGTHv(MX_3=n zrzK8Hot8N*cUs}J(rJ~`YNs_$Yn|3Pt#{hsw9#pk(`KhFPFtO}Ic;~^;k46fm(y;i zJx+U__Bri$I^cBB>5$W5rz1{BosKyjcRJy8(&?1bX{R$zXPwSDop-w6bkXUO(`BbC zPFJ0-IbC<U;dImKmeXygJ5G0<?m69edf@cX>5<c8rzcKNot`;8cY5LU(&?4cYo|9( zZ=K#by?6TH^wH^)(`TnIPG6nAIemBf;q=q#m(y>jKTdz0{yF`3VsK`3W^!hBW^rb9 zW^-nD=5Xe8=5pqC=5gkA=5ywE7H}4H7IGGL7I7AJ7IPMNmT;DImU5PMmT{JKmUEVO zR&Z8yR&rK$R&iE!R&!Q&)^OHz)^gT%)^XN#)^pZ(HgGm{HgYz0HgPs}Hgh(2ws5v| zwsN+1wsE#~wsW?3c5rrdc5-%hc5!xfc5`-j_Hg!e_Hy=i_Hp)g_H*`k4sZ^14ss55 z4si~34s#B7j&P22j&hE6j&Y84j&qK8PH;|iPI69mPH|3kPIFFo&T!6j&T`In&T-Cl z&U4OpE^sb%E^;n*E^#h(E^{t-u5hk&u5zw+u5qq)u5+$;Zg6gNZgOsRZgFmPZgXyT z?r`pO?sD#S?s4vQ?sM*Up5Q#ud6M&F=PAxpou@fZcb?%q(|MNjZ09-7bDifo&v#zn zywG`(^J3>E&P$z_IWKo!;k?p$mGf%nHO_0D*Ez3u-r&5^d6V;I=Pk}#owqq}ci!Q= z(|MQkZs$GDd!6?=?{_}ne9-xj^I_*B&PSb(IUjdE;e68hl=ErlGtOt7&pDrWzTkY( z`I7Tx=PS-vov%4xcfR3#)A^S3ZRb1Acb)G!-*<lC{LuN4^JC{H&QG16IX`!P;r!D1 zmGf)oH_mUJ-#Nc`{^0!4`IGZ!=P%A*oxeGMcmCo0)A^V4Z|6VGf1Uq1|956^VRT_~ zVRm70VRd11VRzwh;dJ40;dbG1;dSA2;dc>m5p)r95q1%A5p@xB5qFVrk#v!Ak#>=B zk#&)Ck#|vWQFKvqQFc*rQFT#sQFqaB(R9&r(RR^s(RI;t(RVR$F?2C<F?KO=F?BI> zF?X?Wv2?L=v39X>v30R?v3GHBaddHVadvTWadmNXad+`>@pSQW@pkcX@pbWY@plPu z33Lf^33dr_33Ul`33rKbiFAo_iFS!`iFJu{iFZkGNpwkaNp?wbNp(qcNq5O`$#ltb z$#%(c$#uzd$#*GmDRe1vDRwDwDRn7xDR-%GsdTAwsdlMxsdcGysds5`X>@6FX?AIG zX?1CHX?N*x>2&FG>2~RH>2>LI>35mnGSOv{%Vd`+E>m5mxlDJN;WE=@mdk9HIWBWu z=DEywS>UqJWs%EbmnAMsU6#2lcUj@G(q)y)YL_)GYhBj4tasVqve9Le%Vw7?E?Zr; zxomgY;j+_Zm&<OKJuZ7)_POkLIpA{8<&eu^mm@AmU5>dNcRAs5(&d!PX_qrDXI;*@ zoOik4a?$0I%Vn1<E>~Tyxm<U-;d0aEmdkCIJ1%!!?z!A|dEoNU<&n!{mnSYyU7oo- zcX{FR(&d%QYnL}JZ(ZKGym$HF^3mm!%V(D_E?-@~xqNr|;quevm&<RLKQ4b={<-{j zVQ^)1WpZV9WpQP7WpibB<#6S6<#OeA<#FY8<#XkC6>t@F6>=4J6>$}H6>}ALm2j1G zm2#DKm2s7Im2;JMRd7{wRdQ8!RdH2yRdZE$)o|5x)pFH#)p6Bz)pON%HE=a_HF7m} zHE}g{HFGt0wQ#j`wQ{v~wQ;p|wR5$1b#Qfbb#irfb#Zldb#rxh^>Foc^>X!g^>Oue z^>g)i4R8%~4RQ^34RH;14RZ~5jc|>0jdG24jd6{2jdP86O>j+gO>#|kO>s?iO><3m z&2Y_h&2r6l&2i0j&2!CnEpRP#Epjb(EpaV%Epsh*t#GY$t#Yk)t#Pe&t#hq+ZE$UL zZE|gPZE<aNZF6mR?QrdM?Q-pQ?Q!jO?Q`vSo!~mrb&~63*D0=3U8lKDcb(xn({+~X zY}Yxib6w}T&Uanly3loz>tfd>u1j5)xh{8I;kwdwmFsHPHLh!2*SW5D-Qc>>b(8C6 z*DbDFUAMVzcirK-({-2YZr44odtLXr?sq-ldeHTd>tWX;u18&uxgK{t;d;{bl<R5N zGp=V{&$*s=z2JJ$^^)sl*DJ19U9Y)bcfH|y)Ag3?ZPz=lcU|wf-gkZA`q1@}>toj^ zu1{T`xjuJ&;ri0`mFsKQH?D78-?_eb{owl1^^@yo*DtPLUB9`0cm3h|)Ag6@Z`VJr ze_j8%{&!_?V{~J3V|HV4V|8P5V|U|l<8<S4<96e5<8|Y6<98Eq6Lb@D6Lu4E6Lk}F z6L*tvlXR1ElXjDFlXa7GlXp{aQ*={uQ+88vQ*~2wQ+LyF({$5v({|Hw({<Bx(|0p) zGjua@Gj=m^Gj%g_Gk3Favvjj^vv#v_vvsp`vv+fFb98fZb9Qrab9Hlbb9eJ_^K|oa z^LF!b^L6uc^LGny3v>%|3w8@}3v~-~3wMifi*$=}i*}1~i*<{0i+4+KOLR+eOLj|f zOLa?gOLxm~%XG_f%XZ6g%XQ0h%XceqD|9PzD|Rb!D|IV#D|f4Kt8}Y!t9Gk#t97e$ zt9NT~YjkUJYj$gKYjtaLYj^8#>vZdK>vrpL>vijM>vx;rHqmX8+hn&XZd2W+xlMPQ z;WpE4mfLK%Ic{^^=DE#xTi~|PZIRnzw<T^%-Ilp6cU$4M(ruO7YPU6RYu(nlt#{kt zw$W{q+h(^dZd={9xovmb;kMIlm)mZ)J#Ks5_POnMJK%QE?U37Hw<B&x-Hy2(cRS&B z((RPnX}2?OXWh=Zop-z7cG2yU+hw;aZdcu|xm|a=;dayQmfLN&J8pN~?z!D}d*Jra z?UCDKw<m5--JZEUcYERX((RSoYqvLUZ{6Oxy?6WI_R;N=+h?~gZeQKLxqWy0;r7$* zm)mc*KW=~B{<-~kV{m75XL4tDXK`nBXLDzF=WyqA=W^$E=W*wC=X2+G7jPGJ7jhSN z7jYML7jqYPmvEPKmvWbOmvNVMmvfhQS8!K!S8`W&S8-Q$S94c)*KpT#*K*f(*KyZ% z*K^l*H*hy}H*z<2H*q(0H*+_4w{W*~w{o|3w{f?1w{y35cW`%fcXD@jcX4-hcXM}l z_i*=g_j31k_i^`i_jC7m4{#534{{H74{;B54|5N9k8qE4k8+Q8k8zK6k8_WAPjF9k zPjXLoPjOFmPjgRq&v4Il&vMUp&vDOn&vVarFK{n(FLEz-FL5t*FLN(<uW+w)uX3+; zuW_$+uXC?=Z*XsPZ*p&TZ*gyRZ*y;V?{M#Q?{e>U?{V*S?{n{WpWr^xeUkfR_bKjE z-KV)vcc0-t(|wlvZ1*|tbKU2;&v#$ozR-P<`(pPc?n~X5xi5EL;l9#+mHTS<HSTNO z*SW8E-{8K{eUtlU_bu*Q-M6`Kci-W@(|wowZudRzd)@cB?{`1oe$f4p`(gJZ?nm8^ zxgU2w;eOKnl>2G-Gwx^I&$*v>zu<n+{gV4-_bcvK-LJV{cfa9&)BTqFZTCCwcir!~ z-*<oD{?PrA`(yVf?oZvHxj%P*;r`P7mHTV=H|}rU-?_hc|KR@7{geA=_b={W-M_hi zcmLu3)BTtGZ}&g$f8GDN|95BbVDw<}VD@0~VD(`0VE5qg;Pl|~;P&A0;Pv41;P(*l z5cCl85cUx95cLrA5ciPqko1u9koJ)AkoA!BkoQpVQ1nppQ1(#qQ1wvrQ1{UA(Dcyq z(Du;r(Dl&s(DyL#F!V6;F!nI<F!eC=F!!+Vu=KF<u=cR=u=TL>u=jBAaP)BUaQ1NV zaP@HWaQE==@bvKV@b>WW@b&QX@b?Jt2=oZ@2=)l^2=xf_2=|Eai1di^i1vu_i1mo` zi1$eFNc2eZNcKqaNcBkbNcYI_$n?na$o9zb$o0tc$oDAlDD)`uDE27vDD^1wDEFxF zsPw4vsP?GwsP(AxsP|~_X!L0EX!dCFX!U6GX!q#w==A9F==SLG==JFH==Yf5G0|g^ z$7GKw9#cK0c}(}1;W5)=md9+5IUaL8=6THbSm3eHW0A*Vk0l;UJ(hVa_gLYv(qom! zYL7J@YdzL^toPX9vC(6b$7YW$9$P)Od2ILC;jz<Wm&b08Jsx{K_Id30IN)*6<B-Q; zk0TyOJ&t)C_c-Bk(&LoJX^%4=XFbk&ocFlkana+F$7PQz9#=iCd0h9n;c?UBmd9<6 zJ05pE?s?qzc;NBS<B`W>k0%~aJ)U_y_juv)(&LrKYmYY`Z#~|5y!ZIv@zLXx$7hc( z9$!7ad3^Wy;qlYsm&b39KOTQQ{(1cOVDM!0Wb$P8WbtJ6Wb<VA<nZM5<nrY9<niS7 z<n!eB6z~-E6!H}I6!8@G6!R4Kl<<`Fl=77Jl<}1Hl=GDLRPa>vRPt2zRPj{xRP$8# z)bP~w)biB!)bZ5y)brH$H1IU^H1ag|H1Ra`H1jm~wD7d_wDPp}wDGj{wDYw0bntZa zbn<lebn$fcbn|rg^ziib^z!uf^zrod^z-!h4Dbx}4Dt;24Dk&04D$^4jPQ)~jPi{3 zjPZ>1jPs25Oz=$fO!7?jOz}+hO!G|l%<#<g%<|0k%<;_i%=66mEbuJ!Eb=V&Eb%P$ zEb}b)tnjS#tn#e(tnsY%tn;k*Z18OKZ1QaOZ1HUMZ1ZgQ?C|XL?DFjP?D6dN?DOpR zoZvapbCTy|&ncc$J*Rn2_nhH5({q;RY|lBKb3NyI&i7p4xzKZw=VH$#o=ZKKc`o-{ z;knXtmFH^DHJ)od*Lkk@+~B#<bCc(0&n=!?J-2yo_uS#R({q>SZqGfQdp-Ag?)N<4 zdC>Ea=V8wyo<}{8c^>yX;d#>Yl;>&BGoEKX&v~Bryx@7!^OEOf&nuo+J+FCQ_q^eG z)AN?+ZO=QNcRlZU-uHaq`Ox!`=VQ+&o=-iWc|P}i;rY_@mFH{EH=b`j-+8|G{NVY~ z^ONUi&o7=|J->N=_x$1c)AN_-Z_huTe?9+s{`X|?V)SD2V)kP3V)bJ4V)x?k;`HM3 z;`ZY4;`QS5;`b8p67&-C67~}D67>@E68DnulJt`DlJ=7ElJ%1FlJ`>ZQuI>tQub2u zQuR{vQuosE()7~u()QBv()H5w()Tj(GW0U?GWIg@GW9a^GWW9Zvh=d@vi7p^vh}j_ zviEZEa`bZYa`tlZa`kfaa`*D^^7QiZ^7iua^7Zob^7jhx3iJx{3ib-|3iS%}3ipce ziu8)|iuQ`}iuH=~iuX$JO7u$dO7=?eO7%+fO83g}%Jj<e%J$0f%Js_g%J(YpD)cJy zD)uVzD)lP!D)*}Js`RSzs`je!s`aY#s`qN}YV>OIYW8aJYV~UKYWM2!>h$XJ>h|jK z>h<dL>i3%9HPLI5*JQ6LUQ@lMc}@44;Wg81me*{rIbL(U=6TKcTHv+NYmwJtuO(hf zy_R_`_gdk#(rcC1YOgh3YrWQat@qmCwb5&n*JiIRUR%Akd2RRF;kDCim)CBuJzjgg z_Id61I^cEC>yX!BuOnVZy^eVu_d4Nq((9DhX|FS0XT8pOo%g!nb<yjR*JZCOURS-Y zd0qFq;dRsNme*~sJ6?Ca?s?t!df@fY>yg)EuP0tly`FhJ_j=*=((9GiYp*w6Z@u1m zz4!Xy_0j8-*JrOUUSGYwd42c#;q}w&m)CEvKVE;m{(1fPV(@14X7XnCX7OhAX7gtE z=J4k9=JMwD=JDqB=JV$F7VsAI7V;MM7V#GK7V{SOmhhJJmhzVNmhqPLmh+bPR`6Ez zR`OQ%R`FK#R`XW(*6`N!*7DZ&*74T$*7Mf)Ht;s|Hu5(1Ht{y~HuE<3w(z#}w(_?2 zw(++0w)3|4cJOxecJg-icJX%gcJp@k_VD)f_VV`j_VM=h_Vf1l4)6~24)PB64)G54 z4)YH8j_{83j`EK7j`5E5j`NQ9PVi3jPV!FnPVr9lPV-Lp&hXCk&hpOo&hgIm&hyUq zF7Ph&F7ht+F7Yn)F7qz;uJEq(uJW$-uJNw*uJf+<Zt!mOZt`ySZt-sQZu4&U?(pvP z?(**T?(y#R?(^>Vp5Q&vdy@BL?<w9>y{CCk_nzTB(|eZpZ0|YVbG_$z&-Y&7z0iA+ z_hRoQ-b=lgc`x@~;l0v(mG^4zHQsBz*Lkn^-r&8_dz1HO?=9Y2y|;O9_uk>X(|ecq zZtp$bd%gF0@Ap37ebD=m_hIiN-bcNUc^~&a;eFEkl=o@xGu~&t&v~EszTkb)`;zx% z?<?L{y{~y+_rBqM)BBe9ZSOnYcfId<-}ipt{m}c7_hauT-cP-sc|Z4l;r-J4mG^7! zH{Nf(-+90H{^0%5`;+%)?=Rk8y}x;X_x|Di)BBhAZ|^_ef4%>C|MzC_Vf110VfJD1 zVfA72VfW$i;q>A1;r8M2;q~G3;r9{n5%dxA5%v-B5%m%C5%-bsk@S)Bk@k`Ck@b=D zk@r#XQS?#rQT9>sQT0*tQTNgC(e%;s(e}~t(e=^u(f2X%G4wI=G4?U>G4(O?G54|X zvGlR>vG%d?vGuX@vG;NCarANWarSZXarJTYarg1?@$~WX@%HiY@%8cZ@%IVv3G@l_ z3HAx`3H1r{3HOQciS&u`iS~){iS>!|iT6qHN%TqbN%l$cN%cwdN%zU{$@Izc$@a<d z$@R(e$@eMnDfB7wDfTJxDfKDyDfg-Hsr0GxsrISysr9MzsrPB{Y4mCGY4&OHY4vII zY4_>y>GbLH>GtXI>GkRJ>Gzr7Gtp;~&t#t|K2v?B`Aqkj;WN``md|XTIX-iJ=K0L` zS>UtKXOYihpCvv^eU|ww_gUey(r1;=YM(VeYkk)FtoPaAv(aah&t{)3K3jdZ`E2*u z;j`0cm(OmWJwAJV_WA7hIpA~9=aA1~pCdj;eUAAY_c`Hn(&v=VX`eGbXMN83ocFol zbJ6FL&t;!0K39FN`CRw8;d9gHmd|aUJ3e=P?)lvJdEoQV=aJ82pC>*~eV+L|_j%#- z(&v@WYo9khZ++hRy!ZLw^U>#%&u5=6K3{#l`F!{J;q%kym(OpXKR$nb{`vg(Ven=2 zW%6bAW$|V8W%FhC<?!Y7<?`kB<?-e9<@4qD74Q}G74jAK74a4I74sGMmGG7HmGYJL zmGPDJmGhPNRq$2xRq|E#Rq<8zRr6K%)$rBy)$-N$)$!H!)$`T&HSjg`HS#s~HSsm| zHS;z1weYp{weq$0wehv}wez+2b?|lcb@Fxgb@6reb@O%i_3-ud_44)h_3`!f_4D=j z4e$;04e|~44e<^24f756jqr{1jq;85jq#23jq{E7P4G?hP4Z3lP4P|jP4i9n&G60i z&GOCm&GF6k&GXIoE$}V$E%Gh)E%7b&E%Pn+t?;e%t@5q*t?{k(t@Ew-ZSZaMZSrmQ zZSigOZS!sS?eOjN?egvR?eXpP?ep#To!~pscara9-zmOReW&?O_nqN8(|4BdY~MM) zbA9Le&i7s5yU=%$?_%F2zDs?V`7ZZe;k(jzmG5fbHNI<o*ZHpZ-Qc^?ca!gC-z~md zeYg2;_ub*U(|4EeZr?q=dwuu$?)N?5d(iig?_u8~zDIqJ`5yN@;d|2el<#TZGrnhi z&-tGBz2JM%_mb~r-z&aXeXsdm_r2kJ)AyF|ZQnb-cYW{q-uHdr`_T81?_=L5zE6Fh z`9Al3;rr6}mG5icH@<Iu-}%1x{owo2_ml5u-!HyjeZTpB_x<7f)AyI}Z{I(@e|`V? z{`Y0@WAtP4WA<b5WA$V6WB23m<MiY5<M!k6<Mre7<M$Kr6Z8}E6ZRAF6ZI4G6Zezw zlk}7FllGJGll7DHllN2bQ}k2vQ}$EwQ}t8xQ}@&G)AZBw)ArNx)AiHy)Auv*GxRg^ zGxjs_Gxam`GxxLbv-Gp_v-Y#`v-Pv{v-flGbM$labM|xbbM<rcbNBP`^Yrub^Y-)c z^Y!!d^Y;tz3-k-}3-$}~3-t^03-^ogi}Z`~i}s80i}j21i}y?LOY}?fOZH3gOZ7|h zOZUt0%k<0g%l6Ch%k|6i%l9krEA%V!EA}h#EA=b$EBCALtMse#tM;q$tM#k%tM_a0 zYxHaKYxZmLYxQgMYxnE$>-6jL>-OvM>-FpN>-U@BH_>mB-(<fjepCIX`Azqm;WyK7 zmfvi@Iev5f=K0O{Tj00QZ;{_(za@T4{g(MH_gmq&(r=aDYQHspYyH;wt@qpDx6yBt z-)6rpep~&v`EB>x;kVOom)~x`J$`%r_WAAiJK%TF?~vbNzaxG}{f_w^_dDTt((jbt zX}>dmXZ_Cko%g%ochT>X-(|lmepmgj`Ca$B;dj&Tmfvl^JAQZl?)lyKd*Jub?~&hQ zzbAfA{hs+f_j}>@((jeuYri*sZ~fl+z4!az_tEc@-)Fxseqa5*`F;2M;rG+;m)~!{ zKYoAx{`vj)WAJD6XYyzEXYptCXY*(G=kVwB=kn+F=ke$D=kw?H7w{MK7xEYO7x5SM z7xNeQm++VLm-3hPm+_bNm-CnRSMXQ#SMpc(SMgW%SMyi**YMZ$*Yel)*YVf&*Ynr+ zH}E&~H}W_3H}N<1H}g05xA3?0xAM34xAC|2xAV96ckp-gck*}kcky@ick_4m_we`h z_wx7l_wo1j_w)Dn5AYB45AqN85AhH65AzTAkMNK5kMfW9kMWQ7kMocBPw-FlPx4Rp zPw`LnPxDXr&+yOm&+^aq&+*Uo&-2gsFYqt)FY+(;FYzz+FY_<=ukf$*ukx?<uko+- zuk)|>Z}4yQZ}M;UZ}D&SZ}V^W@9^*R@AB{V@A2>T@AL2XpWr{yf0F-X|0(`c{ipd) z_n+ZE(|?x#Z2vj_bN%P}&-Y*8ztDe?|6>0o{!9Ir`7ifh;lI*<mH%r0HU4Y;*ZHsa z-{8N|f0O@a|1JJo{kQpV_ut{a(|?!$ZvQ?0d;RzM@Ap68f6)Js|6%_l{zv_f`5*T` z;eXQql>ce}GyZ4&&-tJCzu<q-|C0Y@|117i{jd37_rKwP)Bl$LZT~y|cm41A-}isu z|Iq)D|6~6r{!jg%`9Jr6;s4VAmH%u1H~w$^-}%4y|KR`8|C9e`|1bVu{lEEt_y6Jl z)Bl(MZ~s63fBpaY|MzDIU<_aiU=CmjU=3gkU=QF3;0)jj;11vk;0@pl;13W85DX9s z5DpLt5DgFu5D$<DkPMItkPeUukPVOvkPlD@Pz+ECP!3QDPz_KEP!G@u&<xND&<@ZE z&<)TF&<`*OFbpsXFb*&YFbyyZFb}W@une#Yunw>Zunn*aun%wua13w?a1L+@a1C$^ za1ZbZ@C@(@@DA_^@D1<_@DB(G2n+}c2o4Ad2n`4e2oHz|hzy7dhz^Jehz*Dfh!02z zNDN2{NDfE|NDW8}NDs&e$PCB|$PUN}$PLH~$PXw8C=4hHC=MtIC=DnJC=aLzs0^qI zs1B$Js12wKs1IleXbflyXbxxzXbor!Xb<QJ=nUuz=nm)!=nd!#=nt3>Ffm|Kz~q1_ z0aF8}1xyc^5im1gR>16lIRSG6<^{|TSP-x<U{S#0fF%J-1C|9W4_FbfGGJA}>VP!? zYXjB=tPj`_urXj$z~+E00b2vM1#A!45wJ60SHSLoJpp?I_66(@I1q3!;84KffFl7% z1C9k84>%EUGT>Ce>3}l<X9La!oDaAVa53Ogz~z7|0apXA1zZof5pXl$R>19mI{|kC z?giWrco6U~;8DQifF}V@1D*vu4|oyqGT>Ff>wq@_Zv);1ybt&g@G;<1z~_K30bc{Y z1$+<q5%4qMSHSOpKLLLO{ssIGU<hOkWC~;sWC>&qWD8^u<Ot*p<O<{t<O$>r<O}2v z6bKXy6bcj$6bTd!6blp&ln9gzlnRs%lnIm#lnay(R0vcIR0>oMR0&iKR0~uO)CklJ z)C$xN)CtrL)C<%PGzc^dGzv5hGzl~fGz&Bjv<S2ev<kEiv<b8gv<tKkbO>||bP9A1 zbP03~bPIG3^a%6}^a}J2^a=D0^b7P43<wMi3<?Ym3<(Sk3=0eoj0lVjj0%hnj0ubl zj0=npObAR2ObSd6ObJX4Obbj8%m~a3%nHm7%n8g5%nQs9EC?(NED9_RED0<PEDJ0T ztO%?OtO~3StO=|QtP89UYzS-&Yzk}+Yzb@)Yzu4;><H`(><a7-><R1*><jD<oDeuM za8lspz$t-K1E&Q}51bJ=GjLYm?7%sJa|7oE&JSD=xG->0;Nrj~flC9I1uhR<5x6pN zRp9EtHGyjb*9EQ*+z_}ia8uysz%7AW1Gfck58M&BGjLbn?!Y~Pdjt0c?hiZ=crfr# z;Nid{fky+61s)GP5qL82RN(2rGl6FV&jp?jybyRX@KWIAz$<}Q1Fr>M54;h0Gw@d6 z?Z7*McLVPQ-Vb~b_%QHM;N!q2flmXU1wIda5%@CjRp9HuH-T>h-vz!8{1Est@KfOD zz%PMc1HT1+5Bw4MGw@g7@4!ESe*^yo{tsjbVhmymVh&;nVhv&oVh`d7;tb*n;tt{o z;tk>p;tvuC5)2Xw5)Kjx5)Bdy5)YCHk_?gxk`9syk`0mzk`Gb{QVdcGQVvoHQVmiI zQV-Gy(hSlH(hkxI(hbrJ(ho8SG7K^bG7d5cG7T~dG7qu{vJA2cvJSEdvJJ8evJY|y zatv|`at?9{at(3|au4zd@(l6{@(%I|@(uC}@(&6K3JeMg3JwYh3JnSi3J;11iVTVh ziVlhiiVcbjiVsQ%N(@R0N)Ad1N)1X2N)O5i$_&a1$_~m2$_>g3$`2|CDhw(LDh?_M zDh(<NDi5j%stl?Mst&3Nstu|Ost;-iY7A-$Y7S}%Y7J@&Y7goN>I~`%>JI7&>J91( z>JOR_G%;vW(Bz;gK~saK1x*i{5i~PsR?zIAIYD!S<^|0US`f4_Xi?DOpd~>|gO&v? z4_XnlGH6xM>Yz12YlGGWtq<A|v@vK?(B_~mL0f~i1#J)75wtUCSJ3XDJwbbe_66+^ zIuLX)=upt%pd&#?gN_9q4>}QaGU!y$>7X+~XM@fKoe#PYbTQ~s(B+^jL05yW1ziui z5p*-?R?zLBJ3)7Y?giZsdJyz5=uyz)peI33gPsLF4|);wGU!#%>!3G5Z-d?iy$|{j z^fBmD(C45pL0^Nu1$__t5%e?YSJ3aEKS6(k{ssLHVhCmoW(sBwW(j5uW(#Hy<_P8t z<_hKx<_YEv<_qQz76=v$777*)76}#&77G>+mI#&%mI{^*mI;;(mJ5~-RtQ!MRti=Q zRtZ)ORtr`S)(F-N)(X}R)(O@P)(h4THV8HhHVQTlHVHNjHVZZnwg|QiwhFcmwh6Wk zwhOiob_jM1b_#Y5b_sS3b_;e7_6YV2_6qh6_6hb4_6zn84hRkm4hjwq4haqo4hs$s zjtGtnjtY(rjtPzpjth<tP6$p6P6|#AP6<v8P76*C&Iry7&I-;B&I!&9&I`^DE(k6R zE($IVE(tCTE(<OXt_ZFSt_rRWt_iLUt_!XYZU}A+ZVGM=ZV7G;ZVPS??g;J-?h5V> z?g{P<?hEb@o)A1ScvA4>;3>gVgQo>g51tV`Gk8|;?BF@UbA#sv&ktS@yfAoC@Z#Vl z!Apae1uqX?5xg>ZRq*QIHNk6x*9ET+-VnSocvJA^;4Q&hgSQ2558e^HGk90<?%+Ma zdxQ4{?+-o@d@%S>@ZsPi!AFCS1s@MS5qvWERPgEGGr?zr&jp_kz7Tvd_)_rY;48sb zgRcc&555t6Gx%2U?ch7XcZ2T*-w%Ee{4n@Y@Z;bo!B2yq1wRjd5&SavRq*TJH^Fa% z-vz%9{t)~z_*3xb;4i^ngTDoT5B?GSGx%5V@8Cbde}n%8{|{yeVGLmkVGdylVGUsm zVGrR5;SAvl;SS*m;SJ#n;SUiA5eyLu5e^Xv5e*Rw5f70FkqnUvkq(gwkqwaxkq=P_ zQ4CQEQ4UcFQ4LWGQ4i4w(G1ZF(GJlG(GAfH(GM{QF$^&ZF%B^aF%2;bF%Pi_u?(>a zu@12bu??{cu@7+waSU+^aSm|_aSd?`aS!nb@eJ__@ec6`@eT0{@ec_I2@DAe2@VMf z2@MGg2@i<~i42Jfi4KVgi4BPhi4RE#NeoE}Ne)Q~NexL0Ne{^g$qdN~$qva0$qmU1 z$qy+ADGVtJDGn(KDGezLDG#X#sSK$KsSc?LsST+MsSjxgX$)x!X%1-#X$@%$X%FcL z=?v)#=?>`$=?&=%=?|F@GBIRQ$mEbIAyY%9g-j2b5i&DmR><s-IU#dH=7r1;SrD=? zWKqcCkR>5YLzaas4_OhiGGtZA>X0=dYeUwBtPj}`vN2>+$mWnOAzMSXg=`Pm5wbI6 zSIF*=Jt2ET_J!;ZIS_I%<WR`rkRu^SLym<U4>=KXGUQaq>5wxaXG6|~oDaDWaxvsm z$mNhLAy-4Lg<KE05ppx+R><v;J0W*N?uFbBc@Xk2<Wb1ukS8HeL!N~^4|x&tGUQdr z>yS4gZ$sXNybt*h@-gI7$mftRAzwqjg?tbB5%M$SSIF;>KOuiZ{)PMxVF+amWeQ~u zWeH^sWea5w<p|{r<qG8v<q72t<qPEx6$lj!6$%v&6$up$6$=#)l?as#l?s&(l?jy% zl?#;*RR~oKRSH!ORS8uMRSQ)Q)d<xL)e6-P)d|%N)eF@RH3&5fH3~HjH3>BhH48Nl zwFtEgwF<QkwF$KiwF|WmbqI9~bqaM3bqRG1bqjS5^$7J0^$PV4^$GP2^$Yb64G0Yk z4GIko4G9em4GRqqjR=hljS7tpjR}nnjSGzrO$bd4O$tp8O$kj6O$$vA%?Qm5%?iy9 z%?Zs7%?r&BEeI_PEeb6TEeS0REekCVtq83QtqQFUtqH9StqZLWZ3t})Z3=A;Z3%4+ zZ3}G=?Fj7*?F#J<?FsD-?F;P>oe(-PbW-T#&?%u)L#KsK51kP@Gjvwy?9e%(b3^Ba z&JSG>x-fK6=;F{Np-V%Tg)R?W5xO#TRp{!_HKA)m*M+VR-4MDlbW`Z&&@G``L$`%) z58V;EGjvzz?$AA<dqeky?hic>dNA}*=;6>Kp+`fHg&q$*5qdK8ROso@Gofcg&xM{3 zy%2ga^it^M&?})=L$8Hi54{n3GxS#I?a(`+cSG-m-Vc2c`Y`lS=;P2Qp-)4fg+32` z5&AOpRp{%`H=%Ds--W&p{Sf*w^i$~P&@Z81L%)T75B(APGxS&J@6bP?e?$L;{tsmc zV+>;oV-8~pV+~^qV-Mp9;|${p;|}8q;|=2r;|~)E6ATjy6Alvz6Acp!6AzOJlMIsz zlMa&!lMRy#lMhn}Qw&oIQw~!JQw>uKQxDS!(+txJ(+<-K(+$%L(+@KUGYm5dGY&He zGYvBfGY_)}vkbEevktQfvkkKgvk!9!a}09|a}IL}a}9F~a}V<f^9=I}^A7U~^9}P0 z^A8IM3k(Yi3l0kj3k?ek3lED3iwuhjiw=tkiw%nliw{c(OAJd2OAbp3OASj4OApHk z%M8m3%MQy4%MHs5%MU9ED-0_ND-J6OD-A0PD-Wv(s|>3Os}8FPs|~9Qs}E}kYYb}& zYYuA(YYl4)YY*!P>kR7(>kjJ)>kaD*>kpd{HZg2c*yOM&VN=7Vg-s8e5jHbyR@m&Y zIbn0d=7r4<TM)J|Y*E<auq9zj!<L0D4_gtoGHg}Y>aaCoYs1!stq<D}wlQo|*ygY; zVOzttg>4Vp5w<gISJ>{bJz;yp_J!>aI}mm->`>U@up?nd!;Xa=4?7WdGVD~?>98|l zXT#2goe#SZb}{Ty*yXS*VOPVhg<TK35q2}|R@m*ZJ7IUj?uFeCdl2?8>`~a`uqR<p z!=8mb4|@^zGVE2@>##RrZ^Pb&y$|~k_A%^J*ype>VPC_(g?$hE5%x3eSJ>~cKVg5v z{)PPyV+dyqX9{NyX9;HwXA5T!=LqKv=L+Wz=LzQx=L_c#7YG*&7YY{+7YP>)7Yi2; zmk5^(mkO5-mkE~*mkXB<R|r=OR|;1SR|!`QR|{7U*9g}P*9zAT*9q4R*9+GVHwZTj zHwrfnHwiZlHw!lpw+Ockw+goow+Ximw+puqcL;Y3cM5k7cL{e5cMEq9_Xzh4_X_t8 z_X+n6_Y3zA4+swo4+;+s4+#$q4+{?uj|h(pj|z_tj|q<rj|-0vPY6#8PYO>CPYF*A zPYX{E&j`;9&kD~D&k4^B&kN5FF9<ITFA6UXF9|OVFAFaZuL!RUuL`dYuL-XWuM4ja zZwPM;ZwhY?ZwYS=Zwqe^?+EV<?+Wh@?+Nb>?+fn_pAbGVd{X%2@G0R_!>5H$51$b} zGkjL~?C?3^bHnF_&ktV^zA$`I_~P&-;Y-7pg)a|Z5xz2fRru=gHQ{T+*M+YS-w?hr zd{g-5@Gaq6!?%TR58n~KGkjP0?(jX~d&BpI?+-r^elYw{_~Gy);YY)dg&z+;5q>iK zRQT!eGvQ~$&xM~4zYu;g{8ISk@GIe0!>@&355Ez9GyGQg?eII{cf;?6-w%Hf{xJMe z_~Y;=;ZMV#g+C8}5&km#Rru@hH{ox?--W*q{}BE${8RYn@Gs$C!@q@p5C0MVGyGTh z@9;n2f5ZQU{|{$~V2ogjV2)skV2xmlV2|L4;Edpk;Ev#l;Emvm;Exc95R4Ft5RMRu z5RDLv5RZ_Ekc^OukdBavkd2UwkdIJ^P>fKDP>xWEP>oQFP>;}v(2UTE(2mfF(2dZG z(2p>PFpMyYFpe;ZFpV&aFpsc^u#B*Zu#T{au#K>bu#a$vaEx$@aE@?^aE)+_aF6ha z@Qm<^@Q(0_@Qv_`@Q(<H2#g4d2#yGe2#pAf2#<(}h>VDeh>nPfh>eJgh>u8!NQ_8| zNRCK}NR3E~NRP;f$c)H}$d1T~$c@O0$d4$9D2ynID2^zJD2*tKD37R!sEnwJsE(+K zsEw$LsE=rfXpCrzXpU%!XpLx#XpiWK=#1!!=#J=#=#A)$=#Q8XF)?CN#N>!65mO_k zMNE&F5iv7jR>bUxIT3Rs=0(hpSP-!=Vo}86h$RtABbG%hk6010GGbN4>WDQFYa`Z0 ztdH0bu`yy(#O8=C5nCg+MQo4Q5wSC3SH$j!JrR2&_C@TEI1q6#;!wolh$9h4BaTHJ zk2n!=GU8Ok>4-BCXCux<oR7E=aWUdj#N~)95mzIwMO=@#5pgr(R>bXyI}vvy?nT^> zco6Y0;!(uoh$j(GBc4S(k9ZOBGU8Rl>xefIZzJACypQ-0@iF34#OH`F5nm&|MSPF= z5%DwPSH$m#KM{W;{zd$cV2EUlWQt^tWQk;rWQ$~v<cQ>q<cj2u<cZ{s<cs8w6o?dz z6p9p%6p0j#6pIv(l!%m!l!}y&l!=s$l#7&)RESiJREkuNREboLREt!P)QHrK)QZ%O z)QQxM)Qi-QG>9~eG>SBiG>J5gG>bHkw1~8fw2HKjw28Ehw2QQlbcl3}bc%G2bcuA0 zbc=M4^oaC~^osP3^ojJ1^o#V542TSj42len42cYl42ukpjEIbkjEanojERhmjEjtq zOo&X3Oo~j7Oo>d5Op8p9%!tg4%!<s8%!$m6%!|yAEQl<OEQ&0SEQu_QEQ>6Utca|P ztct9Ttck3Rtc$FVY=~@(Y>I4-Y>8}*Y>RA<?1=1)?27D;?1}7+?2GJ=oDexNa#G~v z$SILiBd0}9kDL)XGjdks?8rHhb0g<P&W~IWxiE53<l@LBkxL_&MJ|tA5xFvQRpjc( zHIZv0*F~<6+z`1ja#Q5y$SsjuBez9vkK7TtGjdnt?#Mlndn5Nn?vFeWc`))&<l)F8 zkw+tsMIMhl5qUE5ROIQ%Gm&Q_&qbb(ybyUY@>1mG$SaXoBd<kXkGv6iGxApC?Z`Wk zcO&mb-j93``7rWP<m1REkxwI^MLv&w5&1ImRpjf)H<526-$lNU{1Evu@>AsJ$S;v! zBfmv{kNgq&GxAsD@5n!qe<S}z{*PpcVvJ&nVvb^oVvS;pVvpj8;*8>o;*R2p;*H{q z;*S!D5{wdx5{?py5{(jz5|5IIl8lmyl8%yzl8us!l8;h|QjAiHQjSuIQjJoJQjgMz z(u~rI(vH%J(v8xK(vLETGK?~cGLABdGL15eGLN!|vW&8dvW~KevW>EfvX63za*T3{ za*lF|a*c9}a*y(e@{IC|@{aO}@{RI~@{bCL3XBSh3XTei3XKYj3Xh72ij0biijInj zij9hkijPW&N{mX1N{&j2N{vd3N{`Bj%8bg2%8ts3%8km4%8x3DDvT<MDvm0NDvc_O zDvzp&s*I|Ns*b9Os*S3Ps*h@jYK&@%YL04&YK>}(YLDuO>Wu1&>W=D(>W%7)>W`Wb zH8E;Z)a0lsQB$L)MNN;I5j8VvR@CgMIZ<<?=0(kqS`f7`YEjhUs3lQLqn1T2k6ID6 zGHO-S>ZmnQYopdht&iFewJ~Z_)aIxyQCp+7MQxAT5w$aFSJdvPJyCn3_C@WFIuLa* z>QL0-s3TEFqmD%#k2(=`GU`;+>8LYNXQR$VosYT@busEv)a9rvQCFj`MO}}&5p^@_ zR@CjNJ5hI|?nT{?dJy$6>QU6=s3%cRqn<@Qk9raHGU`>->!>$TZ=>Ety^s13^)c#G z)aR%#QD39JMSYL@5%n|bSJdyQKT&_9{zd(dVu)spW{PHxW{GBvW{YNz=7{Eu=8EQy z=85Kw=8NW!7Kj#%7K#>*7Ks*(7K;{-mWY;&mWq~+mWh^)mW!5;R)|)NR*F`RR*6=P zR*P1T)`-@O){54S)``}Q){EAUHi$NiHi|ZmHi<TkHj6fowurWjwu-inwu!clwu`op zc8GS2c8Ye6c8PY4c8hk8_K5b3_KNn7_KEh5_KWt94u}qn4vG$r4v7wp4vP+tj);zo zj*5<sj){(qj*E_uPKZv7PKr*BPKi#9PK!>D&WO&8&Wg^C&WX;A&Wp~EE{HCSE{ZOW zE{QIUE{iUYu86LTu8OXXu8FRVu8XdZZisG-Zi;S>Zi#M<Zi{Y@?uhP;?uzb??uqV= z?u+h^o)A4TdQ$Y{=qb@tqo+krkDd`dGkR9^?C3esbED@)&yQXZy)b%F^y26x(MzM3 zMK6zD5xp{cRrKoUHPLIM*F~?7-VnVpdQ<e~=q=G(qqjwGkKPfzGkRC_?&v+yd!zS7 z?~gtZeK7h^^x^0u(MO|?MIVno5q&cHRP^cSGtp<G&qbe)z7Tye`cm}e=qu4zqpw9@ zkG>IoGx}Ea?dUtvccbq`-;aI}{V@7b^yBC!(NCkFML&;z5&bgyRrKrVH_>mS-$lQV z{t*2!`cw4h=r7S<qrXLekNy$;Gx}Hb@900#f203J|Bq&fVT@slVUA&mVU1ynVUOX6 z;f&#m;f~>n;f>*o;g1oB5sVRv5sndw5seXx5s#6Gk&Kawk&cmxk&Tgyk&jV`QH)WF zQI1iGQH@cHQIFAx(TvfG(T>rH(T&lI(T_2RF^n;aF^(~bF^w^cF^{o`v5c{bv5v8c zv5m2dv5#?xag1?_agK3`agA|{agXtc@r?0`@s9C{@s06|@sA0J35*Gf362Sg35^Mh z36F`0iHwPgiH?bhiH(ViiH}K$NsLK~NsdX0NsUR1Nsq~h$&AU0$&Sg1$&Ja2$&V?B zDU2zKDUK<LDUB(MDUYd$sf?+Lsg9|Msg0?NsgG%hX^d%#X^v@$X^m-%X^-iM>5S=$ z>5l1%>5b`&>5rKZGcjgT%;cCUF;iov#Y~Tx5i>JpR?O^}IWco%=Ecm9SrD@@W>L)I zm?bewW0u7%k6973GG<lG>X<b#Yh%{MtdH3cvoU5<%;uOaF<WD{#cYq+5wkO9SIq91 zJu!P@_QmXvIS_L&=1|Pxm?JSqV~)ifk2w)@GUimw>6kMyXJgLAoR7H>b1~*p%;lIX zF;`=*#axfM5py%<R?O{~J27`-?#0}Xc@Xn3=26V!m?tq$W1hu4k9iUEGUipx>zFq& zZ)4uYypQ=1^D*XA%;%UdF<)c8#e9$X5%V+VSIqC2KQVt}{>A){VTfgnWr}5vWr<~t zWs7Bx<%s2s<%;Ew<%#8u<%{Ky6^Ip#6^a#(6^Rv%6^j**m57y$m5P;)m5G&&m5Y^+ zRftuLRf<)PRf$!NRf|=R)ri%M)r!@Q)rr-O)r-}SHHbBgHHtNkHHkHiHH$TmwTQKh zwTiWlwTZQjwTrcnb%=G0b&7S4b%}M2b&GY6^@#P1^@{b5^@;V3^^5h74Tuel4T=qp z4T%kn4T}wrjfjnmjf#zqjfstojf;(sO^8j5O^Qv9O^Hp7O^Z#B&4|s6&5F&A&56y8 z&5O;CEr>0QEs8CUEr~6SEsHIWt%$9Rt%|LVt%<FTt&6RXZHR4*ZHjG<ZHaA-ZHsM> z?TGD+?TYP=?TPJ;?ThV?oe(=Qc2ex**eS77W2ePVkDU=aGj>+&?AST6b7SYl&W~LX zyD)Z9?BduZu}fo@#V(Is5xX*WRqX26HL+`B*Tt@n-4MGmc2n%;*e$VJW4Fa_kKGZw zGj><(?$|xCdt>*-?vFhXdocD;?BUoWu}5Q%#U7765qmQBRP5>4GqGo5&&8gPy%2jb z_EPNS*ekJDW3R<tkG&ClGxk>O?bti9cVq9x-j96{`!M!V?Bm!cu}@>4#XgUH5&JUs zRqX57H?ePH-^IR<{Sf;x_EYTV*e|hPW530IkNpw*Gxk^P@7O=Fe`Ei}{*PsdV~k^p zV~%5qV~t~rV~^vA<Ba2q<BsEr<Bj8s<Bt=F6O0pz6OI#!6O9v#6OWUKlZ=y!la7;# zlZ}&$laEt~Q;buJQ;t)KQ;k!LQ;*Y#(~Q%K(~i@L(~Z-M(~mQVGmJBeGmbNfGmSHg zGmo=~vy8KfvyQWgvyHQhvyXF#bBuF}bB=R~bB%M0bC2_g^NjO~^N#b0^NsV1^N$ON z3ycej3yuqk3ylkl3y+J4i;Rnki;jzli;atmi;qi)ON>j3OO8v4ON~p5OOMNl%Z$s4 z%Z|&5%Z<y6%a1FFD~v0OD~>CPD~&6QE03#)tBk9PtB$LQtBtFRtB-4lYm94(YmRG) zYmIA*Yme)Q>x}D)>yGP*>y7J+>yMidH!*Hf+~l|^aZ}@_#Z8Z!5jQh#R^05kIdOC2 z=EcpATM)M}Zc*IgxFvB*<CeuOk6RJ9GHzAe>bNy=Yvb0%t&iIfw=r&0+~&9~aa-fI z#chw<5w|mLSKRKnJ#l;E_QmawI}mp;?oiy}xFc~#<Br80k2?`}GVWB|>9{j-XXDPr zosYW^cQNi#+~v3{aaZH6#a)lP5qC50R^08lJ8^g8?#11Ydl2_9?or(1xF>N><DSJm zk9!gKGVWE}>$o>@Z{yy@y^s44_c88M+~>G2abM%U#eI+a5%)9hSKRNoKXHHK{>A-| zV~A&rXNqTzXNhNxXNzZ#=ZNQw=Zfc!=ZWWy=Zoi$7l;>(7m62-7l{{*7mF8<mxz~) zmx`B;mx-5+my4H=SBO`PSBh7TSBY1RSBqDV*NE4Q*NWGU*NNAS*NfMWH;6ZkH;Olo zH;FfmH;Xrqw}`ilw~Dupw~4onw~M!rcZhe4cZzq8cZqk6cZ+wA_lWn5_loz9_lft7 z_lx(B4~P$p4~h?t4~Y+r4~q|vkBE<qkBX0ukBN_skBg6wPl!*9Pl`{DPl->BPm52F z&xp^A&x+5E&xy~C&x_BGFNiOUFN!aYFNrUWFN-gauZXXVuZpjZuZgdXuZypbZ-{S< zZ;Ee@Z;5Y>Z;Nk_?}+b=?~3n^?}_h??~Ct`pAbJWep3A8_$l#I<EO<>kDn1gGk#Y5 z?D#qHbK~d5&yQaazc7AL{Nnf}@k`^E#V?Ov5x+8iRs8DsHSufX*Tt`o-w?ksepCGB z_$~2U<G00ckKYl$Gk#b6?)W|Nd*k=T?~gwae=z<~{NeZ`@kis2#UGD95q~oNRQ&1q zGx2BR&&8jQzYu>h{!;wq_$%>O<FCbEkG~OrGyYcm?f5(KcjNEH-;aL~|1kbh{Nwm1 z@lWHQ#XpaK5&ts&Rs8GtH}P-d-^IU={}BH%{!{$t_%HEa<G;m!kN*+>GyYfn@AyCQ zf8+nf|Bq)#U`$|2U`}93U`=34U{Byk;7s63;7;I4;7#C5;7<@p5KItC5Ka(D5KRzE z5KoXukW7$DkWP?EkWG+FkWWxZP)txtP)<-uP)$%vP*2cE&`i)u&`!`v&`r=w&`&T( zFibE?FitQ@FikK^Fi)^ZuuQN@uuiZ^uuZT_uupJEa7=JYa87VZa7}Paa8K|^@J#SZ z@J{ea@J;Yb@J|Rx2uuh{2u=t|2u%n}2v3Meh)jq|h)#$}h)sw~h)+mJNK8mdNKQye zNKHsfNKeQ}$V|ve$WF*f$W6#g$WJIpC`>3yC{8FzC`~9!C{L(Js7$Czs7|O!s7<I# zs847}XiR8IXijKJXiaEKXiw-!=uGHJ=uYTK=uPNL=ueoCFfn0L!sLW02~!iMB}`A4 zkuWo1R>JIrISF$U<|WKeSdg$VVNt^3ge3_}6P6_`Pgs$#GGSH1>V!23YZKNbtWVgG zurXm%!sdi630o7kC2UXFk+3siSHkXuJqddg_9g63IFN8K;ZVZigd+(@6OJVuPdJfq zGT~Ih>4Y;0XA{mPoKLura53Rh!sUc330D)YC0tLqk#IBNR>JLsI|+9a?j_t$c#!Zg z;ZeflgeM746P_hJPk52=GT~Li>x4H6Zxh}nyifR$@G;?2!smo9311VwC45i#k?=F& zSHkavKM8*m{w4fRU`S+4WJ+XCWJzRAWJ_dE<VfU9<VxgD<VoaB<V)mF6i5_I6iO6M z6iF0K6iXCOlt`3JluDFNlu49LluMLPR7g}zR7zA%R7q4#R7+G()JW7!)JoJ&)JfD$ z)JxP)G)Oc|G)gp1G)Xi~G)pv3v`Dl}v`Vy2v`Ms0v`e&4bVzhebV_tibV+ngbW3zk z^hoqf^h)$j^hxwh^h@+l3`h)23`z`63`q=43`-18j7W@3j7p47j7f}5j7yA9Oh`;j zOiD~nOi4^lOiN5p%t*{k%u38o%t_2m%uCEqEJ!R&EJ`d+EJ-X)EK4j;tVpa(tV*m- ztVyg*tV^s<Y)EWOY)WiSY)NcQY)foU>`3fP>`LrT>`ClR>`UxVoRBy%aZ=*s#3_kW z6Q?CkPn?lBGjUep?8G^Va}(z!&QDyBxG-^1;^M?5iAxigB`!}~k+?E(RpRQzHHm8z z*Cnn`+>p32aZ}>v#4U+i6SpO9Pu!8XGjUhq?!-NbdlUC1?oT|Bcrfu$;^D+2iANKU zB_2;ak$5ukRO0ExGl^#t&n2EuypVV?@lxXD#4Cwc6R#y+PrQ+MGx1j9?Zi8YcN6a= z-cNjx_%QKN;^V|8iBA)sB|cAlk@zz4RpRT!H;Hc(-zC0J{E+xD@l)dG#4m|o6Tc;X zPyCViGx1mA@5Dcee-r;D{!e5`VoYL6VoqX7VohR8Vo%~o;!NU7;!fg8;!Wa9;!hGt z5=;_G5>66H5=|0I5>Jvyl1!3Hl1`FIl1-9Jl21}dQcO}xQchAyQcY4zQcu!I(oE7y z(oWJz(oND!(oZr-GE6c`GEOo{GEFi|GEcHdvP`l{vQDx|vQ4r}vQKhIa!hhca!ztd za!qnea!>L|@=Wqd@=o$e@=fwf@=pp#3QP)03Qh`13QY=23QvkiicE@1icX42icN}3 zicd;NN=!;hN=`~iN=-^jN>9p2%1p{i%1+8j%1z2k%1<gtDoiR$Do!d%DorX&Do?6N zs!Xa%s!pm&s!gg(s!wW2YD{WMYEEiNYE5cOYESA&>P+fN>Q3rO>P_lP>Q9=GG%;yX z(&VHmNmG-iB~4G7ku)=DR?_UGIZ1Pq<|WNfT9C9bX;ISRq$Np9la?hdPg;?*GHF%P z>ZCPEYm?R`txwvJv@vN@(&nTsNn4Y)C2ddIk+d^uSJLjJJxP0$_9g94I*@cQ=}^+) zq$5d3la3`FPdbrwGU-&(>7+ABXOqq)olm-ubTR2t(&eNpNmrAuC0$Rtk#sZZR?_XH zJ4ttw?j_w%dXV%m=~2?-q$f#Flb$6#PkNE`GU-*)>!deHZ<F37y-)g(^fBpE(&wZv zNnew`C4Eo&k@Pd^SJLmKKS_U+{w4iSVn}98W=dvGW=UpEW=m#I=1AsD=1S&H=1JyF z=1b;J7DyIM7D^UQ7D*OO7E2aSmPnRNmP(dRmPwXPmP?jTR!CM%R!UY*R!LS(R!de- z)=1V&)=Jh+)=Ab))=Sn;Hb^#1HcB>5Hc2*3HcK{7wn(;2wo0~6wn?^4woA58c1U(i zc1m_mc1d<kc1w0o_DJ?j_Dc3n_DS|l_Dl9p4oD764oVJA4oMD84oePCj!2G7j!KSB zj!BM9j!TYDPDoBnPD)NrPDxHpPD@Tt&PdKo&PvWs&PmQq&P&cuE=Vp+E=n#=E=ev; zE=w*?u1Ky-u1c;>u1T&<u1l^@Zb)uSZc1)WZb@!UZcA=Y?nv%T?n>@X?n&-V?n~}Z zo{&5-c~bJ^<SEHhlcyz5Po9xHGkI3>?BqGgbCc&K&re>EyfArD^5Wzr$xD-$B`;52 zk-Rc_Rr2cOHOXs}*Cnq{-jKX8c~kP{<SoftleZ;rPu`KdGkI6??&Lkmdz1Gi?@vCE zd@%V?^5Nto$w!lqB_B^dk$f`wRPyQMGs$O@&n2HvzL0z|`BL)b<SWTnldmOTPri|S zGx=8X?c_Vjca!fW-%oy!{4n`Z^5f(u$xoA?B|lGok^D0GRr2fPH_304-zC3K{*e4J z`BU=e<S)rzlfNZ@PyUhoGx=BY@8mzpf0O?u|4(K}VN794VNPL5VNGF6VNc;m;Y{I5 z;ZEU6;Z5O7;ZG4r5lj(E5l#_F5ls<G5l@jwkxY?Fkxr3Gkxh|Hkxx-bQA|-vQBF}w zQB6@xQBToG(M-`w(N57x(M{1y(N8f*F-$Q^F-|c_F-<W`F;B5bu}rZ_u}-l`u}!f{ zu}^VGaZGVaaZYhbaZPbcaZm9`@l5eb@lNqc@lEkd@lOdz2}}t}2~G(~2~7!02~UYg ziA;$~iB5@0iA{-1iBCyLNlZyfNlr;gNli&hNl(d0$xO*g$xg{h$xX>i$xkUrDNHF! zDNZR#DNQL$DNm_LsZ6O#sZOa$sZFU%sZVK0X-sKKX-;WLX-#QMX;0}$=}hTL=}zfM z=}qZN=}(!EGBIUR%H)(ODN|FXrA$wmkuo!7R?6&@IVp2f=B3O}S&*_YWl_rFlqD%k zQ<kMHPg#+&GG$fD>XbDpYg5*xtWVjHvN2^-%I1_UDO*#vrEE{xk+L&oSIX{`Jt=!r z_NDAkIgoNN<xtAulp`reQ;ww^PdSltGUZgt>69}mXH(9loKLxsaxvvn%H@<RDOXdj zrCd+Bk#aNTR?6*^J1KWl?xoyMd64oj<x$GxlqV@qQ=X+fPkE8@GUZju>y$SsZ&Ti- zyifU%@-gL8%IB0XDPL2*rF>8Mk@7R;SIX~{KPi7x{-yj+VMt|6WlCjEWl3dCWlLpG z<w)gB<x1sF<w@mD<xAyH6-X6K6-pIO6-gCM6-yOQl}MFLl}eRPl}VLNl}nXRRY+A# zRZ3M(RY_G%RZCS*)kxJ$)k@V))k)P&)l1b+HApo~HA*#3HAyv1HA^*5wMey0wMw;4 zwMn&2wM(^6bx3tgbxL(kbxCzibxU<m^+@$h^-A?l^-1+j^-J|n4M+`44N4784M`16 z4NDDAjYy45jY^G9jY*A7jZ2MBO-M~lO-fBpO-W5nO-oHr%}C8m%}UKq%}LEo%}dQs zEl4d)ElMp;ElDj+ElVv=tw^m*txBy<tx2s-txK&>ZAfiQZAxuUZAooSZA)!W?MUrR z?Mm%V?MdxT?Mv-Xosc>)byDi&)G4V`Q>Ud)Po0rEGj&$#?9@4_b5rM~&QD#Cx-fN7 z>f+QTsY_Frr7llhk-9Q<RqE>0HK}V;*QKsc-H^I5byMo*)Geu7Q@5pVPu-EaGj&($ z?$kZ0dsFwN?oU0CdNB1+>fzKQsYg?fr5;Z`k$N)qRO;!}GpT1&&!wJEy^wk_^-}8P z)GMi1Q?I37PrZ?PGxb*L?bJJ|cT?}B-cNmy`Y`oT>f_WWsZUd%r9Mx6k@_<ARqE^1 zH>qz^-=)4!{gC=G^;7ES)Gw)DQ@^EtPyLblGxb;M@6<o3e^dXZ{!e8{V@zX8V@_j9 zV@+dAV^8Bq<4og9<4)sA<4xmB<4+Sv6HF6I6HXIJ6HOCK6Hk*!lT4FJlTMRKlTDLL zlTTAfQ%qAzQ%+M!Q%zG#Q%}=K(@fJ!(@xV#(@oP$(@!%<GfXo|Gfp!}Gfgu~Gf%Tf zvrMx}vre-~vrV&0vrltKb4+teb53(fb4_zgb5HX~^Gx$f^G@?g^G)+h^G^#%3rq`2 z3r-733r!143r~wki%g43i%yG4i%pA5i%&~POH4~jOHNBkOHE5lOHa#4%S_8k%TCKl z%T3Em%TFsvD@-d&D^4p(D@`j)D^IIPt4ym(t4^y)t4*s*t50i4YfNiOYffuPYfWoQ zYftM)>rCrP>rU%Q>rLxR>rb1IHZg5d+T^q;X;agtrA<$pkv21JR@&^eIcam#=B3R~ zTadOeZBg3dv?Xav)0U+zPg{|;GHq4b>a;a!Ytz=HtxwyKwlQr}+UB$^X<O5_rEO2! zk+w5!SK98hJ!yN>_NDDlJCJrT?NHj`v?FOp(~hMbPdkxzGVN5_>9jLxXVcE5olm=v zb}{Wz+U2w>X;;&(rCm?Ek#;lfR@&{fJ85^*?xo#Ndyw`p?NQp}v?pm#)1IY0PkWK} zGVN8`>$Ep%Z`0nTy-)j)_A%{K+UK+{X<yU6rF~EPk@hp~SK9BiKWTr{{-ym-V@PLA zXG&*IXGv#GXG>>K=Sb&F=St^J=Sk;H=S$~L7f2UO7fKgS7fBaQ7fTmUmq?dPmr9pT zmr0jRmrIvVS4dY(S4vk-S4me*S4&q<*GSh)*Gkt;*Gbn+*Gtz=H%K>3H%d27H%T{5 zH%m89w@9~4w@SB8w@J56w@bHAcSv_kcS?6ocS(0mcT0Cq_el3l_e%Fp_eu9n_e=Lr z4@eJ84@wVC4@nPA4@(bEk4TS9k4leDk4cYBk4ukFPe@NpPfAZtPf1TrPfJfv&q&Wq z&q~iu&q>cs&r8owFGw#;FG?>?FG(*=FH0{^uSl;<uS%~@uSu^>uS>5_Z%A)UZ%S`Y zZ%J=WZ%c1a??~@V?@I4Z?@8}X?@RAbpO8K=eNy`5^eO36)2F3RPoI%KGksS2?DRS5 zbJORg&re^FzA$}J`r`B@=}Xg>r7urkk-jp0Rr>1mHR)^9*QKvd-;lmBeN+18^eyRI z)3>E>Pv4QgGksV3?({wBd(-!&?@vFFelYz|`r-5==||I#r5{f}k$y7$RQl=kGwEm3 z&!wMFzmR@0{Zjhn^egFC)32ppPrs3VGyPWj?esh8chm2s-%o##{xJPf`s4H`=}*(2 zr9V%9k^VCMRr>4nH|cNF-=)7#|B(JM{Zsnq^e^dO)4!#EPydnrGyPZk@AN<Ef7Ab^ z|4(PgV9a33V9sF4V9j95V9(&l;LPC4;LhO5;LYI6;Li}q5X=zD5Y7<E5X}(F5YLdv zkj#+Ekj{|Fkj;?Gkk3%aP|Q%uP|i@vP|Z-wP|wiF(9F=v(9Y1w(9O`x(9bZ)Fw8K@ zFwQW^FwHQ_Fwd~au*|T^u+Ff_u+6Z`u+MPFaLjPZaL#baaLsVbaL@3_@XYYa@Xqkb z@Xhec@XrXy2+Rn|2+jz}2+at~2+xSfh|Gw}h|Y+~h|P%0h|fsKNX$seNX|&fNX<yg zNYBW~$jr#f$j->g$j!*h$j>OqD9k9zD9$L!D9tF#D9@<KsLZI!sLrU#sLiO$sLyD~ zXv}EJXwGQKXw7KLXwT@#=*;NK=+5ZL=*{TM=+BstF)?FO#^j7C8B;T+WlYbQkufu4 zR>tg%IT>>^=4H&!Sdg(WV^PN9j3pUMGnQp6&sdSMGGkT7>WnoRYctkmtk2kxu`y#) z#^#JI8Cx^9Wo*ybk+CylSH|v)JsEp5_GRqPIFNBL<50%oj3XIGGmd2(&p45BGUHUn z>5MZOXEV-aoX@zBaWUgk#^sDF8CNr|Wn9m=k#RHQR>tj&I~jK~?q%H1c#!ch<59-r zj3*gSGoEEU&v=pXGUHXo>x?%UZ!_LyywCWM@iF65#^;PL8DBHLWqi;0k?}L*SH|y* zKN){B{$>2nV8~?5WXfdDWXWXBWXojF<jCaA<jUmE<jLgC<jdsG6v!0J6v`CN6v-6L z6w4IPl*p9Kl**LOl*yFMl*^RQRLE4!RLWG&RLNA$RLfM))X3D#)XLP()XCJ%)XUV* zG{`i}G|Dv2G|4p0G|M#4w8*r~w92&3w8^y1w9B;5bjWnfbjozjbjfthbjx(l^vLwg z^vd+k^vU$i^vm?m49E=349X1749N`549g79jL3}4jLMA8jLD46jLVGAOvp^kOv+5o zOvy~mOv_Bq%*f2l%*xEp%*o8n%*)KrEXXX(EXpj-EXgd*EXyp<tjMg)tjes;tjVm+ ztjny=Y{+cPY|3oTY{_iRY|CuV?8xlQ?8@xU?8)rS?91%WoRB#&b5iEy%qf{uGpA)v z&zzAtGjmqv?94ftb2H~<&d*$sxiE84=HkpHnM*U5WiHQLk-0K+Rp#o<HJNKO*JZBH z+>p63b5rK#%q^K)Gq+`K&)ku@Gjmtw?#w-zdo%ZC?$11sc`)-(=HbjEnMX5^WggEw zk$E!nROac-Gnr>I&t;y^ypVY@^HS#J%qy8!Gp}V{&%BX&GxJvF?aVuwcQfy0-p_oH z`7rZQ=HtvKnNKsHWj@b*k@+(7Rp#r=H<@oU-(|kf{E+!E^Hb*M%rBW=Grwhi&-{`3 zGxJyG@611$e>4AO{?BB{V$5R7V$Nd8V$EX9V$b5p;>_a8;?Cm9;?3gA;?EMu63i0H z63!CI63r6J63>#zlFX9IlFpLJlFgFKlFw4eQp{4yQqEGzQq5A!QqR)J(#+Dz($3P! z(#_J#($6x;GR!i{GR`u|GR-o}GS9Nevdpr|vd*%}vdyx~vd?nJa?Enda?Wzea?Ntf za?kR}^33we^3L+f^3C$g^3Mv$3d{=13eF123e5`33eSqjip+}2iq4A3ip`44iqA^O zO3X^iO3q5jO3g~kO3%v3%FN2j%FfEk%FW8l%FimuD$FX%D$Xj&D$Od(D$lCOs?4g& zs?Ms(s?Dm)s?Tc3YRqcNYR+oOYRziPYR~G(>dflO>dxxP>dorQ>d%^xH8E>a*5s@y zSyQv7WlhhTku@`GR@UsSIazbF=4H*#T9CCcYf;wXtR-1XvzBEo&sveSGHX@V>Z~<c zYqQp6t<Tz!wJ~c`*5<4&SzEKVWo^&ek+m~xSJv*VJz0CR_GRtQI*@fR>rmF=tRq=R zvyNpQ&pMHHGV4^<>8vwZXS2>_ozJ?EbusHw*5#}#Sy!{JWnIs@k##fcR@UvTJ6U(L z?q%K2dXV)n>rvL@tS4Ddvz}!=&w7#dGV4{=>#R3fZ?oQIz0dlP^)c&H*5|A*Szoih zWqr^3k@Yj{SJv;WKUsgX{$>5oV#sF9X3A#HX31vFX3J*J=E&yE=E~;I=E>&G=F8^K z7RVON7RnaR7ReUP7RwgTmdKXOmdcjSmdTdQmdlpUR>)S&R?1e+R>@Y)R?Ak;*2vb( z*2>n-*2&h**2~t<Hpn*2Hp({6Hpw>4Hp@28w#c^3w#v57w#l~5w#&B9cF1<jcFK0n zcFA_lcFT6p_Q>|k_R99o_R03m_RIFq4#*D74$2PB4#^J94$BVDj>wM8j>?YCj>(SA zj?0eEPRLHoPRdTsPRUNqPRmZu&dAQp&dSct&dJWr&dbivF32v-F3K*>F3B#<F3T>@ zuE?&;uF9^?uF0;=uFI~^Zpd!TZpv=XZpm)VZp&`Z?#S-U?#k}Y?#b@W?#u4ao{&8; zds6n~>?zq(v!`WG&z_MzGkaF{?Cd$&bF=4V&(B_vy)b)G_Tua%*-NvRWiQWOk-ai| zRrc!aHQ8&k*JZEI-jKa9dsFu2>@C?_v$th$&)$)}GkaI|?(99;d$adt@6SGveK7k_ z_TlU!*+;XFWgpKzk$p1zRQBoYGudae&t;#_zL0$}`%?Dh>?_$<v#(`e&%Tj;Gy7Kd z?d&_*ceC$h-_L%K{V@Ac_T%g)*-x{dWk1h;k^M6JRrc%bH`#Bq-(|ng{*e7K`&0Jk z>@V40v%h73&;F79Gy7Ne@9aO>f3yE(|IcQ~Va#F5Va{R6Va;L7Vb9^n;mqO6;m+a7 z;mzU8;m;As5zG<F5zZ0G5zP_H5zmpxk<5|Gk<O9Hk<F3Ik<U@cQOr@wQO;4xQO!}y zQP0uH(ah1x(azDy(aq7z(a$l+G0ZW_G0ri`G0ic{G0(BcvCOf`vCgr{vCXl|vCnbH zam;bban5ncam{hdanJF{@yzkc@y_wd@y+qe@y`j!3Csz~3C;=03C#)13D1ehiOh-0 ziOz}1iOq@2iO)&MNz6&gNzO^hNzF;iNzcj1$;`>h$<E2i$<4{j$<HasDa<L#Db6X$ zDa|R%DbK0Msm!U$sm`g%sm-a&sn2Q1Y0PQLY0hcMY0YWNY0v4%>CEZM>CWlN>CNfO z>Cc&vGcjjU&g7gaIa70{<xJ0+kux)AR?h64IXQE4=H<-KS&*|ZXHm}LoFzF+bC%^S z&smYPGG|rJ>YOz>Yjf7+tk2nyvoU8=&gPsgIa_nK<!sN{k+U;rSI+L7Jvn=G_T}u) zIgoQO=TOe!oFh3$bB^U4&pDBEGUrsz>6|k;XLHWwoX@$Cb1~;q&gGmdIahP8<y_CX zk#jTWR?h95J2`iA?&aLid64rk=TXk%oF_R?bDrfq&v}vaGUrv!>zp?^Z*$(|ywCZN z^D*aB&gYyjIbU<W<$TZik@GX>SI+O8KRJJM{^k77VaR37Wy)pFWyxjDWy@vH<;dmC z<;vyG<;msE<;&&I704CL70MOP70DIN70VURmB^LMmCBXQmC2ROmCKdSRmfG$RmxS) zRmoM&Rm)Y+)yUP%)ymb*)ydV()yvh-HOMv0HOe*4HOV#2HOn>6waB&1waT^5waK;3 zwac~7b;xzhb;@<lb;)(jb<1_n^~m+i^~&|m^~v?k^~?3o4ag154ayD94ap774a*JB zjmVA6jmnMAjmeG8jmwSCO~_5mP0CHqP03BoP0LNs&B)En&C1Qr&B@Kp&CAWtEyyj* zEy^v<Ey*p-Ez2#>t;ns+t;(&=t;wy;t;?;?ZOCoRZOU!VZOLuTZOd)X?a1xS?aJ-W z?aA%U?aS@Yosc^*cT(=;+$p(JbEoA_&z+GwGj~?*?A$rIb93kA&d*(tyD)cA?&91f zxl41G<u1=%k-IW?RqpECHMwhZ*X6Fy-H^L6cT?`>+%36VbGPMg&)t!`Gj~_+?%X}O zdvo{Y?$14tdocG<?%~`cxkq!4<sQ#Hk$W=tRPO2AGr4DT&*h%ay^wn`_fqcV+$*_P zbFbxI&%Kd*Gxt{R?c6)LcXRLM-p_rI`!M%W?&I7ixlePS<v!1Sk^3_DRqpHDH@R<f z-{ro~{gC@H_fziY+%LIbbHC+&&;616Gxt~S@7zDRe{=uk{?BE|W6Wd9W6opAW6fjB zW6$Hr<ILmA<IdyB<IUsC<IfYw6U-CJ6V4OK6U`IL6VH>#lgyLKlg^XLlg*RMlh0Gg zQ_NG!Q_fS#Q_WM$Q_s`L)6CP#)6Ub$)6LV%)6X-=Gt4u}GtM)~GtD#0GtaZgv&^%~ zv(B^0v(2;1v(IzLbIfzfbIx<gbIo(hbI<e0^UU+g^Um|h^Ud?i^Un*&3(O133(gD4 z3(X753(t$li_DA4i_VM5i_MG6i_c5QOUz5kOU_HlOU+BmOV7*5%goEl%g)Qm%gxKn z%g-ywE6gj(E6yv)E6pp*E6=OQtIVs)tIn&*tIey+tIuo5Ys_oPYtC!QYt3uRYtQS* z>&)xQ>(1-R>&@%S>(85zH!*Kg-sHR~c~kSI<xS6<kvB7MR^IHqIeByQ=H<=LTadRf zZ&BXjyd`-{^Oof;&s&kVGH+Gh>by01YxCCSt<T$#w=r*1-sZe5d0X?g<!#T~k+(B% zSKjWtJ$ZZc_T}x*JCJuU?@-?1yd!x>^N!^m&pVNKGVfI0>AW*}XY<bGozJ_FcQNl$ z-sQY2c~|qU<z3Iak#{riR^IKrJ9&5W?&aOjdyw}q?@`|4yeD~2^Pc5B&wG*gGVfL1 z>%2F4Z}Z;ez0doQ_c8BN-sik8d0+Fs<$cflk@qw2SKjZuKY4%i{^kA8W5{RBXUb>J zXUS*HXUk{L=g8;G=gQ~K=gH^I=ga5M7swaP7s?mT7s(gR7t0sVm&ljQm&%vUm&upS zm&=#WSIAe)SISq;SIJk+SIbw=*T~n**UHz<*U8t-*UQ(>H^?{4H_A88H_126H_JEA zx5&55x5~H9x5>B7x68NBcgT0lcglCpcgc6ncguIr_sI9m_saLq_sRFo_sjRs56BP9 z56TbD56KVB56chFkI0YAkIIkEkI9eCkIRqGPsmTqPs&fuPsvZsPs>lw&&bcr&&tov z&&kit&&$uxFUT*<FUl{@FUc>>FUv2_ugI^=ugb5^ugR~?ugkB`Z^&=VZ_01ZZ^>`X zZ_97b@5t}W@5=Aa@5%4Y@5}GcpO8N>e^UPB{3-cU^QYxc&!3S$Gk;e8?EE?TbMxor z&(B|wzc7DM{^I;4`AhSc<uA`)k-sv3RsQPyHTi4v*X6Iz-;lpCe^dVE{4M!g^S9-1 z&)<>1Gk;h9?)*LZd-M0@@6SJwe=z@0{^9&1`A74Q<sZ*Kk$*D(RQ~DwGx=xp&*h)b zzmR`1|5E<t{44oa^RMM!&%cp>Gyhip?fg6Wck}P%-_L)L|1kei{^R^7`A_qo<v-7V zk^eIPRsQSzH~DY#-{rs0|B(MN|5N_w{4e=m^S|YP&;ODCGyhlq@BBacfAjz4|IcSA zU@TxNU@l-OU@c%PU@zb(;4I)O;4a`P;4R=Q;4cs;5G)WX5H1iY5G@cZ5HFA@kSvfY zkS>rZkS&lakS|auP%Ka?P%cm@P%Tg^P%qFZ&@9j@&@Rv^&@Ip_&@V73Ff1@CFfK4D zFfA}EFfXtuuq?1Dur9DEur07FurF{Za4c{ta4v8ua4m2va4+yE@GS5u@GkHv@GbBw z@Gl4`2rLLH2rdXI2rURJ2rq~zh%AUIh%SgJh%JaKh%ZPeNGwPyNG?bzNG(V!NH54J z$SlYz$S%k!$Sue#$S)`;C@d%{C@v@|C@m-}C@-ies4S=|s4l1}s4b`~s4r+JXe?+d zXf9|eXf0?fXfNm}=q%_e=q~6f=q>0g=r5R1FtK1#!Q_G|1yc*A6-+OfQ82S$R>ACo zIR$eI<`v8@SWvLAU{S&1f+Yn@3ziiuFIZ8qvS3xg>Vh=|YYWyDtS{J5u(4oM!RCT3 z1zQWY6>KlqQLwXMSHbRrJq3FU_7&_eI8bn~;84Ngf+Gb-3yu{WFE~+fvfxy~>4Gx_ zXA901oG-XgaIxT0!R3N01y>8M6<ja4QE;>1R>AFpI|X+O?iJiGcu?@L;8DTjf+qz} z3!W7`FL+V#vfx$0>w-50ZwuZPyf64r@Uh@i!RLZ61z!uk6?`xFQSh_iSHbUsKLvja z{uTT$U?^lPWGZAXWGQ4VWGiGZ<S67U<SOJY<SFDW<SXPa6etud6e<)h6e$!f6e|=j zlqi%elq!@ilqr-glq-}kR47y|R4P<1R4G&~R4Y_3)F{*})GE|2)G5?0)GO34G$=GI zG%7SMG$}MKG%GYOv?#PJv?{bNv?;VLv@5hPbSQKzbSiW%bSZQ#bSrc(^eFT!^eXf& z^eOZ$^egl)3@8jN3@QvR3@HpP3@Z#Tj3|sOj4F&Sj46yQj4O;UOejn&Oe#z+Oest) zOe;(;%qYw(%qq+-%qh$*%qz?<EGR52EGjH6EGaB4EGsN8tSGE3tSYQ7tSPK5tShW9 zY$$9jY$|LnY$<FlY%6Rp>?rIk>?-Uo>?!Om>?`aqoKQHia8lvq!YPGQ3#S!MFPu?0 zvv5}7?7}&Pa|`Dc&M#b0xUg_h;o`z2g-Z*U6)rDaQMj^jRpIKwHHB*n*A=cW+)%i& za8u#t!Yzec3%3<+FWgbMvv618?!rBVdkgm!?k_x0c(CwL;o-s~g+~jI6&^1<QFyZO zRN?8uGlgdh&lR38yij<t@KWLB!YhSW3$GPkFT7EBv+!2o?ZP{ScMI<o-Y<Mm_^|L% z;p4(5g-;8g6+SO~QTVd(RpINxH-&Et-xa<u{80F@@KfRE!Y_qi3%?b9FZ@yXv+!5p z@4`QYe+&N={x4)GVk}}RVlHASVl84TVlUz-;w<7S;x6JT;w|DU;x7^?5-bub5-t)c z5-k!d5-*Y{k}Q%ck}i@dk}Z-ek}pyyQY=y`QZ7;{QY}&|QZLdd(k#*{(k{{|(k;>} z(l0V7GAuGGGA=SHGA%MIGB2_yvMjPHvM#bIvMsVJvM+Kdax8KxaxQWyaxHQzaxd~I z@+|Ty@-Ffz@-6Z!@-GS~3M>jL3N8vM3M~pN3NMN%iY$sMiY|&NiY<yOiZ4niN-Rn$ zN-jz%N-at&N-xSN$}Gw%$}Y+&$}P$($}cJ?Dl950DlRH1DlIB2Dle)isw}E1sxGQ2 zsx7K3sxN9NYAk9hYA$LiYAtFjYA@<2>MZIi>MrUj>MiOk>Mxp5G_hz>(d42jMN^BW z6-_UiQ8cq?R?+ODIYo1e<`vB^T2QpGXi?GPq9sL3i<T8FFIrKwvS?M&>Y_D8Ym3$u ztuNY8w6SPY(dMEpMO%xu6>TrtQM9vYSJCdGJw<zq_7&|fI#6`5=upw&q9a8|i;fi? zFFH|lvglON>7p}5XN%4ioiDmjbg}4C(dD8mMOTZi6<sg7QFOEDR?+REJ4JVk?iJlH zdQkMR=uy$*q9;X9i=GudFM3h*vglRO>!LSBZ;Rd)y)XJu^s(qu(dVKsMPG})6@4%I zQS`IuSJCgHKSh6w{uTW%Vkl-TW-4YbW+`SZW-Ded<|yVY<|^hc<|*ba<}2ne7AO`h z7Ah7l7AY1j7AqDnmME4imMWGmmMNAkmMfMoRw!01Rw`C5Rw-63Rx4I7)+p92)+*L6 z)+yF4)+^R8HYheMHYzqQHYqkOHY+wSwkWnNwkozRwkftPwkx(Tb|`i%b}Du*b}4o( zb}M!-_9*r&_A2%+_9^x)_AB-;4k!*R4k`{V4k->T4l52Xjwp^Sjw+5Wjwy~Ujw_BY zPAE<+PAX0=PAN_;PAg6?&M3|-&MM9>&MD3<&MVF@E+{T6E-EfAE-5Z8E-NlCt|+c7 zt}3oBt|_i9t}CuDZYXXnZYpjrZYgdpZYypt?kMgo?kess?kVmq?knyuo=`locvA7? z;wi;bi>DP&FP>36vv^kV?BY4abBpH{&o5q3ys&st@#5ko#Y>Bq6)!JdQM|HvRq^WL zHN|U-*A=fX-cY=;cvJD_;w{Bni?<bTFWynSvv^nW?&3YgdyDrK?=L=3e6aXX@!{el z#Yc;e6(27?QGBxaRPpKJGsS0%&lR69zEFIz_)_uZ;w!~hi?0=5FTPQHv-no=?czJd zcZ=^8-!Fbp{IK{@@#Eqr#ZQZ$6+bV2QT(#_Rq^ZMH^py@-xa?v{!sj}_*3!c;xENt zi@z0rFaA;dv-nr>@8Unje~bSW|1V}JVJu-PVJ=}QVJ%@RVK3n*;Vj`Q;V$7R;Vt1S z;V%&=5iAiZ5iSua5iJob5igM_kt~rakuH%bku8xckuOmwQ7lm^Q7%y_Q7us`Q7_Rb z(Jav_(Js*`(Jj#{(JwJ5F)T4EF)lGFF)cAGF)y(wu`IDFu`aPGu`RJHu`h8baV&8v zaV~KwaV>ExaWC;G@htHw@h<Tx@h$Ny@h=G|2`mXJ2`&jK2`vdL2``B#i7bgKi7tsL zi7kmMi7!bgNi0b!NiIn#Ni9h$NiWGL$t=k#$u7w$$t}q%$uB7=DJ&@}DK04~DJ>~0 zDKDugsVu1~sV=E0sV%81sV`|LX)I|fX)b9gX)S3hX)oz0=`86g=`QIh=`HCi=`Wd3 zGO=V*$>fqLB~weLl}s<0Q8Ke+R>|y=IVE#T=9SDZSx~aDWKqfDk|iZeOO}-^FIiEt zvSd}s>XJ1jYfILZtS{M6vaw`S$>x$RC0k3jm25BBQL?jSSIO>@Jtccf_Lb}}IZ$%2 z<WR}sk|QNYOOBNsFF8?ivgB0B>5?-gXG_kNoG-aha<Sx6$>owOC09$Xm0T~mQF627 zR>|#>J0*8Z?v>mxc~J7O<Wb4vk|!lkOP-ZHFL_b&vgB3C>ykGmZ%f{lyf67s^0DMo z$>)+UC0|Rvm3%MxQS!6oSIO^^KP7)l{+0YMVJKxRWh!MZWhrGXWh-Sb<tXJW<tpVa z<tgPY<tybc6(|)f6)F`j6)6=h6)P1ll_-@gl`54kl_`}il`EAmRVY;~RVr03RVh_1 zRV!65)hN|0)hg94)hX32)hpF6H7GSKH7YeOH7PYMH7hkQwJ5bLwJNnPwJEhNwJWtR zbtrW#bt-i(bt!c%bt`o*^(gf$^(yr)^(pl&^(*x+4JZvP4Jr*T4Ji#R4J!>VjVO&Q zjVg^UjVX;SjVp~WO(;z)O)5<;O({(+O)E_=%_z+*%__|<%_+?-%`43>EhsH4Eh;T8 zEh#N6Eh{ZAtthQ5ttzc9ttqW7tt+iBZ76LlZ7OXpZ7FRnZ7Xdr?I`Um?JDgq?J4ao z?JMmsolrWlbW-W$(kZ1=OQ)4iFP%|3vvgMJ?9w@<b4%xy&M#e1y0COn>EhBQrAtef zl`bz`QM$5pRq5)|HKl7y*Ojg>-B7x*bW`c((k-Q1OShG7FWphPvvgPK?$SM_drS9~ z?k_!1da(3R>EY5NrAJGTl^!oWQF^lURO#u`Go@!s&y}7py-<3w^it{N(krD`ORtq) zFTGKEv-DQ!?b17?cT4Y;-Y<Pn`mpp->EqHTrB6$rl|C<hQTnp<Rq5-}H>Gb&-<7^E z{ZRU`^i%2Q(l4c7OTU$VFa1&av-DT#@6tb|e@p+B{x4-HV=QATV=iMUV=ZGVV=v<< z<1FJU<1XVV<1OPW<1Z5^6D$)d6D|`e6D<=f6EBk}lPr@elP;4flP!}glP^;!Q!G;| zQ!Y~}Q!P^~Q!mpf(=5{}(=O8~(=F30(=Rh9Gb}SIGcGeJGc7YKGcU6!vn;bJvo5nK zvn{hLvoCWfb1ZWzb1ri!b1ic#b1(BK^DOf!^Dgr#^DXl$^Dhf13oHvN3oZ*O3oQ#P z3onZ(i!6&Oi!O^Pi!F;Qi!VzkODsz&OD;<(OD#()OE1eP%Ph+(%Pz|)%Pq?*%P%V^ zD=aH2D=sT3D=jN4D=(`kt1PQ3t1hc4t1YW5t1oLPYb<LjYc6XkYb|RlYcK04>n!Uk z>n`gl>n-am>o1#7HnD6{+2pb*WmC(hl}#_3Q8u$|R@v;bIc0Op=9SGaTTr&JY*E?b zvL$6p%a)ZbFI!QzvTRk^>asOuYs=P^tuNb9wy|te+2*n>Wn0U(m2EHEQMR*eSK02e zJ!N~#_Lc1~J5YA8>`>X^vLj_j%Z`;DFFR3ovg}mZ>9R9rXUoo&oiDpkcCqYI+2yh; zWmn6tm0d5pQFgQJR@v>cJ7ssv?v>pydr<bU>`~d{vL|Iv%bt}zFMCn;vg}pa>#{dx zZ_D15y)XMv_Oa|!+2^t^Wnas_m3=S!QTDU!SK05fKV^T*{+0bNV<=}VXDVkdXDMeb zXDeqf=P2ha=PKte=PBnc=PTzg7bq7j7b+Jn7bzDl7b_PpmnfGkmnxSomnoMmmn)Yq zS14C3S1MO7S1DI5S1VU9*C^L4*DBX8*D2R6*DKdAHz+qOH!3$SHz_wQH!C+Uw<xzP zw<@<Tw<)(Rw=1_VcPMu(cPe)-cPV!*cPn=<_bB%)_bT@;_bK-+_bc}=4=4{T4=N8X z4=E2V4=WEZk0_5Uk1CHYk13BWk1LNaPbg0;PbyC?Pbp6=Pb*I^&nV9<&nnL@&neF> z&nwR_FDNf8FDfrCFDWlAFDoxEuPCo9uPU!DuPLuBuPd)FZzyjpZz^vtZz*prZ!2#v z?<nsq?<(&u?<wys?<?;wpHM!rd{X)3@+sw0%cqr3FP~99vwT+h?D9F~bIa$I&o5t4 zzOZ~z`Qq{=<x9(#l`k(}QNFT#Rr%`jHRWr|*Ojj?-%!4>d{g=6@-5|C%eR$pFW*tV zvwT<i?(#k5d&~Eg?=L@4ez5#d`Qh>-<wwhpl^-uZQGT-gRQc)hGv#N?&y}AqzfgX$ z{8IVl@+;+6%deGRFTYWKv;0>1?eaV2cgydU-!Feq{;>Q}`Q!2@<xk6>l|L_kQU0?0 zRr%}kH|1~3-<7{F|4{z1{8Rbo@-O9I%fFR>FaJ^gv;0^2@A5z8f6M=s|1W2#V60%O zV6I@PV69-QV6Wh);H==P;I81Q;H}`R;I9y<5UdcY5UvoZ5Umia5U-G^kgSlZkgkxa zkgbrbkgrgvP^?g@P_9s^P_0m_P_NLa(5%p^(5}#_(5=v`(62D4Fsv}DFs?AEFs(4F zFt4zvu&l7Eu&%JFu&uDGu&;2aaIA2uaISEvaIJ8waIf&F@T~Bv@UHNw@U8Hx@UIA{ z2&@RI2(AdJ2(1XK2(O5!h^&aJh^~mKh^>gLh_6VfNUTVzNUlh!NUcb#NUzAK$gIe! z$gaq#$gRk$$ge1<D6A-|D6S}}D6J@~D6gofsH~`}sII7~sI920sIO?KXsl?eXs&3f zXsu|gXs_s~=&b0f=&tCg=&k6h=&zViF|lG&#pH@96;mswRZOp#Q8BY(R>ka!ITdp& z=2gtESWvOBVo}B7iX|0GE0$F(uUJvBvSL-m>WVcLYb(}OtgqNmv9V%P#pa4F6<aH| zRcx==QL(dPSH<p%Jr#Q^_Eqe!I8br0;!wrmiX#<AD~?qhuQ*Y0vf@<5>54NIXDiNC zoUgc0ak1i3#pQ}C6;~^+Ra~#QQE{{4R>kd#I~8{;?p55ccu?`M;!(xpiYFCME1p$6 zuXs`Mvf@?6>xwrOZ!6ways!9B@v-7l#pjAI6<;g9ReZ1bQSr0lSH<s&KNWu~{#E?1 zV5nrQWU6GYWT|AWWUFMa<f!DV<f`PZ<f-JX<g4Vb6sQ!e6si=i6sZ)g6sr`kl&F-f zl&X}jl&O@hl&h4lRH#&}RH{_2RH;<0RI604)Tq>~)T-33)Tz|1)T`95G^jMJG^#YN zG^sSLG^;ePw5YVKw5qhOw5hbMw5znQbf|Q!bgFc&bg6W$bgOi)^r-Z#^s4l(^r`f% z^sDr*45$pO45|#S45<vQ466*UjHryPjH-;TjH!&RjH`^VOsGt(OsY(-OsPz*Osh<< z%&5$)%&N?;%&E++%&W|=ET}B3EUGN7EU7H5EUPT9tf;K4tg5W8tf{Q6tgEcAY^ZFk zY^rRoY^iLmY^!Xq?5OOl?5gap?5XUn?5pgroKQKja#H2w$|;poE2mXXubfdivvOAD z?8-Tnb1Uan&aYfhxv+9k<>JaEl}js^RW7ewQMs~mRpsi+HI-{C*Hx~s+)%l(a#Q8z z$}N>!E4Ni{uiR0&vvODE?#extdn@-<?yo#hd9d<O<>AUBl}9U&RUWTAQF*fRRORW) zGnHp6&sCnUyij?u@>1pH$}5#uE3Z{vue?!tv+`Eu?aDiqcPsBz-miR6`LOa)<>SgH zl}{_5RX(qLQTej+Rpsl-H<fQI-&MY^{80I^@>AvK$}g2)E5B8Kul!N@v+`Hv@5(=w ze=Gl0{;y=HVyt4SVy<GTVy$AUVz1(;;;iDT;;!PU;;rJV;;#~@608!c60Q=d60H)e z60ee|lB|-dlCF}elC6@flCM&zQmj&{Qm#^|Qms;}Qm@je(yY>|(yr2}(yh{~(yub8 zGORMHGOjYIGOaSJGOx0zvaGVIvaYhJvaPbKvafQea;$Qya;|cza;<W!a<B5J@~rZz z@~-l!@~!f#@~;Z03akpM3a$#N3atvO3a^T&imZyNimr;Oimi&PimytjN~}t%O0G(& zO07z(O0UYO%B;$&%C5?(%B{+)%C9P@Dy%B1Dy}N2Dy=H3DzB=js;sK2s;;W3s;#Q4 zs;_FOYOHFiYOZRjYOQLkYOm_3>a6Oj>aOak>aFUl>aUtmHL+?^)#R!vRa2{`RZXv& zQ8lw_R@LmPIaPD3=2gwFT2QsHYEjkVswGuRtCm$QuUb*HvT9Y;>Z&zWYpd2(t*_cp zwXteb)#j=#Ra>jJRc)`@QMI#bSJm#SJym<F_Eqh#I#6}6>QL3;sv}iLtBzG2uR2k6 zvg%aT>8dkTXRFRtov*r3b+PJF)#a)yRadL7Rb8*TQFXKGR@LpQJ5_h9?p58ddQkPS z>QU9>swY)XtDaRouX<7Svg%dU>#8?ZZ>!!_y|4OE^|9(x)#s`&RbQ*VRei7eQT4Ox zSJm&TKUIIL{#E_2VyI@UW~yecW~pYaW~*ke=BVbZ=Bnnd=Behb=Bwtf7N{1i7OEDm z7O57k7ONJomZ+Ajma3MnmZ_GlmaCSpR;X62R;pI6R;gC4R;yO8)~MF3)~eR7)~VL5 z)~nX9HmEkNHmWwRHmNqPHmf$Twy3tOwyL(SwyCzQwyU<UcBpo&cB*!+cByu)cB^); z_Nex(_Nw--_Nn%*_N(@<4yX>S4yq2W4yg{U4yz8Yj;M~Tj;fBXj;W5Vj;oHZPN+_- zPO46>PN`0<PODC@&Zy3;&Z^F?&Z*9=&a2L^E~qZ7E~+lBE~zf9E~_rDuBfi8uBxuC zuBooAuB)!EZm4doZmMpsZmDjqZmVvu?x^mp?yByt?y2sr?yK&vo=`opdQ$b|>M7Mz ztEW{@ubxpovwBwb?CLqybF1f7&#zuky|8*w_2TL!)k~|FRWGkzQN6NyRrTuXHPvgY z*Hy2t-cY@<dQ<i0>Mhk<tG88euijC;vwBzc?&>|&d#m?V@2@^keX#ma_2KFx)kmw3 zRUfZDQGK%dRQ2iVGu3CS&sCqVzEFL!`cn1f>MPY(tFKjGuf9=zv-(!`?dm(#cdPGJ z->-g9{jmB`_2cR%)laLRRX?wOQT?*|RrTxYH`Q;e-&Mb_{!sm~`cw7i>Mzw_tG`u$ zul`Z}v-(%{@9IC*f2;ph|F34KVXR@QVXk4RVXa}SVXxt+;jH1R;jZDS;jQ7T;ja;> z5v&oa5v~!b5v>uc5wDS`k*txbk*<-ck*$%dk*`sxQLIs_QLa&`QLRy{QLoXc(X7#` z(XP>{(XG*|(XTP6F|0AFF|IMGF|9GHF|V<xv8=JGv97VHv8}PIv9EEcajbEwajtQx zajkKyaj)^H@vQNx@viZy@vZTz@vjM}39JdK39bpL39SjM39pH$iL8mLiLQyMiLHsN ziLXhhNvuh#Nv=t$Nv%n%Nw3MM$*jq$$*#$%$*sw&$*(D>DXb}~DXuB0DXl51DX*!h zsjR80sjjK1sjaE2sjq3MX{>3gX|8FhX{~9iX|L(1>8$Ch>8|Oi>8<Ij>93hkGqGk; z&E%RXHB)P*)l9FMQ8Tk<R?Y01IW==@=GDxvSx~dEW>L-Jnk6+$YnIh4uUS#EvSwAy z>Y6n*YiriktgqQnv$1AV&E}ddHCt=8)oicXQM0pVSIzF4JvDo4_SNjKIZ$)3=1|Sy znj<wwYmU_%uQ^e3vgTCH>6$Y&XKT*YoUgf1bFt=9&E=XaHCJn{)m*Q+QFF8AR?Y32 zJ2iJ}?$z9{c~JAP=26Y#nkO|+Yo66SuX$1PvgTFI>zX$;Z)@Jwys!CC^Rebr&F7jg zHD7DK)qJn{QS-CrSIzI5KQ(`A{?+`iVW?%SWvXSaWvOMYWvgYc<*4PX<*Mbb<*DVZ z<*Vhd6{r=g6{;1k6{!`i6{{7mm8g}hm8zAlm8q4jm8+GnRj5_0RjO64RjF02RjXC6 z)u`31)vDF5)v493)vML7HK;YLHL5kPHK{eNHLEqRwWzhMwW_tQwW+nOwX3zSb*Oc$ zb*go)b*Xi&b*pu+^{Dl%^{Vx*^{Mr(^{e%-4X6#Q4XO>U4XF*S4XX{Wji`;RjjD~V zjj4^TjjN5XO{h(*O{z_<O{q<-O{-0>&8W?+&8p3=&8f|;&8y9?EvPN5EvhZ9EvYT7 zEvqfBt*EW6t*WiAt*Nc8t*foCZK!RmZK`dqZK-XoZL4js?Wpan?W*mr?Wygp?W^st zolrZmc2e!++9|bDYp2ytubojlvvyYP?AkfCb8F|-&aYiiyRddq?c&-cwM%Q4)h@4H zQM<BsRqg89HMMJN*VV4C-B7!+c2n)<+AXzPYq!;Iuia6*vvybQ?%F-Idu#XA?yo&i zd$9IU?cv%ZwMT1@)gG@sQG2rXRPE{7Gqq=H&()r<y-<6x_EPQT+AFnJYp>N_uf0)w zv-Vc)?b<uFcWdv}-miU7`>^&=?c>@fwNGoG)jqF%QTwv?RqgBAH??nT-_^da{ZRX{ z_EYWW+Ap<VYroZgul-T`v-Vf*@7h1Le{28M{;y@IW2|GUW3FSVW36MWW3S_=<E-PV z<F4bW<E`VX<F6B_6RZ=e6Rs1f6Ri`g6R(q~ldO}fldhAgldY4hldn^#Q>;^}Q?65~ zQ>|00Q?Jvg)2!2~)2`F0)2-91)2}nAGpsYJGp;kKGp#eLGq1C#v#hhKv#ztLv#qnM zv#)cgbF6c!bFOo#bFFi$bFcHL^Q`l#^RDx$^R4r%^REl23#<#O3$6>P3#|*Q3$Kf) zi>!;Pi>`~Qi>-^Ri?2(lORP((ORh_)ORY<*ORvkQ%dE?)%dX3*%dN|+%dab_E37N3 zE3PZ4E3GT5E3d1ltE{W4tFEi5tF5c6tFLRQYpiRkYp!dlYprXmYp?65>#Xal>#pmm z>#ggn>#v(oH?eL~-Q>C{byMr6)lILPQ8%-0R^9BnIdyaE=GD!wTTr*KZc*Lhx+Qf> z>z36muUk>KvTjw~>bf;`YwOn4t*_fqx3O+h-R8P2bzAGU)oriaQMa>hSKaQqJ#~BQ z_SNmLJ5YD9?oi#~x+8T*>yFhOuRBq9vhGyf>AEv@XY0<@ov*u4cd_nL-Q~I~byw@I z)m^W<QFpWMR^9EoJ9T&K?$zC|dr<eV?or+2x+ir{>z>s;uX|DVvhG#g>$*2}Z|mOG zy|4RF_p$C%-RHV5bzkeg)qSt~QTMa%SKaTrKXrfW{?+}jW2k4WXR2qeXQ^kcXRBwg z=cwnb=c?zf=c(td=d0(h7pNDk7pfPo7pWJm7poVqm#CMlm#UYpm#LSnm#derSEyI4 zSE^U8SE*O6SF2aA*QnR5*Q(d9*QwX7*Q?jBH>fwPH>x+TH>o$RH>)?Vx2U(Qx2m_U zx2d<Sx2w0Wcc^!)cdB=;cd2)+cdK`=_o(-*_p0}<_o?@-_pA4>52z2U52_EY52+8W z533KakEoBVkE)NZkExHXkE@TbPpD6<PpVI@PpMC>PpeO_F=&#KR^&#BL?&#TX` zFQ_l9FRCxDFR3rBFRL%Fuc)uAud1)Euc@!CudA=GZ>VpqZ>n#uZ>evsZ>w*w@2Kyr z@2c;v@2T&t@2l^xpHM%sep3D9`YH8O>!;OEub)vrvwl|n?D{$NbL;2T&#zxlzp#E$ z{o?v1^-JrQ)i1AKQNOZ&RsHJvHT7%j*VV7D-%!7?epCJC`YrWa>$lZ!uisI>vwm0o z?)p9Td+Ybr@2@{lf3W^g{o(o}^+)TE)gP}vQGc@jRQ>7tGxcZd&()u=zfga%{!;zr z`YZKU>#x;cufI`$v;J27?fN_QckA!f->-jA|FHg1{p0#4^-t@c)jzL)QU9|3RsHMw zH}!Ap-_^gb|4{$2{!{(u`Y-ig>%Y~1um4g1v;J58@A^OWf9wC%|F36gU~FJ&U~XV( zU~OP)U~k}P;B4S(;BMe);BDY*;BOFU5Nr@?5N;4@5N!}^5O0uZkZh1@kZzD^kZq7_ zkZ(|EP;5|YP;O9ZP;F3aP;by^&}`6Z&~DIa&~4Cb&~GqkFl;btFm5nuFl{hvFmJGE zuxzkuux_wvux+qwuy1f^aBOgDaBgsEaBXmFaBuKv@NDpE@NV#F@NMvG@NWoc2y6&y z2yO^z2yF;!2ycjJh-`>zh;E2!h;4{#h;K+}NNh-INNz}JNNq@KNN>n!$ZW`J$Zp7K z$Zg1L$ZsfUC~PQdC~hceC~YWfC~v4}sBEZesBWlfsBNfgsBdU!Xl!U|Xl`g}Xl-a~ zXm99f=xpd}=x*p~=xyk0=x><NFtK4$!{ml34O1JYHB4`q(J-@NR>SOuISq3g<~7W3 zSkSPrVNt{4h9wP48<sUJZ&=Z=vSC%j>V`E9Ya7-ztZ&%Ru(4rN!{&x94O<(wHEeI# z(Xg{&SHtdxJq>#s_BHHpIM8sg;ZVcjh9eC}8;&&`Z#dC#vf)(2>4q~6XB*BnoNu_$ zaIxW1!{vr64ObhkHC%7F(QvcjR>SRvI}LXm?ls(Rc+l{$;Zeimh9?bA8=f^hZ+Ox0 zvf)+3>xMTCZyVk<yl?o>@Uh`j!{>%C4PP6+HGFUQ(eSh3SHtgyKMj8y{x$q>U}$7) zWNKt?WNBn=WNTz^<Y?q<<Z9$@<Z0w><ZI+_6lfG|6lxT16loM~6l)Z3lxUP}lxmc2 zlxdW0lxvi4RA^LeRBBXiRB2RgRBKdk)M(Uf)N0gj)M?ah)N9mlG-xzzG-@<%G-)(# zG;1_(v}m+!v}&|&v}v?$v}?3)bZB&JbZT^NbZK;LbZc~P^l0>K^lJ2O^l9{M^lS8Q z3}_5&3~CH+3~3B)3~LN;jA)E(jB1Q-jA@K*jBAW<OlVAOOlnMSOleGQOlwSU%xKJP z%xcVT%xTPR%xlbVENCojENU!nENLulENd)ptZ1xktZJ-otZA%mtZS@qY-nt3Y-((7 zY-wz5Y-?<9>}c$4>}u?8>}l+6>}%|AoX|M2aZ=;t#wm?c8>cl+Z=BIMvvF4A?8Z5b za~tP1&Tm}MxUg|i<Ko68jY}JsH7;*l(YUg4RpaW$HH~W<*EOzh+|anOaZ}^w#x0Fo z8@DxXZ`{$ivvF7B?#4ZhdmHyP?r%KMc(CzM<Kf05jYk`gH6Cv~(Ri})RO9K!GmU2( z&o!QJywG^D@lxaE#w(3i8?QB9Z@kfXv+-8r?Z!KecN_0D-fw)+_^|O&<KxCBjZYh& zH9l{A(fG3QRpaZ%H;r!_-!;B({LuKZ@l)gH#xIRu8^1MvZ~W2tv+-Bs@5Voke;fZb z{%>SxVr*h+Vs2t-Vr^n;VsGMT;%wq-;%?$;;%(w<;%^dY5^NG`5^fS{5^WM|5^s`d zl5CP{l5Ub|l5LV}l5bLIQfyLcQf^XdQf*ReQg6~|(rnUd(r(ge(rwaf(r+?oGHfzx zGHx<yGHo(zGH<eIvTU+yvTm|zvTd?!vTt%|a%^&Ha&B^Ia&2;Ja&Piz@@(>I@^12J z@@?{K@^1=g3Tz5$3T_H%3T+B&3U7*NifoE%if)Q&ifxK(if>A2N^DAMN^VMNN^MGO zN^i<&%52JN%5KVO%5BPP%5N%YDr_ohDsC!iDs3ujDsQT2s%)xis&1-js%@%ks&8s& zYHVt1YHn(2YHez3YH#Xj>TK$2>Tc?3>TT+4>TjCRG_h$?)8wWpO;ekuHBE1t(KNGZ zR@3aJIZbn$<~7Z4TF|txX;IVSrX@{Fo0c^#Z(7l`vT0S*>ZUbKYn#?Jt#8`Uw6SSZ z)8?ivO<S9`HEnO&(X_K^SJUpMJxzO?_BHKqI?!~m=}^<*rXx*9n~pUdZ#vO*vguUQ z>83MHXPeG7oo~9(bg}7D)8(csO;?+)HC=DI(R8!vR@3dKJ56_+?ls+SdeHQ+=~2_; zrYB8Lo1Qg2Z+g-6vguXR>!vqNZ=2pVy>I%^^s(tv)90oyO<$Y7HGOaT(e$(FSJUsN zKTUs|{x$t?VrXV;W@=_`W@%<^W@~0|=4j?@=4$3{=4s|_=4<9}7HAf17HSr57HJl3 z7Hbx7mS~o2mTH!6mT8u4mTQ)8R%ljiR%%vmR%upkR%=#o)@asj)@s&n)@jyl)@#;p zHfT0%HflC*Hfc6(HfuI-wrI9&wraL+wrRF)wrjR;c4&5Nc4~HRc4>BPc58NT_GtEO z_G<QS_G$KQ_G|WU4rmT+4r&f=4rvZ;4r>l?j%bc-j%to>j%ki<j%$u@PH0YSPHIkW zPH9eUPHRqY&S=hT&T7tX&S}nV&TGzZE@&=nE^01rE@>`pE^97tu4t}ou4=Asu4%4q zu4}GuZfI_7Zfb6BZfS09ZfkCD?r838?rQFC?rH9A?rZLEp3pq8c~bM_<|)lno2NBT zZ=TUSvw2qY?B+SmbDQTi&u?DPys&vu^Wx?u%}bk?H7{>o(Y&&GRrBiRHO*_A*EO$i z-q5_Uc~kS|<}J-zo3}M@Z{E?ovw2tZ?&dwsdz<$)?{7ZPe6aaY^Wo+r%}1M$H6L$2 z(R{M`RP*WPGtFn4&o!TKzR-NJ`BL-c<}1xto3AxrZ@$rdv-wu@?dChpcbo4u-*0}< z{IK~^^W)|x%}<-3H9v2D(fqRcRrBlSH_dOG-!;E){?Pof`BU@f<}b}(o4+-GZ~oEz zv-wx^@8&<vf1Cd`|8Hh!VQgV)VQyh*VQpb+VQ=AR;cVe*;cnq+;cek-;cpRW5o{4^ z5pEG_5p5A`5pR)bk!+D_k#3P`k!_J{k#A9GQEX9aQEpLbQEgFcQE$;`(QMIb(QeUc z(QVOd(Qh$mF>EnvF>WzwF>NtxF>kSGv23wwv2L+xv2C$yv2Sr`acpsFac*&GacyyH zac}Wx@oe#G@ow>H@on*I@ox!e32X^!32q5#32g~$32%vLiEN2#iEfE$iEW8%iEl}0 zNo+}KNp4ALNo`4MNpHz$$!y7L$!^JM$!*DN$!{rWDQqcfDQ+ogDQzihDQ~H0scflg zscxxhscorisc&g$X>4g~X>Mt0X>Dn1X>aLh>1^q0>2B$1>22w2>2I0PGO=Y+%jA|R zEmK>jwM=iB(K54TR?F;`IW2Qr=C#akS<teuWl_uGmL)AqTb8vfZ&}f@vSn4v>XtPv zYg^W}tZ&)Svaw}T%jT9XEn8c*wQO(M(Xz8;SIh2}JuQ1%_O<M9InZ*j<xtDvmLn}k zTaL9HZ#mI&vgK6E>6SAsXIsv-oNu|%a<S!7%jK3UEmvEvwOntx(Q>opR?F>{J1uux z?zP-+dC>B(<x$JymM1MwTb{K%Z+X%3vgK9F>y|eyZ(H8Ayl?r?^0DPp%jcFaEni!{ zwR~^+(ekt9SIh5~KP`V-{<ZvXVQ6J+Wol(^Wocz?Wou<`<!I$><!a?_<!R+@<!j|{ z6=)S~6>1f36=@Z16>Al5m1vc0m1>o4m1&i2m1~u6RcKXgRccjkRcTdiRclpm)o9gh z)oRsl)oImj)oaynHE1<#HEK0(HEA_%HET6*wP>|$wQ99)wQ03&wQIF+b!c^Lb!v5P zb!l~Nb!&BR^=S2M^=kEQ^=b8O^=tKS4QLH)4QdT;4QUN+4QmZ=jcAQ*jcSc<jcJW- zjcbi>O=wMQO=?YUO=(SSO>0eW&1lVR&1%hV&1ubT&1=nXEod!lEov=pEom)nEo&`r zt!S-mt!k}qt!b@ot!u4sZD?(5ZE9_9ZE0<7ZEJ0B?P%?6?P~3A?P=|8?Q89CozOb5 zbyDl()+w!1Tc@>7Z=KOPvvpSM?AAH0b6e-N&Tn1Ny0CRo>*CfWtxH>%wJvX6(YmsA zRqN{3HLYt~*R`&1-O#$RbyMr+)-A1DTer1tZ{5+lvvpVN?$$l6dt3Ll?r%NNda(6S z>*3ZTtw&prwH|Lh(R#A=RO{*1Gp%P^&$XU!z0i8G^-}BQ)+?=7Td%cVZ@tlav-MW% z?bbW3cU$kZ-fw--`mps;>*LlZtxsE@wLWis(fYFWRqN~4H?415-?hGP{m}Zc^;7HT z)-SDJTfen_Z~f8wv-MZ&@76!9e_Q{x{%>VyV{Bt;V{T(<V{Kz=V{hYV<80$<<8I?= z<89+><8Kpa6KoS|6K)e}6KxY~6K|7flWdb}lWvn~lWmi0lW$XKQ*2XeQ*KjfQ*Bdg zQ*YB~(`?gf({9sg({0mh({D3qGi)<zGj20!Gi@_#GjFqKvuv|!vu?9#vu(3$vu|@~ zb8K^Jb8d5Kb8T~Lb8qu#^KA2K^KSEL^KJ8M^KT1i3v3H&3vLT(3vCN)3vY{Pi)@Q( zi*Ac)i*1W*i*HM4OKeMOOKwYPOKnSQOK;0)%WTVP%WlhQ%WcbR%Wo@aD{L!jD{d=k zD{U)lD{rf4t8A-kt8S}lt8J@mt8Z&)Yiw(3Yi?_4Yi(<5Yj5jl>ul?4>u&35>uu|6 z>u;OTHnD9|+vK(>ZByH(wM}oE(KfSfR@>~hIc;;>=C#dlThO+!ZBg6ewk2&#+m^L0 zZ(Gr}vTaq{>b5m)Yunbft#8}Vwy|wf+vc_{ZCl&6wQX<P(YCW~SKIEkJ#Bm2_O<PA zJJ5Ep?NHm{wj*sv+m5vzZ#&U;vh7sc>9#X%XWP!Too~C)cCqbJ+vT<^ZCBf_wOwz! z(RQ=#R@?2iJ8gH{?zP=-d(if<?NQs~wkK^*+n%*OZ+p@9vh7vd>$W#-Z`<Cry>I)_ z_Ob0#+vm0~ZC~5IwS8~<(e|_LSKIHlKW%^8{<ZyYV`yh=XKH6|XK80`XKQC~=V<3_ z=W6F}=V|9{=WFM07ibr37it%77ikx57i$-9muQ!4mui=8muZ)6mur`AS7=vkS87*o zS7}#mS8G>q*J#&l*J{^p*J;;n*K5~rH)uC(H)=O-H)%I*H)}U<w`jL)w`#X;w`sR+ zw`;d=cW8HPcWQTTcWHNRcWZZV_h|QQ_iFcU_i6WS_iOiW4`>f;4{8r?4`~l=4{Hx^ zk7$o<k7|!@k7<u>k86)_PiRkUPijwYPiaqWPis$a&uGtV&uY(Z&uPzX&uh<bFK91p zFKRDtFKI7rFKaJvuV}AquWGMuuW7GsuWPSwZ)k69Z)$IDZ)tCBZ)<OF?`ZFA?`rRE z?`iLC?`!XGpU^(BeNy}6_9^XC+o!cpZ=caVvwc?k?DjeBbKB>&&u?GQzOa2!`{MQ` z?MvI2wJ&d9(Y~^MRr~7pHSKHL*R`*2-_X9XeN+49_ATvO+qboEZ{N|rvwc_l?)E+H zd)xQ5?{7cQez5&e`{DK@?MK^>wI6Rk(SEZ1RQu`nGwo;F&$XX#ztDcM{Zjko_ABjI z+po1>Z@<xgv;9{4?e;tEciZo^-*11={;>T~`{VW}?N8gEwLfov(f+diRr~AqH|=lR z-?hJQ|Iq%i{Zsqr_Al*U+rPDcZ~xK$v;9~5@Ag0Kf7}1H|8HmLVC-P(VD4b)VC`V* zVDI4Q;OyY);O^k*;O*e+;O`LV5bO}@5bhA^5bY4_5bu!aknE7^knWJ_knND`knd3F zQ0!3ZQ0`FaQ0-9bQ18&_(CpCa(C*Ob(CyIc(C;wlFzhhuFzztvFzqnwFz>MFu<Wqv zu<o$wu<fwxu<vl_aO`mEaPDyFaP4sGaPRQw@a*vF@b2*G@a^#H@b3ud2<!;z2<`~! z2<-^#2=9pKi0p{!i0+8#i0z2$i0??~NbE@JNbX4KNbN}LNbkt#$n41K$nMDL$nD7M z$nPlVDC{WeDDEifDD5cgDDSA~sO+ffsP3rgsO_lhsPAa#XzXa}Xzpm~Xzgh0Xz%Fg z=<Mj~=<ew0=<Vq1=<k@&F|lJ($K;MF9aB4|bxiM=(J`}QR>$m)IURF5=5@^PSkSSs zV^PQAjwKySJC=1U?^w~XvSU@p>W(!XYdh9;tnb*+v9V)Q$L5YL9a}rLb!_k0(Xq2* zSI6#-Jso>H_I2#<IM8vh<50)pjw2mMJC1c6?>NzMvg1_8>5elUXFJYyobR~Mak1l4 z$K{SI9alT9bzJYb(Q&imR>$p*I~{jB?seSnc+l~%<59=sjwc;YJDzns?|9Mivg1|9 z>y9@aZ#&*~yzltX@v-Am$LEeO9bY@Xb$svm(ebn6SI6&;KOKKN{&oECVCZD*Wa?z@ zWa(t>Wb0(_<mlw=<m%+^<mu$?<m=?`6zCM}6zUZ26zLT06zdf4l<1V~l<Ji3l<Ac1 zl<So5ROnRfRO(djROwXhRO?jl)acag)aumk)algi)a%smH0U(!H0m_&H0d<$H0w0) zwCJ?#wCc3(wCS|%wCl9*bm(;Kbn0~Obm?^MbnA5Q^yu{L^y>8P^y&2N^y~ER4CoB( z4C)N-4CxH*4C@T<jOdK)jOvW;jOmQ+jO&c=Oz2GPOzKSTOzBMROzTYV%;?PQ%<9bU z%<0VS%<IhWEa)ukEb1)oEa@!mEbA=qtmv%ltm>@ptm&-ntm~}rZ0Kz4Z0c<8Z0T(6 zZ0l_A?C9+5?CR|9?CI?7?Cb3BoX|P3b5iHz&MBQ!JEwI{@0`&&vvXGG?9Mrzb35mC z&hK2%xv+Cl=i<&Kol85HbuRB*(Ydm7Rp;u?HJxia*LAM%+|aqPb5rN$&Mlo=JGXUi z@7&S3vvXJH?#?}(dpq}a?(aO%d9d?P=i$yHoku&5bsq0L(Rs4-ROji=Go5EU&vl;f zywG{E^HS&K&MTc)JFj(K@4V4@v-4Kx?an)$cRTNO-tT<S`LOd*=i|;NoliTTbw2NW z(fP9TRp;x@H=S=g-*vw4{LuNa^Hb;N&M%!`JHK^)@BGpEv-4Ny@6JD+e>?wm{_kYy zV(en-V(wz;V(nt<V(;SU;_Tw;;_l+<;_c$=;_njZ66_M{67CY|673S}67Q1elI)V| zlJ1h}lI@b~lJ8RJQtVRdQtndeQteXfQt#5}((Kae((cmf((Tgg((f|pGVC(yGVU_z zGVL<!GVikJvh1?zvhK3!vhA|#vhQ-}a_n;Ia_(~Ja_w^Ka_{o!^6c{J^6v8K^6m2L z^6v`h3hWB%3hoN&3hfH(3h#>OitLK&itdW(itUQ)itkG3O6*GNO72SOO6^MPO7F_( z%IwPO%I?bP%I(VQ%I_-ZD(ouiD())jD(x!kD(|Z3s_d%js_v@ks_m-ls_$y(YV2z2 zYVK<3YVB(4YVYdk>g?+3>h9|4>h0?5>hGG+HL+__*W|7#T~oWJbxrS@(KWMcR@dyV zIbCzR=5@{QTF|wyYf;zYt|eVdyOwn=?^@BdvTIe>>aI0iYrEEUt?$~<wXthc*XFJ* zU0b`hb#3q3(Y3Q{SJ&>YJzaad_I2&=I?#2n>rmI>t|MJXyN-1o?>f<Svg=gW>8>+f zXS>dIo$tEPb+PMG*X6D&U01uVbzSee(RH)yR@d#WJ6(6X?seVodeHT->rvO^t|whj zyPkDD?|RYovg=jX>#jFlZ@b=gz3=+a^|9+y*XOP;U0=Jtb$##p(e<<ISJ&^ZKV5&j z{&oHDV(4b<X6k0{X6a__X6t6}=IG|^=IZ9|=IQ3`=IiF~7U&l27U~x67U>r47V8%8 zmgtu3mg<)7mg$!5mg|=9R_IpjR_a#nR_RvlR_j*p*67yk*6P;o*6G&m*6Y^qHt06& zHtII+Ht9C)HtRO;w&=F(w(7R-w&}L*w(GX<cIbBOcItNScIkHQcI$TU_UQKP_UiWT z_UZQR_UrcV4(JZ-4(bl>4(Sf<4(kr@j_8i;j_Qu?j_Ho=j_Z!^PUueTPU=qXPU%kV zPU}wZ&gjnU&g#zY&gstW&g;(aF6b`oF6u7sF6l1qF6%DuuIR4puIjGtuIaAruIsMv zZs>08Zt8CCZs~6AZtHIE?&$99?&|LD?&<FB?(6RFp3pt9ds6r0?kU|<yQg(e@1D^; zvwK$e?Cv?;bGzqt&+lH)y|8;x_u}p)-AlWdbuaH;(Y>;JRrl)dHQj5w*LAP&-q5|V zdsFx3?k(M0ySH_3@7~e9vwK(f?(RL^d%O2_@9#d)eX#pb_u=j%-AB8Rbsz6O(S5S} zRQKubGu>yq&vl>gzR-QK`%?Gi?kn9_yRUU$@4nG}v-?)}?e06>cf0R(-|v3V{jmE{ z_v7v--A}upbwBTZ(fzXfRrl-eH{EZ$-*vz5{?Prg`&0Ml?l0Y6yT5gR@BY#Kv-?-~ z@9sa{f4l#6|L<n#VeDb*VeVn+VeMh-VejGS;q2k+;qKw-;qBq;;qMXX5$qA_5$+M` z5$zG{5$}=ck?fJ`k?xV{k?oP|k?&FHQS4FbQSMRcQSDLdQSZ^{(d^Oc(eBad(e2Ue z(eE+nG3+twG43(xG3_zyG4HYHvFx$xvF@?yvF)+zvF~x{aqMyGaqe;HaqV&Iaqscy z@$B*H@$T{I@$K>J@$U)f3G4~#3GNB$3GE5%3Ga#MiR_8$iSCK%iS3E&iSJ41N$g4L zN$yGMN$pANN$<(%$?VDM$?nPN$?eJO$?qxXDeNigDefuhDeWoiDetN1sqCrhsqU%i zsqLxjsqbm%Y3yn0Y3^z1Y3*t2Y47Ri>Fnw1>F(+2>Fw$3>F=4)GqGn<&*YvdJyUz8 z^-S-X(KEAWR?qC7IX!cG=Jm|)S<thvXHn1Mo+Uj?dzSSq?^)5avS(G#>Yg<{YkSu9 ztnb;-v$1DW&*q*jJzIOW^=$9i(X+E>SI_RAJw1DS_Vw)VInZ;k=TOh#o+CX+dye%S z?>W(PvgcIK>7Fw^XM4`|obS2NbFt@A&*h#gJy(0K^<3|{(Q~usR?qF8J3V)M?)BX7 zdC>E)=TXn&o+mv|d!F???|ISlvgcLL>z+3~Z+qVLyzlwY^Rees&*z>mJzsmi^?dL7 z(etzCSI_UBKRthY{`LItVd!P-W$I<_W$9(@W$R_{<>=+?<?7|`<>}?^<?H3|73dZ0 z73vl473mf273&r6mFSi1mFku5mFbo3mFt!7Rp?dhRq9plRq0jjRqIvn)#%mi)#}ym z)#=sk)$7&oHRv_$HR?6)HR(0&HS0C+wdl3%wd%F*wdu9(wd=L-b?9~Mb?SBQb?J5O zb?bHS_2~8N_3HKR_38EP_3QQT4d@N*4eAZ<4e1T-4eJf>jp&W+jp~i=jp>c;jq8o? zP3TSRP3leVP3cYTP3ukX&FIbS&FanW&FRhU&FjtYE$A)mE$S`qE$J=oE$c1st>~@n zt?I4rt?8}pt?RAtZRl<6ZR&0AZRu_8ZR>6C?da|7?dt9B?dk39?d$FDozOe6cT(@< z-YLCPd#CkI@14;*vv*eS?A|%Ob9?9Y&hK5&yRdgr@8aGiy-RzS^)ByS(YvyDRqyKF zHN9(l*Y&RN-O#(ScT?}?-Yvabd$;v&@7>Y6vv*hT?%qAUdwciw?(aR&d$9LV@8RAf zy+?bG^&am%(R;G@RPX8DGrebf&-I?~z0iBH_fqfW-YdOVd$09g@4eA`v-ei-?cO`R zcYE*k-tT?T`>^*>@8jMly-$0e^*--?(fhLZRqyNGH@$Cr-}S!l{m}cd_fzlZ-Y>mh zd%yL5@BPvHv-el;@7_PXe|!J+{_kbzW9(z<WA0<=W9?(>WAEeW<Lu+=<L=|><L%?? z<L?vb6YLY}6Ydk~6YUf06YrDglkAh~lkSu0lkJo1lkZdLQ|wdfQ|?pgQ|(jhQ}5I0 z)9lmg)9%yh)9usi)9*9rGwd_!Gww6#Gwn0$Gw-wLv+T3#v+lF$v+c9%v+r~0bL?~K zbMABLbM15MbMN!$^X&8L^X~KM^X>EN^Y07j3+xN(3+@Z)3+)T*3-62Qi|mW)i|&i* zi|vc+i|<S5OYBSPOYTeQOYKYROYh6*%k0bQ%kInR%k9hS%kL}bE9@)kEAA`lEA1=m zEAOl5tL&@ltM04mtL>}ntM6;*YwT<4Ywm05Ywc_6Ywzpm>+I|5>+b96>+S37>+hS; zH?eP0-{ih2eN+3U^-b@a(KoYiR^RNtIel~c=Jn0*ThO<#Z&Bakz9oH2`<C@B?_1Hg zvTs%2>b^C7Yx~yqt?%2=x3O<i-{!t8eOvps^=<Fl(YLd2SKscwJ$-xo_Vw-WJJ5Hq z?@-_2z9W4{`;PS;?>o_VvhP&i>Ao|4XZz0eo$tHQcd_qM-{rn5eOLRg^<D3~(RZ`& zR^RQuJAHTi?)Ba8d(ii=?@{05z9)T8`=0eZ?|aervhP*j>%KRAZ~NZ$z3=<b_p$F& z-{-zBeP8>&^?mRA(f70OSKsfxKYf4u{`LLuW9Vn>XX<C}XX$6{XX|J0=ji9`=j!L~ z=jrF|=j-S17w8x47wQ-87wH%67wZ@Am*|)5m+F`9m+6=7m+P1BSLj#lSL#>pSLs*n zSL;{r*XY;m*Xq~q*Xh^o*X!5sH|RI)H|jU;H|aO+H|sa=x9GR*x9Yd<x9PX-x9hj> zcj$NQcj|ZUcj<TSck6fW_vrWR_v-iV_v!cT_v`oX59kl<59$x@59tr>59<%_kLZu= zkLr)^kLi!?kL!=`Pv}qVPwG$ZPw7wXPwP+b&*;zW&+5<a&*{(Y&+E_cFX%7qFX}Ju zFX=DsFY7PwujsGruj;Svuj#Mtuj{YxZ|HCAZ|ZOEZ|QICZ|iUG@96LB@9OXF@9FRD z@9XdHpU^+Ce^USC{we)a`=|9!@1M~>vwv3q?EX3ZbNlD@&+lK*zp#H%|Kk27{Y(3o z^)K&V(Z8~PRsZV#HT`S**Y&UO-_XCYe^dYF{w@7m`?vLP@88kCvwv6r?*2Xfd;9nG z@9#g*f3W{h|Ka{4{YU$c^&js)(SNf4RR8JzGyP}#&-I`0ztDfN|5E?u{ww`g`>*w1 z@4wN1v;S8A?fyIccl+=4-|v6W|FHj2|Kt8A{ZIR!^*`@_(f_jlRsZY$H~nw>-}S%m z|Iq)j|5N|x{xAJs`@i*n@Bh*Nv;SBB@BTmifBXOS|L<p*z&L?v0`mlx39J*?Ca_Q7 zn7}!KYXbKKo(a4Y_$KgA5SSo1L1=>T1d$1%6T~KnPmq`(IYDZI^aPm+vJ>Pc$WKt1 zpg2Kkg7O5F391v+Ca6!)n4md9Yl8L!oe8=V^d{&}FqmLC!Dxc<1d|D-6U-)<Pq3I^ zIl*dz^#q#<wiE0o*iUen;5fl)g7XBI39b{|Cb&=VnBY0VYl8O#p9#Jb{3iHM2$&E! zA!tJIgpdiL6T&8hPl%WhIU#C7^n{oRu@mAZ#7{_=kT@Y}Lh^)^38@p(CZtcun2<Rk zYeM#foC&!T@+Ra@D40+<p=d(!gpvuR6Uru(PpFtsIiYGo^@N%UwG-+l)K6%b&^V!K zLi2={39S>_CbUoJn9w<)YeM&go(a7Z`X=;Gm@r}Dgh>-7Pna@c>V#<%rcanLVdjKc z6J}4CGhyz8c@ySOSTJGXghdk;PgpWx>4aqymQPqQVdaEX6IM@HGhyw7braT4*f3$^ zgiRARPuMbH>x69+wolkGVdsQh6LwG7Ghy$9eG~RiI56ShghLY!PdGB+=!9bvj!!r- z;pBu<6HZS!GvVxna}&-_xG>@3gi8}HPq;GS>V#_(u1~lz;pT)}6K+qqGvV%pdlT+Y zcrfANghvw|Pk1un>4aw!o=<o&;pK!^6JAevGvV!ocN5-E_%Pw)gijMbPxvz7>x6F; zzEAiu;pc>36Mj$lGvV)qe-r*sV3^1_k!d3HM3#xH6WJ!RPvn@$Igx83_e7qFyc78* z@=p|)C^%7QqVPnKiJ}w5CW=p#m?$|>YNGT+nTfI!<tEBcRG6qZQE8&`M3srE6V)cF zPt=&GIZ<n(_C%eDx)b##>Q6M7XgJYmqVYtNiKY|HCYn#Qm}oiCYNGW-n~Am)?Izk! zbeQNk(P^UdM3;%K6Wu1dPxP4RInisP_e7tGz7zc>`cDj)7&tL#V(`R}iJ=q2CWcRp zm>4-RYGU-nn2E6y<0i&WOqiHBF==A*#FUAt6VoQ9Pt2H@IWcQu_QaftxfAmy=1(k` zSU9n0V)4Y1iKP?ECYDdEm{>WnYGU=onu)a&>n7GuY?#<Mv1wxS#FmMz6Wb=XPwbf3 zIk9VE_r#uwy%YN;_D`HJapJ^D6DLocGI8p}X%nYUoH23c#90$(Pn<Jx?!<W$=TBTP zapA;86BkchGI8m|WfPZATrqLw#8nelPh2x`?ZkBx*H7FqapS~I6E{!XGI8s~Z4<Xo z+%a+I#9b42Puw$c@5Fr*_fI@9@!-Tm6Aw>3GV$odV-t^0JTdX)#8VSbPdqd6?8I{u z&riHC@#4fw6E9D^GV$ufYZI?eyfN|S#9I?@PrNhn?!<c&?@xR%@!`Zr6CY1}GV$re zXA_@Kd@=Fm#8(qvPkb}+?ZkHz-%tE7@#Dl#6F*P<GV$xgZxg>y{4w$8#9tGCPy93S z@5Fx-|4(F?#5jp*67wXMNvxCDCb3WAn8Z1WYZCV)o=Lou_$KjB5||`7NobPrB#}v? zlf)*8Pm-7<IZ0}g^dy-{vXkT{$xl+4q&P`wlJX>#Nvf07CaF)-n4~#LYm)XPok_Zr z^d{*~GMHpI$!L=CB$G*|lguWWPqLU~Imv30^(31~wv+58*-vtq<T%M`lJg{&Nv@OJ zCb>`YnB+OhYm)aQpGm%x{3iKN3YZi)DQHsgq>xFWlfov2Pl}inIVoyV^rV<cv6JE^ z#ZO9@lsGAAQu3sfNvV_4CZ$ixn3OpwYf|>4oJqNp@+Rd^DwtF_sc2I1q>@RclgcKQ zPpX(yIjL$=^`x3fwUg>5)lX`e)HtbWQuCyiNv)IGCbduMnAAC`Yf|^5o=Lrv`X=>H znlNeNq)C$|Pnt4m>ZECtrcatNY38I^lV(qvGimOmd6VW(S}<whq(ze!Pg*i*>7-?o zmQPwSY2~C<lU7e!GimLlb(7Xl+AwM3q)n4HPuenR>!fXywolqIY3HO}lXg$qGimRn zeUtW2Ixy+rq(hSqPdYN`=%izlj!!x<>ExtSlTJ@MGwJN4bCb?bx-jYDq)U@7Pr5Sc z>ZEIvu1~r#>E@(clWtGCGwJT6dz0=@dNAqXq(_q;PkJ)x>7-|qo=<u)>E)zXlU`4H zGwJQ5caz>v`Y`F^q)(GRPx><H>!fd!zEAow>F1<hlYUS7GwJW7f0O=CVwlW0nQ1cf zWR}USli4P-Pv)4+IhkuR_hg>Qyp#DR^G_C-EI3(cvhZY)$)c0RCW}v&m@GM2YO?fX znaQ$~<tEEdR+y|fS!uHJWR=OPlhr1xPu7^MIazD6_GF#Ox|8)L>rXbAY&h9yvhie- z$)=OdCYw*Tm~1)OYO?iYo5{A5?Izn#c9`rq*=e%#WS7aVlien}PxhGXIoWHn_hg^R zzLWhX`%ey-95^{>a`5Dk$)S_OCWlXsm>fAdYI5}Cn8~q|<0i*XPMDlHIcak8<dn&& zlhY=rPtKT}IXP=`_T-$&xs&rI=T9z}TsXOCa`EJn$)%IaCYMjHm|QuzYI61Dn#r}3 z>n7JvZkXISxoL9q<d(^;liMb@Pwtr9Ik{_c_vD_*y_5SU_fMWMdE(?rlP6D}GI{Fc zX_Kc<o-ujm<XMwvPo6V*?&Nus=TBZRdEw+mlNV23GI{CbWs{drUNL#)<W-YbPhK;5 z?c{Zn*H7LsdE?|wlQ&P^GI{IdZIic8-Z6RS<Xw|@Pu??m@8o@x_fI}B`QYS3lMhcm zGWqD_W0Q|hJ~8>^<WrMRPd+pG?BsKk&riNE`QqeDlP^!cGWqJ{Ym=`}zA^dc<Xe+( zPrftx?&N!u?@xX(`QhY8lOIohGWqG`XOo{#elhvw<X4klPkuA`?c{fp-%tK9`QzkI zlRr=XGWqM|Z<D`I{xSLI<X@A2PyRFc@8o}z|4(L^!Z?L#3iA|}DXdf2rm#=pn8G=Q zYYO)io+-Rj_@?kr5tt%4MQDof6p<;SQ^cl-Pm!1+IYnxU^c0yXvQy-y$WKw2qBuoq zit-edDXLS{rl?QRn4&pFYl`+1ohiCg^rq-fF_>aF#b}E06q6~YQ_QBAPqCO{ImK#< z^%R>awo~k;*iUho;yA@=it`kgDXvr8rnpb>nBqCbYl`<2pDDgm{HFL%378T%C1^_U zl#nT*Q^KZ%Pl=ckIVEaJ^puz>u~Xuv#7{|>k~k%4O7fJHDXCM^rle2Fn36dqYfAQ% zoGH0e@}}fZDVS0?rD#g=l#(f>Q_7~4PpOzvIi+e!^^}?^wNvV*)K6)c(m17QO7oPK zDXml5rnFD#n9@0=YfAT&o+-Uk`lj?xnJ{JIlu1)2Pnj}h>Xd0yrcaqMW#*JwQ)W+@ zGiC0Sc~j<3Sukbcltoh(Pgyc$>6B$tmQPtRW#yDrQ&vw|GiB|RbyL<)*)V0}luc7M zPuVhM>y&L%wolnHW#^P#Q+7|;GiC3TeN*;NIWXnmltWVvPdPH>=#*nqj!!u;<>Zu8 zQ%+AgGv(}*b5qVwxiID8luJ`CPq{MX>Xd6!u1~o!<>r)IQ*KYWGv)4-dsFUDc`)VS zlt)t@PkA!s>6B+vo=<r(<>i!DQ(jMbGv)1+cT?U^`7q_<luuJWPx&(C>y&R(zEAlv z<>!=NQ+`kRGv)7;e^dTXVVKG|m1!#TRF<i%Q`x4nPvw}(IhAWF_f(##yi@t6@=q0* zDmYbWs_;~isiITGrixFMm?}9{YO3^9nW?f<<)+F{RhX(cRcWg7RF$c!Q`M%bPt};J zIaO<__Eepzx>NP0>Q6P8YB<$ss_|5lsisrSrkYQ+m})uIYO3{Ao2j-_?WWpKb(rcn z)oH5pRF|o)Q{ASzPxYAUIn`^b_f(&$zEl0C`cDm*8aOp*YVg#Msi9NDriM?Am>M}X zYHIY<n5nT-<EF+>O_-WEHEC+{)Rd{IQ`4rVPtBN`IW=o)_SBrIxl{9|=1(n{S~#_6 zYVp*PsijlPrj}2wm|8itYHIb=nyIx@>!#LEZJ63PwP|Ye)Rw8OQ`@GtPwkl6IkjtQ z_tc)Ly;J+9_D`KKb>h@XQzuWIGIi?IX;Y_9oiTOh)LBz!Pn|P$?$mix=TBWQb>Y-S zQx{KNGIi<HWmA_=T`_g#)KybgPhB&0?bLNs*H7Irb>q}cQ#ViDGIi_JZBw^T-7$6N z)Lm0|Pu(+h@6>%$_fI`A_2AS)Qx8u)GWF=xV^fb$Ju&s<)KgPWPdzjB?9_8p&riKD z_2Se^Q!h`wGWF`zYg4aJy)pIX)LT<;PrWns?$moz?@xU&_2JY<Qy))#GWF@yXH%a~ zeKGar)K^nqPkl4>?bLTu-%tH8_2bk}Q$J7rGWF}!Z&SZd{W10D)L&D7PyI9X@6>-& z|4(I@#yE{>8uK)kX{^)Orm;`sn8rDcYZ~`7o@u<(_@?ns6PPAAO=z0%G?8hd)5NBU zPm`D?IZbMs^fZ}iveV?I$xl<5rZ`P$n({Q2X{yuIrm0WUn5H>RYnt{nooTw$^rq=g zGni&L&1jnOG?Qtj)6AxsPqUb2In8RC^)#Dlw$tpU*-vwr<~Yr1n)5W5X|B`Urnyh^ znC3anYnt~opJ~3+{HFO&3z!x-EofTsw2*0`)54~OPm7oqIW1~h^t701vD4zF#ZOC^ zmN+eGTJp4%X{poFrln8In3g#$Yg+cSoN2k!@}}iaE0|U|t!P^Dw32D1)5@lmPpg<# zIjw41^|YF4wbSaR)lX}f);O(cTJyA)X|2=RrnOJ&nASP1Yg+fTo@u?)`lj_yn=ozS zv`Nz@Pn$Ar>a=OorcawOZRWID(`HYbGi~m)dDG@kTQF_mv_;bvPg^o=>9l3jmQPzT zZRNC8(^gMgGi~j(b<@^Q+c0h8v`y1CPuntW>$GjtwoltJZRfOI({@kWGi~p*ebe?& zJ236wv_sPlPdhU0=(J<gj!!!=?c}sm(@sx2GwtlObJNaGyD;tIv`f=2PrEYh>a=Uq zu1~u$?dG&w({4|@GwtrQd(-Yudob<cv`5n(PkS=$>9l9lo=<x*?d7yr(_T+|GwtoP zchlZa`!Ma}v`^DMPx~_M>$GpvzEArx?dP;#(|%9;GwtuRf7AX?W0=l3ooPDrbe8F? z)7hr8Pv@A<Ih|`d_jI1=ywmxn^G_F;E;wCiy6|+7>7vucri)LPm@YY8YP$4vnd!3A z<)+I|SD3CiU1_@Vbd~9<)77S{PuG~PIbCbI_H>=;y3_Th>rXeBZaCd&y76?A>88`o zrkhW<m~J`UYP$7wo9VXG?WWsLcbM)t-D$e>beHL_)7_@KPxqMaIo)fz_jI4>zSI4t z`%e#;9ymQ{dhqm+>7moZriV|Dm>xMjYI^kanCY?8<EF<?Pne!KJ!yLK^pxqT)6=G> zPtTa1IX!E7_Vk?TxzqEe=T9$~UO2sIdhzs<>7~=lrk78zm|i)(YI^nbn(4LE>!#OF zZ<yXVy=i*$^p@$Z)7z%EPw$xCIlXIo_w=6Wz0>=q_fMZNed6><(<e`#GJWdwY15}q zpD}&r^jXtqPoFb=?(})n=TBcSec|*)(-%))GJWavWz&~WUom~<^i|VWPhT^A?euli z*H7OtedF{^(>G7wGJWgxZPT|;-!XmX^j*_;Pv0|r@AQ4s_fJ1C{owRN(+^KSGX3cE zW7CgMKQaB}^i$JMPd_vL?DTWf&riQF{o?dX(=SiIGX3iGYtye!zcKyh^jp(!Proz$ z?(}=p?@xa){o(XS(;rWNGX3fFXVafge=+^#^jFhgPk%H0?eurk-%tNA{p0jc(?3uD zGX3lHZ_~d||1tgN^k36|PyaLh@AQAu|4(O_!8n6y2J;M-8LTtdX0XrTn87)NYX<iW zo*BF|_-63W5SSr2LuiKZ43Qb4GsI?y&ybiQIYVlO^bDC9vNPmn$j?xip*TZnhVl%R z8LBhXW~k55n4vjCYlij=of*0_^k(SKFqmOD!)S)_43inAGt6d~&#;(bIm2p(^$eRC zwlnNz*w1j7;W)!-hVu-U8Ll(jX1LGrnBh6YYlim>pBcV0{AT#i2$&H#BWOnOjF1_j zGs0$s&xn{2IU{OD^o*Dpu`}Xk#Lq~WkvJo1M)Hi58L2bUW~9%^n2|XnYex2roEf<@ z@@C}ED40<=qi9C)jFK6pGs<R^�JDIiqSu^^BSswKM8w)X!*`(Kw@NM)Qo88Lczg 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%0AY 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%0DZ-II4u-93Hx%-yqh&)q$L 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 B9peB1 diff --git a/QDMA/linux-kernel/scripts/license-for-datafile_16bit_pattern.txt b/QDMA/linux-kernel/scripts/license-for-datafile_16bit_pattern.txt deleted file mode 100755 index 15469ad..0000000 --- a/QDMA/linux-kernel/scripts/license-for-datafile_16bit_pattern.txt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * THIS BINARY FILE IS GENERATED FROM XILINX TOOLS AND IS AVAILABLE EXCLUSIVELY IN BINARY FORMAT. - * - * Copyright © 2022 Xilinx, Inc. - * - * Redistribution and use in binary form only, without modification, is permitted provided that the following conditions are met: - * - * Redistributions must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * The name of Xilinx, Inc. may not be used to endorse or promote products redistributed with this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED BY XILINX, INC. "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL XILINX, INC. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ \ No newline at end of file diff --git a/QDMA/linux-kernel/scripts/qdma_generate_conf_file.sh b/QDMA/linux-kernel/scripts/qdma_generate_conf_file.sh deleted file mode 100755 index c66cb1a..0000000 --- a/QDMA/linux-kernel/scripts/qdma_generate_conf_file.sh +++ /dev/null @@ -1,121 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - - -#!/bin/bash -# -# Simple script to generate conf file for module params. -# - - -function print_help() { - echo "" - echo "Usage : $0 <bus_num> <num_pfs> <mode> <config_bar> <master_pf>" - echo "Ex : $0 0x06 4 0 0 0" - echo "<bus_num> : PF Bus Number" - echo "" - echo "<num_pfs> : Number of PFs supported, Default - 4" - echo "" - echo "<mode> : Mode, Default - 0 (Auto)" - echo "" - echo "<config_bar> : Config Bar number, Default - 0" - echo "" - echo "<master_pf> : Master PF, Default - 0" - echo "" - echo "" - echo "" - exit 1 -} - -if [ $# -lt 1 ]; then - echo "Invalid arguements." - print_help - exit; -fi; - -bus_num=$1 -num_pfs=4 -mode=0 -config_bar=0 -master_pf=0 - -if [ ! -z $2 ]; then - num_pfs=$2 -fi - -if [ ! -z $3 ]; then - mode=$3 -fi - -if [ ! -z $4 ]; then - config_bar=$4 -fi - -if [ ! -z $5 ]; then - master_pf=$5 -fi - -generate_conf() -{ - conf_file="qdma.conf" - echo -n "options qdma-pf mode=" > conf_file - for ((j = 0; j < ${num_pfs}; j++)) - do - echo -n "${bus_num}:${j}:${mode}" >> conf_file - if [ $j != $((${num_pfs} - 1)) ]; then - echo -n "," >> conf_file - fi - done - echo -e "" >> conf_file - echo -n "options qdma-pf config_bar=" >> conf_file - for ((j = 0; j < ${num_pfs}; j++)) - do - echo -n "${bus_num}:${j}:${config_bar}" >> conf_file - if [ $j != $((${num_pfs} - 1)) ]; then - echo -n "," >> conf_file - fi - done - echo -e "" >> conf_file - echo -n "options qdma-pf master_pf=${bus_num}:${master_pf}" >> conf_file - - echo -e "" >> conf_file - echo -n "options qdma-vf mode=" >> conf_file - for ((j = 0; j < ${num_pfs}; j++)) - do - echo -n "${bus_num}:${j}:${mode}" >> conf_file - if [ $j != $((${num_pfs} - 1)) ]; then - echo -n "," >> conf_file - fi - done - echo -e "" >> conf_file - echo -n "options qdma-vf config_bar=" >> conf_file - for ((j = 0; j < ${num_pfs}; j++)) - do - echo -n "${bus_num}:${j}:${config_bar}" >> conf_file - if [ $j != $((${num_pfs} - 1)) ]; then - echo -n "," >> conf_file - fi - done - - rm -rf /etc/modprobe.d/qdma.conf - cp conf_file /etc/modprobe.d/qdma.conf - rm -rf conf_file -} - -generate_conf diff --git a/QDMA/linux-kernel/scripts/qdma_run_test_mm_vf.sh b/QDMA/linux-kernel/scripts/qdma_run_test_mm_vf.sh deleted file mode 100755 index 1692277..0000000 --- a/QDMA/linux-kernel/scripts/qdma_run_test_mm_vf.sh +++ /dev/null @@ -1,162 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - - -#!/bin/bash -# -# Simple run script to test QDMA in VF AXI-MM mode. -# -# VF AXI-MM Transfer -# - H2C operation is performed to send data to BRAM on the FPGA. -# - C2H operation is performed to reads data from BRAM. -# - C2H data is stored in a local file 'out_mm0_$qid', which will be compared to original file for correctness. - -################################################ -# User Configurable Parameters -################################################ -iteration=$1 # [Optional] Iterations -size=$2 # [Optional] Size per payload packet - -################################################ -# Hard Coded Parameters -################################################ -q_per_vf=1 -vf=00080 -size_max=4096 -host_adr_high=0 -infile='./datafile_16bit_pattern.bin' - - -################################################ -# Input check -################################################ -if [ "$1" == "-h" ]; then - echo "Example: qdma_run_test_st_vf.sh [iteration] [size(in byte)]" - echo "Example: qdma_run_test_st_vf.sh This will run VF MM test in random mode" - exit -fi - -if [ -z $2 ] || [ $# -eq 0 ] ; then - echo "Run VF MM test in random mode" - sleep 3 -fi - -if [ -z $iteration ]; then - iteration=1 -fi - -if [ ! -z $size ]; then - f_size=1 -else - f_size=0 -fi - -################################################# -# Helper Functions -################################################ - -function randomize_tx_params() { - #random host address - if [ $host_adr_high -ne 0 ]; then - hst_adr1=$RANDOM - hst_adr1=$((hst_adr1 % host_adr_high)) - else - hst_adr1=0 - fi - - # byte size - size=$RANDOM - if [ $size -eq 0 ]; then - size=$(($RANDOM % 64 + 1)) ## for random number between 1 and 64 - else - size=$((size % $size_max)) - fi - - # Correct if size is odd - even=$((size%2)) - if [ $even -eq 1 ];then - size=$((size+1)) - fi -} - - -function queue_start() { - echo "---- Queue Start $2 ----" - dma-ctl qdma$1 q add idx $2 mode $3 dir bi - dma-ctl qdma$1 q start idx $2 dir bi -} - -function cleanup_queue() { - echo "---- Queue Clean up $2 ----" - dma-ctl qdma$1 q stop idx $2 dir bi - dma-ctl qdma$1 q del idx $2 dir bi -} - -vfs=`dma-ctl dev list | grep qdmavf | cut -d' ' -f1`; - -echo "**** AXI-MM Start ****" -for vfsdev in $vfs;do - vf="${vfsdev#*f}" - q_per_vf="$(dma-ctl dev list |grep qdmavf$vf | cut -d ' ' -f 3 | cut -d ',' -f 1 | xargs)" - - for ((i=0; i< $q_per_vf; i++)) do - # Setup for Queues - qid=$i - dev_mm_c2h="/dev/qdmavf$vf-MM-$qid" - dev_mm_h2c="/dev/qdmavf$vf-MM-$qid" - loop=1 - - out_mm="out_mm0_"$qid - # Open the Queue for AXI-MM streaming interface. - queue_start vf$vf $qid mm - - while [ "$loop" -le $iteration ] - do - # Determine if DMA is targeted @ random host address - if [ $f_size -eq 1 ]; then - hst_adr1=0 - else - randomize_tx_params - fi - - # H2C transfer - dma-to-device -d $dev_mm_h2c -f $infile -s $size -o $hst_adr1 - - # C2H transfer - dma-from-device -d $dev_mm_c2h -f $out_mm -s $size -o $hst_adr1 - - # Compare file for correctness - cmp $out_mm $infile -n $size - - if [ $? -eq 1 ]; then - echo "#### Test ERROR. Queue $qid data did not match ####" - exit 1 - else - echo "**** Test pass. Queue $qid" - fi - - wait - - ((loop++)) - done - # Close the Queues - cleanup_queue vf$vf $qid - done -done -echo "**** AXI-MM completed ****" diff --git a/QDMA/linux-kernel/scripts/qdma_run_test_pf.sh b/QDMA/linux-kernel/scripts/qdma_run_test_pf.sh deleted file mode 100755 index f49bead..0000000 --- a/QDMA/linux-kernel/scripts/qdma_run_test_pf.sh +++ /dev/null @@ -1,508 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - - -#!/bin/bash -# -# Simple run script to test QDMA in AXI-MM and AXI-St mode. -# -# AXI-MM Transfer -# First H2C operation is performed for 1KBytes, this will write 1Kbytes of data to BRAM on card side. -# Then C2H operation is performed for 1KBytes. DMA reads data from BRAM and will transfer -# to local file 'out_mm0_0', which will be compared to original file for correctness. -# -# AXI-ST H2C Transfer -# for H2C Streaming transfer data needs to be a per-defined data. 16 bit incremental data. -# Data file is provided with the script. -# H2C operation is performed, Data is read from Host memory and send to Card side. There is a data checker -# on the card side which will check the data for correctness and will log the result in a register. -# Script then read the register to check for results. -# -# -# AXI-ST C2H Transfer -# For C2H operation there is a data generator on the Card side which needs to be setup to generate data. -# Qid, transfer length and number of paket are written before C2H transfer. Then -# C2H transfer is started by writing to register. C2H operation is completed and the data is written to 'out_st0_0" -# file which then is compared to a per-defined data file. The data generator will only generate pre-defined -# data, so data comparison will need to be done with 'datafile_16bit_pattern.bin' file only. -# -# - - -function print_help() { - echo "" - echo "Usage : $0 <bdf> <qid_start> <num_qs> <desc_bypass_en> <pftch_en> <pfetch_bypass_en> <flr_on>" - echo "Ex : $0 06000 0 4 1 1 1 1" - echo "<bdf> : PF Bus device function in bbddf format ex:06000" - echo "" - echo "<qid_start> : qid start" - echo "" - echo "<num_qs> : number of queue from qid_start" - echo " Default - 04 " - echo "" - echo "<desc_byapss_en> : Enable desc bypass" - echo " Default - 0 " - echo "" - echo "<pftch_en> : Enable prefetch" - echo " Default - 0 " - echo "" - echo "<pftch_bypass_en> : Enable prefetch bypass" - echo " Default - 0 " - echo "" - echo "<flr_on> : Apply Function Level Reset" - echo " Default - 0 " - echo "" - echo "" - echo "" - exit 1 -} - -if [ $# -lt 2 ]; then - echo "Invalid arguements." - print_help - exit; -fi; - -pf=$1 -qid_start=$2 -num_qs=4 -desc_byp=0 -pftch=0 -pftch_byp=0 -flr_on=0 - -if [ ! -z $3 ]; then - num_qs=$3 -fi - -if [ ! -z $4 ]; then #if arg4 is there byp enable - desc_byp=$4 -fi - -if [ ! -z $5 ]; then #if arg5 is there pfetch enable - pftch=$5 -fi - -if [ ! -z $6 ]; then #if arg6 is there pfetch byp enable - pftch_byp=$6 -fi -if [ ! -z $6 ]; then #if arg7 is there FLR enable - flr_on=$7 -fi - -echo "$pf $qid_start $num_qs $desc_byp $pftch $pftch_byp" -size=1024 -num_pkt=1 #number of packets not more then 64 -infile='./datafile_16bit_pattern.bin' -declare -a bypass_mode_lst=(NO_BYPASS_MODE DESC_BYPASS_MODE CACHE_BYPASS_MODE SIMPLE_BYPASS_MODE) - - -function get_dev () { - pf_list="$(dma-ctl dev list | grep qdma | grep -v qdmavf)" - echo "$pf_list" - while read -r line; do - IFS=$'\t ,~' read -r -a array <<< "$line" - qdmabdf=${array[0]} - bdf_array+=("${qdmabdf#*a}") - full_bdf_array+=("${array[1]}") - num_queue_per_pf+=("${array[4]}") - qbase_array+=("${array[5]}") - done <<< "$pf_list" - -} - -function set_flr() { - echo "Applying function level reset" - for pf_bdf in ${bdf_array[@]}; do - pci_bus=${pf_bdf:0:2} - pci_device=${pf_bdf:2:2} - pci_func=${pf_bdf:4:1} - echo "echo 1 > /sys/bus/pci/devices/0000\:${pci_bus}\:${pci_device}.${pci_func}/reset" - echo 1 > /sys/bus/pci/devices/0000\:${pci_bus}\:${pci_device}.${pci_func}/reset - done -} - -function set_bypass_mode() { - dev=$1 - mode=$2 - dir=$3 - bypass=$4 - local reg_val=0x00; - - if [ $mode == mm ]; then - case $dir in - h2c) - if [ $bypass == DESC_BYPASS_MODE ]; then - echo "setting DESC_BYPASS_MODE for ${mode}-$dir" - reg_val=0x1; - else - reg_val=0x0; - fi - - ;; - c2h) - if [ $bypass == DESC_BYPASS_MODE ]; then - echo "setting DESC_BYPASS_MODE for ${mode}-$dir" - reg_val=0x2; - else - reg_val=0x0; - fi - - ;; - bi) - if [ $bypass == DESC_BYPASS_MODE ]; then - echo "setting DESC_BYPASS_MODE for ${mode}-$dir" - reg_val=0x3; - else - reg_val=0x0; - fi - ;; - esac - else - case $dir in - h2c) - case $bypass in - CACHE_BYPASS_MODE) - echo "setting CACHE_BYPASS_MODE for ${mode}-$dir" - reg_val=0x1; - ;; - SIMPLE_BYPASS_MODE) - echo "setting SIMPLE_BYPASS_MODE for ${mode}-$dir" - reg_val=0x1; - ;; - *) - echo "setting NO_BYPASS_MODE for ${mode}-$dir" - reg_val=0x00; - ;; - esac - ;; - c2h) - case $bypass in - CACHE_BYPASS_MODE) - echo "setting CACHE_BYPASS_MODE for ${mode}-$dir" - reg_val=0x2; - ;; - SIMPLE_BYPASS_MODE) - echo "setting SIMPLE_BYPASS_MODE for ${mode}-$dir" - reg_val=0x4; - ;; - *) - echo "setting NO_BYPASS_MODE for ${mode}-$dir" - reg_val=0x00; - ;; - esac - ;; - bi) - case $bypass in - CACHE_BYPASS_MODE) - echo "setting CACHE_BYPASS_MODE for ${mode}-$dir" - reg_val=0x3; - ;; - SIMPLE_BYPASS_MODE) - echo "setting SIMPLE_BYPASS_MODE for ${mode}-$dir" - reg_val=0x5; - ;; - *) - echo "setting NO_BYPASS_MODE for ${mode}-$dir" - reg_val=0x00; - ;; - esac - ;; - esac - fi - dma-ctl qdma$dev reg write bar 2 0x90 $reg_val -} - -function get_bypass_mode() { - byp_mode=0 - if [ $1 == mm ]; then - if [ $desc_byp -eq 1 ]; then - byp_mode=1 - fi - else - if [ $desc_byp -eq 1 ] && [ $pftch_byp -eq 0 ]; then - byp_mode=2 - elif [ $desc_byp -eq 1 ] && [ $pftch_byp -eq 1 ]; then - byp_mode=3 - fi - fi - echo $byp_mode -} - -function queue_start() { - echo "setting up qdma$1-$3-$2" - dma-ctl qdma$1 q add idx $2 mode $3 dir $4 >> ./run_pf.log 2>&1 - if [ $? -ne 0 ]; then - echo "q add failed for qdma$1-$3-$2" - return - fi - bypass_mode=$(get_bypass_mode $3 $4) - set_bypass_mode $1 $3 $4 ${bypass_mode_lst[${bypass_mode}]} - if [ $3 == mm -o $4 == h2c ]; then - if [ $desc_byp -eq 1 ]; then - dma-ctl qdma$1 q start idx $2 dir $4 desc_bypass_en >> ./run_pf.log 2>&1 - else - dma-ctl qdma$1 q start idx $2 dir $4 >> ./run_pf.log 2>&1 - fi - else - if [ $desc_byp -eq 1 ] && [ $pftch -eq 0 ]; then - if [ $pftch_byp -eq 0 ]; then - dma-ctl qdma$1 q start idx $2 dir $4 desc_bypass_en >> ./run_pf.log 2>&1 - else - dma-ctl qdma$1 q start idx $2 dir $4 desc_bypass_en pfetch_bypass_en >> ./run_pf.log 2>&1 - fi - elif [ $desc_byp -eq 1 ] && [ $pftch -eq 1 ]; then - if [ $pftch_byp -eq 0 ]; then - dma-ctl qdma$1 q start idx $2 dir $4 desc_bypass_en pfetch_en >> ./run_pf.log 2>&1 - else - dma-ctl qdma$1 q start idx $2 dir $4 desc_bypass_en pfetch_en pfetch_bypass_en >> ./run_pf.log 2>&1 - fi - elif [ $desc_byp -eq 0 ] && [ $pftch -eq 1 ] ; then # - if [ $pftch_byp -eq 0 ]; then - dma-ctl qdma$1 q start idx $2 dir $4 pfetch_en >> ./run_pf.log 2>&1 - else - echo "Invalid case of bypass mode" >> ./run_pf.log 2>&1 - dma-ctl qdma$1 q del idx $2 dir bi >> ./run_pf.log 2>&1 - return 1 - fi - else - if [ $pftch_byp -eq 0 ]; then - dma-ctl qdma$1 q start idx $2 dir $4>> ./run_pf.log 2>&1 - else - echo "Invalid case of bypass mode" >> ./run_pf.log 2>&1 - dma-ctl qdma$1 q del idx $2 dir bi >> ./run_pf.log 2>&1 - return 1 - fi - fi - fi - if [ $? -ne 0 ]; then - echo "q start failed for qdma$1-$3-$2-$4" - dma-ctl qdma$1 q del idx $2 dir bi >> ./run_pf.log 2>&1 - return $? - fi - - - return 0 -} - -function cleanup_queue() { - echo "cleaning up qdma$1-$3-$2" - dma-ctl qdma$1 q stop idx $2 dir $4 >> ./run_pf.log 2>&1 - dma-ctl qdma$1 q del idx $2 dir $4 >> ./run_pf.log 2>&1 - -} - - -# Find AXI Master Lite bar -function get_user_bar () { - local pf_bdf=$1 - tmp=`dma-ctl qdma$pf_bdf reg read bar 0 0x10C | grep "0x10c" | cut -d '=' -f2 | cut -d 'x' -f2 | cut -d '.' -f1` - bar_ext=$(printf '%x\n' "$(( 0x$tmp & 0x00000f ))") - - if [ $bar_ext -eq 2 ]; then - usr_bar=1 - elif [ $bar_ext -eq 4 ];then - usr_bar=2 - fi -} - - -function run_mm_h2c_c2h () { - for pf_bdf in ${bdf_array[@]}; do - echo "***********************************************" 2>&1 | tee -a ./run_pf.log - echo "AXI-MM for Func $pf_bdf Start" 2>&1 | tee -a ./run_pf.log - get_user_bar $pf_bdf - for ((i=$qid_start; i < (($qid_start + $num_qs)); i++)); do - # Setup for Queues - qid=$i - dev_mm_c2h="/dev/qdma$pf_bdf-MM-$qid" - dev_mm_h2c="/dev/qdma$pf_bdf-MM-$qid" - - out_mm="/tmp/out_mm"$pf_bdf"_"$qid - # Open the Queue for AXI-MM streaming interface. - queue_start $pf_bdf $qid mm bi - if [ $? -ne 0 ]; then - echo "q setup for qdma$pf_bdf-MM-$qid failed" - continue - fi - echo "setup for qdma$pf_bdf-MM-$qid done" - # H2C transfer - dma-to-device -d $dev_mm_h2c -f $infile -s $size >> ./run_pf.log 2>&1 - - # C2H transfer - dma-from-device -d $dev_mm_c2h -f $out_mm -s $size >> ./run_pf.log 2>&1 - - # Compare file for correctness - cmp $out_mm $infile -n $size - if [ $? -eq 1 ]; then - echo "#### Test ERROR. Queue $qid data did not match ####" - dma-ctl qdma$pf_bdf q dump idx $qid >> ./run_pf.log 2>&1 - dma-ctl qdma$pf_bdf reg dump >> ./run_pf.log 2>&1 - else - echo "**** Test pass. Queue $qid" - fi - # Close the Queues - cleanup_queue $pf_bdf $qid st bi - echo "-----------------------------------------------" - done - echo "AXI-MM for Func $pf_bdf End" 2>&1 | tee -a ./run_pf.log - echo "***********************************************" 2>&1 | tee -a ./run_pf.log - done -} - - - -function run_st_h2c () { - - # AXI-ST H2C transfer - for pf_bdf in "${bdf_array[@]}"; do - echo "***********************************************" 2>&1 | tee -a ./run_pf.log - echo "AXI-ST H2C for Func $pf_bdf Start" 2>&1 | tee -a ./run_pf.log - get_user_bar $pf_bdf - for ((i=$qid_start; i < (($qid_start + $num_qs)); i++)); do - # Setup for Queues - qid=$i - queue_start $pf_bdf $qid st h2c # open the Queue for AXI-ST streaming interface. - - dev_st_h2c="/dev/qdma$pf_bdf-ST-$qid" - - # Clear H2C match from previous runs. this register is in card side. - # MAtch clear register is on offset 0x0C - dma-ctl qdma$pf_bdf reg write bar $usr_bar 0x0C 0x1 >> ./run_pf.log 2>&1 # clear h2c Match register. - - # do H2C Transfer - dma-to-device -d $dev_st_h2c -f $infile -s $size >> ./run_pf.log 2>&1 - - if [ $? -ne 0 ]; then - echo "#### ERROR Test failed. Transfer failed ####" - cleanup_queue $pf_bdf $qid st h2c - continue - fi - # check for H2C data match. MAtch register is in offset 0x10. - pass=`dma-ctl qdma$pf_bdf reg read bar $usr_bar 0x10 | grep "0x10" | cut -d '=' -f2 | cut -d 'x' -f2 | cut -d '.' -f1` - # convert hex to bin - code=`echo $pass | tr 'a-z' 'A-Z'` - val=`echo "obase=2; ibase=16; $code" | bc` - check=1 - if [ $(($val & $check)) -eq 1 ];then - echo "*** Test passed for Queue $qid" - else - echo "#### ERROR Test failed. pattern did not match ####" - dma-ctl qdma$pf_bdf q dump idx $qid >> ./run_pf.log 2>&1 - dma-ctl qdma$pf_bdf reg dump >> ./run_pf.log 2>&1 - fi - cleanup_queue $pf_bdf $qid st h2c - echo "-----------------------------------------------" - done - echo "AXI-ST H2C for Func $pf_bdf End" 2>&1 | tee -a ./run_pf.log - echo "***********************************************" 2>&1 | tee -a ./run_pf.log - done - -} - -function run_st_c2h () { - local pf=0 - - for pf_bdf in "${bdf_array[@]}"; do - - echo "***********************************************" 2>&1 | tee -a ./run_pf.log - echo "AXI-ST C2H for Func $pf_bdf Start" 2>&1 | tee -a ./run_pf.log - - get_user_bar $pf_bdf - - for ((i=$qid_start; i < (($qid_start + $num_qs)); i++)); do - # Setup for Queues - qid=$i - out_st="/tmp/out_st"$pf_bdf"_"$qid - - # Each PF is assigned with 32 Queues. PF0 has queue 0 to 31, PF1 has 32 to 63 - # Write QID in offset 0x00 - hw_qid=$(($qid + ${qbase_array[$pf]} )) - dma-ctl qdma$pf_bdf reg write bar $usr_bar 0x0 $hw_qid >> ./run_pf.log 2>&1 - - # open the Queue for AXI-ST streaming interface. - queue_start $pf_bdf $qid st c2h - - dev_st_c2h="/dev/qdma$pf_bdf-ST-$qid" - let "tsize= $size*$num_pkt" # if more packets are requested. - - # Write transfer size to offset 0x04 - dma-ctl qdma$pf_bdf reg write bar $usr_bar 0x4 $size >> ./run_pf.log 2>&1 - - # Write number of packets to offset 0x20 - dma-ctl qdma$pf_bdf reg write bar $usr_bar 0x20 $num_pkt >> ./run_pf.log 2>&1 - - # Write to offset 0x80 bit [1] to trigger C2H data generator. - dma-ctl qdma$pf_bdf reg write bar $usr_bar 0x08 2 >> ./run_pf.log 2>&1 - - # do C2H transfer - dma-from-device -d $dev_st_c2h -f $out_st -s $tsize >> ./run_pf.log 2>&1 - if [ $? -ne 0 ]; then - echo "#### ERROR Test failed. Transfer failed ####" - cleanup_queue $pf_bdf $qid st c2h - continue - fi - - cmp $out_st $infile -n $tsize - if [ $? -ne 0 ]; then - echo "#### Test ERROR. Queue $2 data did not match ####" - dma-ctl qdma$pf_bdf q dump idx $qid dir c2h >> ./run_pf.log 2>&1 - dma-ctl qdma$pf_bdf reg dump >> ./run_pf.log 2>&1 - else - echo "**** Test pass. Queue $qid" - fi - # Close the Queues - dma-ctl qdma$pf_bdf reg write bar $usr_bar 0x08 0x22 >> ./run_pf.log 2>&1 - var=`dma-ctl qdma$pf_bdf reg read bar $usr_bar 0x18 | sed 's/.*= //' | sed 's/.*x//' | cut -d. -f1` - j=0 - while [ "$j" -lt "2" ] - do - j=$[$j+1] - if [ $var -eq "1" ] - then - break - else - sleep 1 - fi - done - cleanup_queue $pf_bdf $qid st c2h - echo "-----------------------------------------------" - done - pf=$((pf+1)); - echo "AXI-ST C2H for Func $pf_bdf End" 2>&1 | tee -a ./run_pf.log - echo "***********************************************" 2>&1 | tee -a ./run_pf.log - done -} - - -echo "###############################################################" > "run_pf.log" -echo "QDMA Test on All PFs Starts" >> "run_pf.log" -echo "###############################################################" >> "run_pf.log" - -get_dev -if [ $flr_on -ne 0 ]; then - set_flr -fi -run_mm_h2c_c2h -run_st_h2c -run_st_c2h - -exit 0 - - diff --git a/QDMA/linux-kernel/scripts/qdma_run_test_st_vf.sh b/QDMA/linux-kernel/scripts/qdma_run_test_st_vf.sh deleted file mode 100755 index 754a408..0000000 --- a/QDMA/linux-kernel/scripts/qdma_run_test_st_vf.sh +++ /dev/null @@ -1,229 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - - -#!/bin/bash -# Simple run script to test QDMA in VF AXI-ST mode. -# -# VF AXI-ST Transfer -# - H2C operation is performed to send data to BRAM on the FPGA. -# - C2H operation is performed to reads data from BRAM. -# - C2H data is stored in a local file 'out_st_$qid', which will be compared to original file for correctness. - - -################################################ -# User Configurable Parameters -################################################ - -iteration=$1 # [Optional] iterations of C2H tests -size=$2 # [Optional] Size per payload packet -num_pkt=$3 # [Optional] number of payload packet - -################################################ -# Hard Coded Parameters -################################################ -usr_bar=2 # For VF, DMA BAR is bar 0. AXI Master Lite(User BAR) is bar 2. -vf=00080 -size_max=4096 -host_adr_high=0 -infile='./datafile_16bit_pattern.bin' -logfile="loopback$1_$2.log" - -################################################ -# Input check -################################################ -if [ -z $iteration ]; then - iteration=1 -fi - -if [ ! -z $size ]; then - f_size=1 -else - f_size=0 -fi - -if [ -z $num_pkt ]; then - num_pkt=1 -fi - -################################################# -# Helper Functions -################################################ -function randomize_tx_params() { - #random host address - if [ $host_adr_high -ne 0 ]; then - hst_adr1=$RANDOM - hst_adr1=$((hst_adr1 % host_adr_high)) - else - hst_adr1=0 - fi - - # byte size - size=$RANDOM - if [ $size -eq 0 ]; then - size=$(($RANDOM % 64 + 1)) ## for random number between 1 and 64 - else - size=$((size % $size_max)) - fi - - # Correct if size is odd - even=$((size%2)) - if [ $even -eq 1 ];then - size=$((size+1)) - fi -} - -function queue_start() { - echo "---- Queue Start $2 ----" - dma-ctl qdma$1 q add idx $2 dir h2c mode $3 - dma-ctl qdma$1 q start idx $2 dir h2c - dma-ctl qdma$1 q add idx $2 dir c2h mode $3 - dma-ctl qdma$1 q start idx $2 dir c2h -} - -function cleanup_queue() { - echo "---- Queue Clean up $2 ----" - dma-ctl qdma$1 q stop idx $2 dir h2c - dma-ctl qdma$1 q del idx $2 dir h2c - dma-ctl qdma$1 q stop idx $2 dir c2h - dma-ctl qdma$1 q del idx $2 dir c2h -} - -# Get a list of available devices -vfs="$(dma-ctl dev list | grep qdmavf | cut -d ' ' -f1)" -echo "############################# AXI-ST Start #################################" - -for vfsdev in $vfs; do - - vf="${vfsdev#*f}" - q_per_vf="$(dma-ctl dev list |grep qdmavf$vf | cut -d ' ' -f 3 | cut -d ',' -f 1 | xargs)" - hw_qbase="$(dma-ctl dev list |grep qdmavf$vf|cut -d',' -f 2 | cut -d '~' -f 1|xargs)" - - for ((i=0; i<$q_per_vf; i++)) do - - # Setup for Queues - qid=$i - hw_qid=$((qid+hw_qbase)) - dev_st_c2h="/dev/qdmavf$vf-ST-$qid" - dev_st_h2c="/dev/qdmavf$vf-ST-$qid" - out="out_st_$qid" - loop=1 - - # Open the Queue for AXI-ST streaming interface. - queue_start vf$vf $qid st > /dev/null - - while [ "$loop" -le $iteration ] - do - # Determine if DMA is targeted @ random host address - if [ $f_size -eq 1 ]; then - hst_adr1=0 - else - randomize_tx_params - fi - - # if more packets are requested. - let "tsize= $size*$num_pkt" - - echo "" - echo "########################################################################################" - echo "############# H2C ST LOOP $loop : dev=$dev_st_h2c qid=$qid hw_qid=$hw_qid" - echo "############# transfer_size=$tsize pkt_size=$size pkt_count=$num_pkt hst_adr=$hst_adr1" - echo "########################################################################################" - - #clear match bit before each H2C ST transfer - dma-ctl qdmavf$vf reg write bar $usr_bar 0x0c 0x01 - - # H2C transfer - dma-to-device -d $dev_st_h2c -f $infile -s $tsize -o $hst_adr1 & - re=$? - - wait - - # Check match bit and QID - hwqid_match=$(dma-ctl qdmavf$vf reg read bar $usr_bar 0x10 | grep "0x10" | cut -d '=' -f2 | cut -d 'x' -f2 | cut -d '.' -f1) - code=`echo $hwqid_match | tr 'a-z' 'A-Z'` - val=`echo "obase=2; ibase=16; $code" | bc` - if [ $(($val & 0x1)) -ne 1 ];then - echo "### ERROR: QID MATCH is $hwqid_match "$hw_qid_hex"1" - re=-1 - fi - - if [ $re == 0 ]; then - echo "######################################################" - echo "############## VF H2C ST PASS QID $qid ################" - echo "######################################################" - else - echo "#### ERROR: VF H2C ST FAIL" - fi - - echo "" - echo "########################################################################################" - echo "############# C2H ST LOOP $loop : dev=$dev_st_c2h qid=$qid hw_qid=$hw_qid" - echo "############# transfer_size=$tsize pkt_size=$size pkt_count=$num_pkt hst_adr=$hst_adr1" - echo "########################################################################################" - - dma-ctl qdmavf$vf reg write bar $usr_bar 0x0 $hw_qid # for Queue 0 - dma-ctl qdmavf$vf reg write bar $usr_bar 0x4 $size - dma-ctl qdmavf$vf reg write bar $usr_bar 0x20 $num_pkt #number of packets - dma-ctl qdmavf$vf reg write bar $usr_bar 0x08 2 # Must set C2H start before starting transfer - - dma-from-device -d $dev_st_c2h -f $out -o $hst_adr1 -s $tsize & - - wait - - #Check if files is there. - if [ ! -f $out ]; then - echo " #### ERROR: Queue $qid output file does not exists ####" - echo " #### ERROR: Queue $qid output file does not exists ####" >> $logfile - cleanup_queue vf$vf $qid st - exit -1 - fi - - # check files size - filesize=$(stat -c%s "$out") - if [ $filesize -gt $tsize ]; then - echo "#### ERROR: Queue $qid output file size does not match, filesize= $filesize ####" - echo "#### ERROR: Queue $qid output file size does not match, filesize= $filesize ####" >> $logfile - cleanup_queue vf$vf $qid st - exit -1 - fi - - #compare file - cmp $out $infile -n $tsize - if [ $? -eq 1 ]; then - echo "#### Test ERROR. Queue $qid data did not match ####" - echo "#### Test ERROR. Queue $qid data did not match ####" >> $logfile - dma-ctl qdmavf$vf q dump idx $qid mode st dir c2h - dma-ctl qdmavf$vf reg dump - cleanup_queue vf$vf $qid st - exit -1 - else - echo "######################################################" - echo "############## VF C2H ST PASS QID $qid ################" - echo "######################################################" - fi - wait - ((loop++)) - done - cleanup_queue vf$vf $qid st > /dev/null - done -done -echo "########################## AXI-ST completed ###################################" -exit 0 - diff --git a/QDMA/linux-kernel/scripts/qdma_vf_auto_tst.sh b/QDMA/linux-kernel/scripts/qdma_vf_auto_tst.sh deleted file mode 100755 index 4d7fed1..0000000 --- a/QDMA/linux-kernel/scripts/qdma_vf_auto_tst.sh +++ /dev/null @@ -1,102 +0,0 @@ -#/* -# * This file is part of the Xilinx DMA IP Core driver for Linux -# * -# * Copyright (c) 2017-2022, Xilinx, Inc. All rights reserved. -# * Copyright (c) 2022-2023, Advanced Micro Devices, Inc. All rights reserved. -# * -# * This source code is free software; you can redistribute it and/or modify it -# * under the terms and conditions of the GNU General Public License, -# * version 2, as published by the Free Software Foundation. -# * -# * This program is distributed in the hope that it will be useful, but WITHOUT -# * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -# * more details. -# * -# * The full GNU General Public License is included in this distribution in -# * the file called "COPYING". -# */ - - -#!/bin/bash -# -# Simple script to automate the VF regression testing using gtest framework -# -# This script will insert the module, configure the qmax_vfs, and instantiate -# vfs on each PF one at a time. After instantiating the VFs, it will trigger -# qdma_test regression test suite for VF only. -# -# Inputs: -# MODULE_TOP_DIR= Top directory for qdma linux module -# GTEST_TOP_DIR= Top directory for gtest regression test suite -# MASTER_PF_PCI_BDF= BDF For master PF. - -MODULE_DIR=$1 -GTEST_DIR=$2 -qdma_mod=$MODULE_DIR/build/qdma.ko -qdma_mod_vf=$MODULE_DIR/build/qdma_vf.ko -gtest_bin=$GTEST_DIR/build/src/qdma_test -#busdev="0000:05:00" -master_pf=0000:$3 -busdev=${master_pf%.*} -mod_param_arr=("mode=1" "mode=2" "mode=3") -vfs_cnt=(64 60 60 68) -qmax_vfs=1024 - -RED='\033[0;31m' -NC='\033[0m' - -prep_test_env () { - rmmod qdma - rmmod qdma_vf - sleep 2 - insmod $qdma_mod $1 - insmod $qdma_mod_vf - sleep 2 - if [ ! -f /sys/bus/pci/devices/$master_pf/qdma/qmax_vfs ];then - echo -e "${RED} Aborting, no /sys/bus/pci/devices/$master_pf/qdma/qmax_vfs found.${NC}" - exit -4 - fi - echo $qmax_vfs > /sys/bus/pci/devices/$master_pf/qdma/qmax_vfs - echo $3 > /sys/bus/pci/devices/$busdev.$2/sriov_numvfs - ret=$? - echo - echo "**********************************" - echo "******Doing QDMA VF Tests *******" - echo "**********************************" - echo - echo PF=$2, VF=$3, qmax_vfs=$qmax_vfs - echo module_param=$1 - echo - dma-ctl dev list - - return $ret -} - -if [ $# -lt 3 ];then - echo -e "${RED}Aborting. Invalid usgae. Try $0 <MODULE_TOP_DIR> <GTEST_TOP_DIR> <MASTER_PF_PCI_BDF>. ${NC}" - exit -1 -fi - -if [ ! -f $qdma_mod ] || [ ! -f $qdma_mod_vf ];then - echo -e "${RED}Aborting. Missing qdma drivers at $MODULE_DIR${NC}" - exit -2 -fi - -if [ ! -f $gtest_bin ];then - echo -e "${RED}Aborting. Missing qdma_test at $GTEST_DIR${NC}" - exit -3 -fi - -for fn in `seq 0 3`;do - for params in "${mod_param_arr[@]}";do - prep_test_env "$params" $fn ${vfs_cnt[$fn]} - ret=$? - if [ $ret -ne 0 ];then - echo -e "${RED}FAILED VF tests, Aborting${NC}" - exit -1 - fi - sleep 3 - $gtest_bin --gtest_filter="*VF*" - done -done diff --git a/QDMA/windows/QDMA.sln b/QDMA/windows/QDMA.sln deleted file mode 100644 index 0ad42df..0000000 --- a/QDMA/windows/QDMA.sln +++ /dev/null @@ -1,69 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "utilities", "utilities", "{94F05E27-A247-49D0-87D9-9EA67085F512}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "drivers", "drivers", "{AE056764-B26E-440F-A803-22D4287DC633}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{63917B3A-5853-4882-BB78-1A4367A87B62}" - ProjectSection(SolutionItems) = preProject - README.md = README.md - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QDMA Reference Driver", "sys\drv\qdma_generic.vcxproj", "{B446331B-DD9E-40DD-958A-8D7A1AACA454}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dma-arw", "apps\dma-arw\dma_arw.vcxproj", "{4898E717-0B00-487F-9F88-C95D61116871}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dma-rw", "apps\dma-rw\dma_rw.vcxproj", "{F7C376CA-92F6-4484-B737-8670222CE79F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dma-ctl", "apps\dma-ctl\dmactl.vcxproj", "{620A4D4D-5D14-41BA-909B-011FF03A25FD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libqdma", "sys\libqdma\libqdma.vcxproj", "{359143E6-933A-49CC-806C-C5376E1809A4}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B446331B-DD9E-40DD-958A-8D7A1AACA454}.Debug|x64.ActiveCfg = Debug|x64 - {B446331B-DD9E-40DD-958A-8D7A1AACA454}.Debug|x64.Build.0 = Debug|x64 - {B446331B-DD9E-40DD-958A-8D7A1AACA454}.Debug|x64.Deploy.0 = Debug|x64 - {B446331B-DD9E-40DD-958A-8D7A1AACA454}.Release|x64.ActiveCfg = Release|x64 - {B446331B-DD9E-40DD-958A-8D7A1AACA454}.Release|x64.Build.0 = Release|x64 - {B446331B-DD9E-40DD-958A-8D7A1AACA454}.Release|x64.Deploy.0 = Release|x64 - {4898E717-0B00-487F-9F88-C95D61116871}.Debug|x64.ActiveCfg = Debug|x64 - {4898E717-0B00-487F-9F88-C95D61116871}.Debug|x64.Build.0 = Debug|x64 - {4898E717-0B00-487F-9F88-C95D61116871}.Release|x64.ActiveCfg = Release|x64 - {4898E717-0B00-487F-9F88-C95D61116871}.Release|x64.Build.0 = Release|x64 - {F7C376CA-92F6-4484-B737-8670222CE79F}.Debug|x64.ActiveCfg = Debug|x64 - {F7C376CA-92F6-4484-B737-8670222CE79F}.Debug|x64.Build.0 = Debug|x64 - {F7C376CA-92F6-4484-B737-8670222CE79F}.Release|x64.ActiveCfg = Release|x64 - {F7C376CA-92F6-4484-B737-8670222CE79F}.Release|x64.Build.0 = Release|x64 - {620A4D4D-5D14-41BA-909B-011FF03A25FD}.Debug|x64.ActiveCfg = Debug|x64 - {620A4D4D-5D14-41BA-909B-011FF03A25FD}.Debug|x64.Build.0 = Debug|x64 - {620A4D4D-5D14-41BA-909B-011FF03A25FD}.Release|x64.ActiveCfg = Release|x64 - {620A4D4D-5D14-41BA-909B-011FF03A25FD}.Release|x64.Build.0 = Release|x64 - {359143E6-933A-49CC-806C-C5376E1809A4}.Debug|x64.ActiveCfg = Debug|x64 - {359143E6-933A-49CC-806C-C5376E1809A4}.Debug|x64.Build.0 = Debug|x64 - {359143E6-933A-49CC-806C-C5376E1809A4}.Debug|x64.Deploy.0 = Debug|x64 - {359143E6-933A-49CC-806C-C5376E1809A4}.Release|x64.ActiveCfg = Release|x64 - {359143E6-933A-49CC-806C-C5376E1809A4}.Release|x64.Build.0 = Release|x64 - {359143E6-933A-49CC-806C-C5376E1809A4}.Release|x64.Deploy.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {B446331B-DD9E-40DD-958A-8D7A1AACA454} = {AE056764-B26E-440F-A803-22D4287DC633} - {4898E717-0B00-487F-9F88-C95D61116871} = {94F05E27-A247-49D0-87D9-9EA67085F512} - {F7C376CA-92F6-4484-B737-8670222CE79F} = {94F05E27-A247-49D0-87D9-9EA67085F512} - {620A4D4D-5D14-41BA-909B-011FF03A25FD} = {94F05E27-A247-49D0-87D9-9EA67085F512} - {359143E6-933A-49CC-806C-C5376E1809A4} = {AE056764-B26E-440F-A803-22D4287DC633} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {C455ECA0-8379-4737-AE1C-A9D89747A2E2} - EndGlobalSection -EndGlobal diff --git a/QDMA/windows/README.md b/QDMA/windows/README.md deleted file mode 100644 index 414fde4..0000000 --- a/QDMA/windows/README.md +++ /dev/null @@ -1,266 +0,0 @@ -# Xilinx QDMA Driver (Windows) - -This project contains the driver and user-space software for the Xilinx PCIe Multi-Queue DMA Subsystem IP. - -_____________________________________________________________________________ -Contents - -1. Directory Structure -2. Dependencies -3. Building from Source - 3.1 From Visual Studio - 3.2 From Command Line -4. Driver Installation -5. Test Utilities - 5.1 dma-arw - 5.2 dma-rw - 5.3 dma-ctl -6. Known Issues -7. References -_____________________________________________________________________________ - - -1. Directory Structure: - - <project_root>/ - |__ build/ - Generated directory containing build output binaries. - |__ apps/ - Contains application source code which demonstrates the usage of QDMA driver. - | |__ dma-arw/ - Asynchrnous Read/Write PCIe BARs of QDMA IP or perform tx/rx DMA transfers. - | |__ dma-rw/ - Synchronous Read/Write PCIe BARs of QDMA IP or perform tx/rx DMA transfers. - | |__ dma-ctl/ - DMA queues control and configuration for DMA transfers. - |__ docs/ - QDMA documentation - |__ sys/ - Contains the QDMA driver source code. - |__ README.md - This file. - |__ QDMA.sln - Visual Studio Solution. - -2. Dependencies - - * Windows 10 target machine - * Windows 10 development machine - * Windows Driver Development Kit 10.0.17134.0 (or later) - * Visual Studio 2017 - -3. Building from Source - - 3.1 From Visual Studio - ---------------------- - - The Windows driver and sample applications can be built using Visual Studio. - 1. Open the *QDMA.sln* solution. - 2. Select the appropriate *Build Configuration* (Debug/Release) from the menu bar. - 2. Click *Build* from the menu bar. - 3. Click *Build Solution*. - - This driver project settings currently support 64bit Windows 10 OS. - In order to target a different Windows OS, go to the driver project *Properties->Driver Settings->General* and change *Target OS Version* to the desired OS. - - Also *Release* and *Debug* build configurations exist and are configurable via the *Configuration Manager*. - - The compiled build products can then be found in the *build/x64/`CONFIG`/* folder. This folder contains three folders: - - *bin/* contains sample and test applications - - *libqdma/* contains libqdma static library - - *sys/* contains the driver - - 3.2 From Command Line - --------------------- - - 1. Open *Developer Command Prompt for VS2017* - 2. Change directory to the project root directory - 3. Run the following command: - - msbuild /t:clean /t:build QDMA.sln - - 4. The build should run and display the following - - Build succeeded. - 0 Warning(s) - 0 Error(s) - - Time Elapsed 00:01:05.55 - - For more information on building Windows drivers visit the [MSDN website][ref4]. - -4. Driver Installation - - The easiest way to install the driver is via Windows' *Device Manager* - (_Control Panel->System->Device Manager_). - - _**Note**: The driver does not provide a certified signature and uses a test signature instead. - Please be aware that, depending on your target operating system, you may need to enable test-signed drivers in your windows boot configuration - in order to enable installation of this driver. See [MSDN website][ref5] for further information._ - - 1. Open the *Device Manager* - 2. Initially the device will be displayed as a *PCI Serial Port* or *PCI Memory Controller*. - 3. Right-Click on the device and select *Update Driver Software* and - select the folder of the built QDMA driver (typically *build/x64/`CONFIG`/sys/QDMA/* (where `CONFIG` is *Debug* or *Release*). - 4. If prompted about unverified driver publisher, select *Install this driver software anyway*. - 5. *Xilinx Drivers -> Xilinx PCIe Multi-Queue DMA* should now be visible in the *Device Manager* - -5. Test Utilities - - The Xilinx dma-arw and dma-rw are test utilities can perform the following functions - - AXI-MM - - H2C/C2H AXI-MM transfer. - - AXI-ST-H2C - - Enables the user to perform AXI-ST H2C transfers and checks data for correctness. - - AXI-ST-C2H - - Enables the user to perform AXI-ST C2H transfers and checks data for correctness. - - register access - - read a register space - - write to a register space - 5.1 dma-arw - ----------- - e.g. - 1. Get the dma-arw help - > dma-arw -h - dma-arw usage: - dma-arw -v : prints the version information - - dma-arw qdma<N> mode <0 | 1> <DEVNODE> <read|write> <ADDR> [OPTIONS] [DATA] - - - qdma<N> : unique qdma device name (<N> is BBDDF where BB -> PCI Bus No, DD -> PCI Dev No, F -> PCI Fun No) - - mode : 0 : this mode uses ReadFile and WriteFile async implementation - : 1 : this mode uses ReadFileEx and WriteFileEx async implementation - - DEVNODE : One of: queue_mm_ | queue_st_* - where the * is a numeric wildcard (0 - 511for queue). - - ADDR : The target offset address of the read/write operation. - Applicable only for control, user, queue_mm device nodes. - Can be in hex or decimal. - - OPTIONS : - -a set alignment requirement for host-side buffer (default: PAGE_SIZE) - -b open file as binary - -f use contents of file as input or write output into file. - -l length of data to read/write (default: 4 bytes or whole file if '-f' flag is used) - - DATA : Space separated bytes (big endian) in decimal or hex, - e.g.: 17 34 51 68 - or: 0x11 0x22 0x33 0x44 - 2. Read/Write four bytes from AXI-MM at zeroth offset on queue zero of PF 0 - > dma-arw qdma17000 mode 0 queue_mm_0 read 0 -l 4 - > dma-arw qdma17000 mode 0 queue_mm_0 write 0 0xA 0xB 0XC 0xD - > dma-arw qdma17000 mode 1 queue_mm_0 read 0 -l 4 - > dma-arw qdma17000 mode 1 queue_mm_0 write 0 0xA 0xB 0XC 0xD - - 3. Read four bytes from AXI-ST-H2C on queue zero - > dma-arw qdma17000 mode 0 queue_st_0 read -l 4 - > dma-arw qdma17000 mode 1 queue_st_0 read -l 4 - - 4. Write four bytes to AXI-ST-C2H on queue zero - > dma-arw qdma17000 mode 0 queue_st_0 write -l 4 - > dma-arw qdma17000 mode 1 queue_st_0 write -l 4 - - 5. Read/Write four bytes from control register space at zeroth offset - > dma-arw qdma17000 mode 0 control read 0 -l 4 - > dma-arw qdma17000 mode 0 control write 0 0xA 0xB 0XC 0xD - > dma-arw qdma17000 mode 1 control read 0 -l 4 - > dma-arw qdma17000 mode 1 control write 0 0xA 0xB 0XC 0xD - - 5.2 dma-rw - ----------- - e.g. - 1. Get the dma-rw help - > dma-rw -h - dma-rw usage: - dma-rw -v : prints the version information - - dma-rw qdma<N> <DEVNODE> <read|write> <ADDR> [OPTIONS] [DATA] - - - qdma<N> : unique qdma device name (<N> is BBDDF where BB -> PCI Bus No, DD -> PCI Dev No, F -> PCI Fun No) - - DEVNODE : One of: control | user | queue_mm_ | queue_st_* - where the * is a numeric wildcard (0 - 511for queue). - - ADDR : The target offset address of the read/write operation. - Applicable only for control, user, queue_mm device nodes. - Can be in hex or decimal. - - OPTIONS : - -a set alignment requirement for host-side buffer (default: PAGE_SIZE) - -b open file as binary - -f use contents of file as input or write output into file. - -l length of data to read/write (default: 4 bytes or whole file if '-f' flag is used) - - DATA : Space separated bytes (big endian) in decimal or hex, - e.g.: 17 34 51 68 - or: 0x11 0x22 0x33 0x44 - 2. Read/Write four bytes from AXI-MM at zeroth offset on queue zero of PF 0 - > dma-rw qdma17000 queue_mm_0 read 0 -l 4 - > dma-rw qdma17000 queue_mm_0 write 0 0xA 0xB 0XC 0xD - - 3. Read four bytes from AXI-ST-H2C on queue zero - > dma-rw qdma17000 queue_st_0 read -l 4 - - 4. Write four bytes to AXI-ST-C2H on queue zero - > dma-rw qdma17000 queue_st_0 write -l 4 - - 5. Read/Write four bytes from control register space at zeroth offset - > dma-rw qdma17000 control read 0 -l 4 - > dma-rw qdma17000 control write 0 0xA 0xB 0XC 0xD - - 5.3 dma-ctl - ------------ - The Xilinx dma-ctl is a helper utility can perform the following functions for a given PF - - Add/Start/Stop/Delete/State queues - - can add and start a queue - - can stop and delete a queue - - can retrieve and show the state of a queue - - Dump the CSR registers Information - - List all the CSR registers and its values - - Provide the HW and SW capabilities Information - - e.g.: - 1. Get the dma-ctl help - > dma-ctl -h - usage: dma-ctl [dev | qdma<N>] [operation] - dma-ctl -h - Prints this help - dma-ctl -v - Prints the version information - - dev [operation] : system wide FPGA operations - list : list all qdma functions - - qdma<N> [operation] : per QDMA FPGA operations - <N> : N is BBDDF where BB -> PCI Bus No, DD -> PCI Dev No, F -> PCI Fun No - csr <dump> - dump : Dump QDMA CSR Information - - devinfo : lists the Hardware and Software version and capabilities - - queue <add|start|stop|delete|listall> - add mode <mm|st> qid <N> [en_mm_cmpl] idx_h2c_ringsz <0:15> idx_c2h_ringsz <0:15> - [idx_c2h_timer <0:15>] [idx_c2h_th <0:15>] [idx_c2h_bufsz <0:15>] [cmptsz <0|1|2|3>] - add a queue - [trigmode <every|usr_cnt|usr|usr_tmr|usr_tmr_cnt>] [sw_desc_sz <3>] [desc_bypass_en] [pfch_en] [pfch_bypass_en] - [cmpl_ovf_dis] - start qid <N> - start a single queue - stop qid <N> - stop a single queue - delete qid <N> - delete a queue - state qid <N> - print the state of the queue - dump qid <N> dir <h2c|c2h> desc <start> <end> - dump desc ring entries <start> to <end> - dump qid <N> cmpt <start> <end> - dump completion ring entries <start> to <end> - dump qid <N> ctx dir <h2c|c2h> - dump context information of <qid> - cmpt_read qid <N> - Read the completion data - intring dump vector <N> <start_idx> <end_idx> - interrupt ring dump for vector number <N> - for intrrupt entries :<start_idx> --- <end_idx> - reg dump - register dump - - 2. Get the qdma devices list - > dma-ctl dev list - qdma17000 0000:17:00:0 maxQP: 512, 0~511 - qdma17001 0000:17:00:1 maxQP: 512, 512~1023 - qdma17002 0000:17:00:2 maxQP: 512, 1024~1535 - qdma17003 0000:17:00:3 maxQP: 512, 1536~2047 - - -6. Known Issues - - * Driver installation gives warning due to test signature. - * Driver is not fully tuned to achieve maximum IP performance - -7. References - - [ref1]: https://www.xilinx.com/products/intellectual-property/pcie-dma.html - [ref2]: https://www.xilinx.com/support/documentation/ip_documentation/qdma/v3_0/pg302-qdma.pdf - [ref3]: https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit - [ref4]: https://msdn.microsoft.com/en-us/windows/hardware/drivers/develop/building-a-driver - [ref5]: https://msdn.microsoft.com/en-us/windows/hardware/drivers/install/the-testsigning-boot-configuration-option \ No newline at end of file diff --git a/QDMA/windows/RELEASE b/QDMA/windows/RELEASE deleted file mode 100644 index 936e10d..0000000 --- a/QDMA/windows/RELEASE +++ /dev/null @@ -1,76 +0,0 @@ -Release: 2020.2 -================ - -This release is validated on QDMA4.0 2020.2 based example design and -QDMA3.1 2019.2 patch based example design. - -QDMA Windows driver is supported in poll mode by default - -SUPPORTED FEATURES: -=================== -2019.1 Features ---------------- -- Support for AXI4 Memory Mapped(MM) and AXI4 Streaming(ST) Interfaces -- Supports only Physical Functions(PFs) -- 2048 queues Sets (512 queues for each PF) - - 2048 H2C(host-to-card) Descriptor rings - - 2048 C2H (card-to-host) Descriptor rings - - 2048 Completion rings -- Interrupts - - Up to 8 MSI-X vectors per Function - - Interrupt Aggregation with single ring per PF -- Driver can be loaded in - - Poll mode - - direct interrupt mode - - interrupt aggregation mode -- Queues are managed by synchronous/Asynchronous IO from single application. -- Driver configuration through qdma.inf file -- Zero Packet size Write/Read support for ST mode -- Descriptor bypass(8,16,32 descriptor sizes) support -- Descriptor Prefetch - -2019.2 Features ---------------- -- Support disabling overflow check in completion ring -- Support 64B descriptor format in bypass mode -- Support for Completion queue descriptors of 64 bytes size -- Legacy Interrupt Support -- Support HW Error reporting -- Support Completions in Streaming mode -- Support flexible BAR mapping for QDMA configuration register space -- Version for SW and HW -- ST H2C to C2H loopback support -- Enhancements to user application utilities - -2020.1 Updates ---------------- -- QDMA driver and libqdma as a separate project -- Configurable queue distribution between physical functions -- User application utility names changed as dma-ctl, dma-arw, dma-rw -- New set of commands added to dma-ctl application -- Support QDMA4.0 context and register changes -- Common driver to support QDMA3.1 and QDMA4.0 designs -- Updated and validated the example design with marker changes for QDMA4.0 and without marker changes for QDMA3.1 -- Support multiple bus numbers on single card - -2020.2 Updates --------------- -- Support larger MM & ST packet transfer support -- Added support for detailed register dump -- Added support for post processing HW error messages -- Added support for Debug mode and Internal only mode - - -KNOWN ISSUES: -============= -- Driver installation gives warning due to test signature. -- In interrupt mode, Sometimes completions are not received when C2H PIDX updates are held for 64 descriptors -- On QDMA4.0 2020.2 design, User logic fails to generate C2H streaming packets when multiple threads try - to generate packets on multiple active queues. - -DRIVER LIMITATIONS: -=================== -- SRIOV is not supported -- Big endian systems are not supported -- Driver is not fully tuned to achieve maximum IP performance -- For optimal QDMA streaming performance, packet buffers of the descriptor ring should be aligned to at least 256 bytes. diff --git a/QDMA/windows/apps/common/include/device_file.hpp b/QDMA/windows/apps/common/include/device_file.hpp deleted file mode 100644 index a1394bb..0000000 --- a/QDMA/windows/apps/common/include/device_file.hpp +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include <string> -#include <system_error> -#include <vector> -#include <sstream> - -#include <Windows.h> -#include <winioctl.h> -#include <SetupAPI.h> -#include <INITGUID.H> - -#define DEV_NAME_MAX_SZ 12 - -struct device_details { - UINT8 bus_no; - UINT8 dev_no; - UINT8 fun_no; - std::string device_name; - std::string device_path; -}; - -#pragma warning( disable : 4505) -static bool get_device(std::vector<device_details> dev_details, const char *dev_name, device_details &dev_info) { - bool is_dev_found = false; - - for (auto i = 0; i < (int)dev_details.size(); i++) { - if (dev_details[i].device_name == dev_name) { - is_dev_found = true; - dev_info = dev_details[i]; - break; - } - } - return is_dev_found; -} - -static std::vector<device_details> get_device_details(GUID guid) { - auto device_info = SetupDiGetClassDevs((LPGUID)&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - if (device_info == INVALID_HANDLE_VALUE) { - throw std::runtime_error("GetDevices INVALID_HANDLE_VALUE"); - } - - SP_DEVINFO_DATA dev_info_data; - dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); - - SP_DEVICE_INTERFACE_DATA device_interface = { 0 }; - device_interface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - - - std::vector<device_details> dev_details; - device_details info; - - /* enumerate through devices */ - for (unsigned index = 0; - SetupDiEnumDeviceInterfaces(device_info, NULL, &guid, index, &device_interface); - ++index) { - - unsigned char *bus_no = NULL; - unsigned char *dev_addr = NULL; - DWORD lsize = 0; - - /* get required buffer size */ - unsigned long detailLength = 0; - if (!SetupDiGetDeviceInterfaceDetail(device_info, &device_interface, NULL, 0, &detailLength, NULL) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - throw std::runtime_error("SetupDiGetDeviceInterfaceDetail - get length failed"); - } - - /* allocate space for device interface detail */ - auto dev_detail = reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(new char[detailLength]); - dev_detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); - - /* get device interface detail */ - if (!SetupDiGetDeviceInterfaceDetail(device_info, &device_interface, dev_detail, detailLength, NULL, &dev_info_data)) { - delete[] dev_detail; - throw std::runtime_error("SetupDiGetDeviceInterfaceDetail - get detail failed"); - } - - /* get the required size for PCIe BUS NUMBER Parameter */ - if (!SetupDiGetDeviceRegistryProperty(device_info, &dev_info_data, SPDRP_BUSNUMBER, NULL, (PBYTE)bus_no, 0, &lsize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - delete[] dev_detail; - throw std::runtime_error("SetupDiGetDeviceRegistryProperty - get length failed"); - } - - /* Retrieve the PCIe bus number */ - bus_no = (unsigned char*)malloc(lsize); - if (!SetupDiGetDeviceRegistryProperty(device_info, &dev_info_data, SPDRP_BUSNUMBER, NULL, (PBYTE)bus_no, lsize, NULL)) { - delete[] dev_detail; - free(bus_no); - throw std::runtime_error("SetupDiGetDeviceRegistryProperty - get Registry failed"); - } - - /* get the required size for PCIe Device Address Parameter */ - if (!SetupDiGetDeviceRegistryProperty(device_info, &dev_info_data, SPDRP_ADDRESS, NULL, (PBYTE)dev_addr, 0, &lsize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - delete[] dev_detail; - free(bus_no); - throw std::runtime_error("SetupDiGetDeviceRegistryProperty - get length failed"); - } - - /* Retrieve the PCIe Device Address */ - dev_addr = (unsigned char*)malloc(lsize); - if (!SetupDiGetDeviceRegistryProperty(device_info, &dev_info_data, SPDRP_ADDRESS, NULL, (PBYTE)dev_addr, lsize, NULL)) { - delete[] dev_detail; - free(bus_no); - free(dev_addr); - throw std::runtime_error("SetupDiGetDeviceRegistryProperty - get Registry failed"); - } - - /* Prepare BDF format (0xBBDDF) */ - UINT8 dev_no = (*dev_addr & 0xF8) >> 3; - UINT8 fun_no = (*dev_addr & 0x7); - UINT32 bdf = 0x0; - bdf = bdf | (*bus_no << 12); - bdf = bdf | (dev_no << 4); - bdf = bdf | (fun_no); - - /* Prepare the PCIe devices identifier strings */ - std::ostringstream outs; - outs << "qdma"; - outs.setf (std::ios::hex, std::ios::basefield); - outs.width(5); outs.fill('0'); - outs << bdf; - - /* Fill the details in info structure */ - info.bus_no = *bus_no; - info.dev_no = dev_no; - info.fun_no = fun_no; - info.device_name = outs.str(); - info.device_path = dev_detail->DevicePath; - - /* Append it to the return vector */ - dev_details.emplace_back(info); - - free(bus_no); - free(dev_addr); - delete[] dev_detail; - } - - SetupDiDestroyDeviceInfoList(device_info); - - return dev_details; -} - - -inline static std::string get_last_win_err_msg() { - char tmp[256]; - FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), tmp, 256, NULL); - - return{ tmp, 256 }; -} - -struct device_file { - HANDLE h; - device_file(); - device_file(const std::string& path, DWORD accessFlags); - ~device_file(); - - device_file(const device_file& rhs) = delete; - device_file& operator=(const device_file& rhs) = delete; - - device_file(device_file && rhs); - - device_file& operator=(device_file&& rhs); - - void open(const std::string& path, DWORD accessFlags, DWORD fattribs = FILE_ATTRIBUTE_NORMAL); - - void close(); - - template <typename T> - void write(long address, const T value); - - template <typename T> - T read(long address); - - void seek(long device_offset); - size_t write(void* buffer, size_t size); - size_t read(void* buffer, size_t size); - - size_t ioctl(int code, void* inData = nullptr, DWORD inSize = 0, void* outData = nullptr, - DWORD outSize = 0); -}; - -inline device_file::device_file() : h(INVALID_HANDLE_VALUE) {}; - -inline void device_file::open(const std::string& path, DWORD accessFlags, DWORD fattribs) { - h = CreateFile(path.c_str(), accessFlags, 0, NULL, OPEN_EXISTING, - fattribs, NULL); - if (h == INVALID_HANDLE_VALUE) { - throw std::runtime_error("CreateFile control failed: " + get_last_win_err_msg()); - } -} - -inline void device_file::close() { - if (h != INVALID_HANDLE_VALUE) { - CloseHandle(h); - } -} - -inline device_file::device_file(const std::string& path, DWORD accessFlags) : h(INVALID_HANDLE_VALUE) { - open(path, accessFlags); -} - -inline device_file::~device_file() { - close(); -} - -#if 0 -inline device_file::device_file(device_file && rhs) - : h(INVALID_HANDLE_VALUE) { - *this = std::move(rhs); -} - -inline device_file& device_file::operator=(device_file&& rhs) { - if (this != &rhs) { - h = rhs.h; - rhs.h = INVALID_HANDLE_VALUE; - } - return *this; -}; -#endif - -inline void device_file::seek(long device_offset) { - if (INVALID_SET_FILE_POINTER == SetFilePointer(h, device_offset, NULL, FILE_BEGIN)) { - throw std::runtime_error("SetFilePointer failed: " + get_last_win_err_msg()); - } -} - -inline size_t device_file::write(void* buffer, size_t size) { - unsigned long num_bytes_written; - if (!WriteFile(h, buffer, (DWORD)size, &num_bytes_written, NULL)) { - throw std::runtime_error("Failed to write to device! " + get_last_win_err_msg()); - } - - return num_bytes_written; -} - -template <typename T> -inline void device_file::write(long addr, T t) { - seek(addr); - unsigned long num_bytes_written; - if (!WriteFile(h, &t, sizeof(T), &num_bytes_written, NULL)) { - throw std::runtime_error("Failed to write to device! " + get_last_win_err_msg()); - } else if (num_bytes_written != sizeof(T)) { - throw std::runtime_error("Failed to write all bytes!"); - } -} - -inline size_t device_file::read(void* buffer, size_t size) { - unsigned long num_bytes_read; - if (!ReadFile(h, buffer, (DWORD)size, &num_bytes_read, NULL)) { - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - return num_bytes_read; -} - -template <typename T> -inline T device_file::read(long addr) { - seek(addr); - T buffer; - unsigned long num_bytes_read; - if (!ReadFile(h, &buffer, sizeof(T), &num_bytes_read, NULL)) { - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } else if (num_bytes_read != sizeof(T)) { - throw std::runtime_error("Failed to read all bytes!"); - } - return buffer; -} - -inline size_t device_file::ioctl(int code, void* inData, DWORD inSize, void* outData, DWORD outSize) { - - DWORD nb = 0; - BOOL success = DeviceIoControl(h, code, inData, inSize, outData, outSize, &nb, NULL); - if (!success) { - throw std::runtime_error("ioctl failed!" + get_last_win_err_msg()); - } - return nb; -} diff --git a/QDMA/windows/apps/dma-arw/datafile256K.bin b/QDMA/windows/apps/dma-arw/datafile256K.bin deleted file mode 100644 index 1b50cdd57bcc0fb5c0e6ae027560cd03062b5434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262144 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≷E}*%fhPh_1)d2! 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	hQy`Xwg^^)pk)hnu3Rj;XDSG}QnQ}veWZPh!f zcUAAH-dBB~`cU<e>SNU>s!vs)sXkYIq54wwmFjENH>z({->JS={h<0$^^@vn)i0`F zRllizSN);-Q}vhXZ`D7le^vjf{#RvCV^m{OV^(8PV^w2QV^`x)<5c5P<5uHQ<5lBR z<5v?<6I2sY6IK&Z6IBya6IYW^lT?#ZlU9>alU0*blUGwvQ&dw@Q&v+^Q&m$_Q&-ba z(^S(^(^k__(^b<`(^oT4GgLEDGgdQEGgUKFGgq@vvsANEvsSZFvsJTGvsZIab5wIu zb5?Uvb5(Owb64|F^HlRv^H%dw^HuXx^H&Q{3sehI3swtJ3snnK3s;L!i&TqJi&l$K zi&cwLi&slfOH@lzOIAx!OI1r#OIOQK%T&u!%T~)#%T>!$%U3H<D^x2|D^@E}D^)8~ zD_5&ft5mB}t5&N~t5vI0t5<7KYgB7eYgTJfYgKDgYgg+~>s0Gf>sISg>s9Mh>sOng zHc@So+GMpUYE#vwsZCd#p*B-(mfCE!Icjs&=BdqBTcEa3ZIRkywIymx)t0F(S6iXB zQf-ymYPB_LYt`1NtykNiwoz@9+Ge#aYFpK|scl!=p|(?Pm)dT%J!*T^_NnbxJD_$@ z?U34GwIgar)sCqhS39A0Qtg!5X|*$IXVuQBomab{c2Vt;+GVvXYFE{+sa;pQp>|X4 zmfCH#J8E~;?y22Zd!Y7E?UCAJwI^y%)t;$6S9_uMQtg%6Yqd9OZ`IzZy;u97_EGJV z+Gn*dYG2j9seM=bq4rblm)dW&KWcx~{;B;}V^C*QXHsWYXHjQWXH#ca=TPTV=ThfZ z=TYZX=Tqlb7f=^e7g85i7f}~g7gHBkmr$2fmr|Ejmr<8hms6KlS5Q|}S5jA2S5a40 zS5sG4*HG6~*HYJ3*HPD1*HhP5H&8cJH&QoNH&HiLH&ZuPw@|lKw^FxOw^6rMw^O%Q zcTjg!cT#s&cTsm$cT;y)_fYp#_fq#(_fhv%_fz**4^R(O4^j_S4^a<Q4^t0Uk5G?P zk5Z3Tk5P|Rk5i9VPf$-(Pf|}-Pf<@*Pg74<&rr`)&r;7;&r#1+&r{D=FHkR3FH$d7 zFHtX5FH<j9uTZa4uTrm8uTig6uT!sAZ%}VkZ&GhoZ&7bmZ&Pnq?@;el?^5qp?@{kn z?^EwrpP)WbeUkcQ^(pF8)u*XXSD&FiQ+<~DZ1p+nbJgdm&sSfdzEFLU`eOAZ>Pyv^ zsV`Swp}tammHKM+HR@~C*Qu{p-=MxxeUtiT^)2dK)wii{SKpz&Q+=2EZuLFtd)4=; z?^i#deo+08`eF4W>POX&sUKHAp?*^Rl=^A)GwNs6	kRzo33m{gV1+^(*RE)vu{v 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�JDIiqSu^^BSswKM8w)X!*`(Kw@NM)Qo88Lczg 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%0AY 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%0DZ-II4u-93Hx%-yqh&)q$L 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 B9peB1 diff --git a/QDMA/windows/apps/dma-arw/datafile4K.bin b/QDMA/windows/apps/dma-arw/datafile4K.bin deleted file mode 100644 index df437f42c808d41dec5d543d60ce94c8cb8a044a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQzWMXDvWn<^y<l^Sx<>MC+6cQE@6%&_`l#-T_m6KOcR8m$^Ra4i{)Y8_`)zddH zG%_|ZH8Z!cw6eCbwX=6{baHlab#wRd^z!!c_45x13<?ej4GWKmjEatljf+o6OiE5k zO-s+n%*xKm&C4$+EGjN3Ei136tg5c5t*dWnY-(<4ZENr7?CS36?dzW~anj@|Q>RUz zF>}`JIdkXDU$Ah|;w4L$Enl&6)#^2C*R9{Mant54TeofBv2)k%J$v`<KXCBS;Uh<n z9Y1mM)af&4&z-+;@zUihSFc^aar4&gJ9qEhfAH|p<0ns_J%91?)$2EJ-@X6v@zduo zU%!3-@$=X3KY#!IANBue{Ew#p(fmJJ{*9LZqxIit{Xg3N8EyZKwtq+4|D*k%(f;2^ H=>Gx$V6OOT diff --git a/QDMA/windows/apps/dma-arw/dma_arw.cpp b/QDMA/windows/apps/dma-arw/dma_arw.cpp deleted file mode 100644 index ca846c8..0000000 --- a/QDMA/windows/apps/dma-arw/dma_arw.cpp +++ /dev/null @@ -1,723 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "dma_arw.hpp" -#include "version.h" - -cli_cmd cmd; - -void CALLBACK CompletionRoutine( - DWORD errorcode, - DWORD bytes_transfered, - LPOVERLAPPED overlapped -) -{ - qdma_device *qdev = (qdma_device *)overlapped->hEvent; - - if (errorcode) { - qdev->xfer_done = false; - ReleaseSemaphore(qdev->sem_xfer_done, 1, NULL); - std::cerr << "queue transfer failed with error : " << get_last_win_err_msg() << std::endl; - return; - } - - qdev->rxd_size = bytes_transfered; - if (qdev->xfer_size >= bytes_transfered) { - qdev->xfer_done = true; - ReleaseSemaphore(qdev->sem_xfer_done, 1, NULL); - } - - return; -} - -BOOL WINAPI xfer_completion(PVOID arg) -{ - UNREFERENCED_PARAMETER(arg); - bool ret; - constexpr unsigned int wait_size = 50; - LPOVERLAPPED_ENTRY wait_ov_entry = (LPOVERLAPPED_ENTRY)malloc(wait_size * sizeof(OVERLAPPED)); - ULONG no_entries_cmpltd = 0; - ULONG wait_time = COMPL_WAIT_TIME; /* In msec */ - ULONG total_bytes_xfered = 0; - qdma_device *qdev = (qdma_device *)arg; - - - try { - qdev->thread_run = true; - while (true) { - ret = GetQueuedCompletionStatusEx( - qdev->cmplt_io_handle, &wait_ov_entry[0], - wait_size, &no_entries_cmpltd, - wait_time, FALSE); - - if (ret == true) { - qdev->rxd_size = 0; - for (ULONG index = 0; index < no_entries_cmpltd; index++) { - total_bytes_xfered += wait_ov_entry[index].dwNumberOfBytesTransferred; - qdev->rxd_size += wait_ov_entry[index].dwNumberOfBytesTransferred; - } - if (total_bytes_xfered >= qdev->xfer_size) { - qdev->xfer_done = true; - ReleaseSemaphore(qdev->sem_xfer_done, 1, NULL); - } - } - if (qdev->thread_exit == true) - break; - } - free(wait_ov_entry); - } - catch (const std::exception& e) { - free(wait_ov_entry); - std::cout << "Error: " << e.what() << '\n'; - } - - return true; -} - -void qdma_device::async_env_init(void) -{ - sem_xfer_done = CreateSemaphore(NULL, 0, 1, NULL); - if (sem_xfer_done == NULL) { - throw std::runtime_error("CreateSemaphore error: " + get_last_win_err_msg()); - } - - if (cmd.mode == FILE_NORMAL_MODE) { - cmplt_io_handle = CreateIoCompletionPort(queue_.h, NULL, 1, 0); - if (NULL == cmplt_io_handle) { - throw std::runtime_error("FAILED TO CREATE COMPLETION HANDLE : " + get_last_win_err_msg()); - } - - thread_run = false; - thread_exit = false; - xfer_done = false; - - cmplt_th_handle = - CreateThread(NULL, - 10 * 1024 * 1024, // stack size - (LPTHREAD_START_ROUTINE)xfer_completion, - (void *)this, - 0, - NULL); - - if (NULL == cmplt_th_handle) { - CloseHandle(sem_xfer_done); - throw std::runtime_error("Error CreateThread Failed : " + get_last_win_err_msg()); - } - - while (thread_run == false); - } -} - -void qdma_device::async_env_exit(void) -{ - if (cmd.mode == FILE_NORMAL_MODE) { - thread_exit = true; - Sleep(2 * COMPL_WAIT_TIME); - WaitForSingleObject(cmplt_th_handle, INFINITE); - CloseHandle(cmplt_th_handle); - } - CloseHandle(sem_xfer_done); -} - -void qdma_device::poll_completion(void) -{ - int timeout = 0; - - while (WAIT_OBJECT_0 != WaitForSingleObject(sem_xfer_done, 1)) { - timeout++; - SleepEx(9, TRUE); - if (timeout > MAX_TIMEOUT_PERIOD) - break; - } - - if (cmd.mode == FILE_NORMAL_MODE) { - thread_exit = true; - Sleep(2 * COMPL_WAIT_TIME); - } -} - -int qdma_device::qdma_read(void) -{ - bool ret; - OVERLAPPED overlapped; - - cmd.data = allocate_buffer(cmd.size, cmd.alignment); - if (!cmd.data) { - throw std::runtime_error("Error allocating memory" + get_last_win_err_msg()); - } - - switch (cmd.node) { - case devnode_sel::queue_mm: - qopen(cmd.qid, true); - xfer_size = cmd.size; - memset(&overlapped, 0, sizeof(overlapped)); - overlapped.OffsetHigh = 0x0; - overlapped.Offset = (DWORD)cmd.addr; - - if (cmd.mode == FILE_NORMAL_MODE) { - ret = ReadFile(queue_.h, cmd.data, xfer_size, NULL, &overlapped); - } - else { - overlapped.hEvent = this; - ret = ReadFileEx(queue_.h, cmd.data, xfer_size, &overlapped, CompletionRoutine); - } - - if (ret == false) { - auto error = GetLastError(); - if (error != ERROR_IO_PENDING) - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - - /* no-op...just waiting for async completion */ - poll_completion(); - - if (xfer_done) { - printf("Asynchronous Read completed : \n"); - printf("------------------------------\n"); - if (TRUE == cmd.binary) - print_bytes_binary(cmd.data, cmd.size); - else - print_bytes(cmd.addr, cmd.data, cmd.size); - } - else { - printf("Failed to Read : Async Timeout Occurred\n"); - } - qclose(); - break; - - case devnode_sel::queue_st: - { - DWORD packet_size; - DWORD packet_cnt; - DWORD remain_size = cmd.size; - DWORD buf_idx = 0; - bool pkt_generate = true; - bool last_pkt_generate = true; - - qopen(cmd.qid, false); - - do { - if (remain_size >= ST_C2H_MAX_PACK_SIZE_CHUNK) { - packet_cnt = remain_size / ST_C2H_MAX_PACK_SIZE_CHUNK; - packet_size = ST_C2H_MAX_PACK_SIZE_CHUNK; - } - else { - if (last_pkt_generate) { - pkt_generate = true; - last_pkt_generate = false; - } - packet_cnt = 1; - packet_size = remain_size; - } - - if (cmd.size == 0x0) { - cout << "Initiating Zero Byte Read\n"; - } - - if (pkt_generate) { - dgen.reset_pkt_ctrl(); - dgen.configure_c2h(cmd.qid + qbase, packet_size, packet_cnt); - dgen.generate_packets(); - pkt_generate = false; - } - - xfer_size = packet_size * packet_cnt; - xfer_done = false; - - memset(&overlapped, 0, sizeof(overlapped)); - overlapped.OffsetHigh = 0x0; - overlapped.Offset = (DWORD)cmd.addr; - - //printf("buf_idx : %d, len : %d\n", buf_idx, xfer_size); - - if (cmd.mode == FILE_NORMAL_MODE) { - ret = ReadFile(queue_.h, &cmd.data[buf_idx], xfer_size, NULL, &overlapped); - } - else { - overlapped.hEvent = this; - ret = ReadFileEx(queue_.h, &cmd.data[buf_idx], xfer_size, &overlapped, CompletionRoutine); - } - - if (ret == false) { - auto error = GetLastError(); - if (error != ERROR_IO_PENDING) - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - - poll_completion(); - if (!xfer_done) - break; - buf_idx = buf_idx + rxd_size; - remain_size = remain_size - rxd_size; - - if (cmd.size == 0x0) { - cout << "ZERO Byte Read Successful\n"; - } - } while (remain_size); - - if (xfer_done) { - printf("Asynchronous Read completed : \n"); - printf("------------------------------\n"); - if (TRUE == cmd.binary) - print_bytes_binary(cmd.data, cmd.size); - else - print_bytes(cmd.addr, cmd.data, cmd.size); - } - else { - printf("Failed to Read : Async Timeout Occurred\n"); - } - qclose(); - } - - break; - - default: - return 1; - } - - if (cmd.data) _aligned_free(cmd.data); - return 0; -} - -int qdma_device::qdma_write(void ) -{ - bool ret; - OVERLAPPED overlapped; - - switch (cmd.node) { - case devnode_sel::queue_mm: - qopen(cmd.qid, true); - - if (cmd.data == nullptr && false == cmd.file.empty()) { - read_file_option(); - } - - xfer_size = cmd.size; - memset(&overlapped, 0, sizeof(overlapped)); - overlapped.OffsetHigh = 0x0; - overlapped.Offset = (DWORD)cmd.addr; - - if (cmd.mode == FILE_NORMAL_MODE) { - ret = WriteFile(queue_.h, cmd.data, xfer_size, NULL, &overlapped); - } - else { - overlapped.hEvent = this; - ret = WriteFileEx(queue_.h, cmd.data, xfer_size, &overlapped, CompletionRoutine); - } - - if (ret == false) { - auto error = GetLastError(); - if (error != ERROR_IO_PENDING) - throw std::runtime_error("Failed to write to device! " + get_last_win_err_msg()); - } - - poll_completion(); - - if (!xfer_done) { - printf("Failed to Write : Async Timeout Occurred\n"); - } - else { - printf("Asynchronous Write completed : \n"); - printf("------------------------------\n"); - } - - qclose(); - - break; - - case devnode_sel::queue_st: - { - qopen(cmd.qid, false); - aligned_vector<uint16_t> wr_buffer(cmd.size); - iota(wr_buffer.begin(), wr_buffer.end(), static_cast<uint16_t>(0)); /* 0, 1, 2, 3, 4 ... */ - dgen.reset_h2c(); - - if (cmd.size == 0x0) - cout <<"Initiating Zero Byte Write\n"; - - xfer_size = cmd.size; - memset(&overlapped, 0, sizeof(overlapped)); - overlapped.OffsetHigh = 0x0; - overlapped.Offset = (DWORD)cmd.addr; - - if (cmd.mode == FILE_NORMAL_MODE) { - ret = WriteFile(queue_.h, wr_buffer.data(), xfer_size, NULL, &overlapped); - } - else { - overlapped.hEvent = this; - ret = WriteFileEx(queue_.h, wr_buffer.data(), xfer_size, &overlapped, CompletionRoutine); - } - - if (ret == false) { - auto error = GetLastError(); - if (error != ERROR_IO_PENDING) - throw std::runtime_error("Failed to write to device! " + get_last_win_err_msg()); - } - - poll_completion(); - - if (xfer_done) { - printf("Asynchronous Write completed : \n"); - printf("------------------------------\n"); - if (true == dgen.check_h2c(cmd.qid + qbase)) - cout << "Data generator returned SUCCESS for received data" << endl; - else - throw std::runtime_error("Data generator reported error for received data!"); - - if (cmd.size == 0x0) - cout << "ZERO Byte Write Successful\n"; - } - else { - printf("Failed to Write : Async Timeout Occurred\n"); - } - - qclose(); - break; - } - default: - return 1; - } - - if (cmd.data) _aligned_free(cmd.data); - return 0; -} - -static int is_printable(char c) -{ - /* anything below ASCII code 32 is non-printing, 127 is DELETE */ - if (c < 32 || c == 127) { - return FALSE; - } - return TRUE; -} - -static void print_bytes_binary(BYTE* data, size_t length) -{ - FILE* output = stdout; - - if (false == cmd.file.empty()) { - fopen_s(&output, cmd.file.data(), "wb"); - } - - fwrite(data, sizeof(BYTE), length, output); - - if (false == cmd.file.empty()) { - fclose(output); - } -} - -static void print_bytes(size_t addr, BYTE* data, size_t length) -{ - FILE* output = stdout; - - if (false == cmd.file.empty()) { - fopen_s(&output, cmd.file.data(), "wb"); - } - - /* formatted output */ - for (int row = 0; row < (int)(length / 16 + ((length % 16) ? 1 : 0)); - row++) { - - /* Print address */ - fprintf(output, "0x%04zX: ", addr + row * 16); - - /* Print bytes */ - int column; - for (column = 0; column < (int)min(16, length - (row * 16)); - column++) { - fprintf(output, "%02x ", data[(row * 16) + column]); - } - for (; column < 16; column++) { - fprintf(output, " "); - } - - /* Print gutter */ - fprintf(output, " "); - - /* Print characters */ - for (column = 0; column < (int)min(16, length - (row * 16)); - column++) { - fprintf(output, "%c", is_printable(data[(row * 16) + column]) ? - (data[(row * 16) + column]) : '.'); - } - for (; column < 16; column++) { - fprintf(output, " "); - } - fprintf(output, "\n"); - } - - if (false == cmd.file.empty()) { - fclose(output); - } -} - -static int read_file_option(void) -{ - FILE* inputFile; - if (fopen_s(&inputFile, cmd.file.data(), "rb") != 0) { - fprintf(stderr, "Could not open file <%s>\n", cmd.file.data()); - return 1; - } - - /* determine file size */ - if (cmd.size == 0) { - fseek(inputFile, 0, SEEK_END); - fpos_t fpos; - fgetpos(inputFile, &fpos); - fseek(inputFile, 0, SEEK_SET); - cmd.size = (DWORD)fpos; - } - - cmd.data = allocate_buffer(cmd.size, cmd.alignment); - if (!cmd.data) { - fprintf(stderr, "Error allocating %ld bytes of memory, error code: %ld\n", cmd.size, GetLastError()); - return 1; - } - cmd.size = (DWORD)fread(cmd.data, 1, cmd.size, inputFile); - - fclose(inputFile); - return 0; -} - -static void help(void) -{ - cout << "dma-arw usage:\n"; - cout << "dma-arw -v : prints the version information\n\n"; - cout << "dma-arw qdma<N> mode <0 | 1> <DEVNODE> <read|write> <ADDR> [OPTIONS] [DATA]\n\n"; - cout << "- qdma<N> : unique qdma device name (<N> is BBDDF where BB -> PCI Bus No, DD -> PCI Dev No, F -> PCI Fun No)\n"; - cout << "- mode : 0 : this mode uses ReadFile and WriteFile async implementation\n"; - cout << " : 1 : this mode uses ReadFileEx and WriteFileEx async implementation\n"; - cout << "- DEVNODE : One of: queue_mm_ | queue_st_*\n"; - cout << " where the * is a numeric wildcard (0 - N) for queue.\n"; - cout << "- ADDR : The target offset address of the read/write operation.\n"; - cout << " Applicable only for control, user, queue_mm device nodes.\n"; - cout << " Can be in hex or decimal.\n"; - cout << "- OPTIONS : \n"; - cout << " -a set alignment requirement for host-side buffer (default: PAGE_SIZE)\n"; - cout << " -b open file as binary\n"; - cout << " -f use contents of file as input or write output into file.\n"; - cout << " -l length of data to read/write (default: 4 bytes or whole file if '-f' flag is used)\n"; - cout << "- DATA : Space separated bytes (big endian) in decimal or hex, \n"; - cout << " e.g.: 17 34 51 68\n"; - cout << " or: 0x11 0x22 0x33 0x44\n"; -} - -static void init_cmd(void) -{ - cmd.addr = 0x0; - cmd.alignment = 0; - cmd.binary = false; - cmd.node = devnode_sel::none; - cmd.op = op_sel::none; - cmd.bus_no = 0; - cmd.dev_no = 0; - cmd.fun_no = 0; - cmd.dev_name[0] = '\0'; - cmd.qid = 0; - cmd.size = 4; - cmd.data = nullptr; -} - -static BYTE* allocate_buffer(size_t size, size_t alignment) -{ - if (size == 0) { - size = 4; - } - - if (alignment == 0) { - SYSTEM_INFO sys_info; - GetSystemInfo(&sys_info); - alignment = sys_info.dwPageSize; - } - - return (BYTE*)_aligned_malloc(size, alignment); -} - -int parse_command_line(const int argc, char* argv[]) -{ - /* - * qdma_rw pf <pf_number> <device> <read|write> <address> [OPTIONS] [DATA] - * 0 1 2 3 4 5 6... n... - */ - auto argidx = 1; - - if (argc < 2) { - return 1; - } - - if ((strcmp(argv[argidx], "-v") == 0) || (strcmp(argv[argidx], "-V") == 0)) { - printf("%s version %s\n", PROGNAME, VERSION); - printf("%s\n", COPYRIGHT); - exit(0); - } - - init_cmd(); - - if (argc < 5) { - return 1; - } - - if (strncmp(argv[argidx], "qdma", 4)) { - return 1; - } - - strncpy_s(cmd.dev_name, DEV_NAME_MAX_SZ, argv[argidx], _TRUNCATE); - ++argidx; - - if (strncmp(argv[argidx], "mode", 4)) { - return 1; - } - ++argidx; - - cmd.mode = std::stoul(argv[argidx]); - ++argidx; - - if (std::regex_match(argv[argidx], std::regex("queue_mm_[0-9]+"))) { - string qid_str{ argv[argidx] }; - auto it = std::find(qid_str.begin(), qid_str.end(), '_'); - it = it+4; - cout << *it << endl; - cmd.qid = std::stoul(string{ it, qid_str.end() }); - cmd.node = devnode_sel::queue_mm; - } - else if (std::regex_match(argv[argidx], std::regex("queue_st_[0-9]+"))) { - string qid_str{ argv[argidx] }; - auto it = std::find(qid_str.begin(), qid_str.end(), '_'); - it = it + 4; - cmd.qid = std::stoul(string{ it, qid_str.end() }); - cmd.node = devnode_sel::queue_st; - } - else { - return 1; - } - ++argidx; - - if (strcmp(argv[argidx], "read") == 0) { - cmd.op = op_sel::read; - } - else if (strcmp(argv[argidx], "write") == 0) { - cmd.op = op_sel::write; - } - else - return 1; - ++argidx; - - if (cmd.node == devnode_sel::queue_mm) { - cmd.addr = strtoul(argv[argidx], NULL, 0); - ++argidx; - } - else if (cmd.node == devnode_sel::queue_st) { - if (argv[argidx][0] != '-') { - printf("\nErr: ST mode doesn't need the target address option\n\n"); - return 1; - } - } - - while ((argidx < argc) && ((argv[argidx][0] == '-') || (argv[argidx][0] == '/'))) { - switch (argv[argidx][1]) { - case 'l': - argidx++; - cmd.size = strtoul(argv[argidx], NULL, 0); - argidx++; - break; - case 'f': - argidx++; - cmd.file = _strdup(argv[argidx]); - argidx++; - break; - case 'a': - argidx++; - cmd.alignment = strtoul(argv[argidx], NULL, 0); - argidx++; - break; - case 'b': - cmd.binary = TRUE; - argidx++; - break; - case '?': - case 'h': - default: - return 1; - } - } - - if (argidx != argc) { - if (cmd.op == op_sel::write && - cmd.node != devnode_sel::queue_st) { - cmd.size = argc - argidx; - cmd.data = allocate_buffer(cmd.size, cmd.alignment); - if (cmd.data == nullptr) { - cout << "Could not allocate memory for data" << endl; - exit(1); - } - - for (int byteidx = 0; argidx < argc; argidx++, byteidx++) { - cmd.data[byteidx] = (char)strtoul(argv[argidx], NULL, 0); - } - } - else - return 0; - } - - return 0; -} - -int __cdecl main(const int argc, char* argv[]) -{ - try { - if (parse_command_line(argc, argv)) { - help(); - if (cmd.data) _aligned_free(cmd.data); - exit(1); - } - - auto dev_details = get_device_details(GUID_DEVINTERFACE_QDMA); - if (!dev_details.size()) { - std::cerr << "No QDMA Devices found!" << std::endl; - return 1; - } - - device_details dev_info; - auto res = get_device(dev_details, cmd.dev_name, dev_info); - if (res == false) { - printf("Device name is not valid\n"); - if (cmd.data) _aligned_free(cmd.data); - return 1; - } - - cmd.bus_no = dev_info.bus_no; - cmd.dev_no = dev_info.dev_no; - cmd.fun_no = dev_info.fun_no; - qdma_device qdev(dev_info.device_path.c_str()); - - if (cmd.qid >= qdev.get_qmax()) { - if (cmd.data) _aligned_free(cmd.data); - cout << "Invalid qid provided." << endl; - return 1; - } - - if (cmd.op == op_sel::read) { - qdev.qdma_read(); - } - else if (cmd.op == op_sel::write) { - qdev.qdma_write(); - } - } - catch (const std::exception& e) { - if (cmd.data) _aligned_free(cmd.data); - cout << "Error: " << e.what() << '\n'; - } -} diff --git a/QDMA/windows/apps/dma-arw/dma_arw.hpp b/QDMA/windows/apps/dma-arw/dma_arw.hpp deleted file mode 100644 index fd2ea68..0000000 --- a/QDMA/windows/apps/dma-arw/dma_arw.hpp +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include <array> -#include <iomanip> -#include <iostream> -#include <regex> -#include <string> -#include <sstream> -#include <numeric> - -#include "device_file.hpp" -#include "qdma_driver_api.h" - -#pragma comment(lib, "setupapi.lib") - -using std::uint32_t; -using std::string; -using std::runtime_error; -using std::cout; -using namespace std; - -#define ST_C2H_MAX_PACK_SIZE_CHUNK 4096 -#define COMPL_WAIT_TIME 100 /* Milli Seconds */ -#define MAX_TIMEOUT_PERIOD 1000 /* Milli Seconds */ -#define FILE_NORMAL_MODE 0 -#define FILE_EX_MODE 1 - -/* ----- common functions ----- */ -static constexpr uint32_t bit(uint64_t n) { - return (1ull << n); -} - -static constexpr bool is_bit_set(uint64_t x, uint64_t n) { - return (x & bit(n)) == bit(n); -} - -static constexpr uint64_t create_mask(uint64_t n, uint64_t l) { - return ((1ull << l) - 1ull) << n; -} - -static constexpr uint32_t get_bits(uint32_t value, uint32_t bit_index, uint32_t len) { - return ((value & create_mask(bit_index, len)) >> bit_index); -} -/* ----- ----- */ - -enum class devnode_sel { - queue_mm, - queue_st, - none -}; - -enum class op_sel { - read, - write, - interrupt, - none -}; - -struct cli_cmd { - op_sel op; - UINT8 bus_no; - UINT8 dev_no; - UINT8 fun_no; - char dev_name[DEV_NAME_MAX_SZ]; - devnode_sel node; - BYTE *data; - LONG addr; - ULONG qid; - int mode; - DWORD size; - string file; - size_t alignment; - BOOL binary; -}; - -template<typename T, size_t Alignment = 4096> -struct aligned_allocator { - - typedef T value_type; - - aligned_allocator() noexcept {} - - template<class U> - aligned_allocator(const aligned_allocator<U, Alignment>&) noexcept {} - - template<class U> - bool operator==(const aligned_allocator<U>&) const noexcept - { - return true; - } - template<class U> - bool operator!=(const aligned_allocator<U>&) const noexcept - { - return false; - } - - T* allocate(const std::size_t num) { - if (num == 0) { - return nullptr; - } - - void* const ptr = _aligned_malloc(num * sizeof(T), Alignment); - if (ptr == nullptr) { - throw std::bad_alloc(); - } - return static_cast<T*>(ptr); - } - void deallocate(T* const p, std::size_t) { - if (p) { - _aligned_free(p); - } - } - - template<typename T2> - struct rebind { - typedef aligned_allocator<T2, Alignment> other; - }; -}; - -template<typename T, size_t N = 4096> -using aligned_vector = std::vector<T, aligned_allocator<T, N>>; - -template<typename Iter> -void fill_pattern(Iter begin, Iter end) { - std::iota(begin, end, 0); // 0, 1, 2, 3, 4 ... -} - -class data_generator { -public: - using value_type = uint16_t; - - explicit data_generator(const std::string& dev_path) - { - user_bar.open(dev_path + "\\user", GENERIC_WRITE | GENERIC_READ); - } - - ~data_generator() - { - user_bar.close(); - } - - bool check_h2c(const uint32_t qid) - { - const auto match_reg = user_bar.read<uint32_t>(0x10); - const auto match_qid = get_bits(match_reg, 4, 28); /* bits 4-31 = qid */ - return (match_qid == qid) && is_bit_set(match_reg, 0); /* bit 0 = match */ - } - - void reset_h2c() - { - user_bar.write<uint32_t>(0xC, 0x1); - } - - void reset_pkt_ctrl() - { - user_bar.write<uint32_t>(0x8, 0x0); - } - - void set_queue(const uint32_t qid) - { - user_bar.write<uint32_t>(0x0, qid); - } - - void configure_c2h(const uint32_t qid, const uint32_t packet_size, const uint32_t num_packets) - { - //printf("DGEN : PKT SIZE : %d, PKT CNT : %d\n", packet_size, num_packets); - set_queue(qid); - user_bar.write<uint32_t>(0x4, packet_size); - user_bar.write<uint32_t>(0x20, num_packets); - } - - void generate_packets() - { - user_bar.write<uint32_t>(0x8, 0x2); - } - - BOOL read(void *buff, LONG addr, DWORD size) - { - if (INVALID_SET_FILE_POINTER == SetFilePointer(user_bar.h, static_cast<LONG>(addr), nullptr, FILE_BEGIN)) { - return FALSE; - } - - return ReadFile(user_bar.h, buff, size, &size, NULL); - } - - BOOL write(void *buff, LONG addr, DWORD size) - { - if (INVALID_SET_FILE_POINTER == SetFilePointer(user_bar.h, static_cast<LONG>(addr), nullptr, FILE_BEGIN)) { - return FALSE; - } - - return WriteFile(user_bar.h, buff, size, &size, NULL); - } - - BOOL generate_user_interrupt(UINT32 fun_id) - { - UINT32 val = 0x0; - - val = 0x00; - user_bar.write<uint32_t>(0x98, val); - - user_bar.write<uint32_t>(0x9C, val); - - val = 0x0; - val = fun_id << 12; - val |= 0x1; - if (fun_id == 0) - val |= (1u << 4); - user_bar.write<uint32_t>(0x94, val); - - return TRUE; - } - -private: - device_file user_bar; -}; - -class qdma_device { -public: - HANDLE cmplt_th_handle; - HANDLE cmplt_io_handle; - bool thread_run = false; - bool thread_exit = false; - bool xfer_done = false; - HANDLE sem_xfer_done; - ULONG xfer_size; - ULONG rxd_size; - - void async_env_init(void); - void async_env_exit(void); - void poll_completion(void); - - explicit qdma_device(const char* device_path) : dgen(device_path) - { - using namespace std::string_literals; - dev_path = device_path; - control_bar_.open(dev_path + "\\control"s, GENERIC_READ | GENERIC_WRITE); - mgmt.open(dev_path + "\\mgmt"s, GENERIC_READ | GENERIC_WRITE); - get_qstats(); - } - - ~qdma_device() - { - control_bar_.close(); - mgmt.close(); - } - - void get_qstats(void) - { - struct qstat_out qstats_info = { 0 }; - try { - mgmt.ioctl(IOCTL_QDMA_GET_QSTATS, NULL, 0, &qstats_info, sizeof(qstats_info)); - qbase = qstats_info.qbase; - qmax = qstats_info.qmax; - } - catch (const std::exception& e) { - cout << "IOCTL Failed for qstats " << e.what() << '\n'; - } - } - - unsigned int get_qmax() - { - return qmax; - } - - int qopen(ULONG qid, bool is_mm) - { - DWORD f_attribs = (FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING); - if (true == is_mm) - queue_.open(dev_path + "\\queue_"s + to_string(qid), GENERIC_READ | GENERIC_WRITE, f_attribs); - else - queue_.open(dev_path + "\\st_"s + to_string(qid), GENERIC_READ | GENERIC_WRITE, f_attribs); - - async_env_init(); - return 0; - } - - void qclose(void) - { - async_env_exit(); - queue_.close(); - } - - int qdma_read(); - int qdma_write(); - int qdma_interrupt(void); - -private: - const char* dev_path; - device_file control_bar_; - data_generator dgen; - device_file queue_; - device_file mgmt; - unsigned int qbase; - unsigned int qmax; -}; - -static BYTE* allocate_buffer(size_t size, size_t alignment); -static void print_bytes(size_t addr, BYTE* data, size_t length); -static int read_file_option(void); -static void print_bytes_binary(BYTE* data, size_t length); \ No newline at end of file diff --git a/QDMA/windows/apps/dma-arw/dma_arw.vcxproj b/QDMA/windows/apps/dma-arw/dma_arw.vcxproj deleted file mode 100644 index c2a6e3d..0000000 --- a/QDMA/windows/apps/dma-arw/dma_arw.vcxproj +++ /dev/null @@ -1,146 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <ItemGroup> - <ClInclude Include="dma_arw.hpp" /> - <ClInclude Include="version.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dma_arw.cpp" /> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{4898E717-0B00-487F-9F88-C95D61116871}</ProjectGuid> - <TemplateGuid>{504102d4-2172-473c-8adf-cd96e308f257}</TemplateGuid> - <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> - <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> - <Configuration>Debug</Configuration> - <Platform Condition="'$(Platform)' == ''">Win32</Platform> - <RootNamespace>qdma_arw</RootNamespace> - <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion> - <ProjectName>dma-arw</ProjectName> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64</LibraryPath> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PreprocessorDefinitions>_DEBUG;WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> - <AdditionalIncludeDirectories>$(SolutionDir)\apps\common\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <PreprocessorDefinitions>WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>$(SolutionDir)\sys\libqdma\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\apps\common\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PreprocessorDefinitions>_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <AdditionalIncludeDirectories>$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;$(SolutionDir)\apps\common\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> - <IgnoreSpecificDefaultLibraries /> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <PreprocessorDefinitions>WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>$(SolutionDir)\apps\common\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-arw/dma_arw.vcxproj.filters b/QDMA/windows/apps/dma-arw/dma_arw.vcxproj.filters deleted file mode 100644 index 56d6c33..0000000 --- a/QDMA/windows/apps/dma-arw/dma_arw.vcxproj.filters +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup> - <Filter Include="Source Files"> - <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> - </Filter> - <Filter Include="Header Files"> - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> - <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> - </Filter> - <Filter Include="Resource Files"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> - </Filter> - </ItemGroup> - <ItemGroup> - <ClInclude Include="version.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="dma_arw.hpp"> - <Filter>Header Files</Filter> - </ClInclude> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dma_arw.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - </ItemGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-arw/dma_arw.vcxproj.user b/QDMA/windows/apps/dma-arw/dma_arw.vcxproj.user deleted file mode 100644 index be25078..0000000 --- a/QDMA/windows/apps/dma-arw/dma_arw.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup /> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-arw/version.h b/QDMA/windows/apps/dma-arw/version.h deleted file mode 100644 index 63e122e..0000000 --- a/QDMA/windows/apps/dma-arw/version.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#ifndef __QDMARW_VERSION_H -#define __QDMARW_VERSION_H - -#define PROGNAME "dma-arw" -#define VERSION "2020.2.0" -#define COPYRIGHT "Copyright (c) 2020 Xilinx Inc." - -#endif /*__QDMARW_VERSION_H*/ diff --git a/QDMA/windows/apps/dma-ctl/dmactl.cpp b/QDMA/windows/apps/dma-ctl/dmactl.cpp deleted file mode 100644 index 0024867..0000000 --- a/QDMA/windows/apps/dma-ctl/dmactl.cpp +++ /dev/null @@ -1,1440 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include <windows.h> -#include <winioctl.h> -#include <iostream> -#include <algorithm> - -#include "device_file.hpp" -#include "qdma_driver_api.h" -#include "version.h" - -#define MAX_VALID_GLBL_IDX 15 -#define MAX_VALID_CMPT_SZ 3 -#define MAX_VALID_INTR_RING_VEC 8 -#define MAX_VALID_BAR_NUM 5 -#define MAX_CMPT_DESC_SZ 64 -#define MAX_INTR_RING_ENTRY_SZ 32 -#define MAX_DUMP_BUFF_SZ 64 * 1024 -#define MAX_REG_INFO_SZ 1024 - -#pragma comment(lib, "setupapi.lib") - -using std::uint32_t; -using std::string; -using std::runtime_error; -using std::cout; -using namespace std; - -const char *desc_engine_mode[] = { - "Internal and Bypass mode", - "Bypass only mode" - "Inernal only mode", -}; - - -static void help(void); - -static bool open_device(const char *dev_name, device_file& device) -{ - device_details dev_info; - - if (dev_name == NULL) { - cout << "Null Parameter provided for dev_name\n"; - return false; - } - - auto dev_details = get_device_details(GUID_DEVINTERFACE_QDMA); - - if (!dev_details.size()) { - cout << "No QDMA Devices found\n"; - return false; - } - - auto res = get_device(dev_details, dev_name, dev_info); - if (res == false) { - printf("Device name requested to open is not valid\n"); - return false; - } - - const auto& dev_path = dev_info.device_path; - device.open(dev_path + "\\mgmt", GENERIC_READ | GENERIC_WRITE); - - return true; -} - -bool sort_fun(device_details d1, device_details d2) -{ - UINT32 bdf_1 = 0x0, bdf_2 = 0x0; - - bdf_1 = (d1.bus_no << 12) | (d1.dev_no << 4) | d1.fun_no; - bdf_2 = (d2.bus_no << 12) | (d2.dev_no << 4) | d2.fun_no; - return (bdf_1 < bdf_2); -} - -static int get_qrange(const char *dev_name, unsigned int& qmax, unsigned int& qbase) -{ - try { - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 1; - - struct qstat_out qstats_info = { 0 }; - device.ioctl(IOCTL_QDMA_GET_QSTATS, NULL, 0, &qstats_info, sizeof(qstats_info)); - qmax = qstats_info.qmax; - qbase = qstats_info.qbase; - } - catch (const std::exception& e) { - cout << "Failed to get qmax from ioctl : " << e.what() << '\n'; - } - - return 0; -} - -static int handle_dev_cmds(const int argc, char* argv[]) -{ - auto i = 0; - - if (0 == argc) { - return 1; - } - - while (i < argc) { - if (strcmp(argv[i], "list") == 0) { - auto device_details = get_device_details(GUID_DEVINTERFACE_QDMA); - UINT32 prev_bus = 0x000000; - - if (!device_details.size()) { - printf("\nNo QDMA Devices present in the system\n\n"); - break; - } - - std::sort(device_details.begin(), device_details.end(), sort_fun); - - for (auto idx = 0; idx < (int)device_details.size(); idx++) { - unsigned int qmax = 0, qbase = 0; - int ret = get_qrange(device_details[idx].device_name.c_str(), qmax, qbase); - if (ret) - return 1; - - auto bus_no = device_details[idx].bus_no; - auto dev_no = device_details[idx].dev_no; - auto fun_no = device_details[idx].fun_no; - auto end_q = qbase + qmax - 1; - - if (prev_bus != bus_no) { - printf("\n"); - prev_bus = bus_no; - } - - printf("%s\t0000:%02X:%02X:%01X\tmaxQP: %d, %d~%d\n", device_details[idx].device_name.c_str(), bus_no, dev_no, fun_no, qmax, qbase, end_q); - } - printf("\n"); - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - ++i; - } - - return 0; -} -static int handle_csr_cmds(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - while (i < argc) { - if (strcmp(argv[i], "dump") == 0) { - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_CSR_DUMP; - - cmd.csr.out = (struct csr_conf_out *)new struct csr_conf_out; - - try { - device.ioctl(ioctl_code, NULL, 0, cmd.csr.out, sizeof(struct csr_conf_out)); - printf("Global CSR :\n"); - - printf("Index Ring size Timer count Threshold count Buffer size\n"); - for (auto ind = 0; ind < QDMA_CSR_SZ; ++ind) - printf("%-10d%-20u%-20u%-20u%-20u\n", - ind, - cmd.csr.out->ring_sz[ind], - cmd.csr.out->c2h_timer_cnt[ind], - cmd.csr.out->c2h_th_cnt[ind], - cmd.csr.out->c2h_buff_sz[ind]); - - delete cmd.csr.out; - } - catch (const std::exception& e) { - delete cmd.csr.out; - cout << "Failed to dump CSR from ioctl : " << e.what() << '\n'; - } - } - else { - return 1; - } - - ++i; - } - - return 0; -} - -static int handle_devinfo(const char *dev_name) -{ - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_DEVINFO; - - cmd.dev_info.out = (struct device_info_out *)new struct device_info_out; - - try { - device.ioctl(ioctl_code, NULL, 0, cmd.dev_info.out, sizeof(struct device_info_out)); - - printf("=============Hardware Version=================\n"); - printf("%-35s : %s\n", "RTL Version", cmd.dev_info.out->ver_info.qdma_rtl_version_str); - printf("%-35s : %s\n", "Vivado ReleaseID", cmd.dev_info.out->ver_info.qdma_vivado_release_id_str); - printf("%-35s : %s\n", "Device Type", cmd.dev_info.out->ver_info.qdma_device_type_str); - if (strstr(cmd.dev_info.out->ver_info.qdma_device_type_str, "Versal IP") != NULL) - printf("%-35s : %s\n", "Versal IP Type", cmd.dev_info.out->ver_info.qdma_versal_ip_type_str); - printf("\n"); - - printf("=============Software Version=================\n"); - printf("%-35s : %s\n", "qdma driver version", cmd.dev_info.out->ver_info.qdma_sw_version); - printf("\n"); - - printf("=============Hardware Capabilities============\n"); - - printf("%-35s : %d\n", "Number of PFs supported", cmd.dev_info.out->num_pfs); - printf("%-35s : %d\n", "Total number of queues supported", cmd.dev_info.out->num_qs); - printf("%-35s : %d\n", "MM channels", cmd.dev_info.out->num_mm_channels); - printf("%-35s : %s\n", "FLR Present", cmd.dev_info.out->flr_present ? "yes" : "no"); - printf("%-35s : %s\n", "ST enabled", cmd.dev_info.out->st_en ? "yes" : "no"); - printf("%-35s : %s\n", "MM enabled", cmd.dev_info.out->mm_en ? "yes" : "no"); - printf("%-35s : %s\n", "Mailbox enabled", cmd.dev_info.out->mailbox_en ? "yes" : "no"); - printf("%-35s : %s\n", "MM completion enabled", cmd.dev_info.out->mm_cmpl_en ? "yes" : "no"); - printf("%-35s : %s\n", "Debug Mode enabled", cmd.dev_info.out->debug_mode ? "yes" : "no"); - if (cmd.dev_info.out->desc_eng_mode < sizeof(desc_engine_mode) / sizeof(desc_engine_mode[0])) { - printf("%-35s : %s\n", "Desc Engine Mode", desc_engine_mode[cmd.dev_info.out->desc_eng_mode]); - } - else { - printf("%-35s : %s\n", "Desc Engine Mode", "Invalid"); - } - - printf("\n"); - - delete cmd.dev_info.out; - } - catch (const std::exception& e) { - delete cmd.dev_info.out; - cout << "Failed to get devinfo from ioctl : " << e.what() << '\n'; - } - return 0; -} - -static int handle_qmax(const char *dev_name, const int argc, char* argv[]) -{ - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_SET_QMAX; - - if (argc > 1) { - cout << "Only one argument is required" << endl; - return 1; - } - - cmd.qmax_info.in.qmax = (unsigned short)strtoul(argv[0], NULL, 0); - - try { - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - device.ioctl(ioctl_code, &cmd.qmax_info.in, sizeof(cmd.qmax_info.in), NULL, 0); - cout << "Set qmax successfull" << endl; - } - catch (const std::exception& e) { - cout << "Failed to set qmax.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_qstats(const char *dev_name) -{ - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_GET_QSTATS; - cmd.qstats_info.out = new struct qstat_out; - - try { - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - device.ioctl(ioctl_code, NULL, 0, cmd.qstats_info.out, sizeof(struct qstat_out)); - - printf("Device : %s\n", dev_name); - printf("Maximum queues : %u\n", cmd.qstats_info.out->qmax); - printf("Active H2C queues : %u\n", cmd.qstats_info.out->active_h2c_queues); - printf("Active C2H queues : %u\n", cmd.qstats_info.out->active_c2h_queues); - printf("Active CMPT queues : %u\n", cmd.qstats_info.out->active_cmpt_queues); - } - catch (const std::exception& e) { - cout << "Failed to set qmax.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_add_queue(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_QUEUE_ADD; - bool mode, qid, h2c_ring_sz, c2h_ring_sz, c2h_timer, c2h_th, c2h_buff_sz; - bool cmplsz, trigmode; - mode = qid = h2c_ring_sz = c2h_ring_sz = c2h_timer = c2h_th = c2h_buff_sz = false; - cmplsz = trigmode = false; - - while (i < argc) { - if (strcmp(argv[i], "mode") == 0) { - ++i; - - if (strcmp(argv[i], "mm") == 0) { - cmd.q_conf.in.is_st = 0; - } - else if (strcmp(argv[i], "st") == 0) { - cmd.q_conf.in.is_st = 1; - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - mode = true; - } - else if (strcmp(argv[i], "qid") == 0) { - ++i; - cmd.q_conf.in.qid = (unsigned short)strtoul(argv[i], NULL, 0); - cout << "Adding queue ::" << cmd.q_conf.in.qid << endl; - qid = true; - } - else if (strcmp(argv[i], "en_mm_cmpl") == 0) { - cmd.q_conf.in.en_mm_cmpl = true; - } - else if (strcmp(argv[i], "idx_h2c_ringsz") == 0) { - ++i; - cmd.q_conf.in.h2c_ring_sz_index = (unsigned char)strtoul(argv[i], NULL, 0); - if (MAX_VALID_GLBL_IDX < cmd.q_conf.in.h2c_ring_sz_index) { - cout << "Invalid h2c ring size index : " << argv[i] << endl; - return 1; - } - h2c_ring_sz = true; - } - else if (strcmp(argv[i], "idx_c2h_ringsz") == 0) { - ++i; - cmd.q_conf.in.c2h_ring_sz_index = (unsigned char)strtoul(argv[i], NULL, 0); - if (MAX_VALID_GLBL_IDX < cmd.q_conf.in.c2h_ring_sz_index) { - cout << "Invalid c2h ring size index : " << argv[i] << endl; - return 1; - } - c2h_ring_sz = true; - } - else if (strcmp(argv[i], "idx_c2h_timer") == 0) { - ++i; - cmd.q_conf.in.c2h_timer_cnt_index = (unsigned char)strtoul(argv[i], NULL, 0); - if (MAX_VALID_GLBL_IDX < cmd.q_conf.in.c2h_timer_cnt_index) { - cout << "Invalid c2h timer index : " << argv[i] << endl; - return 1; - } - c2h_timer = true; - } - else if (strcmp(argv[i], "idx_c2h_th") == 0) { - ++i; - cmd.q_conf.in.c2h_th_cnt_index = (unsigned char)strtoul(argv[i], NULL, 0); - if (MAX_VALID_GLBL_IDX < cmd.q_conf.in.c2h_th_cnt_index) { - cout << "Invalid c2h threshold index : " << argv[i] << endl; - return 1; - } - c2h_th = true; - } - else if (strcmp(argv[i], "idx_c2h_bufsz") == 0) { - ++i; - cmd.q_conf.in.c2h_buff_sz_index = (unsigned char)strtoul(argv[i], NULL, 0); - if (MAX_VALID_GLBL_IDX < cmd.q_conf.in.c2h_buff_sz_index) { - cout << "Invalid c2h buffer size index : " << argv[i] << endl; - return 1; - } - c2h_buff_sz = true; - } - else if (strcmp(argv[i], "cmptsz") == 0) { - ++i; - unsigned char compl_sz = (unsigned char)strtoul(argv[i], NULL, 0); - if (compl_sz == 0) - cmd.q_conf.in.compl_sz = CMPT_DESC_SZ_8B; - else if (compl_sz == 1) - cmd.q_conf.in.compl_sz = CMPT_DESC_SZ_16B; - else if (compl_sz == 2) - cmd.q_conf.in.compl_sz = CMPT_DESC_SZ_32B; - else if (compl_sz == 3) - cmd.q_conf.in.compl_sz = CMPT_DESC_SZ_64B; - else { - cout << "Invalid c2h completion size : " << argv[i] << endl; - return 1; - } - cmplsz = true; - } - else if (strcmp(argv[i], "trigmode") == 0) { - ++i; - - if (strcmp(argv[i], "every") == 0) { - cmd.q_conf.in.trig_mode = TRIG_MODE_EVERY; - } - else if (strcmp(argv[i], "usr_cnt") == 0) { - cmd.q_conf.in.trig_mode = TRIG_MODE_USER_COUNT; - } - else if (strcmp(argv[i], "usr") == 0) { - cmd.q_conf.in.trig_mode = TRIG_MODE_USER; - } - else if (strcmp(argv[i], "usr_tmr") == 0) { - cmd.q_conf.in.trig_mode = TRIG_MODE_USER_TIMER; - } - else if (strcmp(argv[i], "usr_tmr_cnt") == 0) { - cmd.q_conf.in.trig_mode = TRIG_MODE_USER_TIMER_COUNT; - } - else { - cout << "Invalid trigger mode : " << argv[i] << endl; - return 1; - } - - trigmode = true; - } - else if (strcmp(argv[i], "sw_desc_sz") == 0) { - ++i; - cmd.q_conf.in.sw_desc_sz = (unsigned char)strtoul(argv[i], NULL, 0); - if (cmd.q_conf.in.sw_desc_sz != 3) { - cout << "sw_desc_sz must be 3\n"; - cout << "Only 64B descriptor(3) can be configured in bypass mode\n"; - return 1; - } - } - else if (strcmp(argv[i], "desc_bypass_en") == 0) { - cmd.q_conf.in.desc_bypass_en = true; - } - else if (strcmp(argv[i], "pfch_en") == 0) { - cmd.q_conf.in.pfch_en = true; - } - else if (strcmp(argv[i], "pfch_bypass_en") == 0) { - cmd.q_conf.in.pfch_bypass_en = true; - } - else if (strcmp(argv[i], "cmpl_ovf_dis") == 0) { - cmd.q_conf.in.cmpl_ovf_dis = true; - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - - ++i; - } - - if (!mode || !qid || !h2c_ring_sz || !c2h_ring_sz) { - cout << "Insufficient options provided\n"; - return 1; - } - - if (!cmd.q_conf.in.is_st && - (c2h_buff_sz || cmd.q_conf.in.pfch_en - || cmd.q_conf.in.pfch_bypass_en)) { - cout << "Invalid arguments for MM mode\n"; - return 1; - } - - if ((!cmd.q_conf.in.desc_bypass_en) && (cmd.q_conf.in.sw_desc_sz == 3)) { - cout << "Invalid Parameter Combination : "; - cout << "desc_bypass_en : " << cmd.q_conf.in.desc_bypass_en << ", sw_desc_sz : " << cmd.q_conf.in.sw_desc_sz << endl; - cout << "64 Byte Descriptor supported only when descriptor bypass is enabled\n"; - } - - try { - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - device.ioctl(ioctl_code, &cmd.q_conf.in, sizeof(cmd.q_conf.in), NULL, 0); - cout << "Added Queue " << cmd.q_conf.in.qid << " Successfully\n"; - } - catch (const std::exception& e) { - cout << "Failed to add queue.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_start_queue(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_QUEUE_START; - - while (i < argc) { - if (strcmp(argv[i], "qid") == 0) { - ++i; - cmd.q_conf.in.qid = (unsigned short)strtoul(argv[i], NULL, 0); - cout << "Starting queue :: " << cmd.q_conf.in.qid << endl; - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - - ++i; - } - - try { - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - device.ioctl(ioctl_code, &cmd.q_conf.in, sizeof(cmd.q_conf.in), NULL, 0); - cout << "Started Queue " << cmd.q_conf.in.qid << " Successfully\n"; - } - catch (const std::exception& e) { - cout << "Failed to start queue.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_stop_queue(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_QUEUE_STOP; - - while (i < argc) { - if (strcmp(argv[i], "qid") == 0) { - ++i; - cmd.q_conf.in.qid = (unsigned short)strtoul(argv[i], NULL, 0); - cout << "Stopping queue : " << cmd.q_conf.in.qid << endl; - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - - ++i; - } - - try { - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - device.ioctl(ioctl_code, &cmd.q_conf.in, sizeof(cmd.q_conf.in), NULL, 0); - cout << "Stopped Queue " << cmd.q_conf.in.qid << " Successfully\n"; - } - catch (const std::exception& e) { - cout << "Failed to stop queue.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_delete_queue(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_QUEUE_DELETE; - - while (i < argc) { - if (strcmp(argv[i], "qid") == 0) { - ++i; - cmd.q_conf.in.qid = (unsigned short)strtoul(argv[i], NULL, 0); - cout << "Deleting queue :: " << cmd.q_conf.in.qid << endl; - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - - ++i; - } - - try { - device_file device; - - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - device.ioctl(ioctl_code, &cmd.q_conf.in, sizeof(cmd.q_conf.in), NULL, 0); - cout << "Deleted Queue " << cmd.q_conf.in.qid << " Successfully\n"; - } - catch (const std::exception& e) { - cout << "Failed to delete queue.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_queue_state(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_QUEUE_DUMP_STATE; - - if (i == argc) { - cout << "insufficient argument\n"; - return 1; - } - - while (i < argc) { - if (strcmp(argv[i], "qid") == 0) { - ++i; - cmd.q_state.in.qid = static_cast<unsigned short>(strtoul(argv[i], NULL, 0)); - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - - ++i; - } - - try { - device_file device; - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - cmd.q_state.out = (struct queue_state_out *)new struct queue_state_out; - - if (device.ioctl(ioctl_code, &cmd.q_state.in, sizeof(cmd.q_state.in), - cmd.q_state.out, sizeof(struct queue_state_out))) { - printf("%5s%20s\n", "QID", "STATE"); - printf("%5s%20s\n", "---", "-----"); - printf("%5u%20s\n", cmd.q_state.in.qid, cmd.q_state.out->state); - } - delete cmd.q_state.out; - } - catch (const std::exception& e) { - delete cmd.q_state.out; - cout << "Failed to get queue state.\n" << e.what() << '\n'; - } - - return 0; -} -static int handle_queue_dump(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - bool qid_valid = false, dir_valid = false, desc_valid = false, cmpt_valid = false; - bool type_valid = false; - bool ctx_valid = false; - unsigned short qid = 0; - enum queue_direction dir = QUEUE_DIR_H2C; - enum ring_type type = ring_type::RING_TYPE_H2C; - ioctl_cmd cmd = {}; - DWORD ioctl_code = 0; - - if (i == argc) { - cout << "insufficient argument\n"; - return 1; - } - - while (i < argc) { - if (strcmp(argv[i], "qid") == 0) { - if (argv[i + 1] == NULL) { - cout << "Insufficient options provided\n"; - cout << "qid option needs as an argument : <qid no>\n"; - return 1; - } - - ++i; - qid = static_cast<unsigned short>(strtoul(argv[i], NULL, 0)); - qid_valid = true; - } - else if (strcmp(argv[i], "dir") == 0) { - if (argv[i + 1] == NULL) { - cout << "Insufficient options provided\n"; - cout << "dir option needs as an argument : h2c/c2h\n"; - return 1; - } - - ++i; - if (strcmp(argv[i], "h2c") == 0) { - dir = QUEUE_DIR_H2C; - } - else if (strcmp(argv[i], "c2h") == 0) { - dir = QUEUE_DIR_C2H; - } - else { - cout << "Invalid direction : " << argv[i] << endl; - return 1; - } - dir_valid = true; - } - else if (strcmp(argv[i], "type") == 0) { - if (argv[i + 1] == NULL) { - cout << "Insufficient options provided\n"; - cout << "type option needs as an argument : h2c/c2h/cmpt\n"; - return 1; - } - - ++i; - if (strcmp(argv[i], "h2c") == 0) { - type = ring_type::RING_TYPE_H2C; - } - else if (strcmp(argv[i], "c2h") == 0) { - type = ring_type::RING_TYPE_C2H; - } - else if (strcmp(argv[i], "cmpt") == 0) { - type = ring_type::RING_TYPE_CMPT; - } - else { - cout << "Invalid ring type : " << argv[i] << endl; - return 1; - } - type_valid = true; - } - else if (strcmp(argv[i], "desc") == 0) { - if ((argv[i + 1] == NULL) || (argv[i + 2] == NULL)) { - cout << "Insufficient options provided\n"; - cout << "desc option needs two arguments : <start desc no> and <end desc no>\n"; - return 1; - } - - ioctl_code = IOCTL_QDMA_QUEUE_DUMP_DESC; - cmd.desc_info.in.desc_type = RING_DESC; - - ++i; - cmd.desc_info.in.desc_start = strtoul(argv[i], NULL, 0); - - ++i; - cmd.desc_info.in.desc_end = strtoul(argv[i], NULL, 0); - - if (cmd.desc_info.in.desc_end < cmd.desc_info.in.desc_start) { - cout << "Insufficient range : "; - cout << cmd.desc_info.in.desc_start << "~" << cmd.desc_info.in.desc_end << endl; - return 1; - } - - desc_valid = true; - } - else if (strcmp(argv[i], "cmpt") == 0) { - if ((argv[i + 1] == NULL) || (argv[i + 2] == NULL)) { - cout << "Insufficient options provided\n"; - cout << "desc option needs two arguments : <start desc no> and <end desc no>\n"; - return 1; - } - - ioctl_code = IOCTL_QDMA_QUEUE_DUMP_DESC; - cmd.desc_info.in.desc_type = CMPT_DESC; - - ++i; - cmd.desc_info.in.desc_start = strtoul(argv[i], NULL, 0); - - ++i; - cmd.desc_info.in.desc_end = strtoul(argv[i], NULL, 0); - - if (cmd.desc_info.in.desc_end < cmd.desc_info.in.desc_start) { - cout << "Insufficient range : "; - cout << cmd.desc_info.in.desc_start << "~" << cmd.desc_info.in.desc_end << endl; - return 1; - } - - cmpt_valid = true; - } - else if (strcmp(argv[i], "ctx") == 0) { - ioctl_code = IOCTL_QDMA_QUEUE_DUMP_CTX; - ctx_valid = true; - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - - ++i; - } - - if (!qid_valid || (!dir_valid && !cmpt_valid && !type_valid) || - (!desc_valid && !cmpt_valid && !ctx_valid) || - (type_valid ^ ctx_valid)) { - cout << "Insufficient options provided\n"; - return 1; - } - - try { - device_file device; - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - unsigned int size; - unsigned int out_size; - - if (ctx_valid) { - cmd.ctx_info.in.qid = qid; - cmd.ctx_info.in.type = type; - /* Allocate memory for the maximum possible context size */ - size = MAX_DUMP_BUFF_SZ; - - out_size = sizeof(struct ctx_dump_info_out) + size; - cmd.ctx_info.out = (struct ctx_dump_info_out *)new char[out_size]; - cmd.ctx_info.out->ret_sz = 0; - - device.ioctl(ioctl_code, &cmd.ctx_info.in, sizeof(cmd.ctx_info.in), - cmd.ctx_info.out, out_size); - - if (!cmd.ctx_info.out->ret_sz) { - printf("Failed to dump the queue context\n"); - } - else { - char *addr = (char *)&cmd.ctx_info.out->pbuffer[0]; - for (i = 0; ((i < (int)cmd.ctx_info.out->ret_sz) && (addr[i] != '\0')); i++) { - printf("%c", addr[i]); - } - } - delete[] cmd.ctx_info.out; - } - else { - cmd.desc_info.in.qid = qid; - cmd.desc_info.in.dir = dir; - /* Allocate memory for the maximum possible combination of desc size */ - size = (cmd.desc_info.in.desc_end - cmd.desc_info.in.desc_start + 1) * 64; - - out_size = sizeof(struct desc_dump_info_out) + size; - cmd.desc_info.out = (struct desc_dump_info_out *)new unsigned char[out_size]; - cmd.desc_info.out->desc_sz = 0; - cmd.desc_info.out->data_sz = 0; - - device.ioctl(ioctl_code, &cmd.desc_info.in, sizeof(cmd.desc_info.in), - cmd.desc_info.out, out_size); - - if (!&cmd.desc_info.out->desc_sz || !cmd.desc_info.out->data_sz) { - printf("Failed to dump the queue descriptors\n"); - } - else { - auto desc_index = cmd.desc_info.in.desc_start; - auto desc_cnt = cmd.desc_info.out->data_sz / cmd.desc_info.out->desc_sz; - auto n = cmd.desc_info.out->desc_sz / 4; - UINT32 *addr = (UINT32 *)&cmd.desc_info.out->pbuffer[0]; - - for (i = 0; i < (int)desc_cnt; i++) { - printf("%5d : ", desc_index++); - for (UINT16 j = 0; j < n; j++) { - printf("%08X ", addr[(i * n) + j]); - } - printf("\n"); - } - } - - - delete[] cmd.desc_info.out; - } - } - catch (const std::exception& e) { - if (ctx_valid) - delete[] cmd.ctx_info.out; - else - delete[] cmd.desc_info.out; - - cout << "Failed to dump queue descriptors.\n" << e.what() << '\n'; - } - - return 0; - -} - -static int handle_queue_cmpt_read(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - bool qid_valid = false; - ioctl_cmd cmd = {}; - DWORD ioctl_code = 0x0; - - if (i == argc) { - cout << "insufficient argument\n"; - return 1; - } - - while (i < argc) { - if (strcmp(argv[i], "qid") == 0) { - if (argv[i + 1] == NULL) { - cout << "Insufficient options provided\n"; - cout << "qid option needs as an argument : <qid no>\n"; - return 1; - } - - ++i; - cmd.cmpt_info.in.qid = static_cast<unsigned short>(strtoul(argv[i], NULL, 0)); - qid_valid = true; - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - - ++i; - } - - if (!qid_valid) { - cout << "Insufficient options provided: qid option is must to execute cmpt_read command\n"; - return 1; - } - - try { - device_file device; - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - unsigned int size = 10 * MAX_CMPT_DESC_SZ; - ioctl_code = IOCTL_QDMA_QUEUE_CMPT_READ; - - unsigned int out_size = sizeof(struct cmpt_data_info_out) + size; - cmd.cmpt_info.out = (struct cmpt_data_info_out *)new unsigned char[out_size]; - bool is_data_avail = false; - UINT32 cmpt_data_idx = 0; - do { - cmd.cmpt_info.out->ret_len = 0; - cmd.cmpt_info.out->cmpt_desc_sz = 0; - - memset(&cmd.cmpt_info.out->pbuffer[0], 0xDEADBEEF, size); - - device.ioctl(ioctl_code, &cmd.cmpt_info.in, sizeof(cmd.cmpt_info.in), - cmd.cmpt_info.out, out_size); - - if (!cmd.cmpt_info.out->cmpt_desc_sz || !cmd.cmpt_info.out->ret_len) { - if (is_data_avail == false) - printf("Completion Data not available\n"); - } - else { - is_data_avail = true; - auto n = cmd.cmpt_info.out->cmpt_desc_sz / 4; - auto desc_cnt = cmd.cmpt_info.out->ret_len / cmd.cmpt_info.out->cmpt_desc_sz; - UINT32 *addr = (UINT32 *)&cmd.cmpt_info.out->pbuffer[0]; - for (i = 0; i < (int)desc_cnt; i++) { - printf("%5d : ", cmpt_data_idx++); - for (auto j = 0U; j < n; j++) { - printf("%08X ", addr[(i * n) + j]); - } - printf("\n"); - } - } - } while (cmd.cmpt_info.out->ret_len); - - delete[] cmd.cmpt_info.out; - } - catch (const std::exception& e) { - delete[] cmd.cmpt_info.out; - cout << "Failed to execute cmpt_read command.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_queue_listall(const char *dev_name) -{ - ioctl_cmd cmd = {}; - DWORD ioctl_code = IOCTL_QDMA_QUEUE_DUMP_STATE; - - try { - device_file device; - unsigned int qmax = 0, qbase = 0; - bool ret = open_device(dev_name, device); - if (ret == false) - return 0; - - ret = get_qrange(dev_name, qmax, qbase); - if (ret) - return 1; - - cmd.q_state.out = (struct queue_state_out *)new struct queue_state_out; - - printf("%5s%20s\n", "QID", "STATE"); - printf("%5s%20s\n", "---", "-----"); - for (unsigned short i = 0; i < qmax; i++) { - memset(cmd.q_state.out, 0, sizeof(struct queue_state_out)); - - cmd.q_state.in.qid = i; - - if (device.ioctl(ioctl_code, &cmd.q_state.in, sizeof(cmd.q_state.in), - cmd.q_state.out, sizeof(struct queue_state_out))) { - printf("%5u%20s\n", cmd.q_state.in.qid, cmd.q_state.out->state); - } - } - delete cmd.q_state.out; - } - catch (const std::exception& e) { - delete cmd.q_state.out; - cout << "Failed to get queue state.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_intring_dump(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - bool vector_valid = false; - bool index_valid = false; - ioctl_cmd cmd = {}; - DWORD ioctl_code = 0x0; - - if (i == argc) { - cout << "insufficient argument\n"; - return 1; - } - - while (i < argc) { - if (strcmp(argv[i], "vector") == 0) { - if ((argv[i + 1] == NULL) || (argv[i + 2] == NULL) || (argv[i + 3] == NULL)) { - cout << "Insufficient options provided\n"; - cout << "vector option needs as three arguments : <vec id> <start idx> <end idx>\n"; - return 1; - } - - ++i; - cmd.int_ring_info.in.vec_id = strtoul(argv[i], NULL, 0); - if (MAX_VALID_INTR_RING_VEC < cmd.int_ring_info.in.vec_id) { - cout << "Invalid intr vector id : " << argv[i] << endl; - break; - } - vector_valid = true; - - ++i; - cmd.int_ring_info.in.start_idx = strtoul(argv[i], NULL, 0); - ++i; - cmd.int_ring_info.in.end_idx = strtoul(argv[i], NULL, 0); - if (cmd.int_ring_info.in.start_idx > cmd.int_ring_info.in.end_idx) { - cout << "Start index must be less than or equal to end index" << endl; - break; - } - index_valid = true; - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - ++i; - } - - if (!vector_valid || !index_valid) { - cout << "Insufficient options provided\n"; - return 1; - } - - try { - device_file device; - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - unsigned int size = - (cmd.int_ring_info.in.end_idx - cmd.int_ring_info.in.start_idx + 1) * MAX_INTR_RING_ENTRY_SZ; - - unsigned int out_size = sizeof (struct intring_info_out) + size; - - cmd.int_ring_info.out = (struct intring_info_out *)new unsigned char[out_size]; - - cmd.int_ring_info.out->ret_len = 0; - cmd.int_ring_info.out->ring_entry_sz = 0; - - ioctl_code = IOCTL_QDMA_INTRING_DUMP; - - device.ioctl(ioctl_code, &cmd.int_ring_info.in, sizeof(cmd.int_ring_info.in), - cmd.int_ring_info.out, out_size); - - if (!cmd.int_ring_info.out->ring_entry_sz || !cmd.int_ring_info.out->ret_len) { - printf("Failed to dump the intr ring\n"); - } - else { - auto start_idx = cmd.int_ring_info.in.start_idx; - auto ring_entry_cnt = cmd.int_ring_info.out->ret_len / cmd.int_ring_info.out->ring_entry_sz; - auto n = cmd.int_ring_info.out->ring_entry_sz / 4; - UINT32 *addr = (UINT32 *)&cmd.int_ring_info.out->pbuffer[0]; - for (i = 0; i < (int)ring_entry_cnt; i++) { - printf("%5d : ", start_idx++); - for (UINT16 j = 0; j < n; j++) { - printf("%08X ", addr[(i * n) + j]); - } - printf("\n"); - } - } - delete[] cmd.int_ring_info.out; - } - catch (const std::exception& e) { - delete[] cmd.int_ring_info.out; - cout << "Failed to execute intring dump command.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_reg_dump(const char *dev_name, const int argc, char* argv[]) -{ - UNREFERENCED_PARAMETER(argc); - UNREFERENCED_PARAMETER(argv); - - ioctl_cmd cmd = {}; - DWORD ioctl_code = 0x0; - - try { - device_file device; - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - unsigned int size = MAX_DUMP_BUFF_SZ; - - unsigned int out_size = sizeof(struct regdump_info_out) + size; - cmd.reg_dump_info.out = (struct regdump_info_out *)new char[out_size]; - cmd.reg_dump_info.out->ret_len = 0; - - ioctl_code = IOCTL_QDMA_REG_DUMP; - - device.ioctl(ioctl_code, NULL, 0, cmd.reg_dump_info.out, out_size); - - if (!cmd.reg_dump_info.out->ret_len) { - printf("Failed to dump the registers\n"); - } - else { - char *addr = (char *)&cmd.reg_dump_info.out->pbuffer[0]; - for (auto i = 0; ((i < (int)cmd.reg_dump_info.out->ret_len) && (addr[i] != '\0')); i++) { - printf("%c", addr[i]); - } - } - delete[] cmd.reg_dump_info.out; - } - catch (const std::exception& e) { - delete[] cmd.reg_dump_info.out; - cout << "Failed to execute reg dump command.\n" << e.what() << '\n'; - } - - return 0; -} - - -static int handle_reg_info(const char* dev_name, const int argc, char* argv[]) -{ - UNREFERENCED_PARAMETER(dev_name); - UNREFERENCED_PARAMETER(argc); - UNREFERENCED_PARAMETER(argv); - auto i = 0; - bool bar_valid = false; - ioctl_cmd cmd = {}; - DWORD ioctl_code = 0x0; - - if (i == argc) { - cout << "insufficient arguments\n"; - return 1; - } - - while (i < argc) { - if (strcmp(argv[i], "bar") == 0) { - if ((argv[i + 1] == NULL) || (argv[i + 2] == NULL)) { - cout << "Insufficient options provided\n"; - cout << "bar option needs atleast two arguments : <bar_num> <address> [num_regs <M>]\n"; - return 1; - } - - ++i; - cmd.reg_info.in.bar_no = strtoul(argv[i], NULL, 0); - if ((MAX_VALID_BAR_NUM < cmd.reg_info.in.bar_no) && - ((cmd.reg_info.in.bar_no % 2) != 0)) { - cout << "Invalid BAR number provided : " << argv[i] << endl; - break; - } - cmd.reg_info.in.bar_no = cmd.reg_info.in.bar_no / 2; - bar_valid = true; - - ++i; - cmd.reg_info.in.address = strtoul(argv[i], NULL, 0); - - ++i; - if ((argv[i] != NULL) && (strcmp(argv[i], "num_regs")) == 0) { - cmd.reg_info.in.reg_cnt = strtoul(argv[i + 1], NULL, 0); - ++i; - } - else { - cmd.reg_info.in.reg_cnt = 1; - } - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - ++i; - } - - if (!bar_valid) { - return 1; - } - - try { - device_file device; - auto ret = open_device(dev_name, device); - if (ret == false) - return 0; - - unsigned int size = (cmd.reg_info.in.reg_cnt * MAX_REG_INFO_SZ); - unsigned int out_size = sizeof(struct reg_info_out) + size; - cmd.reg_info.out = (struct reg_info_out *)new char[out_size]; - cmd.reg_info.out->ret_len = 0; - - ioctl_code = IOCTL_QDMA_REG_INFO; - - device.ioctl(ioctl_code, &cmd.reg_info.in, sizeof(cmd.reg_info.in), - cmd.reg_info.out, out_size); - - if (!cmd.reg_info.out->ret_len) { - printf("Failed to dump the registers\n"); - } - else { - char* data = (char*)&cmd.reg_info.out->pbuffer[0]; - for (i = 0; ((i < (int)cmd.reg_info.out->ret_len) && - (data[i] != '\0')); i++) { - printf("%c", data[i]); - } - } - delete[] cmd.reg_info.out; - } - catch (const std::exception& e) { - delete[] cmd.reg_info.out; - cout << "Failed to execute reg info command.\n" << e.what() << '\n'; - } - - return 0; -} - -static int handle_queue_cmds(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - - while (i < argc) { - if (strcmp(argv[i], "add") == 0) { - ++i; - return handle_add_queue(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "start") == 0) { - ++i; - return handle_start_queue(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "stop") == 0) { - ++i; - return handle_stop_queue(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "delete") == 0) { - ++i; - return handle_delete_queue(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "state") == 0) { - ++i; - return handle_queue_state(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "dump") == 0) { - ++i; - return handle_queue_dump(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "cmpt_read") == 0) { - ++i; - return handle_queue_cmpt_read(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "listall") == 0) { - ++i; - return handle_queue_listall(dev_name); - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - } - - return 0; -} - -static int handle_intring_cmds(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - - while (i < argc) { - if (strcmp(argv[i], "dump") == 0) { - ++i; - return handle_intring_dump(dev_name, argc - i, argv + i); - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - } - return 0; -} - -static int handle_reg_cmds(const char *dev_name, const int argc, char* argv[]) -{ - auto i = 0; - - while (i < argc) { - if (strcmp(argv[i], "dump") == 0) { - ++i; - return handle_reg_dump(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "info") == 0) { - ++i; - return handle_reg_info(dev_name, argc - i, argv + i); - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } - } - return 0; -} - -static int process_cli(const int argc, char* argv[]) -{ - auto i = 1; - char dev_name[DEV_NAME_MAX_SZ]; - - if (strcmp(argv[1], "dev") == 0) { - ++i; - return handle_dev_cmds(argc - i, argv + i); - } - else if (strncmp(argv[1], "qdma", 4) == 0) { - strncpy_s(dev_name, DEV_NAME_MAX_SZ, argv[1], _TRUNCATE); - ++i; - } - else if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "/?") == 0)) { - help(); - return 0; - } - else if ((strcmp(argv[1], "-v") == 0) || (strcmp(argv[1], "-V") == 0)) { - printf("%s version %s\n", PROGNAME, VERSION); - printf("%s\n", COPYRIGHT); - return 0; - } - - if (strcmp(argv[i], "csr") == 0) { - ++i; - return handle_csr_cmds(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "devinfo") == 0) { - ++i; - return handle_devinfo(dev_name); - } - else if (strcmp(argv[i], "qmax") == 0) { - ++i; - return handle_qmax(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "qstats") == 0) { - ++i; - return handle_qstats(dev_name); - } - else if (strcmp(argv[i], "queue") == 0) { - ++i; - return handle_queue_cmds(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "intring") == 0) { - ++i; - return handle_intring_cmds(dev_name, argc - i, argv + i); - } - else if (strcmp(argv[i], "reg") == 0) { - ++i; - return handle_reg_cmds(dev_name, argc - i, argv + i); - } - else { - cout << "Unknown command " << argv[i] << endl; - return 1; - } -} - -static void help(void) -{ - cout << "usage: dma-ctl [dev | qdma<N>] [operation]\n"; - cout << " dma-ctl -h - Prints this help\n"; - cout << " dma-ctl -v - Prints the version information\n"; - cout << "\n"; - cout << "dev [operation]\t: system wide FPGA operations\n"; - cout << " list\t: list all qdma functions\n"; - cout << "\n"; - cout << "qdma<N> [operation]\t: per QDMA FPGA operations\n"; - cout << " <N>\t\t: N is BBDDF where BB -> PCI Bus No, DD -> PCI Dev No, F -> PCI Fun No\n"; - cout << " csr <dump>\n"; - cout << " dump\t: Dump QDMA CSR Information\n"; - cout << " \n"; - cout << " devinfo\t: lists the Hardware and Software version and capabilities\n"; - cout << " qmax <N>\t: Assign maximum number of queues for a device\n"; - cout << " qstats\t: Dump number of available and free queues\n"; - cout << " \n"; - cout << " queue <add|start|stop|delete|listall>\n"; - cout << " add mode <mm|st> qid <N> [en_mm_cmpl] idx_h2c_ringsz <0:15> idx_c2h_ringsz <0:15>\n"; - cout << " [idx_c2h_timer <0:15>] [idx_c2h_th <0:15>] [idx_c2h_bufsz <0:15>] [cmptsz <0|1|2|3>] - add a queue\n"; - cout << " [trigmode <every|usr_cnt|usr|usr_tmr|usr_tmr_cnt>] [sw_desc_sz <3>] [desc_bypass_en] [pfch_en] [pfch_bypass_en]\n"; - cout << " [cmpl_ovf_dis]\n"; - cout << " start qid <N> - start a single queue\n" ; - cout << " stop qid <N> - stop a single queue\n"; - cout << " delete qid <N> - delete a queue\n"; - cout << " state qid <N> - print the state of the queue\n"; - cout << " dump qid <N> dir <h2c|c2h> desc <start> <end> - dump desc ring entries <start> to <end>\n"; - cout << " dump qid <N> cmpt <start> <end> - dump completion ring entries <start> to <end>\n"; - cout << " dump qid <N> ctx type <h2c|c2h|cmpt> - dump context information of <qid>\n"; - cout << " cmpt_read qid <N> - Read the completion data\n"; - cout << " intring dump vector <N> <start_idx> <end_idx> - interrupt ring dump for vector number <N>\n"; - cout << " for intrrupt entries :<start_idx> --- <end_idx>\n"; - cout << " reg dump - register dump\n"; - cout << " reg info bar <N> addr [num_regs <M>] - dump detailed fields information of a register\n"; -} - -int __cdecl main(const int argc, char* argv[]) -{ - try { - if (argc > 1) { - /* Pasre command line options */ - if (process_cli(argc, argv)) { - help(); - } - } - else { - help(); - } - } - catch (const std::exception& e) { - cout << "Error: " << e.what() << '\n'; - } -} diff --git a/QDMA/windows/apps/dma-ctl/dmactl.vcxproj b/QDMA/windows/apps/dma-ctl/dmactl.vcxproj deleted file mode 100644 index 7941c37..0000000 --- a/QDMA/windows/apps/dma-ctl/dmactl.vcxproj +++ /dev/null @@ -1,146 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <ItemGroup> - <ClInclude Include="..\common\include\device_file.hpp" /> - <ClInclude Include="version.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dmactl.cpp" /> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{620A4D4D-5D14-41BA-909B-011FF03A25FD}</ProjectGuid> - <TemplateGuid>{504102d4-2172-473c-8adf-cd96e308f257}</TemplateGuid> - <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> - <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> - <Configuration>Debug</Configuration> - <Platform Condition="'$(Platform)' == ''">Win32</Platform> - <RootNamespace>qdma_rw</RootNamespace> - <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion> - <ProjectName>dma-ctl</ProjectName> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64</LibraryPath> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PreprocessorDefinitions>_DEBUG;WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> - <AdditionalIncludeDirectories>$(SolutionDir)\apps\common\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <PreprocessorDefinitions>WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>$(SolutionDir)\sys\libqdma\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\apps\common\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PreprocessorDefinitions>_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <AdditionalIncludeDirectories>$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;$(SolutionDir)\apps\common\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> - <IgnoreSpecificDefaultLibraries /> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <PreprocessorDefinitions>WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>$(SolutionDir)\apps\common\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-ctl/dmactl.vcxproj.filters b/QDMA/windows/apps/dma-ctl/dmactl.vcxproj.filters deleted file mode 100644 index 2002160..0000000 --- a/QDMA/windows/apps/dma-ctl/dmactl.vcxproj.filters +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup> - <Filter Include="Source Files"> - <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> - </Filter> - <Filter Include="Header Files"> - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> - <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> - </Filter> - <Filter Include="Resource Files"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> - </Filter> - </ItemGroup> - <ItemGroup> - <ClInclude Include="..\common\include\device_file.hpp"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="version.h"> - <Filter>Header Files</Filter> - </ClInclude> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dmactl.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - </ItemGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-ctl/dmactl.vcxproj.user b/QDMA/windows/apps/dma-ctl/dmactl.vcxproj.user deleted file mode 100644 index be25078..0000000 --- a/QDMA/windows/apps/dma-ctl/dmactl.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup /> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-ctl/version.h b/QDMA/windows/apps/dma-ctl/version.h deleted file mode 100644 index 3fc5eb8..0000000 --- a/QDMA/windows/apps/dma-ctl/version.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#ifndef __QDMATOOL_VERSION_H -#define __QDMATOOL_VERSION_H - -#define PROGNAME "dma-ctl" -#define VERSION "2020.2.0" -#define COPYRIGHT "Copyright (c) 2020 Xilinx Inc." - -#endif /* __QDMATOOL_VERSION_H */ diff --git a/QDMA/windows/apps/dma-rw/datafile256K.bin b/QDMA/windows/apps/dma-rw/datafile256K.bin deleted file mode 100644 index 1b50cdd57bcc0fb5c0e6ae027560cd03062b5434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262144 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≷E}*%fhPh_1)d2! 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	hQy`Xwg^^)pk)hnu3Rj;XDSG}QnQ}veWZPh!f zcUAAH-dBB~`cU<e>SNU>s!vs)sXkYIq54wwmFjENH>z({->JS={h<0$^^@vn)i0`F zRllizSN);-Q}vhXZ`D7le^vjf{#RvCV^m{OV^(8PV^w2QV^`x)<5c5P<5uHQ<5lBR z<5v?<6I2sY6IK&Z6IBya6IYW^lT?#ZlU9>alU0*blUGwvQ&dw@Q&v+^Q&m$_Q&-ba z(^S(^(^k__(^b<`(^oT4GgLEDGgdQEGgUKFGgq@vvsANEvsSZFvsJTGvsZIab5wIu zb5?Uvb5(Owb64|F^HlRv^H%dw^HuXx^H&Q{3sehI3swtJ3snnK3s;L!i&TqJi&l$K zi&cwLi&slfOH@lzOIAx!OI1r#OIOQK%T&u!%T~)#%T>!$%U3H<D^x2|D^@E}D^)8~ zD_5&ft5mB}t5&N~t5vI0t5<7KYgB7eYgTJfYgKDgYgg+~>s0Gf>sISg>s9Mh>sOng zHc@So+GMpUYE#vwsZCd#p*B-(mfCE!Icjs&=BdqBTcEa3ZIRkywIymx)t0F(S6iXB zQf-ymYPB_LYt`1NtykNiwoz@9+Ge#aYFpK|scl!=p|(?Pm)dT%J!*T^_NnbxJD_$@ z?U34GwIgar)sCqhS39A0Qtg!5X|*$IXVuQBomab{c2Vt;+GVvXYFE{+sa;pQp>|X4 zmfCH#J8E~;?y22Zd!Y7E?UCAJwI^y%)t;$6S9_uMQtg%6Yqd9OZ`IzZy;u97_EGJV z+Gn*dYG2j9seM=bq4rblm)dW&KWcx~{;B;}V^C*QXHsWYXHjQWXH#ca=TPTV=ThfZ z=TYZX=Tqlb7f=^e7g85i7f}~g7gHBkmr$2fmr|Ejmr<8hms6KlS5Q|}S5jA2S5a40 zS5sG4*HG6~*HYJ3*HPD1*HhP5H&8cJH&QoNH&HiLH&ZuPw@|lKw^FxOw^6rMw^O%Q zcTjg!cT#s&cTsm$cT;y)_fYp#_fq#(_fhv%_fz**4^R(O4^j_S4^a<Q4^t0Uk5G?P zk5Z3Tk5P|Rk5i9VPf$-(Pf|}-Pf<@*Pg74<&rr`)&r;7;&r#1+&r{D=FHkR3FH$d7 zFHtX5FH<j9uTZa4uTrm8uTig6uT!sAZ%}VkZ&GhoZ&7bmZ&Pnq?@;el?^5qp?@{kn z?^EwrpP)WbeUkcQ^(pF8)u*XXSD&FiQ+<~DZ1p+nbJgdm&sSfdzEFLU`eOAZ>Pyv^ zsV`Swp}tammHKM+HR@~C*Qu{p-=MxxeUtiT^)2dK)wii{SKpz&Q+=2EZuLFtd)4=; z?^i#deo+08`eF4W>POX&sUKHAp?*^Rl=^A)GwNs6	kRzo33m{gV1+^(*RE)vu{v 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�JDIiqSu^^BSswKM8w)X!*`(Kw@NM)Qo88Lczg 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%0AY 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%0DZ-II4u-93Hx%-yqh&)q$L z_rl$acQ4(&eD})Tt9P&6y?*z`-J5rB-MxMH&fU9r@7=wB_rcwVcOTt-eD}%Sr+1&- zeSY`F-IsS?-F<!c&E2<m-`#zG_ru+fcR$_zeD}-UuXn%Q{eJhy-Jf@V-Ti&{&)vUw z|K0t6m*F1cJ*Ioi_gL<+-ebGRevjiG=RK}_-1m6y@!sRR$A3@Yp5Q&9d&2ib?up(L zyC;56;-2I^se97*WbVn{le;H>PvM^8J*9if_f+nw-c!4$eoy0`<~^-@+V^zs>E6@3 zr+?4jp5Z;Cd&c)n?wQ^*yJvpS;-2L_t9#b>Z0_0Kv%6=1&*7fqJ*Rul_gwC|-gCR> ze$V5c=RL1`-uHa&`QG!p=YKEYUf{i;d%^cY?uFh9yBB^h;$GyvsC&`(V(!J>i@O(p zFX3L|y`+1|_fqbq-b=feelO!*=Dn<Y+4pkp<=)G?mw&I|Ug5o>d&T!k?v>svyH|d% z;$G#ws(aP<YVOtEtGic!ui;+fy{3E3_ge0?-fO$pey`(R=e@3b-S>L#_1^2d*MD!q zy@~fG-J5)G%Dt)grrn!<Z^pfu_h#LjeQ(aax%cMXn}2V?y@mG{-CKNb$-Slbmfc%^ zZ^gZp_g39oeQ(XZwfENDTYqoEy^Z%a-P?R`%e}4lw%yx)Z^ylz_jcXeeQ(dbz4!Lr z+kfxCy@U4--8+2m$i1WYj@>(c@5H^6_fFkAeecY@v-i&3JAd!Oy^HrQ-Mf76%Dt=i zuHCzS@5a5G_io+0eece_yZ7$hyMOP&y@&T6-FtlR$-Srdp51$X@5Q~B_g>w5eecb^ zxA)%Ndw=i4y^r@k-TQp+%e}AnzTNwN@5jBL_kP{`eech`zxV##`+tw&KI46+`^@)Q z?z7%!yU%`~<38touKV2gdG7Px=ey5;U*NvreWClp_eJiD-WR(seqZ9g<bA38()VTV z%ifo}FMnU*zT$nQ`^xuK?yKHcyRUv<<G$v7t^3;db?)ol*SoKO-{8LCeWUxv_f77b z-Z#5%e&6E0<$bIB*7t4h+upakZ-3w6zT<tT`_A`W?z`T1yYGJA<G$y8ulwHjeeV0- z_q*?ZKj41g{h<57_e1W7-VeJUem~-V<o&4o(f4ES$KH>-AAdjLe&YS4`^ooH?x)^Q zyPtkP<9_D-tozybbMEKf&%2+0zu<o1{i6HD_e<`V-Y>gfe!t>=<^8Jr)%R=e*WRzY zUw^;he&hY7`_1=T?zi4=yWf7l<9_G;uKV5hd+zt%@4MfBf5QEV_b1(-e1FRQsrRSd zpMHPF{h9Y?-JgAb&i%Rf=iQ%wf5H8Q_ZQt?e1FOPrT3TJUw(hZ{gwAu-Cuow&Hc6a z*WF)#f5ZKa_cz_&e1FURt@pRx-+q6`{hjxB-QRtG&;7mk_ub!r|G@o&_Yd7aeE-P( zqxX;9KYstj{gd}k-9LT*%>A?X&)q+N|HA!?_b=VQeE-V*tM{+nzkdJ5{hRl1-M@YR z&i%Xh@7=$D|H1u-_aEJVeE-S)r}v-Te}4bP{g?M&-G6=m&HcCc-`#(I|HJ){_dnhL zeE-Y+ulK**|9=0+{h#-L-T!_6&;7sm|K0z8pWy-H1EvSe4_F?sK45#m{($2F=L4<> z+z)sj@IK&s!2dwtf#3t72f`0T9*8~=dm#Qm;(_D?sRz;zWFE*qkb5BiK;ePn1EmMb z4^$qgK2Uq0{y^h_<^!z<+7EOd=swVUp#Q+&f#CzA2gVOf9+*Bbdtm;+;(_G@s|VH( zY#!J?uzO(tz~O=81E&Yh4_qF&K5%>B{=nmb=L4??-Vb~p_&)G^;Qt`tLEwX+2f+_Q z9)vy!dl3F0;z8tts0YyxVjjdkh<gzKAmKscgQN$^4^keaK1h3z{vhK)=7X#U*$;9a z<UYuIkpH0ILE(d<2gMIc9+W;Pdr<zM;z8wust45%Y97=+sC!WVpy5H|gQf?~4_Y3y zK4^Q;{-EPQ=Yy^X-4A*m^gif&(Enh<gNY9&J(&Dp%7dv7rahScV8(-)4`w}>{b0_6 zxew+&nEznGgM|+kJy`r;$%Ca2mOWVhV8w%#4^}-`{b0?5wGY-kSpQ(dgN+Y1J=pwU z%Y&^CwmsPXV8?@<4|YA+{b0|7y$|+1*#F?bgM$waJvjW}$b+K~jy*X3;KYNI4^BNe z{ou@lvk%TaIRD_ngNqL?J-Gbf%7d#9u06Q^;KqZS4{klU{ou}nyASR?xc}h6gNF|u zJ$U@!$%Cg4o;`T};KhTN4_-ZZ{ou`mw-4Suc>mzTgO3kBJ^1|K%Y&~EzCHN<;KzfX z4}LxP{ov1ozYqRB`2T?6A>%`)hs+OI9<n}Ud&vHf<00omu7}(Yc^>jU<a@~fP~f59 zL!pPl4@Dk|J`{T>{!rqf<U^^4(hp@G%085PDF0C5q2fcOhsqCC9;!Z6d#L_U<Duq5 zt%uqVbsp+I)O)D^(BPrrL!*br4^1ALJ~Vr1{?Ou~<wL87)(>qS+CH><X#ddRq2oiR zht3aO9=bksd+7eq<Dut6uZP|beIEKg^n2+4FyLX}!=Q)34?`Y?J`8&p{xITU<in_k z(GO!D#y*UD82>QgVdBH2hsh699;QA_dzk((<6-8*tcTeTa~|eC%zK#su;5|g!=i`9 z4@(}FJ}i4!{;=X<<-@9n)embP);_FzSpTr$VdKN5hs_UL9=1Mgd)WT4<6-B+u7}+Z zdmi>a?0eY%aKgih4<|jG{BX*{sSl?;oc?ge!<i3fJ)He;&cnG6=RKVNaKXcc4;MXL z{BX&`r4N@qT>fyy!<7$LJzV{8&BL`1*F9YSaKpom4>vvB{BX;|tq-?7-2QOK!<`Rz zJ>30p&%?bB_dVSI@W8`^4-Y*&{P4)bqYsZgJpS;+!;=qBJv{yJ%)_$}&pkZ<@WR83 z4=+8u{P4=ds}HX|y#DaU!<!FpJ-q$!&cnM8?>)T#@WI1}4<9{z{P4-crw^Y!eE#so z!<P?VJ$(J}&BM13-#vW)@WaE84?jKp{P4@euMfXH{QmIA!=Dd-J^cOf&%?hD|2_Qw zkl_*IBc?~pk60eDK4N>s{)pod=OeC1+>dx3@jl{v#Q#X(k>DetN5YRp9*I5@dnEoy z;*sPdsYlX}WFE;rl6xfoNa2y<Bc(^mk5nG1K2m$6{z&7I<|C~~+K+S|=|0kXr2oj^ zk>MkwN5+p#9+^Hedu0B|;*sSet4G$4Y#!M@vU_Cz$l;OWBd15sk6a$PK5~2H{>bBz z=OeF2-j949`9AV{<o_t(QQ)JXN5PLm9)&&%dlddC;!)(Is7KL{VjjglihC6QDB)4! zqoha4k5V3`K1zF({wU*7=A*1f*^hD_<vz-Ll>eyUQQ@PaN5zjy9+f^SdsP0Y;!)+J zsz=q2Y97@-s(V!bsNqrLqozmAk6IqJK5Bc^{;1<o=cBGi-H&=6^*-u*)c<J0qlu3u zJ(~Pz%A=`|rahYeXvU+Nk7hlZ{b<gkxsT>On*V6QqlJ$aJzD%|$)lx@mOWbjXvL$I zk5)Ze{b<djwU5?4TK{Onqm7R?J=*+e%cHH2wmsVZXvd?Sk9IxU{b<jly^r=i+W+Xl zql1qQJv#j8$fKi=jy*d5=)|Lwk4`;0{pif2vyaX_I{)axql=F&J-Ynp%A>1~u06W` z=*FX)k8VA>{pil4yN~WYy8r0Gqlb?kJ$n4;$)l%_o;`a0=*6R#k6t}`{pii3w~yXE zdjIIdqmPe1J^K9U%cHN4zCHT>=*Od<kA6M+{pio5zmNVs`u~XGG2>&V$IOpe9<x4X zd(8fr<1y!BuE*Suc^>mV=6lTlSm3eXW1+{wk3}AfJ{Ef{{#fF%<YTGF(vM{x%RZKS zEdN;HvEpN;$I6dY9;-f9d#wIg<FV#rt;gDrbsp<J)_bh~*x<3@W248$k4+w%J~n%7 z{@CKN<zuVI){ku-+dj5?Z2#EdvEyT>$Ig#k9=kqvd+h$$<FV&sugBhxeIENh_IvFA zIN)*M<DkdEk3$}ZJ`Q^v{y5@s<m0Hv(T`&u$3BjG9RE1sapL2o$H|XV9;ZG|dz}6_ z<8kKWtjF1pa~|hD&U>8yxZrW&<D$pKk4qkxJ}!G){<z|C<>RWy)sJf)*FLU$T>rS? zapU8r$IXvh9=ASjd))rG<8kNXuE*Vvdmi^b?t9$-c*5g}k0(8z{CLXasgI{Up8j~o z<C%|VJ)Zq|&f~d{=RKbPc){a^j~6{&{CLUZrH_|AUjBH+<CTwBJzo8I&EvI?*F9eU zc*En3k2gKu{CLabt&g`o-u`&U<DHLpJ>LCz&*Qz1_dVYK_`u_Xj}JXQ{P@V@qmPe0 zKK}T`<CBk1JwE;T%;U3<&pkf>_`>6hk1svG{P@b_tB<cezW(^e<C~9fJ-+?;&f~j} z?>)Z%_`&0cj~_jL{P@Y^r;ndKe*XBy<Cl+LJ%0W8&EvO^-#vc+_`~Cmk3T*B{P@e` zuaCby{{HyK<DZXzJ^uap&*Q(3|2_WynBfWI6Q(E3PgtI?K4E*p{)FQR=M%0c+)sF( z@IK*t!v93ziQp5VC&Eueo`^mXdm{cs;)&!FsVCA;WS+=Ak$WQlMB$0z6Qw80PgI_$ zK2dw3{zT)6<`b<a+D~+z=swYVqW{F;iQyBYC&o`qo|rx{dt&~?;)&%Gt0&e^Y@XOY zv3p|w#NmnK6Q?K6Ph6h3K5={E{>0;n=M%3d-cNj<_&)J_;{PPzN#K*9C&5obo`gOL zdlLR6;z{I_s3*}+VxGi4iF*?NB;iTolcXofPg0(wK1q9${v_i`=98=^*-vtw<UYxJ zlK-UON#T>CC&f=no|HZ*ds6<S;z{L`swdS?YM#_Sse4lYq~S^9lcp!lPg<U|K52W> z{-onc=aa4{-A{U+^gii((*I<_lZj6zJ(>Ju%9E*2rahVdWX6-3Pi8%t{bbIQxliUj zng3+LlZ8(fJz4x@$&;l|mOWYiWW|$}PgXry{bbFPwNKVPS^s3ilZ{U{J=y$Z%ag57 zwmsSYWXF@8Pj)@o{bbLRy-)T%+5hCglY>tVJvsd3$djW_jy*a4<iwMcPfk5K{p8G( zvro=FIsfFslZ#I-J-Phk%9E>4u06T_<i?YmPi{TA{p8M*yHD;tx&P$BlZQ_pJ$d}( z$&;r~o;`W~<i(ShPhLHF{p8J)w@=<ZdH>|YlaEh6J^B3P%agB9zCHQ=<j0erPkuf5 z{p8P+zfb->`TvCBDdSV7r_4`Tp0Yk=d&>Tl<0<D;uBY5jd7kn<<$KEiRN$%LQ=zBA zPeq=JJ{5Z^{#4?r<Ws4q(obcc%088QD*sgBsp3<mr^-)No~k}od#e6a<EiFTt*6>g zb)M=z)qAS{)ZnS%Q=_NGPfebhJ~ex4{?y{B<x{Jt)=zDo+CH^=YX8*XspC_pr_N7Z zp1MADd+Pqw<EiIUuczKmeV+P0^?U07G~j9A)1arpPeY!DJ`H;s{xsrg<kP69(NANZ z#y*XE8viumY2wqQr^!!Ko~Axcdz$_<<7wv8tf$#ebDrit&3l^vwBTvs)1s%vPfMPb zJ}rA%{<Pw0<<qLC)lX}l);_I!TK}}+Y2(wTr_E1Wp0+-1d)ofA<7wy9uBY8kd!F__ z?R(n)bi&h#PbWQ{{B+9GsZXapo&I#j)0t0aJ)Qk@&eOS1=RKYObivbwPZvF1{B+6F zrB9bVUH){%)0IzGJzf2D&C|6{*F9bTbi>n)Pd7c?{B+CHtxvZ--TrjP)16OuJ>C6u z&(pn6_dVVJ^uW`DPY*pk{Pf7vqfd`LJ^u8>)00n6Jw5&O%+s?^&pkc=^up7NPcJ>a z{PfDxt52^zz5evZ)0<CkJ-z+(&eOY3?>)W$^ug1IPai#f{PfAwr%#_feg5>t)0a<Q zJ$?Q3&C|C}-#vZ*^uyDSPd`2V{PfGyuTQ@{{r>dF)1Oa&J^lUk&(pt8|2_Txl;IiU zGp1+E&sd(ZK4W{v{*2=p=QFNn+|PKP@jl~w#{W#<ncy>_XTr}!o{2sadnW!&;+f<# zsb|v9WS+@BlY1urOyQa0Go@$B&s3hNK2v+9{!HVU<}<Bl+Rt>J=|0nYrvJ>~nc*{| zXU5M=o|!%~duIO3;+f?$t7q2FY@XRZvwLR$%;A~iGpA?H&s?6lK688K{><Z<=QFQo z-p_oV`9AY|=Kn0<S>UsvXTi@xo`pUOdlvpI;#uUgsAtj7VxGl5i+dLTEa6$=v!rLq z&r+VHK1+L+{w(8J=CiD4+0SyG<vz=MmjA5aS>dyyXT{G-o|Qf;dshCe;#uXhs%O>D zYM#|Tt9w@etl?SXv!-Xw&sv_fK5Ki{{;cC!=d-S7-OqZS^*-x+*8gn6vx(0pJ)8V& z%Co7@rahbfY{s*h&t^TF{cO&&xzFZ3oBwRVvxUzVJzM;2$+M-;mOWekY{j#c&sIHK z{cO#%wa?Z)TmNjsvyIO-J=^?j%d@S|wmsYaY{#>m&vrfA{cO*(z0dYN+yCsqvxCnL zJv;pD$g`u*jy*g6?8LK^&rUr%{p`%Mv(L^wJOAv$vy0CzJ-htu%CoD_u06Z{?8dX3 z&u%@t{p`-OyU*@DyZ`LLvxm<fJ$wA@$+M@=o;`d1?8UQ}&t5%y{p`)Nx6j@^d;jdi zvyaa{J^TFZ%d@Y~zCHW??8md8&wf4o{p`=Pzt8?X`~QsLIpcGt=giMpp0hq@d(Qrx z<2mPZuIJp(d7kq==X=ioT;RFjbD`(L&qbb#J{Nl~{#@d@<a4R#($8g{%RZNTF8^HN zx#DxB=gQAjo~u4rd#?Um<GJQ@t>@a$b)M@!*L$x2+~B$4bED_R&rP12J~w-A{@miZ z<#Vg&*3WI8+dj8@ZvWijx#M%E=g!Yvp1VGGd+z?+<GJT^ujk&+eV+S1_j~UDJm7iY z^PuO!&qJPvJ`Z~y{ygG&<nyTK(a&R^$3BmH9{)VydE)b==gH4go~J%fd!GJ0<9X)u ztmoO!bDrlu&wHN#yx@7^^P=a)&r6<{J}-M-{=DLO<@2iN)z535*FLX%UjMw|dE@h@ z=grSsp0_@4d*1%M<9X-vuIJs)d!F|`?|a_=e8TgI&nG>f{Cvvusn4f9pZ<Kt^O?_Q zJ)ix2&hxp?=RKeQe8KaD&lf#k{CvstrO%f=U;cc>^Oet6JzxEN&GWU-*F9hVe8cmN z&o@2a{Cvyvt<SeT-~N2Z^PSIkJ>UI&&-1;{_dVbL{J`^r&ksF6{QSuCqtA~$KmPp0 z^OMg{JwN^Y%=5F)&pki?{KE5#&o4c{{QS!EtIw}JzyAEj^PA6aJ-_|@&hxv^?>)c& z{K4~w&mTR1{QSxDr_Y}~fByW%^Ow(GJ%9cD&GWa<-#vf-{KNB)&p$o?{QS%Fug||d z|Ni{P^PkUuJ^%gu&-1^}|2_ZzoZ$uI3#J#$FIZl%zF>R7{(|EL=L@bE+%I@u@V?-C z!T&<wh2RUJ7s4+@UWmRBdm;Wp;)Uc3sTa~OWM0U=kb5EjLg9tt3#AvzFH~NrzEFFi z{zBu0<_oPC+Anlo=)TZ<q5s0*h2aaM7sfA4UYNcxdtv^<;)Uf4s~6TUY+l&DuzO+u z!r_JE3#S*(FI--@zHoct{=(yh=L@eF-Y<M!_`dLa;r}AwMc|8|7r`$=UWC2~dlCL3 z;zi_(s29;MVqV0)h<g$LBH=~ii=-FHFH&BlzDRqK{vzW==8LQs*)MWl<i5yzk^iFL zMd6F07sW41UX;Eldr|(P;zi|)su$HSYF^a7sC!ZWqTxm3i>4RNFIrx-zG!>V{-WbW z=Zmfv-7k7x^uFkO(f?w?i-|8Ly_o!B%8RKlroEW{V#bS^FJ`@%{bJ6Gxi99unEztI zi-j*1y;%HW$%~~gmc3a1V#SM<FIK%+{bJ3FwJ+AaSpQ<fi;XWfz1aL>%Zsfqw!PT? zV#kY}FLu4y{bJ9Hy)X8?*#F|di-Ru?y*T{h$cv*dj=ebk;>3%SFHXHU{o>4vvoFrQ zIRE0pi;FKVy}111%8RQnuD!Va;>L@cFK)fK{o>AxyD#p&xc}n8i-#{By?FfM$&05i zp1pYf;>C-XFJ8TP{o>7ww=dqkc>m(Vi;pipz4-j%%ZslszP<SV;>U}hFMhrF{o>Dy zzc2p1`2T|8CF4t`m&`9&Ub4Pqd&&Ni<0a=yu9w^|d0z6q<a^2gQsAZFOQDy-FGXI8 zz7%^Y{!-$l<V&fS(l2FR%D$9)DgRR8rQ%Dam&z|yUaG!Sd#V0X<E7?Ht(V#_bzbVe z)O)G_(%_}xOQV;@FHK&WzBGGj{?g*5<x8uV)-P>d+P<`VY5&sUrQ=Jdm(DL;Ub?<? zd+Gkt<E7_Iub190eO~&$^n2<5GT>$4%b=IRFGF62z6^UA{xafa<jbg+(Jy0O#=eYu z8UHfjW#Y@Em&q?vUZ%cGdzt<+<7MW{te4p@b6)1Y%zK&tvfyRm%c7UXFH2sQzASrL z{<7j_<;$v<)h}ya*1oKJS^u)(W#h}Hm(4F*Uben$d)fZ7<7MZ|u9w{}dtUaw?0eb& za>C1rFDJd6{Bp|6sV}F!oc?mg%b71{y`24W&da$k=e?Z&a>2`mFBiRB{Bp_5r7xGg zT>f&!%at!zy<Gir&C9hf*S%c-a>L7wFE_p1{Bq07tuME|-2QUM%bhQGz1;nB&&$0p z_r2Wz^1#c3FAu#u{PM`lqc4xWJpS^;%abopy*&N$%*(Sc&%HeV^1{oDFE72k{PN1n zt1qv;y#DgW%bPE6y}bSM&da+m@4dYL^1;i8FCV>p{PM}mr!SwqeE#yq%a<=-y?p)h z&C9nh-@SbQ^25uIFF(Ef{PN4ouP?v7{QmOC%bzcQz5M<1&&$6r|GoVGlHnEOE2dY> zuUKBOzG8dD{)*!j=PRyP+^=|E@xJ1F#s5m+mEbF(SHiDEUWvXEdnNu#;+5npsaMjk zWM0X>l6xipO5v5_E2US;uT);CzEXRo{z~JO<}0mN+OKq8>Auo?rT@y{mEkL+SH`bQ zUYWi!du9I0;+5qqt5?>qY+l*EvU_F!%HfscE2me^uUuZazH)oz{>tN(=PR#Q-miRK z`M&ad<^L++Rp6_jSHZ7BUWL92dlmjF;#K6Us8`XiVqV3*ihC9RD&bY)tE5-SuToy6 zzDj$Q{wm{D=Bun%*{^b5<-W>$mH(>XRpG0mSH-VNUX{KodsY6b;#K9Vs#n#oYF^d8 zs(V%cs^L}RtEN}YuUcNUzG{2b{;K0u=c}$)-LHCH^}gzR)&FY3tBJ2By_)=L%B!ib zroEc}YR0RXuV%fP{c6suxv%EEn*VCStA(!?y;}Tg$*ZNWmc3g3YQ?LSuU5TU{c6pt zwXfE_TK{UptBtQVz1sY0%d4%gw!PZ^YR9XcuXerK{c6vvy|4DY+W+dntAno&y*m8r z$g88Tj=ehm>cp#)uTH%>{p!rCv#-v*I{)gztBbELy}JDB%B!oduD!bc>c*>^uWr4% z{p!xEyRYuOy8r6ItB0>1y?XrW$*ZTYp1peh>cy*<uU@@+{p!uDx3Av4djIOftB<cf zz54v>%d4-izP<YX>c^{}uYSGy{p!!Fzpwti`u~dIHREfh*UYb3UbDVtd(Hlu<2C1N zuGieJd0z9r=6lWmTHv+dYoXV|uSH&qz7~5e{#xR-<ZG$d(ywJ+%f6O-E&p2Kwc=}~ z*UGO|UaP)Vd#(Oj<F)2%t=HPGbzbYf)_bl0+TgX}Yopi3uT5T?zBYSp{@UWT<!h_g z)~{_|+rGAYZU5Tgwc~52*Uqn9Uc0__d+q+(<F)5&uh-tMeO~*%_IvIBI^cES>!8=c zuR~skz7BgG{yO4y<m;%{(XV4($G(nx9sfGvb>i!!*U7I_UZ=iJd!7C|<8|iitk>DE zb6)4Z&U>Bzy5M!;>!R1iuS;H+zAk%R{<`9I<?E`~)vs$_*S@ZMUH`h_b>r)%*Uhh6 zUbnt(d)@xJ<8|ljuGihKdtUdx?t9(;dcy08uP42p{CdjksjsKKp8k5q>zS`-y`KGg z&g;3a=e?f)dco_3uNS>u{CdgjrLUL0UjBN;>y@upy<Yu#&Fi(V*S%i<dc*6DuQ$Ek z{Cdmlt*^Je-u`;W>z%K6z25zL&+EOf_r2c#`oQahuMfRG{QAi2qpy#>KK}Z|>yxif zy*~Z=%<HqS&%HkX`oimruP?p6{QAo4tFN!UzW(~g>zl7{y}teW&g;9c@4deN`oZgm zuOGdB{QAl3r>~#Ae*XH!>zA)zy?*`r&Fi<X-@ShS`orswuRp#1{QAr5udlzo{{H&M z>z}WGz5f0B&+EUh|GobIn&A!O8>TnRZ&=>2zF~XA{)XcX=Nqm!+;4c^@V?=D!~aI$ zjo=%hH^Og3-iW>tdn5iv;*I1RsW;MZWZuZWk$WTmM&XU(8>KhOZ&co>zEOLl{zl`C z<{Pay+HZ8;=)Tc=qyNU>jo}-kH^y&F-k82Idt?5_;*I4St2fqfY~I+uv3q0x#^H_Q z8>ctUZ(QEEzHxiw{>I~t=Nqp#-fw)~_`dOb<Nqe$P2iiLH^Fa0-h{phdlUX9;!Wh6 zs5jAXV&25QiF*_OCgDxuo1{0%Z&Kc*zDawN{wCv1=9{cH*>7^*<i5#!lmDjRP2roO zH^pyC-ju#6dsF_V;!Wk7syEedYTneose4oZrr}NFo2EC-Z(828zG-{Y{-)zi=bNrK z-EVr{^uFnP)Bk3|n~85Gy_x)G%A2WgroEZ|X2zSDZ)Uxj{btUaxo_sZng3?Nn}u%{ zy;=Nb$(yBbmc3d2X2qM8Z&tlo{btRZwQttFS^s9kn~iTaz1jR`%bTrlw!PW@X2+YI zZ+5-e{btXby>Irt+5hIin}cr-y*d2m$eW{Yj=eel=ER$mZ%(~A{pQS@vv1D5IsfLu zn~QHQy}A76%A2ciuD!Yb=Ej?wZ*IN0{pQY_yKnBjx&P+Dn}=^6y?OlR$(yHdp1pbg z=Ea+rZ(hB5{pQV^w{PCPdH?3an~!fkz4`p+%bTxnzP<VW=Es|#Z+^Y`{pQb`zi<A% z`TvIDE#q6Jx6E%@-m<=Bd&~Zo<1Ob~uD9H8dEWBA<$KHjR^YARTcNkYZ$;jUz7=~b z{#N3x<Xfq?(r;zn%D$C*EB{vEt>Rmyx5{r--m1P;d#nCd<E`dft+(25b>8Z})qAV| z*5Iw-TcfweZ%y8szBPMm{?_8H<y)(_)^Baz+P<}WYyZ~at>as#x6W@}-nzbZd+Ywz z<E`ggueaWBect-M^?U38HsEdG+n~3>Z$sXOz72aD{x;%m<lCsX(Qjkk#=ebv8~--p zZQ|Rcx5;l)-lo1ydz=0?<89{Kthd>3bKd5@&3l{ww%~2y+oHF{Z%f{mzAbxO{<h+6 z<=d*a)o*Lw*1oNKTmQD<ZR6Xfx6N-`-nPDNd)xlD<89~LuD9K9d*1fG?R(q*cEa0< zZzsK-{C3LQsc)yfo&I*l+nH}?y`BAb&fB?f=e?c(cEQ_)Zx_8?{C3IPrEizLUH*2( z+m&xuy<Pow&D*ta*S%f;cEj6^Z#TW&{C3ORt#7xz-TrpR+nsNBz1{tG&)dCk_r2Z! z_Q2bNZx6ja{PxJ(qi>JBJ^uE@+mmlky*>T*%-geX&%HhW_QKnXZ!f*Q{PxP*t8cHp zz5e#b+naB1y}kYR&fB|h@4dbM_QBhSZy&vV{PxM)r*EIVeg5{v+m~-&y?y=m&D*zc z-@SeR_QTtcZ$G{L{PxS+uW!G-{r>jH+n;ZLz5V_6&)dIm|GoYHmf;=aJEnKc?^xck zzGHjG{*L1v=R2-<-0yha@xJ4G$Nx^?o!~p6cf#*P-if{wdnf)*;+^C>sdv)vWZucX zlY1xsPT`&6JEeEZ?^NEYzEgXr{!Zha<~yx-+V6DU>Aur@r~l62o#8v9cgF8b-kH8L zduRU6;+^F?t9RD#Y~I<vvwLU%&f%ToJEwQf?_A!wzH@u${?6l_=R2==-tT<g`M&de z=l?F?UEsT*cfs#M-i5vkdl&vL;$7sssCUutV&28Ri+dOUF5z9`yQFu??^52SzDs+T z{x0KP=DVzS+3#}R<-W^%m;bKdUE#Z;cg62Y-j%*9dsqIh;$7vts(01zYTnhpt9w`f zuHjwdyQX)|?^@oqzH58e{;uO)=ew?V-S2wd^}g$S*Z*$9yNT~6y_@`Q%DbuWroEf~ zZpOQr?`FN5{cg^?x$ow^oBwXXyM^x-y<7Zl$-AZRmc3j4ZpFKm?^eBA{cg>>weQxw zTmNpuyN&NQz1#e5%e$@bw!Pc_ZpXWw?{>Z0{cg{@z3=wD+yCysyMylzy*vEw$h)KO zj=ekn?!>#3?@qlt{qD@Wv+vHmJOA#&yNmBGy}SJG%Db!YuD!ed?#8>D?{2-j{qD}Y zyYKG3yZ`RNyNB-{y?gxb$-AfTp1phi?!~*8?_Rxo{qD`Xx9{G)d;jjkyN~Zaz5D#` z%e$}dzP<bY?#H{I?|!}e{qE1ZzwiFN`~QyNJ>z?(_ss8E-m|`Ed(Zx!<2~nluJ_#U zdEWEB=X=lpUf{jpd!hHj??v8=z88Bh{$Ap}<a??2((h&7%f6R;FaKWQz2bYN_sZ{8 z-mAV>d$0ap<Gtp4t@qmRb>8c~*L$!3-r&9Ad!zTp?@ivDzBhYs{@&uf<$J65*6(fJ z+rGDZZ~xxmz2keQ_s;KK-n+hcd++|<<Gts5ulL^Xect=N_j~XEKHz=e`=Iy1??c{) zz7KmJ{yyS;<ol@i(eGp4$G(qyAOAk#ed7D1_sQ>5-lx7#d!PP3<9+7)toPaPbKd8^ z&wHQ$zTkb~`=a;7?@Qj7zAt-U{=VXU<@>7l)$eQG*S@cNU;n=0edGJ4_s#EH-nYJQ zd*A-P<9+A*uJ_&Vd*1iH?|a|>e!}~S?<c*V{C>*&sqd$~pZ<Qv`<d@&y`TMl&ilFV z=e?i*e!=^N?-#va{C>&%rSF%$U;ci@`<3rky<h!)&HJ_Q*S%l=e#85X?>D{Q{C>;( zt?#$J-~N8b`<?H1z2E(Q&-=aa_r2f${=oZ#?+?8{{Qk)MqwkNsKmPv2`;+fay+8f_ z%=@$N&%HnY{=)l<?=QW-{Qk=OtM9M9zyAKl`<w4?y}$kb&ilLX@4dhO{=xf)?;pK? z{Qk-Nr|+M=fByc(`<L%uy?_1w&HK0S-@SkT{=@r^??1i&{Qk@PukXLT|Nj2R`=9TB zz5o6G&-=gc|GoeJp5X)I2c{3qA6P!Heqj5+{(<8I=LfD2+#h&8@P6R?!2dzugWw0D z55gZrK8Su0`yl>7;)CP|sSna0WIo7#kozG2LE(eq2c-|nA5=c5eo*_M{z2n|<_E10 z+8=a2=zh@qp#Q<(gW(6G55^x%KA3(m`(XaT;)CS}s}I&6Y(Ch2u=`;D!Qq4B2d59t zA6!1TesKHX{=wse=LfG3-XDBE_<r#F;Qt}uL*R#?55XToK7@V<`w;#i;zQ(zs1MN} zVm`!vi2D%#A>l*fhole5A5uP~en|U}{vqQ-=7+2g*&lK~<bKHekpH3JL*a*_55*r! zK9qha`%wO&;zQ+!st?s4YChC{sQXa=q2WX0ho%qBA6h=NerWs9{-NVT=ZCHj-5+{B z^nU33(Enk=hlw91eVF`V%7>{RrhS<HVaA7<A7*`+{bA0BxgX|znEzqHhlL*&eOUZq z$%myMmVH?MVa11)A69)>{b9|AwI9}fSpQ+ehm9XLec1eA%ZIHWwtd+CVaJD^A9j7% z{bA3Cy&v{{*#F_chl3vueK`E#$cLjJj(s@(;lziNA5MKZ{o%}qvmefVIRD|ohl?LB zeYpJL%7?2Tu6?-v;l_uXA8viP{o&4syC3d-xc}k7hld{?eR%xg$%m&Oo_%=!;l+oS zA6|WU{o&1rw;$epc>m$UhmRjVefa$0%ZINYzJ2)q;m3!cAAWuK{o&7tzaRd6`2T_7 zBjZP=kIWxgKC*sf`^f&0<0I!su8-Uwc|P)f<on3~QQ)KCN1>0xA4NWjeiZvC{!!wi z<VUHG(jR3$%6^plDF0F6qvA)UkIElaKB|6H`>6g=<D=$Bt&iFtbw28T)cdIa(cq)u zN28C%A5A`*el+`N{?X#2<wvWJ)*o#?+J3bAX#dgSqvJ=XkIo-mKDvH%`{@4B<D=(C zuaDjzeLnhr^!w=lG2mn1$DohFA45Kdehm8<{xRZX<j1Iw(H~<z#(s?Z82>ThW8%l8 zkI5fXKBj(5`<VVQ<74K>tdH3rb3W#N%=?)CvEXCj$D)tLA4@)#ek}V~{;}d?<;SXz z)gNm<)_$z}SpTu%W8=rBkIf%jKDK^r``G@m<74N?u8-Xxdp`Dl?EBdNal*%mA18gB z{Bg?1sUN3(oc?jf$C)2zeVqMq&d0eQ=Y5?2alyxh9~XUG{Bg<0r5~4lT>f#z$CV#f zeO&!<&BwJL*L__7al^-rA2)s6{Bg_2tsl32-2QRL$DJQ{ecb(V&&RzV_kG;|@xaG} z9}j&z{PD=gqaTlbJpS>-$CDpVeLVf~%*V4I&wV`q@xsT8A1{5p{PD`is~@j@y#DdV z$D1E-eZ2kg&d0kS?|r=g@xjN3A0K^u{PD@hryrkveE#vp$Cn>peSH1#&BwPN-+g@l z@x#ZDA3uHk{PD}juOGjC{QmLB$Dbd6ef<6L&&R(X|9$-bk>L~LC#Fx#pIAPzeq#H? z{)yug=O?aD+@E+p@qXg_#Q#a)li(+zPr{!>K8b!3`y~EJ;*;bjsZY|MWIoA$lKUk8 zN#T>?C#6rypHx1nep36S{z>DL<|nOB+Mjej>3-7tr2om_li??$PsX22KAC<p`(*yf z;*;ekt54RSY(Ck3vioHJ$>EdZC#O%&pIkn<escTd{>kH$=O?dE-k*Fv`F`^I<o_w) zQ{bndPr;u;K81b?`xO2u;#1_Os87+KVm`%wiu)A*DdAJ%r=(BGpHe=heoFh4{wd>A z=BKPr*`IPg<$lWhl>e#VQ{ktgPsN`~K9znd`&9m^;#1|Ps!!FQYChF|s{2&`so_)O zr>0NMpISb(ero&F{;A_r=cleu-Jg0s^?vI6)c<M1r-`2?eVY7f%BQKHrhS_JX~w6S zpJsiU{b|mpxu52Jn*V9Rr-h#ueOml!$)}~CmVH|OX~n0NpH_WZ{b|jowV&2~TK{Ro zr;VRBecJqK%crfMwtd?EX~(CXpLTuP{b|pqy`T1d+W+amr-PpkeLDQ<$fu*9j(s}* z>BOg#pH6)`{prl7v!Bj=I{)dyr;DF1eY*VV%BQQJu6?@x>Bgs<pKg7+{prr9yPxiT zy8r3Hr-z>&eR}-q$)~5Eo_%`$>BXm)pI&`>{pro8x1Zj9djILer;ndLefs?A%crlO zzJ2=s>Bpy^pMHJ%{pruAzn}hn`u~aHGvjBb&&;1$KC^yi`^^5C<1^=HuFu?`c|P-g z=KIY5S>UtaXQ9u+pG7{4eir*I{#oL)<Y%eR(w}8M%YK&oEdN>Iv*Kr^&&r=wKC6CK z`>g(1<Fn>xt<Tz@bw2BU*88mg+2FI`XQR)?pG`iSem47T{@LQQ<!7tU)}L)Y+kUqD zZ2#Hev*Tx{&(5D+KD&N)`|SSN<Fn^yug~6}eLnks_WSJrIpA~P=b+EQpF=)}eh&K_ z{yE}v<maf*(Vt^J$9|6c9RE4tbK>Wu&&i)tKBs<8`<(tc<8$Wctk2n>b3W&O&ikDI zx!`l*=c3QWpG!WMelGi5{<-3F<>#u;)t_rV*M6@1T>rV@bK~cx&&{7(KDT~u``rGy z<8$ZduFu_{dp`Gm?)%*TdBW$3pC^5u{CUdfsh_8Pp8k2p=b4{peV+Y!&gZ$G=Y5|4 zdBNv}pBH^z{CUaerJt95UjBK-=arvVeO~=}&F8hB*L`09dBf+8pErHp{CUggt)I7j z-u`*V=bfK-ect_f&*#0L_kG^~`M~FcpAUUL{Q1b|qo0p`KK}W{=aZjLeLns9%;&S8 z&wW1s`NHRmpD%sB{Q1h~tDmoZzW({f=bN8zeZKwq&gZ+I?|r`i`N8LhpC5gG{Q1e} zr=OpFe*XEz=a-*feSZD<&F8nD-+g}n`NQXrpFe&6{Q1l0ub;nt{{H#L=bxW{eg6IV z&*#6N|9$@dnc)lL7p5=FUs%4deqsB<{)OWU=NGOo++TRU@P6U@!v96!i{KZbFT!6$ zzKDJi`y&2D;)~=LsV~xBWWLCLk^3V5Md6F$7o{)CUsS%Reo_0P{zc=9<`=Cm+Fx|O z=zh`rqW{I<i{TfeFUDU?zL<V7`(pmZ;)~@Mt1s4HY`)ljvHN2G#o>$N7pE`IUtGSp zesTNa{>9^q=NGRp-d}va_<r&G;{PS!OW>EFFTr0zzJz`W`x5>o;!EV0s4vl9V!p(F ziTe`&CE-irm!vPrUsArLeo6b1{w3o}=9jE5*<W(L<bKKflK-XPOW~KIFU4O<zLb6` z`%?a;;!EY1sxQ@FYQEHdsryp@rQu8Cm!>bxUs}GjerfyC{-xtf=a;T8-CugX^nU64 z(*I?`mx*5{eVP1a%9p8MrhS?IWyY78UuJ!o{bkOVxnJgeng3<MmxW&zeOdfv$(N;H zmVH_NWyP13Usiot{bkLUwO`hKS^s6jmyKUGecAkF%a^TRwtd<DWyhDDUv_=j{bkRW zy<hfy+5hFhmxEspeL4K)$d{vEj(s`)<;0hhUrv2F{pHM;vtQ1AIsfItmy2I6eYyPQ z%9pEOu6?=w<;ItrUv7Q5{pHS=yI<~ox&P(Cmxo^-eR=%l$(N^Jo_%@#<;9nmUtWEA z{pHP<w_o0UdH?0ZmycgQefj+5%a^ZTzJ2-r<;RzwUw(c0{pHV>zhC}+`TvFCE8|zD zugqUrzOsI0`^x^6<16P^uCLr*dA{;~<@?J2Rp6`OSD~-MUq!x(eii#F{#D|u<X5S$ z(qCo1%6^smD*sjCtKwIsugYIlzN&sz`>Os`<E!RZt*_c&b-wC;)%&Xd)!?h)SEH}S zUroN6el`1Q{?+2E<yWh()?aPD+J3eBYX8;YtK(Ovug+gxzPf&O`|AGH<E!Uaudm); zeZKmB_514oHQ;OD*PyS#UqilzehvE?{x#xj<kzUL(O+Y}#(s_a8vixnYvR|WugPCi zzNUUn`<nhW<7?*EtgqQ$bH3(&&HI}Fwcu;v*P^e*UrWB0el7c2{<Y$3<=3jO)n9AA z)_$$~TK~1-Yvb3ZugzauzP5gC``Z4s<7?;FuCLu+d%pI5?fcsQb;8$)UnhN?{B_FL zsb8mko&I&k*O^~ueVzSv&eyqL=Y5_3b-~w#Ul)B{{B_CKrC*nQUH)~&*OgyaeO>)^ z&DXVG*L_|8b;H+<UpIZ-{B_IMtzWl&-TrmQ*PUN?eck<a&)2<Q_kG>}^}yGIUk`mf z{PoD!qhF7GJ^uB?*OOmQeLem4%-6GD&wV}r^}^SSUoU;V{PoJ$t6#5uz5eya*PCB& zeZBql&eywN?|r@h^}*MNUmtya{PoG#r(d6aeg5^u*Oy;keSQ7)&DXbI-+g`m^~2YX zUq5~Q{PoM%uV24?{r>gG*Pma1ef|CQ&)2_S|9$=cmEjxXH>PjQ-&nq}eq;N_{*B`s z=Qplz+~0V<@qXj`#{W&=o8UL0Z^GY1zKMPl`zHQP;+y0*sc+KXWWLFMllvzBP2rp3 zH>GdN-&DS-epCCV{!QbX<~OZx+TV1(>3-AurvJ_0o8dR3Z^qwDzL|bA`)2;l;+y3+ zt8dodY`)okv-@WM&EcElH>YpT-(0@AeslZg{>|f?=Qpo!-rsz_`F`{J=Kn3=Ti~~# zZ^7R}zJ-1Z`xgE!;#=gmsBh8VV!p+Gi~AP;E#X_@x1?{$-%`G%eoOn7{w?EM=C`bG z+23-$<$lZimjA8bTj95&Z^hqAzLkC}`&Ry~;#=jns&CcbYQEKetNT{}t>Ihax2A8+ z-&(%4erx;I{;lI%=eMqJ-QRk?^?vL7*8gq7w~5~-eVhDk%D1WCrhS|KZN|5m-)4QA z{cX;-x!>k}oBwUWw}sypeOvr($+xB7mVI0PZN;~h-&TEF{cX*+wcpl#TmNmtw~gO6 zecSwP%eSrHwtd_FZO6Br-*$c5{cX>;z2EkI+yCvrw}amfeLMW^$hV{4j(t1+?Zmf} z-%foy{q4-Rv)|5rJOAy%w~OB{eY^ba%D1cEu6?`y?Z&s8-)?=o{q4@TyWj48yZ`OM zw};;zeS7@v$+xH9o_%}%?Zvm3-(G!t{q4=Sx8L4<d;jgjw~yaGef#|F%eSxJzJ2@t z?Z>yD-+q1j{q4`Uzu*3S`~QvMJL7kz@66v>zO#O3`_BHI<2&bfuJ7F6dA{?0=ljn8 zUEsUmccJgX-$lNQei!>L{$1j`<aep>(%)si%YK*pF8^KOyW)4H@5<j*zN>y$`>y_7 z<Gbc}t?%03b-wF<*ZZ#j-Qc_7ccbsd-%Y-oemDDW{@voc<#(&^*57Tu+kUtEZvWlk zyW@AK@6O*{zPo;R`|keT<Gbf~ukYU9eZKpC_xtYuJ>Yxb_n_~=-$TBKeh>Q|{ypM* z<oBrW(cfdf$9|9d9{)Yzd*b(`@5$d&zNdaq`=0(i<9p`!tnb<1bH3+(&-<SLz2JM{ z_oDB`-%GxielPo8{=MRR<@c)Z)!%Er*M6`2UjMz}d*k<}@6F#^zPEmF``-S&<9p}# zuJ7I7d%pL6@B7~WeZu#N-zR;a{C&#zso$r4pZ<Nu_nF^keV_e(&iA?B=Y605eZlvI z-xqyf{C&yyrQer*U;cf?_m$sQeP8{3&G)t6*L`3AeZ%*S-#2~V{C&&!t>3qO-~N5a z_nqH&ec%0k&-cCG_kG|0{lNEw-w%C1{Qb!Hqu-BxKmPs1_mkgGeLwyE%=fe3&wW4t z{lfQ)-!FZ?{Qb)JtKYAEzyAHk_nY5ueZT$v&iA|D?|r}j{lWK#-yeN{{Qb%Ir{AA_ zfByZ&_m|&aeSiJ^&G)z8-+h1o{loW<-#>l-{Qb-Kuiw9Y|Ni~Q_n+T?egFOa&-cII z|9$`eo#6-L52hc?KUjXS{$TsT{)6KO=MSzQ+&_4J@c!WY!T&?xhu{yPAHqLGeu(}M z`yu{A;)mo9sUOlmWPZs0kozJ3L*a+w52YW<KU99G{!sg&{zK!3<`1nO+COxD=>E|A zq5s3+hv5&SAI3jSewh9+`(ggW;)mrAs~^@sY<}4Ou=`>E!{LYH52qi_KU{ve{&4%@ z{=?&k=MS$R-amYP`2O(w;r}DxN8pd3AHhFDeuVxA`w{*l;z#6<s2|ZkVt&N_i2D)$ zBjHElkE9>TKT>|A{z&_g{v+c@=8vo&**|iA<o?L}k^iIMN8yj6AH_dPew6+w`%(U* z;z#9=svp%qYJSxIsQXd>qv1#6kES2ZKU#jY{%HHr{-fhZ=Z~%*-9LJM^#17k(f?z@ zkBL7f{h0h?%8#i(ru~@yW5$n}KW6=y{bSCLxj*LpnEzwJkA*)L{aE~C$&aN!mi<`% zW5th^KUV!%{bS9KwLjMVSpQ?gkBvVz{n-3t%a5%;w*A=tW5<u3KX(1t{bSFMy+8K- z*#G0ekApuB{W$#N$d98xj{P|P<HV1XKTiEP{o~A!vp>%LIRE3qkBdJp{kZ(&%8#o* zuKl?F<HnDhKW_cF{o~G$yFc#zxc}q9kB2`V{doN2$&aT$p8a_K<He7cKVJQK{o~D# zw?E$fc>m+WkB>h-{rLRj%a5-=zWw<A<HwJmKYsoA{o~J%zd!!{`2U09C*x11pUgj5 zezN{#`^o;3<0t1&uAkgLd4BT#<on70Q{boIPobZ}KSh3u{uKKu{!`+o<WH%e(m!Q> z%Knu5DgRU9r{YhgpUOW~eyaXd`>Fm@<EQ3Nt)JRIb$;sp)cdLb)8MD!Potm4KTUp` z{xth({?p>8<xi`h)<122+WxfrY5&vVr{hnjpUyvBe!Bj2`|1AE<EQ6Oub<vOeSZ4> z^!w@mGvH_7&!C^dKSO?o{tWvW{xjld<j<&|(LZB;#{P`^8UHikXX4MKpUFQ{ey09R z`<ebT<7ej2te@FGbAIOj%=?-Dv*2gp&!V5jKTCd={w(`h{<Gp|<<F|0)jw-~*8Z&f zS^u-)XXDSNpUpp8ezyK>``P}p<7em3uAkjMdw%x*?EBgObHdMwKPUa1{Bz3BsXwRv zoc?ph&zV1G{ha-C&d<3&=lz`jbHUGrKNtO6{Bz0Ar9YSbT>f*#&y_z{{apQX&Cj(z z*Zo}obHmS#KR5l{{Bz6Ctv|Q@-2QXN&z(Pa{oMU?&(FO-_x;@e^T5x8KM(yp{PW1q zqd$-RJpS{<&yzn-{XG5i%+Iqw&;30A^TN-IKQH~f{PW7st3R*(y#DjX&znDQ{k;A2 z&d<9)@BO_0^TE%DKOg;k{PW4rr$3+leE##r&zC=6{e1oN&Cj<#-~D|5^TW@NKR^Ba z{PWAtuRp*2{QmRD&!0bk{rvs&&(FU<|NZ>`li?TRFQ#A2zgT{;{$l&Z{)^)m=P#~b z+`o8!@&4lb#s5p-m*6j<U&6mceu@4P`z8KM;+NzvsbA8+WPZv1lKUn9OW~K|FQs3~ zzf^vy{!;s;{!8PR<}a;Z+P`#u>HgCDrT@#|m*Fp?U&g;oewqF<`(^&i;+N$wt6$c? zY<}7PvioKK%i)*fFQ;G5zg&K~{&M@}{>$T+=P$2c-oJc)`Tp|z<^L<-SKzOpU%|gZ zeue%D`xX8x;#cIas9({)Vt&Q`iu)D+E8$n-ucTkezfyjs{!06m{ww2G=C7<@*}rmr z<^Ib1mH(^YSK+UsU&X&lewF?z`&Is{;#cLbs$bQ=YJS!Js{2*{tKnDUuclwkzgm8^ z{%ZTx{;T6x=dZ3`-M@N%_5SMn)&Fb4uZh1V{hIu1%CD)vru~}!YsRmczh?cK{cFyz zxxeQ9n*VFTuZ6!B{aXBM$*-lqmi=1(YsIgXzgGQP{cFvywZGQ=TK{XquZ_Pp{o4F% z%df4!w*A`vYsashzjpoF{cF#!y}$PT+W+gouY<o1{W|>X$giWnj{Q3R>%^~<zfS!+ z{p-xHv%k*$I{)j!uZzDf{kr_?%CD=xuKl|H>&CB}zi$1y{p-%JyT9)Jy8r9JuZO=L z{d)ZC$*-rsp8b0M>&35^zh3=%{p-!Ix4+)~djIRguaCbz{rddt%dfA$zWw_C>&LI3 zzkdDt{p-)KzrX(d`u~gJH{)-n-^{;RezX2&`_2BF<2UDTuHW3hd4BW$=KIb6Tj00g zZ=v79zeRqF{ucW!{#)X=<Zr3p(!XVX%l?-8E&p5Lx8iT5-^#yLeyjdg`>p<4<G1E- zt>4<eb$;vq*88ph+u*n1Z=>JFzfFFd{x<t<{@dcW<!`Is*1v6j+y1uuZU5Whx8rZ8 z-_E~Xe!Kp5`|bYQ<G1H;uixIkeSZ7?_WSMsJK%TV@1Wnoze9e9{to*c{yXA#<nO58 z(Z6GU$NrA{9sfJwcjE7)-^ssIey9FU`<?zf<9Fuotl!zcbAIRk&ikGJyWn@>@1ozu zze|3X{x17n{=4FL<?pKB)xT?g*Z!{iUH`k`cjND--_5^Uez*Q^``!M#<9FxpuHW6i zdw%!+?)%;Ud&2LDzbE~k{CmppslTWFp8k8r@0q`6{hs}M&hNRu=l!1ld%^F8zZd;p z{CmmorN5W`UjBQ<@0Gt-{a*ch&F{6p*Zp4qd&BRIzc>Bf{Cmsqt-rVZ-u`>X@14JQ z{oeh1&+omz_x;}g`@rvmzYqOB{QJo7qrZ>+KK}c}?~}hz{XYHs%<r?m&;36C`@-*w zzc2m1{QJu9tG}=PzW)2h@0-7G{l5MC&hNXw@BP02`@!#rzaRa6{QJr8r@x>5e*XK# z@0Y({{eJ!X&F{Cr-~E37`@`>#zd!x{{QJxAufM<j{{H*N@1MVa{r>&?&+os#|NZ{| zo8b@RAErOde^~yo{$cyW{)gia=O3;=+<$of@c!ZZ!~aL%kKiAnKf-@R{)qk&`y>8G z;*aDXsXx+xWd6whk^3Y6N8yj+AEiIae^mac{!#m*{zv1F<{zy;+JAKZ=>F0BqyNX? zkKrGqKgNGd{+RwT`(ysc;*aGYt3TF%Z2s8(vHN5H$Kj9TAE!Uge_Z~!{&D-`{>S5w z=O3>>-hX`l`2O+x<Nqh%PvD=RKf!-O{)GMs`xE{r;!otCs6WwvV*bSbiTe}(C*e=x zpQJy@e^UOW{z?0j{wL#4=AW!T*?)5W<o?O~lmDmSPvM`UKgEAa{*?YH`&0g>;!owD zsz23#YW~#zsrys^r{PcIpQb;}e_H;u{%QNu{-@(l=bx@W-G6%i^#1Al)Bk6}pNW4a z{h9n{%Acu!ru~`zXU3nIe`fue{b$afxqs&Ung3_OpM`%G{aO5H$)BZvmi<}&XT_hD ze^&ij{b$XewSU(AS^sClpN)Su{n`9y%b%@(w*A@uXUCtNe|G)Z{b$dgy?^%o+5hLj zpM!r6{W<*S$e*Ksj{Q0Q=ft0re@^{5{pZY|vwzP0IsfOvpNoGk{ki<-%Ac!$uKl_G z=f<C#e{TJ`{pZe~yMONex&P<EpND@Q{dxT7$)Bfxp8a|L=f$6we_s80{pZb}w}0OK zdH?6bpO1e&{rUXo%b%}*zWw?B=f|I)e}4V>{pZi0zkmMy`TvLEFXLaPzs!GG{<8jM z`^)~9<1go5uD{%WdH(YL<@?M3SKzPUU!lLke?|U^{uTQx{#W9!<X@@3(tl<C%Knx6 zEB{yFui{^&zsi4A{;K{}`>Xy}<FDplt-soTb^hx9)%&ae*Wj<=U!%Xqe@*_H{x$n+ z{@3EK<zK76)_-mO+WxisYya2buj5~*zs`SM{<{8k`|JMK<FDsmufN`Zeg69X_517p zH{fsJ-=M$2e?$I;{tf#Z{x{-p<lm^j(SKw9#{P}_8~-=qZ{pvizsY}7{-*v-`<wnZ z<8S8QtiRcRbN=T3&HJ1Gx8QH#-=e?8e@p(B{w@1k{<q?9<=?8m)qiXL*8Z*gTmQG= zZ{y#lzs-MJ{<i*Y``iAv<8SBRuD{)Xd;a$R?fcvRcf#L^e<%H&{CCRVseh;ao&I;m z-<f}B{hj@H&fmFz=lz}kcfsF<e;55-{CCOUrGJ<GUH*5)-<5w?{ayWc&EK_u*Zp1p zcf;R}e>eTz{CCUWt$(-u-TrsS-<^MV{oVa{&)>a&_x;`f_rTwSe-HgV{P)P;qkoV6 zJ^uH^-;;k&{XPBn%-^$r&;33B_rl+ce=q&L{P)V=tADTkz5e&c-<yAL{k{G7&fmL# z@BO|1_rc$Xe;@sQ{P)S<r+=UQeg5~w-<N-1{eAuS&EL0w-~E06_ru?he?R^G{P)Y> zuYbS&{r>mI-=BYf{r&y-&)>g)|NZ^{m*F4dKc;`o|5*O9{$u;c{*U7y=RdB0-2Zs~ z@&4oc$Nx{@pWr{Cf5QJn{)zq*`zQWS;-BO{sejV{Wd6zillv$CPvM{9Kc#=l|5W~| z{!{y>{!ind=0B}}+W&O^>HgFEr~l93pW#2Ff5!hz{+a$W`)B^o;-BR|tAE!2Z2sB) zv-@ZN&*7irKc|1r|6KmL{&V~1{?Fr|=RdE1-v505`Tq0!=l?I@U*Nx>f5HDk{)PSv z`xpK%;$P&ysDIJ_V*bVci~AS<FX3O}zodW3|5E;?{!9Cp{x9QS=D)0e+5d9><^Ie2 zm;bNeU*W%^f5rbw{+0eK`&a(2;$P*zs(;o0YW~&!tNT~~ui;<gzovi9|62aF{%iZ! z{;%U-=fAFh-T!+2_5SPo*Z*(Azlr}Q{hR!6%D<`qrv01#Z^plw|7QK0{cp~{x&P+< zoBwaYzlHx6{agHR$-kxlmi=4)Z^gfr|5p85{cp{`wg1-rTmNsvzm5Mk{oDL+%fGGv zw*A}wZ^yr#|91V`{cq2|z5n+8+yC#tzk~k{{X6{c$iJiij{Q6S@5H~8|4#io{qM}b zv;WThJOA&(zl;Aa{k#0{%D=1suKm0I@5aBI|8D)e{qN4dyZ`R}yZ`UOzlZ-G{d@fH z$-k%np8b3N@5R5D|6cuj{qN1cxBuS#d;jmlzmNYu{rmjy%fGMxzWw|D@5jHN|9<`Z z{qN7ezyJRI`~Q#OKjVL<|IGhc{<HpP`_KNL<3HzruK(QsdH(bM=ljq9U*Nysf1&@v z|3&_b{ulc%{$Jw1<bSFE(*I@t%l?=9FaKZRzv6$T|H}VW{;U31`>+0A<G<#At^eBp zb^h!A*ZZ&k-{8ODf204#|4sgz{x|z?{@>!i<$tUH*8gq(+y1xvZ~x!nzvF+W|IYti z{=5En`|tkW<G<&Bum9fveg6CY_xtbvKj44h|DgZD|3m(V{tx>f{y*Y><o~Gu(f?!q z$NrD|AOAn$f8zh7|H=PT{-^#=`=9<l<A3J=tpC~nbN=W4&-<VMzu<r2|DylJ|4aUt z{xADq{=edX<^QVx)&Fb$*Z!~jU;n@1f8+nA|IPnf{<r>b```Y*<A3M>uK(Ttd;a(S z@B82Xf5QKX|0n&Q{C~>-ssE?_pZ<Tw|C#@1{h$4R&i}dp=l!4mf5HES{}=sV{C~;+ zrT>@xU;cl^|CRq&{a^im&HuIk*Zp7rf5ZQc|2O^L{C~^;t^c?E-~NBc|DFGL{onn6 z&;Pyu_x<1h|G@u){}25?{Qt=RqyLZnKmPy3|C9eu{XhNx%>T3h&;39D|HA)^|1bT& z{Qt`TtN*Y4zyANm|C|4B{lESH&i}jr@BP33|H1!<{~!H-{Qt@Sr~jY*fByf)|Cj$? z{eS)c&HuOm-~E68|HJ=}|3Cfz{Qt}Uum8XO|Nj5S|DXSV{r~;{&;P&w|NZ~}9{@>^ B9peB1 diff --git a/QDMA/windows/apps/dma-rw/datafile4K.bin b/QDMA/windows/apps/dma-rw/datafile4K.bin deleted file mode 100644 index df437f42c808d41dec5d543d60ce94c8cb8a044a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQzWMXDvWn<^y<l^Sx<>MC+6cQE@6%&_`l#-T_m6KOcR8m$^Ra4i{)Y8_`)zddH zG%_|ZH8Z!cw6eCbwX=6{baHlab#wRd^z!!c_45x13<?ej4GWKmjEatljf+o6OiE5k zO-s+n%*xKm&C4$+EGjN3Ei136tg5c5t*dWnY-(<4ZENr7?CS36?dzW~anj@|Q>RUz zF>}`JIdkXDU$Ah|;w4L$Enl&6)#^2C*R9{Mant54TeofBv2)k%J$v`<KXCBS;Uh<n z9Y1mM)af&4&z-+;@zUihSFc^aar4&gJ9qEhfAH|p<0ns_J%91?)$2EJ-@X6v@zduo zU%!3-@$=X3KY#!IANBue{Ew#p(fmJJ{*9LZqxIit{Xg3N8EyZKwtq+4|D*k%(f;2^ H=>Gx$V6OOT diff --git a/QDMA/windows/apps/dma-rw/dma_rw.cpp b/QDMA/windows/apps/dma-rw/dma_rw.cpp deleted file mode 100644 index 21406e5..0000000 --- a/QDMA/windows/apps/dma-rw/dma_rw.cpp +++ /dev/null @@ -1,543 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "dma_rw.hpp" -#include "version.h" - -cli_cmd cmd; - -int qdma_device::qdma_read(void ) -{ - cmd.data = allocate_buffer(cmd.size, cmd.alignment); - if (!cmd.data) { - throw std::runtime_error("Error allocating memory" + get_last_win_err_msg()); - } - - switch (cmd.node) { - case devnode_sel::control: - if (INVALID_SET_FILE_POINTER == SetFilePointer(control_bar_.h, static_cast<LONG>(cmd.addr), nullptr, FILE_BEGIN)) { - throw runtime_error("SetFilePointer failed: " + std::to_string(GetLastError())); - } - if (!ReadFile(control_bar_.h, cmd.data, cmd.size, &cmd.size, NULL)) { - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - print_bytes(cmd.addr, cmd.data, cmd.size); - break; - - case devnode_sel::user: - if (false == dgen.read(cmd.data, cmd.addr, cmd.size)) { - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - print_bytes(cmd.addr, cmd.data, cmd.size); - break; - - case devnode_sel::queue_mm: - qopen(cmd.qid, true); - - if (INVALID_SET_FILE_POINTER == SetFilePointer(queue_.h, static_cast<LONG>(cmd.addr), nullptr, FILE_BEGIN)) { - throw runtime_error("SetFilePointer failed: " + std::to_string(GetLastError())); - } - if (!ReadFile(queue_.h, cmd.data, cmd.size, &cmd.size, NULL)) { - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - - if (TRUE == cmd.binary) - print_bytes_binary(cmd.data, cmd.size); - else - print_bytes(cmd.addr, cmd.data, cmd.size); - - qclose(); - - break; - - case devnode_sel::queue_st: - { - DWORD packet_size; - DWORD packet_cnt; - DWORD remain_size = cmd.size; - DWORD rxd_size = 0; - DWORD buf_idx = 0; - bool pkt_generate = true; - bool last_pkt_generate = true; - - qopen(cmd.qid, false); - do { - if (remain_size >= ST_C2H_MAX_PACK_SIZE_CHUNK) { - packet_cnt = remain_size / ST_C2H_MAX_PACK_SIZE_CHUNK; - packet_size = ST_C2H_MAX_PACK_SIZE_CHUNK; - } - else { - if (last_pkt_generate) { - pkt_generate = true; - last_pkt_generate = false; - } - packet_cnt = 1; - packet_size = remain_size; - } - - if (cmd.size == 0x0) { - cout << "Initiating Zero Byte Read\n"; - } - - if (pkt_generate) { - dgen.reset_pkt_ctrl(); - dgen.configure_c2h(cmd.qid + qbase, packet_size, packet_cnt); - dgen.generate_packets(); - pkt_generate = false; - } - - if (!ReadFile(queue_.h, &cmd.data[buf_idx], (packet_size * packet_cnt), &rxd_size, NULL)) { - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - - buf_idx = buf_idx + rxd_size; - remain_size = remain_size - rxd_size; - - if (cmd.size == 0x0) { - cout << "ZERO Byte Read Successful\n"; - } - } while (remain_size); - qclose(); - - if (TRUE == cmd.binary) - print_bytes_binary(cmd.data, cmd.size); - else - print_bytes(cmd.addr, cmd.data, cmd.size); - } - - break; - - default: - return 1; - } - - if (cmd.data) _aligned_free(cmd.data); - return 0; -} - -int qdma_device::qdma_write(void ) -{ - switch (cmd.node) { - case devnode_sel::control: - if (INVALID_SET_FILE_POINTER == SetFilePointer(control_bar_.h, static_cast<LONG>(cmd.addr), nullptr, FILE_BEGIN)) { - throw runtime_error("SetFilePointer failed: " + std::to_string(GetLastError())); - } - if (!WriteFile(control_bar_.h, cmd.data, cmd.size, &cmd.size, NULL)) { - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - break; - - case devnode_sel::user: - if (false == dgen.write(cmd.data, cmd.addr, cmd.size)) { - throw std::runtime_error("Failed to read from device! " + get_last_win_err_msg()); - } - break; - - case devnode_sel::queue_mm: - qopen(cmd.qid, true); - - if (cmd.data == nullptr && false == cmd.file.empty()) { - read_file_option(); - } - - if (INVALID_SET_FILE_POINTER == SetFilePointer(queue_.h, static_cast<LONG>(cmd.addr), nullptr, FILE_BEGIN)) { - throw runtime_error("SetFilePointer failed: " + std::to_string(GetLastError())); - } - if (!WriteFile(queue_.h, cmd.data, cmd.size, &cmd.size, NULL)) { - throw std::runtime_error("Failed to write to device! " + get_last_win_err_msg()); - } - - qclose(); - - break; - - case devnode_sel::queue_st: - { - qopen(cmd.qid, false); - aligned_vector<uint16_t> wr_buffer(cmd.size); - iota(wr_buffer.begin(), wr_buffer.end(), static_cast<uint16_t>(0)); /* 0, 1, 2, 3, 4 ... */ - dgen.reset_h2c(); - - if (cmd.size == 0x0) { - cout <<"Initiating Zero Byte Write\n"; - } - - if (!WriteFile(queue_.h, wr_buffer.data(), cmd.size, &cmd.size, NULL)) { - throw std::runtime_error("Failed to write to device! " + get_last_win_err_msg()); - } - - if (true == dgen.check_h2c(cmd.qid + qbase)) - cout << "Data generator returned SUCCESS for received data" << endl; - else - throw std::runtime_error("Data generator reported error for received data!"); - - if (cmd.size == 0x0) { - cout << "ZERO Byte Write Successful\n"; - } - - qclose(); - break; - } - default: - return 1; - } - - if (cmd.data) _aligned_free(cmd.data); - return 0; -} - -int qdma_device::qdma_interrupt(void) -{ - switch (cmd.node) { - case devnode_sel::user: - if (false == dgen.generate_user_interrupt(cmd.fun_no)) { - throw std::runtime_error("Failed to generate user interrupt from device! " + get_last_win_err_msg()); - } - break; - - default: - throw std::runtime_error("Can not generate user interrupt for wrong target! " + get_last_win_err_msg()); - } - - return 0; -} - -static int is_printable(char c) -{ - /* anything below ASCII code 32 is non-printing, 127 is DELETE */ - if (c < 32 || c == 127) { - return FALSE; - } - return TRUE; -} - -static void print_bytes_binary(BYTE* data, size_t length) -{ - FILE* output = stdout; - - if (false == cmd.file.empty()) { - fopen_s(&output, cmd.file.data(), "wb"); - } - - fwrite(data, sizeof(BYTE), length, output); - - if (false == cmd.file.empty()) { - fclose(output); - } -} - -static void print_bytes(size_t addr, BYTE* data, size_t length) -{ - FILE* output = stdout; - - if (false == cmd.file.empty()) { - fopen_s(&output, cmd.file.data(), "wb"); - } - - /* formatted output */ - for (int row = 0; row < (int)(length / 16 + ((length % 16) ? 1 : 0)); - row++) { - - /* Print address */ - fprintf(output, "0x%04zX: ", addr + row * 16); - - /* Print bytes */ - int column; - for (column = 0; column < (int)min(16, length - (row * 16)); - column++) { - fprintf(output, "%02x ", data[(row * 16) + column]); - } - for (; column < 16; column++) { - fprintf(output, " "); - } - - /* Print gutter */ - fprintf(output, " "); - - /* Print characters */ - for (column = 0; column < (int)min(16, length - (row * 16)); - column++) { - fprintf(output, "%c", is_printable(data[(row * 16) + column]) ? - (data[(row * 16) + column]) : '.'); - } - for (; column < 16; column++) { - fprintf(output, " "); - } - fprintf(output, "\n"); - } - - if (false == cmd.file.empty()) { - fclose(output); - } -} - -static int read_file_option(void) -{ - FILE* inputFile; - if (fopen_s(&inputFile, cmd.file.data(), "rb") != 0) { - fprintf(stderr, "Could not open file <%s>\n", cmd.file.data()); - return 1; - } - - /* determine file size */ - if (cmd.size == 0) { - fseek(inputFile, 0, SEEK_END); - fpos_t fpos; - fgetpos(inputFile, &fpos); - fseek(inputFile, 0, SEEK_SET); - cmd.size = (DWORD)fpos; - } - - cmd.data = allocate_buffer(cmd.size, cmd.alignment); - if (!cmd.data) { - fprintf(stderr, "Error allocating %ld bytes of memory, error code: %ld\n", cmd.size, GetLastError()); - return 1; - } - cmd.size = (DWORD)fread(cmd.data, 1, cmd.size, inputFile); - - fclose(inputFile); - return 0; -} - -static void help(void) -{ - cout << "dma-rw usage:\n"; - cout << "dma-rw -v : prints the version information\n\n"; - cout << "dma-rw qdma<N> <DEVNODE> <read|write> <ADDR> [OPTIONS] [DATA]\n\n"; - cout << "- qdma<N> : unique qdma device name (<N> is BBDDF where BB -> PCI Bus No, DD -> PCI Dev No, F -> PCI Fun No)\n"; - cout << "- DEVNODE : One of: control | user | queue_mm_ | queue_st_*\n"; - cout << " where the * is a numeric wildcard (0 - N) for queue.\n"; - cout << "- ADDR : The target offset address of the read/write operation.\n"; - cout << " Applicable only for control, user, queue_mm device nodes.\n"; - cout << " Can be in hex or decimal.\n"; - cout << "- OPTIONS : \n"; - cout << " -a set alignment requirement for host-side buffer (default: PAGE_SIZE)\n"; - cout << " -b open file as binary\n"; - cout << " -f use contents of file as input or write output into file.\n"; - cout << " -l length of data to read/write (default: 4 bytes or whole file if '-f' flag is used)\n"; - cout << "- DATA : Space separated bytes (big endian) in decimal or hex, \n"; - cout << " e.g.: 17 34 51 68\n"; - cout << " or: 0x11 0x22 0x33 0x44\n"; -} - -static void init_cmd(void) -{ - cmd.addr = 0x0; - cmd.alignment = 0; - cmd.binary = false; - cmd.node = devnode_sel::none; - cmd.op = op_sel::none; - cmd.bus_no = 0; - cmd.dev_no = 0; - cmd.fun_no = 0; - cmd.dev_name[0] = '\0'; - cmd.qid = 0; - cmd.size = 4; - cmd.data = nullptr; -} - -static BYTE* allocate_buffer(size_t size, size_t alignment) -{ - if (size == 0) { - size = 4; - } - - if (alignment == 0) { - SYSTEM_INFO sys_info; - GetSystemInfo(&sys_info); - alignment = sys_info.dwPageSize; - } - - return (BYTE*)_aligned_malloc(size, alignment); -} - -int parse_command_line(const int argc, char* argv[]) -{ - /* - * dma-rw pf <pf_number> <device> <read|write> <address> [OPTIONS] [DATA] - * 0 1 2 3 4 5 6... n... - */ - auto argidx = 1; - - if (argc < 2) { - return 1; - } - - if ((strcmp(argv[argidx], "-v") == 0) || (strcmp(argv[argidx], "-V") == 0)) { - printf("%s version %s\n", PROGNAME, VERSION); - printf("%s\n", COPYRIGHT); - exit(0); - } - - init_cmd(); - - if (argc < 5) { - return 1; - } - - if (strncmp(argv[argidx], "qdma", 4)) { - return 1; - } - - strncpy_s(cmd.dev_name, DEV_NAME_MAX_SZ, argv[argidx], _TRUNCATE); - ++argidx; - - if (strcmp(argv[argidx], "control") == 0) { - cmd.node = devnode_sel::control; - } - else if (strcmp(argv[argidx], "user") == 0) { - cmd.node = devnode_sel::user; - - if (strcmp(argv[argidx + 1], "interrupt") == 0) { - cmd.op = op_sel::interrupt; - return 0; - } - } - else if (std::regex_match(argv[argidx], std::regex("queue_mm_[0-9]+"))) { - string qid_str{ argv[argidx] }; - auto it = std::find(qid_str.begin(), qid_str.end(), '_'); - it = it+4; - cout << *it << endl; - cmd.qid = std::stoul(string{ it, qid_str.end() }); - cmd.node = devnode_sel::queue_mm; - } - else if (std::regex_match(argv[argidx], std::regex("queue_st_[0-9]+"))) { - string qid_str{ argv[argidx] }; - auto it = std::find(qid_str.begin(), qid_str.end(), '_'); - it = it + 4; - cmd.qid = std::stoul(string{ it, qid_str.end() }); - cmd.node = devnode_sel::queue_st; - } - else { - return 1; - } - ++argidx; - - if (strcmp(argv[argidx], "read") == 0) { - cmd.op = op_sel::read; - } - else if (strcmp(argv[argidx], "write") == 0) { - cmd.op = op_sel::write; - } - else - return 1; - ++argidx; - - if (cmd.node == devnode_sel::queue_mm || cmd.node == devnode_sel::control || cmd.node == devnode_sel::user) { - cmd.addr = strtoul(argv[argidx], NULL, 0); - ++argidx; - } - else if (cmd.node == devnode_sel::queue_st) { - if (argv[argidx][0] != '-') { - return 1; - } - } - - while ((argidx < argc) && ((argv[argidx][0] == '-') || (argv[argidx][0] == '/'))) { - switch (argv[argidx][1]) { - case 'l': - argidx++; - cmd.size = strtoul(argv[argidx], NULL, 0); - argidx++; - break; - case 'f': - argidx++; - cmd.file = _strdup(argv[argidx]); - argidx++; - break; - case 'a': - argidx++; - cmd.alignment = strtoul(argv[argidx], NULL, 0); - argidx++; - break; - case 'b': - cmd.binary = TRUE; - argidx++; - break; - case '?': - case 'h': - default: - return 1; - } - } - - if (argidx != argc) { - if (cmd.op == op_sel::write && - cmd.node != devnode_sel::queue_st) { - cmd.size = argc - argidx; - cmd.data = allocate_buffer(cmd.size, cmd.alignment); - if (cmd.data == nullptr) { - cout << "Could not allocate memory for data" << endl; - exit(1); - } - - for (int byteidx = 0; argidx < argc; argidx++, byteidx++) { - cmd.data[byteidx] = (char)strtoul(argv[argidx], NULL, 0); - } - } - else - return 0; - } - - return 0; -} - -int __cdecl main(const int argc, char* argv[]) -{ - try { - if (parse_command_line(argc, argv)) { - help(); - if (cmd.data) _aligned_free(cmd.data); - exit(1); - } - - auto dev_details = get_device_details(GUID_DEVINTERFACE_QDMA); - cout << "Found " << dev_details.size() << " QDMA devices\n"; - - device_details dev_info; - auto res = get_device(dev_details, cmd.dev_name, dev_info); - if (res == false) { - printf("Device name is not valid\n"); - if (cmd.data) _aligned_free(cmd.data); - return 1; - } - - cmd.bus_no = dev_info.bus_no; - cmd.dev_no = dev_info.dev_no; - cmd.fun_no = dev_info.fun_no; - qdma_device qdev(dev_info.device_path.c_str()); - - if (cmd.qid >= qdev.get_qmax()) { - if (cmd.data) _aligned_free(cmd.data); - cout << "Invalid qid provided." << endl; - return 1; - } - - if (cmd.op == op_sel::read) { - qdev.qdma_read(); - } - else if (cmd.op == op_sel::write) { - qdev.qdma_write(); - } - else if (cmd.op == op_sel::interrupt) { - qdev.qdma_interrupt(); - } - } - catch (const std::exception& e) { - if (cmd.data) _aligned_free(cmd.data); - cout << "Error: " << e.what() << '\n'; - } -} diff --git a/QDMA/windows/apps/dma-rw/dma_rw.hpp b/QDMA/windows/apps/dma-rw/dma_rw.hpp deleted file mode 100644 index 49185d6..0000000 --- a/QDMA/windows/apps/dma-rw/dma_rw.hpp +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include <array> -#include <iomanip> -#include <iostream> -#include <regex> -#include <string> -#include <sstream> -#include <numeric> - -#include "device_file.hpp" -#include "qdma_driver_api.h" - -#pragma comment(lib, "setupapi.lib") - -using std::uint32_t; -using std::string; -using std::runtime_error; -using std::cout; -using namespace std; - -#define ST_C2H_MAX_PACK_SIZE_CHUNK 4096 - -/* ----- common functions ----- */ -static constexpr uint32_t bit(uint64_t n) { - return (1ull << n); -} - -static constexpr bool is_bit_set(uint64_t x, uint64_t n) { - return (x & bit(n)) == bit(n); -} - -static constexpr uint64_t create_mask(uint64_t n, uint64_t l) { - return ((1ull << l) - 1ull) << n; -} - -static constexpr uint32_t get_bits(uint32_t value, uint32_t bit_index, uint32_t len) { - return ((value & create_mask(bit_index, len)) >> bit_index); -} -/* ----- ----- */ - -enum class devnode_sel { - control, - user, - queue_mm, - queue_st, - none -}; - -enum class op_sel { - read, - write, - interrupt, - none -}; - -struct cli_cmd { - op_sel op; - UINT8 bus_no; - UINT8 dev_no; - UINT8 fun_no; - char dev_name[DEV_NAME_MAX_SZ]; - devnode_sel node; - BYTE *data; - LONG addr; - ULONG qid; - DWORD size; - string file; - size_t alignment; - BOOL binary; -}; - -template<typename T, size_t Alignment = 4096> -struct aligned_allocator { - - typedef T value_type; - - aligned_allocator() noexcept {} - - template<class U> - aligned_allocator(const aligned_allocator<U, Alignment>&) noexcept {} - - template<class U> - bool operator==(const aligned_allocator<U>&) const noexcept - { - return true; - } - template<class U> - bool operator!=(const aligned_allocator<U>&) const noexcept - { - return false; - } - - T* allocate(const std::size_t num) { - if (num == 0) { - return nullptr; - } - - void* const ptr = _aligned_malloc(num * sizeof(T), Alignment); - if (ptr == nullptr) { - throw std::bad_alloc(); - } - return static_cast<T*>(ptr); - } - void deallocate(T* const p, std::size_t) { - if (p) { - _aligned_free(p); - } - } - - template<typename T2> - struct rebind { - typedef aligned_allocator<T2, Alignment> other; - }; -}; - -template<typename T, size_t N = 4096> -using aligned_vector = std::vector<T, aligned_allocator<T, N>>; - -template<typename Iter> -void fill_pattern(Iter begin, Iter end) { - std::iota(begin, end, 0); // 0, 1, 2, 3, 4 ... -} - -class data_generator { -public: - using value_type = uint16_t; - - explicit data_generator(const std::string& dev_path) - { - user_bar.open(dev_path + "\\user", GENERIC_WRITE | GENERIC_READ); - } - - ~data_generator() - { - user_bar.close(); - } - - bool check_h2c(const uint32_t qid) - { - const auto match_reg = user_bar.read<uint32_t>(0x10); - const auto match_qid = get_bits(match_reg, 4, 28); /* bits 4-31 = qid */ - return (match_qid == qid) && is_bit_set(match_reg, 0); /* bit 0 = match */ - } - - void reset_h2c() - { - user_bar.write<uint32_t>(0xC, 0x1); - } - - void reset_pkt_ctrl() - { - user_bar.write<uint32_t>(0x8, 0x0); - } - - void set_queue(const uint32_t qid) - { - user_bar.write<uint32_t>(0x0, qid); - } - - void configure_c2h(const uint32_t qid, const uint32_t packet_size, const uint32_t num_packets) - { - printf("DGEN : PKT SIZE : %d, PKT CNT : %d\n", packet_size, num_packets); - set_queue(qid); - user_bar.write<uint32_t>(0x4, packet_size); - user_bar.write<uint32_t>(0x20, num_packets); - } - - void generate_packets() - { - user_bar.write<uint32_t>(0x8, 0x2); - } - - BOOL read(void *buff, LONG addr, DWORD size) - { - if (INVALID_SET_FILE_POINTER == SetFilePointer(user_bar.h, static_cast<LONG>(addr), nullptr, FILE_BEGIN)) { - return FALSE; - } - - return ReadFile(user_bar.h, buff, size, &size, NULL); - } - - BOOL write(void *buff, LONG addr, DWORD size) - { - if (INVALID_SET_FILE_POINTER == SetFilePointer(user_bar.h, static_cast<LONG>(addr), nullptr, FILE_BEGIN)) { - return FALSE; - } - - return WriteFile(user_bar.h, buff, size, &size, NULL); - } - - BOOL generate_user_interrupt(UINT32 fun_id) - { - UINT32 val = 0x0; - - val = 0x00; - user_bar.write<uint32_t>(0x98, val); - - user_bar.write<uint32_t>(0x9C, val); - - val = 0x0; - val = fun_id << 12; - val |= 0x1; - if (fun_id == 0) - val |= (1u << 4); - user_bar.write<uint32_t>(0x94, val); - - return TRUE; - } - -private: - device_file user_bar; -}; - -class qdma_device { -public: - explicit qdma_device(const char* device_path) : dgen(device_path) - { - using namespace std::string_literals; - dev_path = device_path; - control_bar_.open(dev_path + "\\control"s, GENERIC_READ | GENERIC_WRITE); - mgmt.open(dev_path + "\\mgmt"s, GENERIC_READ | GENERIC_WRITE); - get_qstats(); - } - - ~qdma_device() - { - control_bar_.close(); - mgmt.close(); - } - - void get_qstats(void) - { - struct qstat_out qstats_info = { 0 }; - try { - mgmt.ioctl(IOCTL_QDMA_GET_QSTATS, NULL, 0, &qstats_info, sizeof(qstats_info)); - qbase = qstats_info.qbase; - qmax = qstats_info.qmax; - } - catch (const std::exception& e) { - cout << "IOCTL Failed for qstats " << e.what() << '\n'; - } - } - - unsigned int get_qmax() - { - return qmax; - } - - int qopen(ULONG qid, bool is_mm) - { - if (true == is_mm) - queue_.open(dev_path + "\\queue_"s + to_string(qid), GENERIC_READ | GENERIC_WRITE); - else - queue_.open(dev_path + "\\st_"s + to_string(qid), GENERIC_READ | GENERIC_WRITE); - - return 0; - } - - void qclose(void) - { - queue_.close(); - } - - int qdma_read(); - int qdma_write(); - int qdma_interrupt(void); - -private: - const char* dev_path; - device_file control_bar_; - data_generator dgen; - device_file queue_; - device_file mgmt; - unsigned int qbase; - unsigned int qmax; -}; - -static BYTE* allocate_buffer(size_t size, size_t alignment); -static void print_bytes(size_t addr, BYTE* data, size_t length); -static int read_file_option(void); -static void print_bytes_binary(BYTE* data, size_t length); \ No newline at end of file diff --git a/QDMA/windows/apps/dma-rw/dma_rw.vcxproj b/QDMA/windows/apps/dma-rw/dma_rw.vcxproj deleted file mode 100644 index 79419da..0000000 --- a/QDMA/windows/apps/dma-rw/dma_rw.vcxproj +++ /dev/null @@ -1,146 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <ItemGroup> - <ClInclude Include="dma_rw.hpp" /> - <ClInclude Include="version.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dma_rw.cpp" /> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{F7C376CA-92F6-4484-B737-8670222CE79F}</ProjectGuid> - <TemplateGuid>{504102d4-2172-473c-8adf-cd96e308f257}</TemplateGuid> - <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> - <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> - <Configuration>Debug</Configuration> - <Platform Condition="'$(Platform)' == ''">Win32</Platform> - <RootNamespace>qdma_rw</RootNamespace> - <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion> - <ProjectName>dma-rw</ProjectName> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> - <ConfigurationType>Application</ConfigurationType> - <DriverTargetPlatform>Universal</DriverTargetPlatform> - <CharacterSet>NotSet</CharacterSet> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64</LibraryPath> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\bin\</OutDir> - <ApiValidator_Enable>false</ApiValidator_Enable> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PreprocessorDefinitions>_DEBUG;WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> - <AdditionalIncludeDirectories>$(SolutionDir)\apps\common\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <PreprocessorDefinitions>WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>$(SolutionDir)\sys\libqdma\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\apps\common\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PreprocessorDefinitions>_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <AdditionalIncludeDirectories>$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;$(SolutionDir)\apps\common\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> - <IgnoreSpecificDefaultLibraries /> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <PreprocessorDefinitions>WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WINAPI_PARTITION_DESKTOP=1;WINAPI_PARTITION_SYSTEM=1;WINAPI_PARTITION_APP=1;WINAPI_PARTITION_PC_APP=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>$(SolutionDir)\apps\common\include;$(SolutionDir)\sys\drv\include;$(SolutionDir)\sys\libqdma\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - </ClCompile> - <Link> - <AdditionalDependencies>%(AdditionalDependencies);onecoreuap.lib</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-rw/dma_rw.vcxproj.filters b/QDMA/windows/apps/dma-rw/dma_rw.vcxproj.filters deleted file mode 100644 index 090c753..0000000 --- a/QDMA/windows/apps/dma-rw/dma_rw.vcxproj.filters +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup> - <Filter Include="Source Files"> - <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> - </Filter> - <Filter Include="Header Files"> - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> - <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> - </Filter> - <Filter Include="Resource Files"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> - </Filter> - </ItemGroup> - <ItemGroup> - <ClInclude Include="version.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="dma_rw.hpp"> - <Filter>Header Files</Filter> - </ClInclude> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dma_rw.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - </ItemGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-rw/dma_rw.vcxproj.user b/QDMA/windows/apps/dma-rw/dma_rw.vcxproj.user deleted file mode 100644 index be25078..0000000 --- a/QDMA/windows/apps/dma-rw/dma_rw.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup /> -</Project> \ No newline at end of file diff --git a/QDMA/windows/apps/dma-rw/version.h b/QDMA/windows/apps/dma-rw/version.h deleted file mode 100644 index adae316..0000000 --- a/QDMA/windows/apps/dma-rw/version.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#ifndef __QDMARW_VERSION_H -#define __QDMARW_VERSION_H - -#define PROGNAME "dma-rw" -#define VERSION "2020.2.0" -#define COPYRIGHT "Copyright (c) 2020 Xilinx Inc." - -#endif /*__QDMARW_VERSION_H*/ diff --git a/QDMA/windows/sys/drv/include/qdma_driver_api.h b/QDMA/windows/sys/drv/include/qdma_driver_api.h deleted file mode 100644 index e4d12cf..0000000 --- a/QDMA/windows/sys/drv/include/qdma_driver_api.h +++ /dev/null @@ -1,434 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef QDMA_DRIVER_API_H_ -#define QDMA_DRIVER_API_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <basetsd.h> -#include <pshpack8.h> - -/** - * Define an Interface Guid so that app can find the device and talk to it. - */ -#include <guiddef.h> - -typedef int BOOL; - -#ifdef DEFINE_GUID -DEFINE_GUID (GUID_DEVINTERFACE_QDMA, - 0x80f90fa8,0x0cea,0x43c5,0x81,0xce,0x4b,0xf9,0x4a,0xa1,0x4c,0x72); -/** {80f90fa8-0cea-43c5-81ce-4bf94aa14c72} */ -#endif - -/** Interface File Names exposed by driver */ -#define QDMA_FILE_USER L"\\user" -#define QDMA_FILE_CONTROL L"\\control" -#define QDMA_FILE_BYPASS L"\\bypass" -#define QDMA_FILE_DMA_QUEUE L"\\queue_" -#define QDMA_FILE_DMA_ST_QUEUE L"\\st_" -#define QDMA_FILE_DMA_MGMT L"\\mgmt" - -#define QDMA_CSR_SZ 16U -#define QDMA_MAX_UDD_DATA_LEN 64U -#define QDMA_VERSION_INFO_LENGTH 32U - -/** Queue Direction */ -enum queue_direction { - QUEUE_DIR_H2C = 0, - QUEUE_DIR_C2H -}; - -/** Descriptor Type */ -enum descriptor_type { - RING_DESC = 0, - CMPT_DESC -}; - -/** Completion descriptor size */ -enum cmpt_desc_sz { - CMPT_DESC_SZ_8B = 0, - CMPT_DESC_SZ_16B, - CMPT_DESC_SZ_32B, - CMPT_DESC_SZ_64B, - CMPT_DESC_SZ_MAX -}; - -/** Trigger mode (to be used for ST Queues) */ -enum trig_mode { - TRIG_MODE_DISABLE = 0, - TRIG_MODE_EVERY, - TRIG_MODE_USER_COUNT, - TRIG_MODE_USER, - TRIG_MODE_USER_TIMER, - TRIG_MODE_USER_TIMER_COUNT, - TRIG_MODE_MAX -}; - -enum ring_type { - RING_TYPE_H2C = 0, - RING_TYPE_C2H, - RING_TYPE_CMPT -}; - -/** Device IOCTL Commands */ -enum commands { - CMD_CSR_DUMP, - CMD_DEVINFO, - CMD_QUEUE_ADD, - CMD_QUEUE_START, - CMD_QUEUE_STOP, - CMD_QUEUE_DELETE, - CMD_QUEUE_DUMP_STATE, - CMD_QUEUE_READ_UDD, - CMD_QUEUE_DUMP_DESC, - CMD_QUEUE_DUMP_CTX, - CMD_QUEUE_CMPT_READ, - CMD_INTRING_DUMP, - CMD_REG_DUMP, - CMD_QUEUE_NO_COPY, - CMD_SET_QMAX, - CMD_GET_QSTATS, - CMD_REG_INFO, - CMD_OP_MAX -}; - -/** Structure which holds the CSR registers information - * IOCTL Command : - * IOCTL_QDMA_CSR_DUMP - */ -struct csr_conf_out{ - UINT32 ring_sz[QDMA_CSR_SZ]; - UINT32 c2h_timer_cnt[QDMA_CSR_SZ]; - UINT32 c2h_th_cnt[QDMA_CSR_SZ]; - UINT32 c2h_buff_sz[QDMA_CSR_SZ]; - UINT32 wb_interval; -}; - -/** Structure which holds the Queue configuration parameters - * Valid IOCTL Commands: - * IOCTL_QDMA_QUEUE_ADD - * IOCTL_QDMA_QUEUE_START - * IOCTL_QDMA_QUEUE_STOP - * IOCTL_QDMA_QUEUE_DELETE - */ -struct queue_conf_in { - UINT16 qid; - BOOL is_st; - UINT8 h2c_ring_sz_index; - UINT8 c2h_ring_sz_index; - UINT8 c2h_buff_sz_index; - UINT8 c2h_th_cnt_index; - UINT8 c2h_timer_cnt_index; - enum cmpt_desc_sz compl_sz; - enum trig_mode trig_mode; - UINT8 sw_desc_sz; - BOOL desc_bypass_en; - BOOL pfch_en; - BOOL pfch_bypass_en; - BOOL cmpl_ovf_dis; - BOOL en_mm_cmpl; -}; - -/** Structure to be passed as input parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_DUMP_STATE - */ -struct queue_state_in { - UINT16 qid; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_DUMP_STATE - */ -struct queue_state_out { - char state[20]; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_DEVINFO -*/ -struct device_info_out { - struct version_info { - char qdma_rtl_version_str[QDMA_VERSION_INFO_LENGTH]; - char qdma_vivado_release_id_str[QDMA_VERSION_INFO_LENGTH]; - char qdma_device_type_str[QDMA_VERSION_INFO_LENGTH]; - char qdma_versal_ip_type_str[QDMA_VERSION_INFO_LENGTH]; - char qdma_sw_version[QDMA_VERSION_INFO_LENGTH]; - }ver_info; - UINT32 num_pfs; - UINT32 num_qs; - BOOL flr_present; - BOOL st_en; - BOOL mm_en; - BOOL mm_cmpl_en; - BOOL mailbox_en; - BOOL debug_mode; - UINT8 desc_eng_mode; - UINT32 num_mm_channels; -}; - -/** Structure to be passed as input parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_READ_UDD -*/ -struct cmpt_udd_info_in { - UINT16 qid; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_READ_UDD -*/ -struct cmpt_udd_info_out { - UINT64 length; - UINT8 buffer[QDMA_MAX_UDD_DATA_LEN]; -}; - -/** Structure to be passed as input parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_DUMP_DESC -*/ -struct desc_dump_info_in { - UINT16 qid; - enum queue_direction dir; - enum descriptor_type desc_type; - UINT32 desc_start; - UINT32 desc_end; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_DUMP_DESC -*/ -struct desc_dump_info_out { - size_t desc_sz; - size_t data_sz; - UINT8 pbuffer[1]; -}; - -/** Structure to be passed as input parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_DUMP_CTX -*/ -struct ctx_dump_info_in { - UINT16 qid; - enum ring_type type; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_DUMP_CTX -*/ -struct ctx_dump_info_out { - size_t ret_sz; - char pbuffer[1]; -}; - -/** Structure to be passed as input parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_CMPT_READ -*/ -struct cmpt_data_info_in { - UINT16 qid; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_QUEUE_CMPT_READ -*/ -struct cmpt_data_info_out { - size_t ret_len; - size_t cmpt_desc_sz; - UINT8 pbuffer[1]; -}; - -/** Structure to be passed as input parameter for - * IOCTL Command : - * IOCTL_QDMA_INTRING_DUMP - */ -struct intring_info_in { - UINT32 vec_id; - UINT32 start_idx; - UINT32 end_idx; -}; - -/** Structure to be passed as input parameter for - * IOCTL Command : - * IOCTL_QDMA_SET_QMAX - */ -struct qmax_in { - UINT32 qmax; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_INTRING_DUMP - */ -struct intring_info_out { - size_t ret_len; - size_t ring_entry_sz; - UINT8 pbuffer[1]; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_REG_DUMP - */ -struct regdump_info_out { - size_t ret_len; - char pbuffer[1]; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_GET_QSTATS - */ -struct qstat_out { - UINT32 qbase; - UINT32 qmax; - UINT32 active_h2c_queues; - UINT32 active_c2h_queues; - UINT32 active_cmpt_queues; -}; - -/** Structure to be passed as input parameter for - * IOCTL Command : - * IOCTL_QDMA_REG_INFO - */ -struct reg_info_in { - UINT32 bar_no; - UINT32 address; - UINT32 reg_cnt; -}; - -/** Structure to be passed as output parameter for - * IOCTL Command : - * IOCTL_QDMA_REG_INFO - */ -struct reg_info_out { - size_t ret_len; - char pbuffer[1]; -}; - -struct csr_conf_data { - struct csr_conf_out *out; -}; - -struct queue_conf { - struct queue_conf_in in; -}; - -struct queue_active_state { - struct queue_state_in in; - struct queue_state_out *out; -}; - -struct device_info { - struct device_info_out *out; -}; - -struct cmpt_udd_info { - struct cmpt_udd_info_in in; - struct cmpt_udd_info_out *out; -}; - -struct desc_dump_info { - struct desc_dump_info_in in; - struct desc_dump_info_out *out; -}; - -struct ctx_dump_info { - struct ctx_dump_info_in in; - struct ctx_dump_info_out *out; -}; - -struct cmpt_data_info { - struct cmpt_data_info_in in; - struct cmpt_data_info_out *out; -}; - -struct intring_info { - struct intring_info_in in; - struct intring_info_out *out; -}; - -struct regdump_info { - struct regdump_info_out *out; -}; - -struct qmax_info { - struct qmax_in in; -}; - -struct qstats_info { - struct qstat_out *out; -}; - -struct reg_info { - struct reg_info_in in; - struct reg_info_out* out; -}; - -/** Union that consolidates parameters for all ioctl commands */ -union ioctl_cmd { - struct csr_conf_data csr; - struct queue_conf q_conf; - struct queue_active_state q_state; - struct device_info dev_info; - struct cmpt_udd_info udd_info; - struct desc_dump_info desc_info; - struct ctx_dump_info ctx_info; - struct cmpt_data_info cmpt_info; - struct intring_info int_ring_info; - struct regdump_info reg_dump_info; - struct qmax_info qmax_info; - struct qstats_info qstats_info; - struct reg_info reg_info; -}; - -#define QDMA_IOCTL(index) CTL_CODE(FILE_DEVICE_UNKNOWN, index, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_QDMA_CSR_DUMP QDMA_IOCTL(CMD_CSR_DUMP) -#define IOCTL_QDMA_DEVINFO QDMA_IOCTL(CMD_DEVINFO) -#define IOCTL_QDMA_QUEUE_ADD QDMA_IOCTL(CMD_QUEUE_ADD) -#define IOCTL_QDMA_QUEUE_START QDMA_IOCTL(CMD_QUEUE_START) -#define IOCTL_QDMA_QUEUE_STOP QDMA_IOCTL(CMD_QUEUE_STOP) -#define IOCTL_QDMA_QUEUE_DELETE QDMA_IOCTL(CMD_QUEUE_DELETE) -#define IOCTL_QDMA_QUEUE_DUMP_STATE QDMA_IOCTL(CMD_QUEUE_DUMP_STATE) -#define IOCTL_QDMA_QUEUE_READ_UDD QDMA_IOCTL(CMD_QUEUE_READ_UDD) -#define IOCTL_QDMA_QUEUE_DUMP_DESC QDMA_IOCTL(CMD_QUEUE_DUMP_DESC) -#define IOCTL_QDMA_QUEUE_DUMP_CTX QDMA_IOCTL(CMD_QUEUE_DUMP_CTX) -#define IOCTL_QDMA_QUEUE_CMPT_READ QDMA_IOCTL(CMD_QUEUE_CMPT_READ) -#define IOCTL_QDMA_INTRING_DUMP QDMA_IOCTL(CMD_INTRING_DUMP) -#define IOCTL_QDMA_REG_DUMP QDMA_IOCTL(CMD_REG_DUMP) -#define IOCTL_QDMA_QUEUE_NO_COPY QDMA_IOCTL(CMD_QUEUE_NO_COPY) -#define IOCTL_QDMA_SET_QMAX QDMA_IOCTL(CMD_SET_QMAX) -#define IOCTL_QDMA_GET_QSTATS QDMA_IOCTL(CMD_GET_QSTATS) -#define IOCTL_QDMA_REG_INFO QDMA_IOCTL(CMD_REG_INFO) - -#include <poppack.h> - -#ifdef __cplusplus -} -#endif - -#endif /* QDMA_DRIVER_API_H_ */ diff --git a/QDMA/windows/sys/drv/qdma.inf b/QDMA/windows/sys/drv/qdma.inf deleted file mode 100644 index a7b5ac1..0000000 --- a/QDMA/windows/sys/drv/qdma.inf +++ /dev/null @@ -1,325 +0,0 @@ -; -; Copyright (C) 2020 Xilinx, Inc -; -; Licensed under the Apache License, Version 2.0 (the "License"). You may -; not use this file except in compliance with the License. You may obtain -; a copy of the License at -; -; http://www.apache.org/licenses/LICENSE-2.0 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -; WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -; License for the specific language governing permissions and limitations -; under the License. - -; -; QDMA.inf -; - -[Version] -Signature = "$WINDOWS NT$" -Class = %ClassName% -ClassGuid = {a3a4c1ce-5a80-452c-9b51-a98edd3378d1} -Provider = %ManufacturerName% -CatalogFile = QDMA.cat -DriverVer = 10/15/2020, 2020.2.0.0 ;Format : year.quarter_no.drv_ver.libqdma_ver -DriverPackageType = PlugAndPlay - -[DestinationDirs] -DefaultDestDir = 12 -QDMA_Device_CoInstaller_CopyFiles = 11 - -; ================= Class section ============================================= - -[ClassInstall32] -Addreg=SampleClassReg - -[SampleClassReg] -HKR,,,0,%ClassName% -HKR,,Icon,,-5 - -[SourceDisksNames] -1 = %DiskName%,,,"" - -[SourceDisksFiles] -QDMA.sys = 1,, -WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll=1 ; make sure the number matches with SourceDisksNames - -; ================= Install Section =========================================== - -[Manufacturer] -%ManufacturerName%=Standard,NT$ARCH$ - -[Standard.NT$ARCH$] -; DisplayName Section DeviceId -; ----------- ------- -------- -; GEN 1 -; PCIe lane width x1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9011 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9111 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9211 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9311 ; PF 3 -; PCIe lane width x2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9012 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9112 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9212 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9312 ; PF 3 -; PCIe lane width x4 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9014 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9114 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9214 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9314 ; PF 3 -; PCIe lane width x8 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9018 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9118 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9218 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9318 ; PF 3 -; PCIe lane width x16 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_901f ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_911f ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_921f ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_931f ; PF 3 - -; GEN 2 -; PCIe lane width x1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9021 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9121 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9221 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9321 ; PF 3 -; PCIe lane width x2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9022 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9122 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9222 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9322 ; PF 3 -; PCIe lane width x4 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9024 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9124 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9224 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9324 ; PF 3 -; PCIe lane width x8 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9028 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9128 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9228 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9328 ; PF 3 -; PCIe lane width x16 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_902f ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_912f ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_922f ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_932f ; PF 3 - -; GEN 3 -; PCIe lane width x1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9031 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9131 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9231 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9331 ; PF 3 -; PCIe lane width x2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9032 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9132 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9232 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9332 ; PF 3 -; PCIe lane width x4 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9034 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9134 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9234 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9334 ; PF 3 -; PCIe lane width x8 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9038 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9138 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9238 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9338 ; PF 3 -; PCIe lane width x16 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_903f ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_913f ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_923f ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_933f ; PF 3 - -; GEN 4 -; PCIe lane width x1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9041 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9141 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9241 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9341 ; PF 3 -; PCIe lane width x2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9042 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9142 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9242 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9342 ; PF 3 -; PCIe lane width x4 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9044 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9144 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9244 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9344 ; PF 3 -; PCIe lane width x8 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9048 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9148 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9248 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_9348 ; PF 3 - -; Versal -; GEN 1 -; PCIe lane width x1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b011 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b111 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b211 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b311 ; PF 3 -; PCIe lane width x2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b012 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b112 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b212 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b312 ; PF 3 -; PCIe lane width x4 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b014 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b114 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b214 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b314 ; PF 3 -; PCIe lane width x8 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b018 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b118 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b218 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b318 ; PF 3 -; PCIe lane width x16 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b01f ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b11f ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b21f ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b31f ; PF 3 - -; GEN 2 -; PCIe lane width x1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b021 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b121 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b221 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b321 ; PF 3 -; PCIe lane width x2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b022 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b122 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b222 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b322 ; PF 3 -; PCIe lane width x4 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b024 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b124 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b224 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b324 ; PF 3 -; PCIe lane width x8 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b028 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b128 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b228 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b328 ; PF 3 -; PCIe lane width x16 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b02f ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b12f ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b22f ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b32f ; PF 3 - -; GEN 3 -; PCIe lane width x1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b031 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b131 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b231 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b331 ; PF 3 -; PCIe lane width x2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b032 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b132 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b232 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b332 ; PF 3 -; PCIe lane width x4 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b034 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b134 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b234 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b334 ; PF 3 -; PCIe lane width x8 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b038 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b138 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b238 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b338 ; PF 3 -; PCIe lane width x16 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b03f ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b13f ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b23f ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b33f ; PF 3 - -; GEN 4 -; PCIe lane width x1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b041 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b141 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b241 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b341 ; PF 3 -; PCIe lane width x2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b042 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b142 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b242 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b342 ; PF 3 -; PCIe lane width x4 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b044 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b144 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b244 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b344 ; PF 3 -; PCIe lane width x8 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b048 ; PF 0 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b148 ; PF 1 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b248 ; PF 2 -%QDMA.DeviceDesc%= QDMA_Device, PCI\VEN_10ee&DEV_b348 ; PF 3 - -[QDMA_Device.NT] -CopyFiles=Drivers_Dir - -; MSI/MSI-X support -[QDMA_Device.NT.HW] -AddReg = QDMA_Device.EnableMSI - -[QDMA_Device.EnableMSI] -HKR,"Interrupt Management",,0x00000010 -HKR,"Interrupt Management\MessageSignaledInterruptProperties",,0x00000010 -HKR,"Interrupt Management\MessageSignaledInterruptProperties",MSISupported,0x00010001,1 -HKR,"Interrupt Management\MessageSignaledInterruptProperties",MessageNumberLimit,0x00010001,32 - -[Drivers_Dir] -QDMA.sys - -; ================= Service installation ====================================== - -[QDMA_Device.NT.Services] -AddService = QDMA,%SPSVCINST_ASSOCSERVICE%, QDMA_Service_Inst - -; ================= QDMA driver install sections ============================== - -[QDMA_Service_Inst] -DisplayName = %QDMA.SVCDESC% -ServiceType = 1 ; SERVICE_KERNEL_DRIVER -StartType = 3 ; SERVICE_DEMAND_START -ErrorControl = 1 ; SERVICE_ERROR_NORMAL -ServiceBinary = %12%\QDMA.sys -AddReg = QDMA_Device_Inst.NT.Services.AddReg - -[QDMA_Device_Inst.NT.Services.AddReg] -; Driver operation mode. -HKR,Parameters,"DRIVER_MODE",0x00010001,0 ;set to 0 - hardware polling, 1 - Direct Interrupt, 2 - Indirect Interrupt (default is 0 - polling) -; Config BAR Index -HKR,Parameters,"CONFIG_BAR",0x00010001,0 ;set to either 0, 1 or 2 (default is 0) - -; ================= QDMA_Device Coinstaller installation ====================== - -[QDMA_Device.NT.CoInstallers] -AddReg=QDMA_Device_CoInstaller_AddReg -CopyFiles=QDMA_Device_CoInstaller_CopyFiles - -[QDMA_Device_CoInstaller_AddReg] -HKR,,CoInstallers32,0x00010000, "WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll,WdfCoInstaller" - -[QDMA_Device_CoInstaller_CopyFiles] -WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll - -[QDMA_Device.NT.Wdf] -KmdfService = QDMA, QDMA_wdfsect - -[QDMA_wdfsect] -KmdfLibraryVersion = $KMDFVERSION$ - -[Strings] -SPSVCINST_ASSOCSERVICE = 0x00000002 -ManufacturerName = "Xilinx" -ClassName = "Xilinx Drivers" -DiskName = "QDMA Installation Disk" -QDMA.DeviceDesc = "Xilinx PCIe Multi-Queue DMA" -QDMA.SVCDESC = "QDMA Service" diff --git a/QDMA/windows/sys/drv/qdma_generic.vcxproj b/QDMA/windows/sys/drv/qdma_generic.vcxproj deleted file mode 100644 index 69b3ede..0000000 --- a/QDMA/windows/sys/drv/qdma_generic.vcxproj +++ /dev/null @@ -1,213 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{B446331B-DD9E-40DD-958A-8D7A1AACA454}</ProjectGuid> - <TemplateGuid>{497e31cb-056b-4f31-abb8-447fd55ee5a5}</TemplateGuid> - <TargetFrameworkVersion> - </TargetFrameworkVersion> - <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> - <Configuration>Debug</Configuration> - <Platform Condition="'$(Platform)' == ''">Win32</Platform> - <RootNamespace>MDMA</RootNamespace> - <ProjectName>QDMA Reference Driver</ProjectName> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> - <ConfigurationType>Driver</ConfigurationType> - <DriverType>KMDF</DriverType> - <DriverTargetPlatform>Desktop</DriverTargetPlatform> - <SupportsPackaging>true</SupportsPackaging> - <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> - <ConfigurationType>Driver</ConfigurationType> - <DriverType>KMDF</DriverType> - <DriverTargetPlatform>Desktop</DriverTargetPlatform> - <SupportsPackaging>true</SupportsPackaging> - <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> - <ConfigurationType>Driver</ConfigurationType> - <DriverType>KMDF</DriverType> - <DriverTargetPlatform>Desktop</DriverTargetPlatform> - <SupportsPackaging>true</SupportsPackaging> - <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> - <ConfigurationType>Driver</ConfigurationType> - <DriverType>KMDF</DriverType> - <DriverTargetPlatform>Desktop</DriverTargetPlatform> - <SupportsPackaging>true</SupportsPackaging> - <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\sys\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <TargetName>QDMA</TargetName> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\sys\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <TargetName>QDMA</TargetName> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\sys\</OutDir> - <TargetName>QDMA</TargetName> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\sys\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <TargetName>QDMA</TargetName> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <WppEnabled>true</WppEnabled> - <WppRecorderEnabled>false</WppRecorderEnabled> - <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">include\trace.h</WppScanConfigurationData> - <WppKernelMode>true</WppKernelMode> - <CompileAs>CompileAsCpp</CompileAs> - <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> - <AdditionalIncludeDirectories>$(ProjectDir)\..\libqdma\include;$(ProjectDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <WppModuleName>qdma</WppModuleName> - <LanguageStandard>stdcpp17</LanguageStandard> - <SupportJustMyCode>false</SupportJustMyCode> - </ClCompile> - <Inf /> - <ResourceCompile /> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <WppEnabled>false</WppEnabled> - <WppRecorderEnabled>false</WppRecorderEnabled> - <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">include\trace.h</WppScanConfigurationData> - <WppKernelMode>true</WppKernelMode> - <CompileAs>CompileAsCpp</CompileAs> - <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> - <AdditionalIncludeDirectories>$(ProjectDir)\..\libqdma\include;$(ProjectDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <WppModuleName>qdma</WppModuleName> - <LanguageStandard>stdcpp17</LanguageStandard> - </ClCompile> - <Inf /> - <Inf /> - <Inf /> - <Inf /> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <WppEnabled>true</WppEnabled> - <WppRecorderEnabled>false</WppRecorderEnabled> - <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">source\trace.h</WppScanConfigurationData> - <WppKernelMode>true</WppKernelMode> - <CompileAs>CompileAsCpp</CompileAs> - <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> - <AdditionalIncludeDirectories>$(ProjectDir)\..\libqdma\include;$(ProjectDir)\include;$(ProjectDir)\source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <WppModuleName>qdma</WppModuleName> - <LanguageStandard>stdcpp17</LanguageStandard> - <SupportJustMyCode>false</SupportJustMyCode> - <AdditionalOptions>$(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions> - </ClCompile> - <Inf /> - <ResourceCompile /> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <WppEnabled>false</WppEnabled> - <WppRecorderEnabled>false</WppRecorderEnabled> - <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">source\trace.h</WppScanConfigurationData> - <WppKernelMode>true</WppKernelMode> - <CompileAs>CompileAsCpp</CompileAs> - <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> - <AdditionalIncludeDirectories>$(ProjectDir)\..\libqdma\include;$(ProjectDir)\include;$(ProjectDir)\source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <WppModuleName>qdma</WppModuleName> - <LanguageStandard>stdcpp17</LanguageStandard> - <AdditionalOptions>$(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions> - </ClCompile> - <Inf /> - <Inf /> - <Inf /> - <Inf /> - </ItemDefinitionGroup> - <ItemGroup> - <FilesToPackage Include="$(TargetPath)" /> - </ItemGroup> - <ItemGroup> - <Inf Include="qdma.inf" /> - </ItemGroup> - <ItemGroup> - <None Include="resource\Resource.aps" /> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="resource\Resource.rc" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\libqdma\libqdma.vcxproj"> - <Project>{359143e6-933a-49cc-806c-c5376e1809a4}</Project> - </ProjectReference> - </ItemGroup> - <ItemGroup> - <ClInclude Include="..\libqdma\include\qdma_exports.h" /> - <ClInclude Include="..\libqdma\include\xversion.hpp" /> - <ClInclude Include="include\qdma_driver_api.h" /> - <ClInclude Include="source\device.h" /> - <ClInclude Include="source\driver.h" /> - <ClInclude Include="source\io_queue.h" /> - <ClInclude Include="source\trace.h" /> - <ClInclude Include="source\windows_common.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="source\device.cpp" /> - <ClCompile Include="source\driver.cpp" /> - <ClCompile Include="source\io_queue.cpp" /> - </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/sys/drv/qdma_generic.vcxproj.filters b/QDMA/windows/sys/drv/qdma_generic.vcxproj.filters deleted file mode 100644 index ce750f2..0000000 --- a/QDMA/windows/sys/drv/qdma_generic.vcxproj.filters +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup> - <Filter Include="Source Files"> - <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> - </Filter> - <Filter Include="Header Files"> - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> - <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> - </Filter> - <Filter Include="Resource Files"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> - </Filter> - <Filter Include="Driver Files"> - <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> - <Extensions>inf;inv;inx;mof;mc;</Extensions> - </Filter> - </ItemGroup> - <ItemGroup> - <Inf Include="qdma.inf"> - <Filter>Driver Files</Filter> - </Inf> - </ItemGroup> - <ItemGroup> - <None Include="resource\Resource.aps"> - <Filter>Resource Files</Filter> - </None> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="resource\Resource.rc"> - <Filter>Resource Files</Filter> - </ResourceCompile> - </ItemGroup> - <ItemGroup> - <ClInclude Include="include\qdma_driver_api.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\device.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\driver.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\io_queue.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\trace.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="..\libqdma\include\qdma_exports.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="..\libqdma\include\xversion.hpp"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\windows_common.h"> - <Filter>Header Files</Filter> - </ClInclude> - </ItemGroup> - <ItemGroup> - <ClCompile Include="source\device.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\driver.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\io_queue.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - </ItemGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/sys/drv/qdma_generic.vcxproj.user b/QDMA/windows/sys/drv/qdma_generic.vcxproj.user deleted file mode 100644 index a667f8f..0000000 --- a/QDMA/windows/sys/drv/qdma_generic.vcxproj.user +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <RemoveDriver>False</RemoveDriver> - <InstallMode>None</InstallMode> - <HardwareIdString /> - <CommandLine /> - <ScriptPath>C:\Program Files (x86)\Windows Kits\10\Testing\Tests\Utilities\DefaultDriverPackageInstallationTask.dll</ScriptPath> - <DbgengRemoteMachineName>XIRIPDSLAB20</DbgengRemoteMachineName> - <DbgengKernelMachineName>XIRIPDSLAB20</DbgengKernelMachineName> - <DeployFiles /> - <ScriptName>Microsoft.DriverKit.DefaultDriverPackageInstallationClass.PerformDefaultDriverPackageInstallation</ScriptName> - <ScriptDeviceQuery /> - <EnableVerifier>True</EnableVerifier> - <AllDrivers>False</AllDrivers> - <VerifyProjectOutput>True</VerifyProjectOutput> - <VerifyDrivers /> - <VerifyFlags>133563</VerifyFlags> - <FrameWorkInteraction>FvOn</FrameWorkInteraction> - <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> - <TestCertificate> - </TestCertificate> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <TestCertificate> - </TestCertificate> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <TestCertificate> - </TestCertificate> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <TestCertificate> - </TestCertificate> - </PropertyGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/sys/drv/resource/Resource.aps b/QDMA/windows/sys/drv/resource/Resource.aps deleted file mode 100644 index 0c3530ff98bfca8f73aa146fefa36be5a3b9ad6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2984 zcmZQzU|>*SU|{(FAA&)AWZccbz@Wmwz~I3U&fo-A#|V|?lz=iAK5#NHcv{8ersgK4 z78S=N=A>36=B1>@6cpuWr6!jY$5dqIWad@q8W|WE#6-CGI>x&cWtOED73&%pni$1+ z2AIaf^u&YI#Dj$6(@Jx4Vmw?OUBKqV6qm<m<QJF3<fh~%#*}B~rR0|v$N0MVI>rR0 z7U!21C8z2YB{MKQ!f@{iurm!95bjk3izqS_K{XocWiT)@FvL3s1jqZiMufx%xd!`( z206RNhdKI$x-u9V7&34o%RBq~`a1f#K&4F#3=9kzxKI`Ng#`KgKouB*<hhaMgCl)i zVcJ2a^Dr>L995o~SCm=|b`fJ(aD13+P_U=JU%aQEn?HjggAfCwr;BrZaEN1wr!#|w zuAwG_E(0T2FNl2nAM7;-1_n2ba5x2)LJo%z*N6~LKWCp%7gq*Du&fHh|NqFMMp#9S z;i4e*3=AEN=xIbBoJb4=5Ml1gV8sx_kjs$Dkjs$7kjhZRP|Og+kjRk3kjhZOkjRk7 zkiwA45W`TwP{feWkj0S7kjzj5R#U-{$&ka4$&klT!Jx}v#9#o1F$@t5E)2d5jtub( zE(}EsnG9u6Q*{{(7z`Oq7>pQV7(5vQ7)%-BG3<$ln-dRL9nX-)P|A?Qki!te;KAU^ z;K<;D<enIYVuo^tc!msye1>9%60l!V7;+gB8Dbd9!LCbT$Y&@AyVw`%vKWRUhE#@P zhJ1!nh9ZV!hExVa20exh1_lOaaA*X8{hH2D#E{64%b>vE2KFgPhXR8JLj{8cgBgP+ zLkvSWiuno*-VB-0u(4p!V=x5!GmjyeA%~$98j7V1xo~$u+yJqc0i1_X^Rq5Iu9(2_ z%D{k}0t`{PMyOn41_nbj215q)gv!7mfsrQkFzn%H@O1I_W-tV0K6Dcd85kKE7#Ua? zJYAd}{hVEW7>q#5JY5`}{DVRmj3JyL*N~t{1``O!)7{TM$d$nq!i#hbW-x;={rnls zAuMMf|6o@J3kb)<)hB?#62!)v^BM4ETog%Xe~etufUFr?vBAIq@*ylk>w?3Ahk=2? zgn@w}gu#^|f+2*#lfjR{nZbu4l);6;6{!qH&dbPUnHWL+keEi+ubi2eoKu>Ts-Ofb zfRuQ-7#J9s37Q2`!N7oQ7D!_SGpt?_VEF$Z9Q6#y<v|5A$cJGJ!3^;XVGOPeK@7nR zo(%pBehl$o|GF{wgHz*PmiPY{KykzXN)8|)2yG8yGB7Z(Ft9K%2r%SAxnSxB6G%re zLkYNC$YV%{=PXZ#Jccxed<F)FEnqbU3?>W)43-QaI*Gx6fq}t_ftP`i!I>eSA(x>5 zTrO2I_<{3hD%k7@a2|z}Mmh`%3?LJe8T7z%O`x(EZkG!<?<a%ZP{2^akjaqGkOx+W zY=#0u0E07wCqpWO0)sEO`~j)dWe8*_Wk>~MU1({dz!1cc%8&*w<x&|y`5mMOx$FZO zZot67zzBCk7+7^NlHH&Z$bdnQ0fa$ieh7mU10&cMC1ACA;Ib0oV@C!B22}SFc0~$< z0s|w14?`+LI@mN&XcjP3f<q#mA%md=Tmt4Zpo)RYJZA<?1_f~0Y{+1aW;1GNTQP7l zFf#Z<%>=~<s4jt(pdep>>KX<HSXr#cP|Q%tPz(wphAMD8K}z2ghEi}%gYYo}nt!Pq zKUNIf42%q@cB97<sEz~qUys2UDW(`0To^#<I*cKap$Hzsp!5ex(V#k*1zc)?>XST% zVul=sM3i*L$+CfE3P!mMDGNXW17m^Od?35<wfR8ptS>0-Ld<p+s15Rm5xMP%*#-f% z9Wt1Z)nK+AK<!Qu7GyP;brz_;sX<YLS>J%l)f23wm8+n#l!FbQ9!RJmmw%uVF$Aw3 TkP6f?6I5PSuz}j(*vm@**aH40 diff --git a/QDMA/windows/sys/drv/resource/Resource.rc b/QDMA/windows/sys/drv/resource/Resource.rc deleted file mode 100644 index eee2360e5ee55d9476640e2054304c0d95020e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2038 zcmezWPoF`HftP`cL4iSwL4m=UA)ldup^~A9A(J7UA%mfWL4iSo!I?pmL4m=D!2paE z7$O)l8FCmh8S)q^7<3pE7(5yB7?R<pAWZXN$Ye-nNM*=lC}v1yNMTT5C}qfFNMT52 zC}L1xC}GH8NM%r9aAYW8NMuNc@=*1FOb-LAFJ{PO$Y;m{yF-t`0PHT92}%s8x|A3+ z8T1$w7$O<+8A=%x7;+gB87krKQ((wr$OrqZ6zndDOEMXX859`Oz&-=HDwUxE?Dhh% zN|0X_7?K(C8FCp4z<y5z`x&INoFNnJ7l=6^5meV;x<r8?pCO5%gdq_ehKTS=WPsQK ziUE+CG^9{MHB*5hk)Z_cBZLVG3=jy4xe|r~1}g@A27QKdFw|p6L<(s=hJ1!1hI9sf zux}8tRLr2y;KSg_;LPC4;KvZm;L4!OV8j3lahNSIT7e;yA&()4A(f#R9Ck$vsSJe- zr3{%2AQmXLlNc%)KrStShFLO0B0~~bhXO+mLn1>t1IU-4w2;V<4%P)pB_#~`3<}_| zQD7(sr^OO5FCCoPiW%}5(iln@${7;DdJyhOVF1Nq30OxGLn%WEo>Ye(o*<nH47f~y zq&!fZD=;WAI5Gr-Q++Ul5`zMR6PWMG5Da!*ID;oc2!jWMKSL-(2t0-q7{VDG8G;ys z7#tb=7(y648C=0;_%j57bDckfAA<{6rzZo54Km-K!3~@{{1_q`6d1f2Ji%%}IU*IB z;vo45lu`@8Apwa8P`rXd50+9vVG2rv!3?S3{07N2h)_chi8OG^K&0kkh609EhGd3J zaPCNEfW%!MLpnn#11R1=DL$PcpP>w#PxGKLr2y7d#E=V)6IkvA<uOnwf>H;l1Odr{ z@&PD*L1A2s6k^!Q3RJi1!By*nSs*_tgY8dd$YCf2moy3tHVmK~ng?~C9zzC$9auFs zm3a&$P;~_i2$k5)RbtR%&|`>!k|5tCF%&YSfJ>VgG*`qhR6xyzg#^fSP`*$Cy9Htc zsAL3{KzZPJ3S)3(2x5q5aAWXf@L_Oe2w{k12w-r9=5R<pM<>G=+!#U_;u%~Rf*8WU zCM$zO0k^5a451881k8q*Y6Leoo*|eak|CHOgu#`;mnd6Y!0FwYA&9|~Apo5IL8%;M zP6#*$fc&AvfLyOAFa$6-GkAhS!k3|xA%_8!Msyhh8A=&a!C05Ug~6A>kwJkWh#{3B z4V?Nwbq%O2Q($lbmjaM92?=9dApy!)AfE&=_%S##_<%`Y23H1D*MVFJ$@{4FAF}PB zS`d^Qh_@S*|2-Mp!Fd~GH!Q9}E<tyL5<?)=$9fFK43!MU3=n@o(hjJGLQVCM+A0@Z MYwAH$A0*`i0G3TX6951J diff --git a/QDMA/windows/sys/drv/source/device.cpp b/QDMA/windows/sys/drv/source/device.cpp deleted file mode 100644 index fd900c0..0000000 --- a/QDMA/windows/sys/drv/source/device.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#define INITGUID - -#include "qdma_driver_api.h" -#include "io_queue.h" -#include "device.h" - -#include "trace.h" - -#ifdef ENABLE_WPP_TRACING -#include "device.tmh" -#endif - -#ifdef ALLOC_PRAGMA -#pragma alloc_text (PAGE, qdma_create_device) -#pragma alloc_text (PAGE, qdma_evt_device_prepare_hardware) -#pragma alloc_text (PAGE, qdma_evt_device_release_hardware) -#endif - -using namespace xlnx; - -_Use_decl_annotations_ -NTSTATUS -qdma_create_device( - _Inout_ PWDFDEVICE_INIT wdf_device_init -) -{ - PAGED_CODE(); - - WdfDeviceInitSetIoType(wdf_device_init, WdfDeviceIoDirect); - - /* Set call-backs for any of the functions we are interested in. If no call-back is set, the - * framework will take the default action by itself. - */ - WDF_PNPPOWER_EVENT_CALLBACKS pnp_power_callbacks; - WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnp_power_callbacks); - pnp_power_callbacks.EvtDevicePrepareHardware = qdma_evt_device_prepare_hardware; - pnp_power_callbacks.EvtDeviceReleaseHardware = qdma_evt_device_release_hardware; - WdfDeviceInitSetPnpPowerEventCallbacks(wdf_device_init, &pnp_power_callbacks); - - WDF_OBJECT_ATTRIBUTES device_attributes; - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&device_attributes, device_context); - - /* Register file object call-backs */ - WDF_FILEOBJECT_CONFIG file_config; - WDF_FILEOBJECT_CONFIG_INIT(&file_config, - qdma_evt_device_file_create, - qdma_evt_device_file_close, - qdma_evt_device_file_cleanup); - WDF_OBJECT_ATTRIBUTES file_attribs; - WDF_OBJECT_ATTRIBUTES_INIT(&file_attribs); - file_attribs.SynchronizationScope = WdfSynchronizationScopeNone; - WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&file_attribs, file_context); - WdfDeviceInitSetFileObjectConfig(wdf_device_init, &file_config, &file_attribs); - - WDFDEVICE device; - auto status = WdfDeviceCreate(&wdf_device_init, &device_attributes, &device); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "WdfDeviceCreate failed! %!STATUS!", status); - return status; - } - - /* Create a device interface to user-space */ - status = WdfDeviceCreateDeviceInterface(device, &GUID_DEVINTERFACE_QDMA, nullptr); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "WdfDeviceCreateDeviceInterface failed! %!STATUS!", status); - return status; - } - - /* Initialize the I/O Package and any Queues */ - status = qdma_io_queue_initialize(device); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "qdma_io_queue_initialize() failed! %!STATUS!", status); - return status; - } - - return status; -} - -static NTSTATUS read_reg_params( - xlnx::queue_op_mode &op_mode, - UINT8 &config_bar) -{ - WDFKEY key; - DECLARE_CONST_UNICODE_STRING(value_drv_mode, L"DRIVER_MODE"); - DECLARE_CONST_UNICODE_STRING(value_config_bar, L"CONFIG_BAR"); - op_mode = xlnx::queue_op_mode::POLL_MODE; - WDFDRIVER driver = WdfGetDriver(); - - NTSTATUS status = WdfDriverOpenParametersRegistryKey(driver, - STANDARD_RIGHTS_ALL, - WDF_NO_OBJECT_ATTRIBUTES, - &key); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "WdfDriverOpenParametersRegistryKey failed: %!STATUS!", status); - goto ErrExit; - } - - ULONG DRV_MODE; - status = WdfRegistryQueryULong(key, &value_drv_mode, &DRV_MODE); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "WdfRegistryQueryULong failed: %!STATUS!", status); - goto ErrExit; - } - - if (DRV_MODE > INTR_COAL_MODE) { - TraceError(TRACE_DEVICE, "Invalid parameter DRIVER_MODE - [%lu]", DRV_MODE); - status = STATUS_INVALID_PARAMETER; - goto ErrExit; - } - - op_mode = (xlnx::queue_op_mode)DRV_MODE; - - ULONG CONFIG_BAR; - status = WdfRegistryQueryULong(key, &value_config_bar, &CONFIG_BAR); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "WdfRegistryQueryULong failed: %!STATUS!", status); - goto ErrExit; - } - - if (CONFIG_BAR > 2ul) { - TraceError(TRACE_DEVICE, "Invalid parameter CONFIG_BAR - [%lu]", CONFIG_BAR); - status = STATUS_INVALID_PARAMETER; - goto ErrExit; - } - - config_bar = (UINT8)CONFIG_BAR; - - TraceVerbose(TRACE_DEVICE, "Parameter DRV_MODE - [%lu] CONFIG_BAR - [%lu]", op_mode, CONFIG_BAR); - -ErrExit: - WdfRegistryClose(key); - return status; -} - -//_Use_decl_annotations_ -static void -qdma_user_isr_handler( - ULONG event_id, - void *user_data) -{ - UNREFERENCED_PARAMETER(event_id); - UNREFERENCED_PARAMETER(user_data); - TraceInfo(TRACE_DEVICE, "In %s", __func__); -} - -//_Use_decl_annotations_ -static void -qdma_user_interrupt_enable( - ULONG event_id, - void *user_data) -{ - UNREFERENCED_PARAMETER(event_id); - UNREFERENCED_PARAMETER(user_data); - TraceInfo(TRACE_DEVICE, "In %s", __func__); -} - -//_Use_decl_annotations_ -static void -qdma_user_interrupt_disable( - ULONG event_id, - void *user_data) -{ - UNREFERENCED_PARAMETER(event_id); - UNREFERENCED_PARAMETER(user_data); - TraceInfo(TRACE_DEVICE, "In %s", __func__); -} - -NTSTATUS qdma_evt_device_prepare_hardware( - const WDFDEVICE device, - const WDFCMRESLIST resources, - const WDFCMRESLIST resources_translated) -{ - PAGED_CODE(); - - qdma_drv_config drv_conf = {}; - device_context *ctx = get_device_context(device); - - ctx->qdma = qdma_interface::create_qdma_device(); - if (ctx->qdma == nullptr) { - TraceError(TRACE_DEVICE, "qdma device memory allocation failed"); - return STATUS_INSUFFICIENT_RESOURCES; - } - - - NTSTATUS status = read_reg_params(ctx->config.op_mode, ctx->config.config_bar); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "failed to read registry params %!STATUS!", status); - return status; - } - - drv_conf.operation_mode = ctx->config.op_mode; - drv_conf.cfg_bar = ctx->config.config_bar; - drv_conf.qsets_max = QDMA_MAX_QUEUES_PER_PF; - drv_conf.user_msix_max = QDMA_MAX_USER_INTR; - drv_conf.data_msix_max = QDMA_MAX_DATA_INTR; - drv_conf.user_data = (void*)device; - drv_conf.user_isr_handler = qdma_user_isr_handler; - drv_conf.user_interrupt_enable_handler = qdma_user_interrupt_enable; - drv_conf.user_interrupt_disable_handler = qdma_user_interrupt_disable; - - status = ctx->qdma->init(drv_conf); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "qdma.init() failed! %!STATUS!", status); - return status; - } - - status = ctx->qdma->open(device, resources, resources_translated); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "qdma.open() failed! %!STATUS!", status); - return status; - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_evt_device_release_hardware( - const WDFDEVICE device, - WDFCMRESLIST resources_translated) -{ - PAGED_CODE(); - - UNREFERENCED_PARAMETER(resources_translated); - - device_context* ctx = get_device_context(device); - if (ctx) { - ctx->qdma->close(); - qdma_interface::remove_qdma_device(ctx->qdma); - ctx->qdma = nullptr; - } - - return STATUS_SUCCESS; -} \ No newline at end of file diff --git a/QDMA/windows/sys/drv/source/device.h b/QDMA/windows/sys/drv/source/device.h deleted file mode 100644 index 7bce0ad..0000000 --- a/QDMA/windows/sys/drv/source/device.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include "windows_common.h" -#include "qdma_exports.h" - -EXTERN_C_START - -#define QDMA_MAX_QUEUES_PER_PF 512 -#define QDMA_MAX_USER_INTR 1 -#define QDMA_MAX_DATA_INTR 7 - -struct device_context { - struct { - xlnx::queue_op_mode op_mode; - UINT8 config_bar; - }config; - - xlnx::qdma_interface *qdma; -}; -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(device_context, get_device_context) - -_IRQL_requires_same_ -_IRQL_requires_max_(PASSIVE_LEVEL) -NTSTATUS -qdma_create_device( - _Inout_ PWDFDEVICE_INIT device_init -); - -enum class file_target { - USER, - CONTROL, - BYPASS, - DMA_QUEUE, - ST_QUEUE, - MGMT, - UNKNOWN = 255, -}; - -struct file_context { - file_target target; - UINT16 qid; - bool no_copy; -}; -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(file_context, get_file_context) - -EVT_WDF_DEVICE_PREPARE_HARDWARE qdma_evt_device_prepare_hardware; -EVT_WDF_DEVICE_RELEASE_HARDWARE qdma_evt_device_release_hardware; - -EXTERN_C_END diff --git a/QDMA/windows/sys/drv/source/driver.cpp b/QDMA/windows/sys/drv/source/driver.cpp deleted file mode 100644 index 09c0502..0000000 --- a/QDMA/windows/sys/drv/source/driver.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "driver.h" -#include "device.h" - -#include "trace.h" - -#ifdef ENABLE_WPP_TRACING -#include "driver.tmh" -#endif - -#ifdef ALLOC_PRAGMA -#pragma alloc_text (INIT, DriverEntry) -#pragma alloc_text (PAGE, qdma_evt_device_add) -#pragma alloc_text (PAGE, qdma_evt_driver_context_cleanup) -#endif - -using namespace xlnx; - -_Use_decl_annotations_ -NTSTATUS -DriverEntry( - _In_ PDRIVER_OBJECT driver_object, - _In_ PUNICODE_STRING registry_path -) -{ - /** Initialize WPP Tracing */ - WPP_INIT_TRACING(driver_object, registry_path); - - TraceInfo(TRACE_DRIVER, "Xilinx PCIe Multi-Queue DMA Driver - Built %s,%s", - __DATE__, __TIME__); - - /** Register a cleanup callback to call WPP_CLEANUP during driver unload */ - WDF_OBJECT_ATTRIBUTES attributes; - WDF_OBJECT_ATTRIBUTES_INIT(&attributes); - attributes.EvtCleanupCallback = qdma_evt_driver_context_cleanup; - - WDF_DRIVER_CONFIG config; - WDF_DRIVER_CONFIG_INIT(&config, qdma_evt_device_add); - - NTSTATUS status = WdfDriverCreate(driver_object, registry_path, &attributes, &config, WDF_NO_HANDLE); - - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DRIVER, "WdfDriverCreate failed %!STATUS!", status); - WPP_CLEANUP(driver_object); - return status; - } - - TraceVerbose(TRACE_DRIVER, "%!FUNC! Exit"); - - return status; -} - -_Use_decl_annotations_ -NTSTATUS -qdma_evt_device_add( - _In_ WDFDRIVER driver, - _Inout_ PWDFDEVICE_INIT device_init -) -{ - UNREFERENCED_PARAMETER(driver); - - PAGED_CODE(); - return qdma_create_device(device_init); -} - -_Use_decl_annotations_ -VOID -qdma_evt_driver_context_cleanup( - _In_ WDFOBJECT driver_object -) -{ - // EvtCleanupCallback for WDFDEVICE objects is always called at PASSIVE_LEVEL - _IRQL_limited_to_(PASSIVE_LEVEL); - PAGED_CODE(); - -#ifndef ENABLE_WPP_TRACING - UNREFERENCED_PARAMETER(driver_object); -#endif - - TraceVerbose(TRACE_DRIVER, "%!FUNC! Entry"); - /** Stop WPP Tracing */ - WPP_CLEANUP(WdfDriverWdmGetDriverObject(static_cast<WDFDRIVER>(driver_object))); -} diff --git a/QDMA/windows/sys/drv/source/driver.h b/QDMA/windows/sys/drv/source/driver.h deleted file mode 100644 index 929ff61..0000000 --- a/QDMA/windows/sys/drv/source/driver.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include "windows_common.h" - -EXTERN_C_START - -/** - * WDFDRIVER Events - */ - -DRIVER_INITIALIZE DriverEntry; -EVT_WDF_DRIVER_DEVICE_ADD qdma_evt_device_add; -EVT_WDF_OBJECT_CONTEXT_CLEANUP qdma_evt_driver_context_cleanup; - - -EXTERN_C_END diff --git a/QDMA/windows/sys/drv/source/io_queue.cpp b/QDMA/windows/sys/drv/source/io_queue.cpp deleted file mode 100644 index 964b4e1..0000000 --- a/QDMA/windows/sys/drv/source/io_queue.cpp +++ /dev/null @@ -1,1441 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "qdma_driver_api.h" -#include "device.h" -#include "io_queue.h" - -#include "trace.h" - -#ifdef ENABLE_WPP_TRACING -#include "io_queue.tmh" -#endif - -// remove some false positive static analysis errors related to trace messages -//#ifndef WPP_TRACING -//#define WPP_(x) (void) -//#endif - -#ifdef ALLOC_PRAGMA -#pragma alloc_text (PAGE, qdma_io_queue_initialize) -#endif - -using namespace xlnx; - -void drv_st_tx_zcmp_cb(void *priv, NTSTATUS status); -void drv_st_tx_cmp_cb(void *priv, NTSTATUS status); -void drv_mm_cmp_cb(void *priv, NTSTATUS status); -void drv_st_rx_cmp_cb(const st_c2h_pkt_fragment *rx_pkts, size_t num_pkts, void *priv, NTSTATUS status); -void drv_st_process_udd_only_pkts(UINT16 qid, void *udd_addr, void *priv); - -/* ----------------- static function definitions ----------------- */ -const static struct device_file_details { - file_target target; - const wchar_t* name; -} file_name_LUT[] = { - { file_target::USER, QDMA_FILE_USER }, - { file_target::CONTROL, QDMA_FILE_CONTROL }, - { file_target::BYPASS, QDMA_FILE_BYPASS }, - { file_target::DMA_QUEUE, QDMA_FILE_DMA_QUEUE }, - { file_target::ST_QUEUE, QDMA_FILE_DMA_ST_QUEUE }, - { file_target::MGMT, QDMA_FILE_DMA_MGMT}, -}; - -/* convert from filename to device node */ -static file_target parse_file_name( - const PUNICODE_STRING file_name) -{ - for (UINT i = 0; i < sizeof(file_name_LUT) / sizeof(file_name_LUT[0]); ++i) { - if (!wcscmp(file_name->Buffer, file_name_LUT[i].name)) { - return file_name_LUT[i].target; - } - if (wcsstr(file_name->Buffer, file_name_LUT[i].name) - && file_name->Length > wcslen(file_name_LUT[i].name)) { - return file_name_LUT[i].target; - } - } - TraceError(TRACE_DEVICE, "device file name does not match one of known types!"); - return file_target::UNKNOWN; -} - -static UINT16 extract_index_token( - const PUNICODE_STRING file_name) -{ - ULONG index = 0; - UNICODE_STRING token_uni; - RtlInitUnicodeString(&token_uni, wcsstr(file_name->Buffer, L"_") + 1); - auto status = RtlUnicodeStringToInteger(&token_uni, 10, &index); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_DEVICE, "RtlUnicodeStringToInteger failed! %!STATUS!", status); - return UINT16_MAX; - } - return (UINT16)index; -} - -static void io_read_bar( - qdma_interface *qdma_dev, - qdma_bar_type bar_type, - const WDFREQUEST request, - const size_t length) -{ - WDF_REQUEST_PARAMETERS params; - WDF_REQUEST_PARAMETERS_INIT(¶ms); - WdfRequestGetParameters(request, ¶ms); - const auto offset = static_cast<size_t>(params.Parameters.Read.DeviceOffset); - - /* get handle to the IO request memory which will hold the read data */ - WDFMEMORY request_mem; - auto status = WdfRequestRetrieveOutputMemory(request, &request_mem); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfRequestRetrieveOutputMemory failed: %!STATUS!", status); - goto ErrExit; - } - - /* get pointer to buffer */ - const auto req_buffer = WdfMemoryGetBuffer(request_mem, nullptr); - - status = qdma_dev->read_bar(bar_type, offset, req_buffer, length); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "Reading PCIe BAR failed: %!STATUS!", status); - goto ErrExit; - } - - WdfRequestCompleteWithInformation(request, status, length); - return; - -ErrExit: - WdfRequestComplete(request, status); -} - -static void io_write_bar( - qdma_interface *qdma_dev, - qdma_bar_type bar_type, - const WDFREQUEST request, - const size_t length) -{ - WDF_REQUEST_PARAMETERS params; - WDF_REQUEST_PARAMETERS_INIT(¶ms); - WdfRequestGetParameters(request, ¶ms); - const auto offset = static_cast<size_t>(params.Parameters.Write.DeviceOffset); - - /* get handle to the IO request memory which will hold the read data */ - WDFMEMORY request_mem; - - auto status = WdfRequestRetrieveInputMemory(request, &request_mem); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfRequestRetrieveOutputMemory failed: %!STATUS!", status); - goto ErrExit; - } - - /* get pointer to buffer */ - const auto req_buffer = WdfMemoryGetBuffer(request_mem, nullptr); - - status = qdma_dev->write_bar(bar_type, offset, req_buffer, length); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "Writing PCIe BAR failed: %!STATUS!", status); - goto ErrExit; - } - - WdfRequestCompleteWithInformation(request, status, length); - return; - -ErrExit: - WdfRequestComplete(request, status); -} - -static BOOLEAN program_mm_dma_cb( - const WDFDMATRANSACTION transaction, - WDFDEVICE device, - WDFCONTEXT context, - const WDF_DMA_DIRECTION direction, - const PSCATTER_GATHER_LIST sg_list) -{ - auto dev_ctx = get_device_context(device); - DMA_TXN_CONTEXT *dma_ctx = (DMA_TXN_CONTEXT *)context; - const auto request = WdfDmaTransactionGetRequest(transaction); - WDF_REQUEST_PARAMETERS params; - WDF_REQUEST_PARAMETERS_INIT(¶ms); - WdfRequestGetParameters(request, ¶ms); - - const auto device_offset = (direction == WdfDmaDirectionWriteToDevice) ? - params.Parameters.Write.DeviceOffset : - params.Parameters.Read.DeviceOffset; - - auto status = dev_ctx->qdma->qdma_enqueue_mm_request(dma_ctx->qid, direction, sg_list, device_offset, drv_mm_cmp_cb, transaction); - if (!NT_SUCCESS(status)) { - dma_ctx->txn_len = 0; - /** Complete the DMA transaction */ - drv_mm_cmp_cb(transaction, status); - TraceError(TRACE_IO, "qdma_enqueue_mm_request() failed! %!STATUS!", status);; - return false; - } - - TraceVerbose(TRACE_IO, "qdma_enqueue_mm_request(): txd len : %lld", dma_ctx->txn_len); - - return true; -} - -static BOOLEAN program_st_tx_dma_cb( - WDFDMATRANSACTION transaction, - WDFDEVICE device, - const WDFCONTEXT context, - const WDF_DMA_DIRECTION direction, - const PSCATTER_GATHER_LIST sg_list) -{ - UNREFERENCED_PARAMETER(direction); - - auto dev_ctx = get_device_context(device); - DMA_TXN_CONTEXT *dma_ctx = (DMA_TXN_CONTEXT *)context; - - auto status = dev_ctx->qdma->qdma_enqueue_st_tx_request(dma_ctx->qid, sg_list, drv_st_tx_cmp_cb, transaction); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "qdma_enqueue_st_tx_request() failed! %!STATUS!", status); - drv_st_tx_cmp_cb(transaction, status); - return false; - } - - TraceVerbose(TRACE_IO, "qdma_enqueue_st_tx_request(): txd len : %lld", dma_ctx->txn_len); - - return true; -} - - -static void io_mm_dma( - qdma_interface *qdma_dev, - UINT16 qid, - WDFREQUEST request, - const size_t length, - const WDF_DMA_DIRECTION direction) -{ - WDF_OBJECT_ATTRIBUTES attributes; - WDFDMATRANSACTION dma_transaction; - - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DMA_TXN_CONTEXT); - auto status = WdfDmaTransactionCreate(qdma_dev->dma_enabler, &attributes, &dma_transaction); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfDmaTransactionCreate() failed: %!STATUS!", status); - return; - } - - auto dma_ctx = get_dma_txn_context(dma_transaction); - dma_ctx->qid = qid; - dma_ctx->txn_len = length; - - /* initialize a DMA transaction from the request */ - status = WdfDmaTransactionInitializeUsingRequest(dma_transaction, - request, - program_mm_dma_cb, - direction); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfDmaTransactionInitializeUsingRequest failed: %!STATUS!", status); - goto ErrExit; - } - - status = WdfDmaTransactionExecute(dma_transaction, dma_ctx); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfDmaTransactionExecute failed: %!STATUS!", status); - goto ErrExit; - } - - TraceVerbose(TRACE_IO, "DMA transfer triggered on queue %d, direction : %d", qid, direction); - return; - -ErrExit: - WdfObjectDelete(dma_transaction); - WdfRequestComplete(request, status); - TraceError(TRACE_IO, "DMA transfer initiation failed, Request 0x%p: %!STATUS!", request, status); - -} - -static void io_st_read_dma( - qdma_interface *qdma_dev, - UINT16 qid, - WDFREQUEST request, - const size_t length) -{ - WDF_OBJECT_ATTRIBUTES attributes; - DMA_TXN_CONTEXT *dma_context = nullptr; - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DMA_TXN_CONTEXT); - - NTSTATUS status = WdfObjectAllocateContext(request, &attributes, (PVOID *)&dma_context); - dma_context->qid = qid; - dma_context->txn_len = length; - - status = qdma_dev->qdma_enqueue_st_rx_request(qid, length, drv_st_rx_cmp_cb, (void *)request); - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - TraceError(TRACE_IO, "DMA transfer initiation failed: %!STATUS!", status); - } - - TraceVerbose(TRACE_IO, "DMA transfer triggered on queue %d", qid); -} - -static void io_st_zero_write_dma( - qdma_interface *qdma_dev, - UINT16 qid, - WDFREQUEST request, - const size_t length, - const WDF_DMA_DIRECTION direction) -{ - UNREFERENCED_PARAMETER(length); - UNREFERENCED_PARAMETER(direction); - - ST_DMA_ZERO_TX_PRIV *priv; - /** construct one element sg_list */ - constexpr size_t sg_list_len = sizeof(SCATTER_GATHER_LIST) + sizeof(SCATTER_GATHER_ELEMENT); - PSCATTER_GATHER_LIST sg_list; - - sg_list = (PSCATTER_GATHER_LIST)ExAllocatePoolWithTag(NonPagedPoolNx, sg_list_len, IO_QUEUE_TAG); - if (sg_list == NULL) { - TraceVerbose(TRACE_IO, "sg_list: Mem alloc failed\n"); - return; - } - - RtlZeroMemory(sg_list, sg_list_len); - - sg_list->NumberOfElements = 1; - sg_list->Elements[0].Address.QuadPart = NULL; - sg_list->Elements[0].Length = 0x0; - - priv = (ST_DMA_ZERO_TX_PRIV*)ExAllocatePoolWithTag(NonPagedPoolNx, sizeof(ST_DMA_ZERO_TX_PRIV), IO_QUEUE_TAG); - if (priv == NULL) { - ExFreePoolWithTag(sg_list, IO_QUEUE_TAG); - TraceVerbose(TRACE_IO, "priv: Mem alloc failed\n"); - return; - } - - /** Store the context info in priv data */ - priv->request = request; - priv->sg_list = sg_list; - - /* For Zero byte transfer, pass the ST_DMA_ZERO_TX_PRIV in WDFDMATRANSACTION parameter that contains, - locally constructed single element sglist parameter & WDFREQUEST for the function qdma_enqueue_st_request */ - auto status = qdma_dev->qdma_enqueue_st_tx_request(qid, sg_list, drv_st_tx_zcmp_cb, static_cast<PVOID>(priv)); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "DMA transfer initiation failed! %!STATUS!", status); - drv_st_tx_zcmp_cb(priv, status); - return; - } - - TraceVerbose(TRACE_IO, "DMA transfer triggered on queue %d for zero length", qid); - return; -} - -static void io_st_write_dma( - qdma_interface *qdma_dev, - UINT16 qid, - WDFREQUEST request, - const size_t length, - const WDF_DMA_DIRECTION direction) -{ - WDF_OBJECT_ATTRIBUTES attributes; - WDFDMATRANSACTION dma_transaction; - - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DMA_TXN_CONTEXT); - auto status = WdfDmaTransactionCreate(qdma_dev->dma_enabler, &attributes, &dma_transaction); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfDmaTransactionCreate() failed: %!STATUS!", status); - WdfRequestComplete(request, status); - return; - } - - auto dma_ctx = get_dma_txn_context(dma_transaction); - if (!dma_ctx) { - goto ErrExit; - } - - dma_ctx->qid = qid; - dma_ctx->txn_len = length; - - /* initialize a DMA transaction from the request */ - status = WdfDmaTransactionInitializeUsingRequest(dma_transaction, - request, - program_st_tx_dma_cb, - direction); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfDmaTransactionInitializeUsingRequest failed: %!STATUS!", status); - goto ErrExit; - } - - status = WdfDmaTransactionExecute(dma_transaction, dma_ctx); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfDmaTransactionExecute failed: %!STATUS!", status); - goto ErrExit; - } - - TraceVerbose(TRACE_IO, "DMA transfer triggered on queue %d", qid); - return; - -ErrExit: - WdfObjectDelete(dma_transaction); - WdfRequestComplete(request, status); - TraceError(TRACE_IO, "DMA transfer initiation failed! for Request : %p, %!STATUS!", request, status); -} - -/* ----- CB Processing Functions ----- */ -void drv_st_rx_cmp_cb(const st_c2h_pkt_fragment *rx_pkts, size_t num_pkts, void *priv, NTSTATUS status) -{ - WDFREQUEST request = (WDFREQUEST)priv; - size_t offset = 0; - auto dma_ctx = get_dma_txn_context(request); - auto file_ctx = get_file_context(WdfRequestGetFileObject(request)); - - if (nullptr == file_ctx) { - status = STATUS_UNSUCCESSFUL; - goto ErrExit; - } - - if ((NT_SUCCESS(status))) { - if (dma_ctx->txn_len != (size_t)0) { - WDFMEMORY output_mem; - status = WdfRequestRetrieveOutputMemory(request, &output_mem); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfRequestRetrieveOutputMemory failed: %!STATUS!", status); - WdfRequestCompleteWithInformation(request, status, (size_t)0); - return; - } - - for (size_t i = 0; i < num_pkts; i++) { - st_c2h_pkt_fragment packet = rx_pkts[i]; - -#ifdef DBG - if (packet.udd_data != nullptr) { - UINT8 len = 0; - constexpr unsigned short MAX_UDD_STR_LEN = (QDMA_MAX_UDD_DATA_LEN * 3) + 1; - char imm_data_str[MAX_UDD_STR_LEN]; - UINT32 udd_len; - UINT8 udd_buffer[QDMA_MAX_UDD_DATA_LEN]; - WDFQUEUE io_queue = WdfRequestGetIoQueue(request); - if (io_queue) { - auto dev_ctx = get_device_context(WdfIoQueueGetDevice(io_queue)); - status = dev_ctx->qdma->qdma_retrieve_st_udd_data(dma_ctx->qid, packet.udd_data, udd_buffer, &udd_len); - - for (auto iter = 0UL; iter < udd_len; iter++) { - RtlStringCchPrintfA((imm_data_str + len), (MAX_UDD_STR_LEN - len), "%02X ", udd_buffer[iter]); - len = len + 3; /* 3 characters are getting utilized for each byte */ - } - TraceVerbose(TRACE_IO, "Immediate data Len : %d, Data: %s", udd_len, imm_data_str); - } - } -#endif - if ((packet.data) && (packet.length) && - (packet.pkt_type != st_c2h_pkt_type::ST_C2H_UDD_ONLY_PKT)) { - - if ((offset + packet.length) >= dma_ctx->txn_len) { - if (false == file_ctx->no_copy) - WdfMemoryCopyFromBuffer(output_mem, offset, packet.data, (dma_ctx->txn_len - offset)); - offset += (dma_ctx->txn_len - offset); - break; - } - else { - if (false == file_ctx->no_copy) - WdfMemoryCopyFromBuffer(output_mem, offset, packet.data, packet.length); - offset += packet.length; - } - } - } - } - - WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, offset); - return; - } - -ErrExit: - WdfRequestCompleteWithInformation(request, status, (size_t)0); - - TraceVerbose(TRACE_IO, "ST C2H Request completed with %!STATUS!", status); -} - -static void dma_complete_transaction(WDFDMATRANSACTION dma_transaction, NTSTATUS status) -{ - NTSTATUS ret; - WDFREQUEST request = NULL; - BOOLEAN transaction_complete = false; - auto dma_ctx = get_dma_txn_context(dma_transaction); - size_t length = dma_ctx->txn_len; - UINT16 qid = dma_ctx->qid; - - request = WdfDmaTransactionGetRequest(dma_transaction); - if (!request) - /** Dont return from here, Need to delete the dma_transaction object */ - TraceError(TRACE_IO, "Callback triggered, No request pending on queue %d", qid); - - if ((NT_SUCCESS(status))) - transaction_complete = WdfDmaTransactionDmaCompleted(dma_transaction, &ret); - else - transaction_complete = WdfDmaTransactionDmaCompletedFinal(dma_transaction, length, &ret); - - if (transaction_complete) { - NT_ASSERT(status != STATUS_MORE_PROCESSING_REQUIRED); - WdfObjectDelete(dma_transaction); - } - else { - TraceError(TRACE_IO, "Err: DMA transaction not completed on queue %d, ret : %X", qid, ret); - } - - if (request) { - WdfRequestCompleteWithInformation(request, status, length); - TraceVerbose(TRACE_IO, "DMA transfer completed on queue %d, Len : %lld", qid, length); - } -} - -void drv_mm_cmp_cb(void *priv, NTSTATUS status) -{ - if (priv == nullptr) { - TraceError(TRACE_IO, "WDFDMATRANSACTION is NULL, Not possible to proceed"); - return; - } - - dma_complete_transaction(static_cast<WDFDMATRANSACTION>(priv), status); -} - -void drv_st_tx_cmp_cb(void *priv, NTSTATUS status) -{ - if (priv == nullptr) { - TraceError(TRACE_IO, "WDFDMATRANSACTION is NULL, Not possible to proceed"); - return; - } - - dma_complete_transaction(static_cast<WDFDMATRANSACTION>(priv), status); -} - -void drv_st_tx_zcmp_cb(void *priv, NTSTATUS status) -{ - if (priv == nullptr) { - TraceError(TRACE_IO, "WDFREQUEST is NULL, Not possible to proceed"); - return; - } - - ST_DMA_ZERO_TX_PRIV *priv_ctx = (ST_DMA_ZERO_TX_PRIV *)priv; - - WdfRequestCompleteWithInformation(static_cast<WDFREQUEST>(priv_ctx->request), status, 0); - - ExFreePoolWithTag(priv_ctx->sg_list, IO_QUEUE_TAG); - ExFreePoolWithTag(priv_ctx, IO_QUEUE_TAG); - - TraceInfo(TRACE_IO, "DMA Transfer completed for Zero length"); -} - -void drv_st_process_udd_only_pkts(UINT16 qid, void *udd_addr, void *priv) -{ - TraceVerbose(TRACE_IO, "UDD Only Call back function called, qid : %d, " - "udd_addr : %p, priv : %p\n", qid, udd_addr, priv); - -#ifdef DBG - if ((udd_addr == nullptr) || (priv == nullptr)) - return; - - UINT8 len = 0; - constexpr unsigned short MAX_UDD_STR_LEN = (QDMA_MAX_UDD_DATA_LEN * 3) + 1; - char imm_data_str[MAX_UDD_STR_LEN]; - UINT32 udd_len; - UINT8 udd_buffer[QDMA_MAX_UDD_DATA_LEN]; - qdma_interface *qdma_dev = (qdma_interface *)priv; - - NTSTATUS status = qdma_dev->qdma_retrieve_st_udd_data(qid, udd_addr, udd_buffer, &udd_len); - - if (NT_SUCCESS(status)) { - for (auto iter = 0UL; iter < udd_len; iter++) { - RtlStringCchPrintfA((imm_data_str + len), (MAX_UDD_STR_LEN - len), "%02X ", udd_buffer[iter]); - len = len + 3; /* 3 characters are getting utilized for each byte */ - } - - TraceInfo(TRACE_IO, "Immediate data Len : %d, Data: %s", udd_len, imm_data_str); - } -#endif -} - -NTSTATUS qdma_io_queue_initialize( - const WDFDEVICE device) -{ - PAGED_CODE(); - - TraceVerbose(TRACE_IO, "Initializing main entry IO queue"); - - /* Configure a default queue so that requests that are not configure-fowarded using - * WdfDeviceConfigureRequestDispatching to goto other queues get dispatched here. - */ - WDF_IO_QUEUE_CONFIG queue_config; - WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queue_config, WdfIoQueueDispatchParallel); - queue_config.AllowZeroLengthRequests = true; - queue_config.EvtIoDeviceControl = qdma_evt_ioctl; - queue_config.EvtIoStop = qdma_evt_io_stop; - queue_config.EvtIoRead = qdma_evt_io_read; - queue_config.EvtIoWrite = qdma_evt_io_write; - - WDFQUEUE queue; - auto status = WdfIoQueueCreate(device, &queue_config, WDF_NO_OBJECT_ATTRIBUTES, &queue); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfIoQueueCreate failed %!STATUS!", status); - return status; - } - - return status; -} - -static NTSTATUS retrive_ioctl( - WDFREQUEST request, - PVOID ibuf, - size_t ibuf_len, - PVOID *obuf = nullptr, - size_t obuf_len = 0 -) -{ - PVOID in_buff = nullptr; - PVOID out_buff = nullptr; - size_t buff_len; - NTSTATUS status; - - if (ibuf != nullptr) { - status = WdfRequestRetrieveInputBuffer(request, ibuf_len, &in_buff, &buff_len); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfRequestRetrieveInputBuffer failed: %!STATUS!", status); - return status; - } - - if (ibuf_len != buff_len) { - TraceError(TRACE_IO, "input buffer length mismatch: %lld != %lld", ibuf_len, buff_len); - return STATUS_UNSUCCESSFUL; - } - - RtlCopyMemory(ibuf, in_buff, buff_len); - } - - if (obuf != nullptr) { - status = WdfRequestRetrieveOutputBuffer(request, obuf_len, &out_buff, &buff_len); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "WdfRequestRetrieveOutputBuffer failed: %!STATUS!", status); - return STATUS_UNSUCCESSFUL; - } - - if (obuf_len != buff_len) { - TraceError(TRACE_IO, "output buffer length mismatch: %lld != %lld", obuf_len, buff_len); - return STATUS_UNSUCCESSFUL; - } - - *obuf = out_buff; - } - - return STATUS_SUCCESS; -} - -static NTSTATUS validate_ioctl_cmd( - ULONG io_control_code, - ioctl_cmd& cmd -) -{ - NTSTATUS status = STATUS_SUCCESS; - - switch (io_control_code) { - case IOCTL_QDMA_QUEUE_ADD: - if (cmd.q_conf.in.h2c_ring_sz_index >= QDMA_CSR_SZ) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - if (cmd.q_conf.in.c2h_ring_sz_index >= QDMA_CSR_SZ) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - if (cmd.q_conf.in.c2h_buff_sz_index >= QDMA_CSR_SZ) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - if (cmd.q_conf.in.c2h_th_cnt_index >= QDMA_CSR_SZ) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - if (cmd.q_conf.in.c2h_timer_cnt_index >= QDMA_CSR_SZ) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - if (cmd.q_conf.in.compl_sz >= CMPT_DESC_SZ_MAX) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - if (cmd.q_conf.in.trig_mode >= TRIG_MODE_MAX) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - break; - case IOCTL_QDMA_QUEUE_DUMP_DESC: - if (cmd.desc_info.in.dir > queue_direction::QUEUE_DIR_C2H) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - if (cmd.desc_info.in.desc_type > descriptor_type::CMPT_DESC) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - break; - case IOCTL_QDMA_QUEUE_DUMP_CTX: - if (cmd.ctx_info.in.type > ring_type::RING_TYPE_CMPT) { - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - break; - default: - /* default validation is success */ - break; - } - -Exit: - return status; -} - -void qdma_evt_ioctl( - WDFQUEUE queue, - WDFREQUEST request, - size_t output_buffer_length, - size_t input_buffer_length, - ULONG io_control_code) -{ - NTSTATUS status; - auto dev_ctx = get_device_context(WdfIoQueueGetDevice(queue)); - auto file_ctx = get_file_context(WdfRequestGetFileObject(request)); - auto qdma_dev = dev_ctx->qdma; - union ioctl_cmd cmd; - enum queue_state qstate; - - TraceVerbose(TRACE_IO, "Queue 0x%p, Request 0x%p OutputBufferLength %llu InputBufferLength %llu IoControlCode 0x%X", - queue, request, output_buffer_length, input_buffer_length, io_control_code); - - if (file_target::MGMT != file_ctx->target && file_target::ST_QUEUE != file_ctx->target) { - TraceError(TRACE_IO, "File target not supported"); - WdfRequestComplete(request, STATUS_UNSUCCESSFUL); - return; - } - - if (false == qdma_dev->qdma_is_device_online()) { - TraceError(TRACE_DEVICE, "QDMA Device is offline."); - WdfRequestComplete(request, STATUS_DEVICE_OFF_LINE); - return; - } - - RtlZeroMemory(&cmd, sizeof(cmd)); - switch (io_control_code) { - case IOCTL_QDMA_CSR_DUMP : - { - qdma_glbl_csr_conf conf = {}; - - status = retrive_ioctl(request, nullptr, 0, - (PVOID *)&cmd.csr.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_CSR_DUMP"); - status = qdma_dev->qdma_read_csr_conf(&conf); - if (!NT_SUCCESS(status)) - goto Exit; - - RtlCopyMemory(cmd.csr.out, &conf, sizeof(conf)); - - WdfRequestCompleteWithInformation(request, status, sizeof(qdma_glbl_csr_conf)); - break; - } - case IOCTL_QDMA_DEVINFO : - { - qdma_version_info version_info = {}; - - status = retrive_ioctl(request, nullptr, 0, - (PVOID *)&cmd.dev_info.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_DEVINFO"); - status = qdma_dev->qdma_device_version_info(version_info); - if (!NT_SUCCESS(status)) - goto Exit; - - device_info_out::version_info *ver_info = &cmd.dev_info.out->ver_info; - - RtlStringCchCopyNA(ver_info->qdma_rtl_version_str, - sizeof(ver_info->qdma_rtl_version_str), - version_info.qdma_rtl_version_str, - QDMA_VERSION_INFO_LENGTH); - - RtlStringCchCopyNA(ver_info->qdma_vivado_release_id_str, - sizeof(ver_info->qdma_vivado_release_id_str), - version_info.qdma_vivado_release_id_str, - QDMA_VERSION_INFO_LENGTH); - - RtlStringCchCopyNA(ver_info->qdma_device_type_str, - sizeof(ver_info->qdma_device_type_str), - version_info.qdma_device_type_str, - QDMA_VERSION_INFO_LENGTH); - - RtlStringCchCopyNA(ver_info->qdma_versal_ip_type_str, - sizeof(ver_info->qdma_versal_ip_type_str), - version_info.qdma_versal_ip_type_str, - QDMA_VERSION_INFO_LENGTH); - - RtlStringCchCopyNA(ver_info->qdma_sw_version, - sizeof(ver_info->qdma_sw_version), - version_info.qdma_sw_version_str, - QDMA_VERSION_INFO_LENGTH); - - qdma_device_attributes_info dev_attr = {}; - status = qdma_dev->qdma_get_dev_capabilities_info(dev_attr); - if (status != STATUS_SUCCESS) - goto Exit; - - cmd.dev_info.out->num_pfs = dev_attr.num_pfs; - cmd.dev_info.out->num_qs = dev_attr.num_qs; - cmd.dev_info.out->flr_present = dev_attr.flr_present; - cmd.dev_info.out->st_en = dev_attr.st_en; - cmd.dev_info.out->mm_en = dev_attr.mm_en; - cmd.dev_info.out->mm_cmpl_en = dev_attr.mm_cmpl_en; - cmd.dev_info.out->mailbox_en = dev_attr.mailbox_en; - cmd.dev_info.out->num_mm_channels = dev_attr.num_mm_channels; - cmd.dev_info.out->debug_mode = dev_attr.debug_mode; - cmd.dev_info.out->desc_eng_mode = dev_attr.desc_eng_mode; - - WdfRequestCompleteWithInformation(request, status, sizeof(device_info_out)); - - break; - } - case IOCTL_QDMA_QUEUE_ADD : - { - queue_config q_conf = {}; - - status = retrive_ioctl(request, - &cmd.q_conf.in, sizeof(cmd.q_conf.in)); - if (!NT_SUCCESS(status)) - goto Exit; - - status = validate_ioctl_cmd(io_control_code, cmd); - if (!NT_SUCCESS(status)) - goto Exit; - - q_conf.h2c_ring_sz_index = cmd.q_conf.in.h2c_ring_sz_index; - q_conf.c2h_ring_sz_index = cmd.q_conf.in.c2h_ring_sz_index; - q_conf.c2h_buff_sz_index = cmd.q_conf.in.c2h_buff_sz_index; - q_conf.c2h_th_cnt_index = cmd.q_conf.in.c2h_th_cnt_index; - q_conf.c2h_timer_cnt_index = cmd.q_conf.in.c2h_timer_cnt_index; - q_conf.is_st = cmd.q_conf.in.is_st; - - if (cmd.q_conf.in.trig_mode == trig_mode::TRIG_MODE_EVERY) - q_conf.trig_mode = qdma_trig_mode::QDMA_TRIG_MODE_EVERY; - else if (cmd.q_conf.in.trig_mode == trig_mode::TRIG_MODE_USER_COUNT) - q_conf.trig_mode = qdma_trig_mode::QDMA_TRIG_MODE_USER_COUNT; - else if (cmd.q_conf.in.trig_mode == trig_mode::TRIG_MODE_USER) - q_conf.trig_mode = qdma_trig_mode::QDMA_TRIG_MODE_USER; - else if (cmd.q_conf.in.trig_mode == trig_mode::TRIG_MODE_USER_TIMER) - q_conf.trig_mode = qdma_trig_mode::QDMA_TRIG_MODE_USER_TIMER; - else if (cmd.q_conf.in.trig_mode == trig_mode::TRIG_MODE_USER_TIMER_COUNT) - q_conf.trig_mode = qdma_trig_mode::QDMA_TRIG_MODE_USER_TIMER_COUNT; - else - q_conf.trig_mode = qdma_trig_mode::QDMA_TRIG_MODE_DISABLE; - - if (cmd.q_conf.in.compl_sz == cmpt_desc_sz::CMPT_DESC_SZ_8B) - q_conf.cmpt_sz = qdma_desc_sz::QDMA_DESC_SZ_8B; - else if (cmd.q_conf.in.compl_sz == cmpt_desc_sz::CMPT_DESC_SZ_16B) - q_conf.cmpt_sz = qdma_desc_sz::QDMA_DESC_SZ_16B; - else if (cmd.q_conf.in.compl_sz == cmpt_desc_sz::CMPT_DESC_SZ_32B) - q_conf.cmpt_sz = qdma_desc_sz::QDMA_DESC_SZ_32B; - else if (cmd.q_conf.in.compl_sz == cmpt_desc_sz::CMPT_DESC_SZ_64B) - q_conf.cmpt_sz = qdma_desc_sz::QDMA_DESC_SZ_64B; - - q_conf.desc_bypass_en = cmd.q_conf.in.desc_bypass_en; - q_conf.pfch_bypass_en = cmd.q_conf.in.pfch_bypass_en; - q_conf.pfch_en = cmd.q_conf.in.pfch_en; - q_conf.cmpl_ovf_dis = cmd.q_conf.in.cmpl_ovf_dis; - q_conf.sw_desc_sz = cmd.q_conf.in.sw_desc_sz; - q_conf.en_mm_cmpl = cmd.q_conf.in.en_mm_cmpl; - - if (q_conf.is_st) - q_conf.proc_st_udd_cb = drv_st_process_udd_only_pkts; - else - q_conf.proc_st_udd_cb = nullptr; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_ADD : %u", cmd.q_conf.in.qid); - - status = qdma_dev->qdma_add_queue(cmd.q_conf.in.qid, q_conf); - WdfRequestComplete(request, status); - break; - } - case IOCTL_QDMA_QUEUE_START : - { - status = retrive_ioctl(request, - &cmd.q_conf.in, sizeof(cmd.q_conf.in)); - if (!NT_SUCCESS(status)) - goto Exit; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_START : %u", - cmd.q_conf.in.qid); - status = qdma_dev->qdma_start_queue(cmd.q_conf.in.qid); - WdfRequestComplete(request, status); - break; - } - case IOCTL_QDMA_QUEUE_STOP : - { - status = retrive_ioctl(request, - &cmd.q_conf.in, sizeof(cmd.q_conf.in)); - if (!NT_SUCCESS(status)) - goto Exit; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_STOP : %u", cmd.q_conf.in.qid); - status = qdma_dev->qdma_stop_queue(cmd.q_conf.in.qid); - WdfRequestComplete(request, status); - break; - } - case IOCTL_QDMA_QUEUE_DELETE : - { - status = retrive_ioctl(request, - &cmd.q_conf.in, sizeof(cmd.q_conf.in)); - if (!NT_SUCCESS(status)) - goto Exit; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_DELETE : %u", cmd.q_conf.in.qid); - status = qdma_dev->qdma_remove_queue(cmd.q_conf.in.qid); - WdfRequestComplete(request, status); - break; - } - case IOCTL_QDMA_QUEUE_DUMP_STATE : - { - status = retrive_ioctl(request, - &cmd.q_state.in, sizeof(cmd.q_state.in), - (PVOID *)&cmd.q_state.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - status = validate_ioctl_cmd(io_control_code, cmd); - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.q_state.out == nullptr) { - TraceError(TRACE_IO, "NULL Buffer for IOCTL_QDMA_QUEUE_DUMP_STATE"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_DUMP_STATE : %d", cmd.q_state.in.qid); - status = qdma_dev->qdma_get_queues_state(cmd.q_state.in.qid, &qstate, - cmd.q_state.out->state, sizeof(cmd.q_state.out->state)); - - if (!NT_SUCCESS(status)) - goto Exit; - - WdfRequestCompleteWithInformation(request, status, sizeof(queue_state_out)); - break; - } - case IOCTL_QDMA_QUEUE_READ_UDD : - { - status = retrive_ioctl(request, - &cmd.udd_info.in, sizeof(cmd.udd_info.in), - (PVOID *)&cmd.udd_info.out, output_buffer_length); - - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.udd_info.out == nullptr) { - TraceError(TRACE_IO, "NULL Buffer for IOCTL_QDMA_QUEUE_DUMP_STATE"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_READ_UDD : %d", cmd.udd_info.in.qid); - - status = qdma_dev->qdma_retrieve_last_st_udd_data(cmd.udd_info.in.qid, - &cmd.udd_info.out->buffer[0], (UINT32 *)&cmd.udd_info.out->length); - - if (!NT_SUCCESS(status)) - goto Exit; - - WdfRequestCompleteWithInformation(request, status, sizeof(cmpt_udd_info_out)); - - break; - } - case IOCTL_QDMA_QUEUE_DUMP_DESC : - { - status = retrive_ioctl(request, - &cmd.desc_info.in, sizeof(cmd.desc_info.in), - (PVOID *)&cmd.desc_info.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - status = validate_ioctl_cmd(io_control_code, cmd); - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.desc_info.out == nullptr) { - TraceError(TRACE_IO, "NULL Buffer for CMD_QUEUE_DUMP_DESC"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - qdma_desc_info desc_info; - - desc_info.qid = cmd.desc_info.in.qid; - desc_info.dir = (cmd.desc_info.in.dir == QUEUE_DIR_H2C) ? - qdma_queue_dir::QDMA_QUEUE_DIR_H2C : qdma_queue_dir::QDMA_QUEUE_DIR_C2H; - desc_info.desc_type = (cmd.desc_info.in.desc_type == RING_DESC) ? - qdma_desc_type::RING_DESCRIPTOR : qdma_desc_type::CMPT_DESCRIPTOR; - desc_info.desc_start = cmd.desc_info.in.desc_start; - desc_info.desc_end = cmd.desc_info.in.desc_end; - desc_info.buffer_sz = (UINT32)output_buffer_length - sizeof(struct desc_dump_info_out); - - desc_info.pbuffer = &cmd.desc_info.out->pbuffer[0]; - desc_info.desc_sz = 0; /* updated by qdma api desc_dump */ - desc_info.data_sz = 0; /* updated by qdma api desc_dump */ - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_DUMP_DESC : %d", desc_info.qid); - - status = qdma_dev->qdma_queue_desc_dump(&desc_info); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "qdma_dev->qdma_queue_desc_dump failed : Err : %X", status); - goto Exit; - } - - cmd.desc_info.out->desc_sz = desc_info.desc_sz; - cmd.desc_info.out->data_sz = desc_info.data_sz; - - WdfRequestCompleteWithInformation(request, status, - sizeof(desc_dump_info_out) + desc_info.data_sz); - - break; - } - case IOCTL_QDMA_QUEUE_DUMP_CTX : - { - status = retrive_ioctl(request, - &cmd.ctx_info.in, sizeof(cmd.ctx_info.in), - (PVOID *)&cmd.ctx_info.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - status = validate_ioctl_cmd(io_control_code, cmd); - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.ctx_info.out == nullptr) { - TraceError(TRACE_IO, "NULL Buffer for CMD_QUEUE_DUMP_CTX"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - qdma_ctx_info ctx_info; - - ctx_info.qid = cmd.ctx_info.in.qid; - - if (cmd.ctx_info.in.type == ring_type::RING_TYPE_H2C) - ctx_info.ring_type = qdma_q_type::QDMA_Q_TYPE_H2C; - else if (cmd.ctx_info.in.type == ring_type::RING_TYPE_C2H) - ctx_info.ring_type = qdma_q_type::QDMA_Q_TYPE_C2H; - else if (cmd.ctx_info.in.type == ring_type::RING_TYPE_CMPT) - ctx_info.ring_type = qdma_q_type::QDMA_Q_TYPE_CMPT; - - ctx_info.buffer_sz = output_buffer_length - sizeof(struct ctx_dump_info_out); - ctx_info.pbuffer = &cmd.ctx_info.out->pbuffer[0]; - ctx_info.ret_sz = 0; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_DUMP_CTX : %d", ctx_info.qid); - /* Read context data */ - status = qdma_dev->qdma_queue_dump_context(&ctx_info); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "qdma_dev->qdma_queue_dump_context failed, qid : %d : Err : %X", ctx_info.qid, status); - goto Exit; - } - - cmd.ctx_info.out->ret_sz = ctx_info.ret_sz; - - WdfRequestCompleteWithInformation(request, status, - sizeof(ctx_dump_info_out) + ctx_info.ret_sz); - break; - } - case IOCTL_QDMA_QUEUE_CMPT_READ : - { - status = retrive_ioctl(request, - &cmd.cmpt_info.in, sizeof(cmd.cmpt_info.in), - (PVOID *)&cmd.cmpt_info.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.cmpt_info.out == nullptr) { - TraceError(TRACE_IO, "NULL Buffer for CMD_QUEUE_CMPT_READ"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - qdma_cmpt_info cmpt_info; - - cmpt_info.qid = cmd.cmpt_info.in.qid; - cmpt_info.buffer_len = (UINT32)output_buffer_length - sizeof(struct cmpt_data_info_out); - - cmpt_info.pbuffer = &cmd.cmpt_info.out->pbuffer[0]; - cmpt_info.ret_len = 0; - cmpt_info.cmpt_desc_sz = 0; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_QUEUE_CMPT_READ : %d", cmpt_info.qid); - /* Read MM completion data */ - status = qdma_dev->qdma_read_mm_cmpt_data(&cmpt_info); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "qdma_dev->qdma_read_mm_cmpt_data failed : Err : %X", status); - goto Exit; - } - - cmd.cmpt_info.out->ret_len = cmpt_info.ret_len; - cmd.cmpt_info.out->cmpt_desc_sz = cmpt_info.cmpt_desc_sz; - - WdfRequestCompleteWithInformation(request, status, - sizeof(cmpt_data_info_out) + cmpt_info.ret_len); - break; - } - case IOCTL_QDMA_INTRING_DUMP : - { - status = retrive_ioctl(request, - &cmd.int_ring_info.in, sizeof(cmd.int_ring_info.in), - (PVOID *)&cmd.int_ring_info.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.int_ring_info.out == nullptr) { - TraceError(TRACE_IO, "NULL Buffer for IOCTL_QDMA_INTRING_DUMP"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - qdma_intr_ring_info intring_info; - intring_info.vec_id = cmd.int_ring_info.in.vec_id; - intring_info.start_idx = cmd.int_ring_info.in.start_idx; - intring_info.end_idx = cmd.int_ring_info.in.end_idx; - intring_info.buffer_len = output_buffer_length - sizeof(struct intring_info_out); - - intring_info.ret_len = 0; - intring_info.ring_entry_sz = 0; - intring_info.pbuffer = &cmd.int_ring_info.out->pbuffer[0]; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_INTRING_DUMP : %d", intring_info.vec_id); - status = qdma_dev->qdma_intring_dump(&intring_info); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "qdma_dev->qdma_intring_dump failed : Err : %X", status); - goto Exit; - } - - cmd.int_ring_info.out->ret_len = intring_info.ret_len; - cmd.int_ring_info.out->ring_entry_sz = intring_info.ring_entry_sz; - - WdfRequestCompleteWithInformation(request, status, - sizeof(intring_info_out) + intring_info.ret_len); - break; - } - case IOCTL_QDMA_REG_DUMP : - { - status = retrive_ioctl(request, nullptr, 0, - (PVOID *)&cmd.reg_dump_info.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.reg_dump_info.out == nullptr) { - TraceError(TRACE_IO, "NULL Buffer for CMD_REG_DUMP"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - qdma_reg_dump_info regdump_info; - - regdump_info.buffer_len = output_buffer_length - sizeof(struct regdump_info_out); - - regdump_info.ret_len = 0; - regdump_info.pbuffer = &cmd.reg_dump_info.out->pbuffer[0]; - - TraceVerbose(TRACE_IO, "IOCTL_QDMA_REG_DUMP"); - status = qdma_dev->qdma_regdump(®dump_info); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "qdma_dev->qdma_regdump failed : Err : %X", status); - goto Exit; - } - - cmd.reg_dump_info.out->ret_len = regdump_info.ret_len; - - WdfRequestCompleteWithInformation(request, status, - sizeof(regdump_info_out) + regdump_info.ret_len); - break; - } - case IOCTL_QDMA_QUEUE_NO_COPY : - { - TraceInfo(TRACE_IO, "No Copy Set for QID : %u", file_ctx->qid); - file_ctx->no_copy = true; - WdfRequestComplete(request, STATUS_SUCCESS); - break; - } - case IOCTL_QDMA_SET_QMAX: - { - status = retrive_ioctl(request, &cmd.qmax_info.in, sizeof(cmd.qmax_info.in)); - if (!NT_SUCCESS(status)) - goto Exit; - - status = qdma_dev->qdma_set_qmax(cmd.qmax_info.in.qmax); - WdfRequestComplete(request, status); - break; - } - case IOCTL_QDMA_GET_QSTATS : - { - status = retrive_ioctl(request, nullptr, 0, - (PVOID *)&cmd.qstats_info.out, sizeof(struct qstat_out)); - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.qstats_info.out == nullptr) { - TraceError(TRACE_IO, "nullptr Buffer for IOCTL_QDMA_GET_QSTATS"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - qdma_qstat_info qstats = { 0 }; - status = qdma_dev->qdma_get_qstats_info(qstats); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "qdma_dev->qdma_get_qstats_info() failed : Err : %X", status); - goto Exit; - } - - cmd.qstats_info.out->qbase = qstats.qbase; - cmd.qstats_info.out->qmax = qstats.qmax; - cmd.qstats_info.out->active_h2c_queues = qstats.active_h2c_queues; - cmd.qstats_info.out->active_c2h_queues = qstats.active_c2h_queues; - cmd.qstats_info.out->active_cmpt_queues = qstats.active_cmpt_queues; - WdfRequestCompleteWithInformation(request, status, sizeof(struct qstat_out)); - break; - } - case IOCTL_QDMA_REG_INFO: - { - status = retrive_ioctl(request, &cmd.reg_info.in, sizeof(cmd.reg_info.in), - (PVOID*)&cmd.reg_info.out, output_buffer_length); - if (!NT_SUCCESS(status)) - goto Exit; - - if (cmd.reg_info.out == nullptr) { - TraceError(TRACE_IO, "nullptr Buffer for IOCTL_QDMA_REG_INFO"); - status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - struct qdma_reg_info reg_info = { 0 }; - reg_info.bar_no = cmd.reg_info.in.bar_no; - reg_info.address = cmd.reg_info.in.address; - reg_info.reg_cnt = cmd.reg_info.in.reg_cnt; - reg_info.buf_len = output_buffer_length - sizeof(struct reg_info_out);; - reg_info.ret_len = 0; - reg_info.pbuffer = cmd.reg_info.out->pbuffer; - - status = qdma_dev->qdma_get_reg_info(®_info); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_IO, "qdma_dev->qdma_get_reg_info() failed : Err : %X", status); - goto Exit; - } - - cmd.reg_info.out->ret_len = reg_info.ret_len; - - WdfRequestCompleteWithInformation(request, status, - sizeof(reg_info_out) + reg_info.ret_len); - break; - } - default: - TraceInfo(TRACE_IO, "UNKNOWN IOCTL CALLED"); - WdfRequestComplete(request, STATUS_UNSUCCESSFUL); - break; - } - - return; - -Exit: - WdfRequestComplete(request, status); -} - -void qdma_evt_io_stop( - WDFQUEUE queue, - WDFREQUEST request, - ULONG action_flags) -{ - TraceInfo(TRACE_IO, "Queue 0x%p, Request 0x%p ActionFlags %d", queue, request, action_flags); - - return; -} - -void qdma_evt_io_read( - const WDFQUEUE io_queue, - const WDFREQUEST request, - size_t length) -{ - auto status = STATUS_SUCCESS; - - auto dev_ctx = get_device_context(WdfIoQueueGetDevice(io_queue)); - auto file_ctx = get_file_context(WdfRequestGetFileObject(request)); - NT_ASSERT(dev_ctx != nullptr); - NT_ASSERT(file_ctx != nullptr); - - /* For Non ST mode, return success for zero length reads */ - if ((file_ctx->target != file_target::ST_QUEUE) && (length == 0)) { - WdfRequestComplete(request, STATUS_SUCCESS); - return; - } - - switch (file_ctx->target) { - case file_target::USER: - TraceVerbose(TRACE_IO, "AXI Master Lite BAR reading %llu bytes", length); - io_read_bar(dev_ctx->qdma, qdma_bar_type::USER_BAR, request, length); - break; - case file_target::CONTROL: - TraceVerbose(TRACE_IO, "control BAR reading %llu bytes", length); - io_read_bar(dev_ctx->qdma, qdma_bar_type::CONFIG_BAR, request, length); - break; - case file_target::BYPASS: - TraceVerbose(TRACE_IO, "AXI Bridge Master BAR reading %llu bytes", length); - io_read_bar(dev_ctx->qdma, qdma_bar_type::BYPASS_BAR, request, length); - break; - case file_target::DMA_QUEUE: - TraceVerbose(TRACE_IO, "queue_%u reading %llu bytes", file_ctx->qid, length); - io_mm_dma(dev_ctx->qdma, file_ctx->qid, request, length, - WdfDmaDirectionReadFromDevice); - break; - case file_target::ST_QUEUE: - TraceVerbose(TRACE_IO, "queue_%u reading %llu bytes", file_ctx->qid, length); - io_st_read_dma(dev_ctx->qdma, file_ctx->qid, request, length); - break; - default: - TraceError(TRACE_IO, "Unknown file target!"); - status = STATUS_INVALID_PARAMETER; - } - - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - } -} - -void qdma_evt_io_write( - const WDFQUEUE io_queue, - const WDFREQUEST request, - size_t length) -{ - - auto status = STATUS_SUCCESS; - - auto dev_ctx = get_device_context(WdfIoQueueGetDevice(io_queue)); - auto file_ctx = get_file_context(WdfRequestGetFileObject(request)); - - NT_ASSERT(dev_ctx != nullptr); - NT_ASSERT(file_ctx != nullptr); - - /* For Non ST mode, return success for zero length writes */ - if ((file_ctx->target != file_target::ST_QUEUE) && (length == 0)) { - WdfRequestComplete(request, STATUS_SUCCESS); - return; - } - - switch (file_ctx->target) { - case file_target::USER: - TraceVerbose(TRACE_IO, "AXI Master Lite BAR writing %llu bytes", length); - io_write_bar(dev_ctx->qdma, qdma_bar_type::USER_BAR, request, length); - break; - case file_target::CONTROL: - TraceVerbose(TRACE_IO, "control BAR writing %llu bytes", length); - io_write_bar(dev_ctx->qdma, qdma_bar_type::CONFIG_BAR, request, length); - break; - case file_target::BYPASS: - TraceVerbose(TRACE_IO, "AXI Bridge Master BAR writing %llu bytes", length); - io_write_bar(dev_ctx->qdma, qdma_bar_type::BYPASS_BAR, request, length); - break; - case file_target::DMA_QUEUE: - TraceVerbose(TRACE_IO, "queue_%u writing %llu bytes", file_ctx->qid, length); - io_mm_dma(dev_ctx->qdma, file_ctx->qid, request, length, WdfDmaDirectionWriteToDevice); - break; - case file_target::ST_QUEUE: - TraceVerbose(TRACE_IO, "queue_%u writing %llu bytes", file_ctx->qid, length); - if (length == 0) { - io_st_zero_write_dma(dev_ctx->qdma, file_ctx->qid, request, length, WdfDmaDirectionWriteToDevice); - } - else { - io_st_write_dma(dev_ctx->qdma, file_ctx->qid, request, length, WdfDmaDirectionWriteToDevice); - } - break; - default: - TraceError(TRACE_IO, "Unknown file target!"); - status = STATUS_INVALID_PARAMETER; - } - - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - } -} - -void qdma_evt_device_file_create( - const WDFDEVICE wdf_device, - const WDFREQUEST request, - const WDFFILEOBJECT wdf_file) -{ - auto status = STATUS_SUCCESS; - - auto file_name = WdfFileObjectGetFileName(wdf_file); - auto dev_ctx = get_device_context(wdf_device); - - /* no filename given? */ - NT_ASSERT(file_name != nullptr); - if (file_name->Buffer == nullptr) { - TraceError(TRACE_DEVICE, "no device file name given!"); - status = STATUS_INVALID_PARAMETER; - goto ErrExit; - } - - auto ctx = get_file_context(wdf_file); - NT_ASSERT(ctx != nullptr); - - ctx->target = parse_file_name(file_name); - if (ctx->target == file_target::UNKNOWN) { - TraceError(TRACE_DEVICE, "device file %wZ is not supported!", file_name); - status = STATUS_INVALID_PARAMETER; - goto ErrExit; - } - else if (ctx->target == file_target::DMA_QUEUE) { - ctx->qid = extract_index_token(file_name); - status = dev_ctx->qdma->qdma_is_queue_in_range(ctx->qid); - if (STATUS_SUCCESS != status) { - goto ErrExit; - } - TraceVerbose(TRACE_DEVICE, "MM qid=%u", ctx->qid); - } - else if (ctx->target == file_target::ST_QUEUE) { - /* get the qid number */ - ctx->qid = extract_index_token(file_name); - ctx->no_copy = false; - status = dev_ctx->qdma->qdma_is_queue_in_range(ctx->qid); - if (STATUS_SUCCESS != status) { - goto ErrExit; - } - TraceVerbose(TRACE_DEVICE, "ST qid=%u", ctx->qid); - } - - if (false == dev_ctx->qdma->qdma_is_device_online()) { - TraceError(TRACE_DEVICE, "QDMA Device is offline."); - status = STATUS_DEVICE_OFF_LINE; - } - - TraceVerbose(TRACE_DEVICE, "Opening file %wZ", file_name); - -ErrExit: - WdfRequestComplete(request, status); -} - -void qdma_evt_device_file_close( - const WDFFILEOBJECT wdf_file) -{ - PUNICODE_STRING file_name = WdfFileObjectGetFileName(wdf_file); - TraceVerbose(TRACE_DEVICE, "Closing file %wZ", file_name); -} - -void qdma_evt_device_file_cleanup( - const WDFFILEOBJECT wdf_file) -{ - PUNICODE_STRING file_name = WdfFileObjectGetFileName(wdf_file); - TraceVerbose(TRACE_DEVICE, "Cleanup %wZ", file_name); -} diff --git a/QDMA/windows/sys/drv/source/io_queue.h b/QDMA/windows/sys/drv/source/io_queue.h deleted file mode 100644 index 49617e5..0000000 --- a/QDMA/windows/sys/drv/source/io_queue.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include "windows_common.h" -#include "qdma_exports.h" - -EXTERN_C_START - -using namespace xlnx; - -static constexpr ULONG IO_QUEUE_TAG = 'UQOI'; - -NTSTATUS qdma_io_queue_initialize(WDFDEVICE wdf_device); - -struct DMA_TXN_CONTEXT { - UINT16 qid; - size_t txn_len; -}; - -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DMA_TXN_CONTEXT, get_dma_txn_context) - - -struct ST_DMA_ZERO_TX_PRIV { - WDFREQUEST request; - PVOID sg_list; -}; - -EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL qdma_evt_ioctl; -EVT_WDF_IO_QUEUE_IO_STOP qdma_evt_io_stop; -EVT_WDF_IO_QUEUE_IO_READ qdma_evt_io_read; -EVT_WDF_IO_QUEUE_IO_WRITE qdma_evt_io_write; - -EVT_WDF_DEVICE_FILE_CREATE qdma_evt_device_file_create; -EVT_WDF_FILE_CLOSE qdma_evt_device_file_close; -EVT_WDF_FILE_CLEANUP qdma_evt_device_file_cleanup; - -EXTERN_C_END diff --git a/QDMA/windows/sys/drv/source/trace.h b/QDMA/windows/sys/drv/source/trace.h deleted file mode 100644 index f999760..0000000 --- a/QDMA/windows/sys/drv/source/trace.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#if defined(DBG) || defined(ENABLE_WPP) -#define ENABLE_WPP_TRACING -#endif - -/** - * Define the tracing flags. - * - * Tracing GUID - 0bed1f17-aa40-5163-c038-33715b81ae49 - * Trace Name : 'Xilinx-QDMA-Debug' - */ -#define WPP_CONTROL_GUIDS \ - WPP_DEFINE_CONTROL_GUID( \ - QDMATraceGuid, (0bed1f17, aa40, 5163, c038, 33715b81ae49), \ - \ - WPP_DEFINE_BIT(TRACE_PCIE) \ - WPP_DEFINE_BIT(TRACE_INTR) \ - WPP_DEFINE_BIT(TRACE_THREAD) \ - WPP_DEFINE_BIT(TRACE_QDMA) \ - WPP_DEFINE_BIT(TRACE_DBG) \ - WPP_DEFINE_BIT(TRACE_QDMA_ACCESS) \ - WPP_DEFINE_BIT(TRACE_DRIVER) \ - WPP_DEFINE_BIT(TRACE_DEVICE) \ - WPP_DEFINE_BIT(TRACE_IO) \ - ) - -/* WPP_LEVEL_FLAGS_LOGGER and WPP_LEVEL_FLAGS_ENABLED support trace functions - with LEVEL and FLAGS static parameters (in that order) prior to any dynamic - parameters (such as MSG) -*/ -#define WPP_LEVEL_FLAGS_LOGGER(level, flags) \ - WPP_LEVEL_LOGGER(flags) - -#define WPP_LEVEL_FLAGS_ENABLED(level, flags) \ - (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= level) - -/* Optimize WPP tracing call site conditional checks - - NOTE: This is only safe if we ensure no WPP tracing functions are called - before WPP_INIT_TRACING() or after WPP_CLEANUP(). -*/ -#define WPP_CHECK_INIT - - -// -// This comment block is scanned by the trace preprocessor to define our -// Trace functions. -// -// begin_wpp config -// FUNC TraceVerbose{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS, MSG, ...); -// FUNC TraceInfo{LEVEL=TRACE_LEVEL_INFORMATION}(FLAGS, MSG, ...); -// FUNC TraceWarning{LEVEL=TRACE_LEVEL_WARNING}(FLAGS, MSG, ...); -// FUNC TraceError{LEVEL=TRACE_LEVEL_ERROR}(FLAGS, MSG, ...); -// FUNC TraceEvents(LEVEL, FLAGS, MSG, ...); -// end_wpp -// - -/** WPP tracing is disabled by default in release configuration. - * so stub out definitions and functions - * - * To Enable WPP Tracing, Enable Run WPP Tracing in settings and - * define MACRO "ENABLE_WPP" - */ -#ifndef ENABLE_WPP_TRACING -#define WPP_INIT_TRACING(driver_object, registry_path) -#define WPP_CLEANUP(driver_object) -#define TraceVerbose(flags, ...) (__VA_ARGS__) -#define TraceInfo(flags, ...) (__VA_ARGS__) -#define TraceWarning(flags, ...) (__VA_ARGS__) -#define TraceError(flags, ...) (__VA_ARGS__) -#define TraceEvents(flags, ...) (__VA_ARGS__) -#endif diff --git a/QDMA/windows/sys/drv/source/windows_common.h b/QDMA/windows/sys/drv/source/windows_common.h deleted file mode 100644 index 834f007..0000000 --- a/QDMA/windows/sys/drv/source/windows_common.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#ifndef STRICT -#define STRICT -#endif - -#include <ntddk.h> -#include <wdf.h> -#include <ntintsafe.h> -#include <ntstrsafe.h> -#include <stdio.h> -#include <stddef.h> - diff --git a/QDMA/windows/sys/libqdma/include/qdma_exports.h b/QDMA/windows/sys/libqdma/include/qdma_exports.h deleted file mode 100644 index ab597a5..0000000 --- a/QDMA/windows/sys/libqdma/include/qdma_exports.h +++ /dev/null @@ -1,940 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include <pshpack8.h> - -/** - * @file - * @brief This file contains the declarations for libqdma interface structures - * - */ - -/* Xilinx namespace */ -namespace xlnx { - -class qdma_interface; -struct st_c2h_pkt_fragment; - -/** - * enum qdma_q_type: Q type - */ -enum qdma_q_type { - /** @QDMA_Q_TYPE_H2C: H2C Q */ - QDMA_Q_TYPE_H2C, - /** @QDMA_Q_TYPE_C2H: C2H Q */ - QDMA_Q_TYPE_C2H, - /** @QDMA_Q_TYPE_CMPT: CMPT Q */ - QDMA_Q_TYPE_CMPT, - /** @QDMA_Q_TYPE_MAX: Total Q types */ - QDMA_Q_TYPE_MAX -}; - -/** queue_state - State of the QDMA queue */ -enum queue_state { - /** Queue is available to configure */ - QUEUE_AVAILABLE, - /** Queue is added with resources */ - QUEUE_ADDED, - /** Queue is programmed and started */ - QUEUE_STARTED, - /** Queue critical operation is in progress */ - QUEUE_BUSY, - /** Invalid Queue State */ - QUEUE_INVALID_STATE -}; - -/** Streaming card to host packet type */ -enum class st_c2h_pkt_type { - /** C2H DATA Packet MACRO */ - ST_C2H_DATA_PKT, - /** C2H USER DEFINED DATA Packet MACRO */ - ST_C2H_UDD_ONLY_PKT, -}; - -/** qdma_queue_dir - QDMA Queue Direction */ -enum class qdma_queue_dir { - /** Queue H2C Direction */ - QDMA_QUEUE_DIR_H2C = 0, - /** Queue C2H Direction */ - QDMA_QUEUE_DIR_C2H -}; - -/** RING DESCRIPTOR TYPE */ -enum class qdma_desc_type { - /* Descriptor of type descriptor ring */ - RING_DESCRIPTOR = 0, - /* Descriptor of type completion ring */ - CMPT_DESCRIPTOR -}; - -/** DESCRIPTOR SIZE IN BYTES */ -enum class qdma_desc_sz { - /* Descriptor size of 8 bytes */ - QDMA_DESC_SZ_8B = 0, - /* Descriptor size of 16 bytes */ - QDMA_DESC_SZ_16B, - /* Descriptor size of 32 bytes */ - QDMA_DESC_SZ_32B, - /* Descriptor size of 64 bytes */ - QDMA_DESC_SZ_64B, - /* Descriptor size of invalid size */ - QDMA_DESC_SZ_MAX -}; - -/** Completion status trigger mode */ -enum class qdma_trig_mode { - /* Trigger disabled */ - QDMA_TRIG_MODE_DISABLE = 0, - /* Trigger on every update */ - QDMA_TRIG_MODE_EVERY, - /* Trigger on user count */ - QDMA_TRIG_MODE_USER_COUNT, - /* Trigger on user event */ - QDMA_TRIG_MODE_USER, - /* Trigger on user timer */ - QDMA_TRIG_MODE_USER_TIMER, - /* Trigger on user timer and count */ - QDMA_TRIG_MODE_USER_TIMER_COUNT, - /* Trigger invalid */ - QDMA_TRIG_MODE_MAX -}; - -/** queue_op_mode - QDMA Operation Mode */ -enum queue_op_mode { - /** Poll Mode */ - POLL_MODE = 0, - /** Direct Interrupt Mode */ - INTR_MODE, - /** Indirect Interrupt Mode(Aggregation) */ - INTR_COAL_MODE -}; - -/** qdma_bar_type - QDMA PCIe BAR Types */ -enum class qdma_bar_type { - /** QDMA Configuration BAR - * (Contains all QDMA configuration Registers) - */ - CONFIG_BAR, - /** QDMA AXI Master Lite BAR - * (Contains User Logic Registers) - */ - USER_BAR, - /** QDMA AXI Bridge Master BAR - * (Contains Bypass Registers to bypass QDMA) - */ - BYPASS_BAR -}; - -/** Specifies No of CSR Global Registers avalable */ -static constexpr size_t QDMA_GLBL_CSR_REG_CNT = 16; - -/** qdma_glbl_csr_conf - Provides the available CSR - * connfiguration registers - */ -struct qdma_glbl_csr_conf { - /** Ring Size CSR Registers */ - UINT32 ring_sz[QDMA_GLBL_CSR_REG_CNT]; - /** C2H Timer Count CSR Registers */ - UINT32 c2h_timer_cnt[QDMA_GLBL_CSR_REG_CNT]; - /** C2H Threshold CSR Registers */ - UINT32 c2h_th_cnt[QDMA_GLBL_CSR_REG_CNT]; - /** C2H Buffer size CSR Registers */ - UINT32 c2h_buff_sz[QDMA_GLBL_CSR_REG_CNT]; - /** Writeback interval timeout register */ - UINT32 wb_interval; -}; - -/** - * dma_completion_cb() - DMA Request completion callback function type - * - * @param[in] priv: Driver provided private member - * @param[in] status: DMA Request completion status - * - * @return void - */ -using dma_completion_cb = void(*)(void *priv, NTSTATUS status); - -/** - * st_rx_completion_cb() - Streaming C2H DMA Request completion callback function type - * - * @param[in] rx_frags: List of packet fragments - * @param[in] num_pkts: entries in rx_frags - * @param[in] priv: Driver provided private member - * @param[in] status: DMA Request completion status - * - * @return void - */ -using st_rx_completion_cb = void(*)(const st_c2h_pkt_fragment *rx_frags, size_t num_pkts, void *priv, NTSTATUS status); - -/** - * proc_st_udd_only_cb() - User defined data received callback function type - * - * @param[in] qid: Queue number - * @param[in] udd_addr: UDD pointer - * @param[in] priv: Driver provided private member - * - * @return void - */ -using proc_st_udd_only_cb = void(*)(UINT16 qid, void *udd_addr, void *priv); - -/** - * fp_user_isr_handler() - User defined user ISR handler - * - * @param[in] event_id: Event identifier - * @param[in] user_data: Driver provided user data - * - * @return void - */ -using fp_user_isr_handler = void(*)(ULONG event_id, void *user_data); - -/** - * fp_user_interrupt_enable_handler() - User defined user ISR handler - * - * @param[in] event_id: Event identifier - * @param[in] user_data: Driver provided user data - * - * @return void - */ -using fp_user_interrupt_enable_handler = void(*)(ULONG event_id, void *user_data); - -/** - * fp_user_interrupt_disable_handler() - User defined user ISR handler - * - * @param[in] event_id: Event identifier - * @param[in] user_data: Driver provided user data - * - * @return void - */ -using fp_user_interrupt_disable_handler = void(*)(ULONG event_id, void *user_data); - -/** dev_config - qdma device configuration - * needed to initialize the device - */ -struct qdma_drv_config { - /* Queue operation mode */ - queue_op_mode operation_mode; - - /* Config BAR index */ - UINT8 cfg_bar; - - /* Maximum queues for the device */ - UINT32 qsets_max; - - /* Maximum user MSIx vector to use */ - UINT16 user_msix_max; - - /* Maximum data MSIx vector to use */ - UINT16 data_msix_max; - - /* User data for user interrupt callback functions */ - void *user_data; - - /* User ISR handler */ - fp_user_isr_handler user_isr_handler; - - /* User interrupt enable handler */ - fp_user_interrupt_enable_handler user_interrupt_enable_handler; - - /* User interrupt disable handler */ - fp_user_interrupt_disable_handler user_interrupt_disable_handler; -}; - -/** queue_config - qdma queue configuration - * needed to add a queue - */ -struct queue_config { - /** queue is ST or MM */ - bool is_st; - /** H2C ring size index */ - UINT8 h2c_ring_sz_index; - /** C2H ring size index */ - UINT8 c2h_ring_sz_index; - /** C2H buffer size index */ - UINT8 c2h_buff_sz_index; - /** C2H threshold index */ - UINT8 c2h_th_cnt_index; - /** C2H timer count index */ - UINT8 c2h_timer_cnt_index; - /** completion ring size */ - qdma_desc_sz cmpt_sz; - /** trigger mode (valid for ST C2H) */ - qdma_trig_mode trig_mode; - /** Software descriptor size */ - UINT8 sw_desc_sz; - /** descriptor bypass enabled or not */ - bool desc_bypass_en; - /** prefetch enabled or not */ - bool pfch_en; - /** prefetch bypass enabled or not */ - bool pfch_bypass_en; - /** Completion overflow disabled or not */ - bool cmpl_ovf_dis; - /** MM completion enabled or not */ - bool en_mm_cmpl; - /** ST UDD data only call back function */ - proc_st_udd_only_cb proc_st_udd_cb; -}; - -/** st_c2h_pkt_fragment - C2H Packet Details */ -struct st_c2h_pkt_fragment { - /** C2H Data Fragment Address */ - void *data = nullptr; - /** User Defined Data Address */ - void *udd_data = nullptr; - /** Length of the C2H data Fragment */ - size_t length = 0; - /** Indicates Start of packet */ - UINT32 sop : 1; - /** Indicates End of packet */ - UINT32 eop : 1; - /** Indicates Packet Type (ST_C2H_DATA_PKT or ST_C2H_UDD_ONLY_PKT) */ - st_c2h_pkt_type pkt_type : 1; - /** Reserved Field */ - UINT32 reserved : 29; -}; - -/** qdma_device_attributes_info - Device Attributes/Features */ -struct qdma_device_attributes_info { - /** No of Physical functions supported */ - UINT8 num_pfs; - /** No of queues supported */ - UINT16 num_qs; - /** Function Level Reset Status */ - bool flr_present; - /** Streaming Feature enabled */ - bool st_en; - /** Memory Mapped Feature enabled */ - bool mm_en; - /** MM Completion Feature enabled */ - bool mm_cmpl_en; - /** Mailbox Feature enabled */ - bool mailbox_en; - /** Debug mode is enabled/disabled for IP */ - bool debug_mode; - /** Descriptor Engine mode: - * Internal only/Bypass only/Internal & Bypass - */ - UINT8 desc_eng_mode; - /** Number of MM channels supported */ - UINT16 num_mm_channels; -}; - -#define DEVICE_VERSION_INFO_STR_LENGTH 32 -/** qdma_version_info - QDMA HW and SW version information */ -struct qdma_version_info { - /** Version string */ - char qdma_rtl_version_str[DEVICE_VERSION_INFO_STR_LENGTH]; - /** Release string */ - char qdma_vivado_release_id_str[DEVICE_VERSION_INFO_STR_LENGTH]; - /** Qdma device type string*/ - char qdma_device_type_str[DEVICE_VERSION_INFO_STR_LENGTH]; - /** Versal IP state string*/ - char qdma_versal_ip_type_str[DEVICE_VERSION_INFO_STR_LENGTH]; - /** QDMA SW Version string*/ - char qdma_sw_version_str[DEVICE_VERSION_INFO_STR_LENGTH]; -}; - -/** qdma_desc_info - Structure contains required members to - * retrieve descriptor information - * - * The QDMA queue descriptor information will be copied into - * <b><em>pbuffer</em></b> for the requested <b><em>qid</em></b>, - * <b><em>dir</em></b>, <b><em>desc_type</em></b> from - * <b><em>desc_start</em></b> to <b><em>desc_end</em></b> into - * <b><em>pbuffer</em></b>. - * - * Caller must allocate memory for <b><em>pbuffer</em></b> and - * the size must be specified in <b><em>buff_sz</em></b> - * - * The driver specifies the actual length of data copied - * into <b><em>pbuffer</em></b> in <b><em>data_sz</em></b> field - * along with descriptor size in <b><em>desc_sz</em></b>. - * - */ -struct qdma_desc_info { - /** QID */ - UINT16 qid; - /** Q Direction (H2C, C2H) */ - qdma_queue_dir dir; - /** Descriptor Type (Ring Descriptor, Completion Descriptor) */ - qdma_desc_type desc_type; - /** Descriptor Start Index */ - UINT32 desc_start; - /** Descriptor End Index */ - UINT32 desc_end; - /** Data Buffer available size */ - size_t buffer_sz; - /** Data Buffer */ - UINT8 *pbuffer; - /** Size of the descriptor */ - size_t desc_sz; - /** Size of the data returned */ - size_t data_sz; -}; - -/** qdma_cmpt_info - Structure contains required members to - * retrieve completion ring information - * - * The QDMA MM completion ring data will be copied into - * <b><em>pbuffer</em></b> for the requested <b><em>qid</em></b> - * - * Caller must allocate memory for <b><em>pbuffer</em></b> and - * the size must be specified in <b><em>buf_len</em></b> - * - * The driver specifies the actual length of data copied - * into <b><em>pbuffer</em></b> in <b><em>ret_len</em></b> field - * along with completion descriptor size in <b><em>cmpt_desc_sz</em></b>. - * - */ -struct qdma_cmpt_info { - /** QID */ - UINT16 qid; - /** Data Buffer available size */ - size_t buffer_len; - /** Returned Data size */ - size_t ret_len; - /** Completion Descriptor size */ - size_t cmpt_desc_sz; - /** Buffer to hold Completion Descriptors */ - UINT8 *pbuffer; -}; - -/** qdma_ctx_info - Structure contains required members to - * retrieve QDMA queue context information - * - * The queue context information will be copied into - * <b><em>pbuffer</em></b> for the requested <b><em>qid</em></b> - * in the requested <b><em>dir</em></b> - * - * Caller must allocate memory for <b><em>pbuffer</em></b> and - * the size must be specified in <b><em>buff_sz</em></b> - * - * The driver specifies the actual length of data copied - * into <b><em>pbuffer</em></b> in <b><em>ret_sz</em></b> field. - */ -struct qdma_ctx_info { - /** QID */ - UINT16 qid; - /** Ring Type (H2C, C2H, CMPT) */ - enum qdma_q_type ring_type; - /** Data Buffer available size */ - size_t buffer_sz; - /** Returned Data size */ - size_t ret_sz; - /** Buffer to hold context information */ - char *pbuffer; -}; - -/** qdma_intr_ring_info - Structure contains required members to - * retrieve Interrupt ring information. - * - * The interrupt ring information will be copied into - * <b><em>pbuffer</em></b> from <b><em>start_idx</em></b> to - * <b><em>end_idx</em></b> for the requested <b><em>vec_id</em></b> - * - * Caller must allocate memory for <b><em>pbuffer</em></b> and - * the size must be specified in <b><em>buf_len</em></b> - * - * The driver specifies the actual length of data copied - * into <b><em>pbuffer</em></b> in <b><em>ret_len</em></b> field. - * - * The driver specifies the size of the ring entry in <b><em>ring_entry_sz</em></b> - */ -struct qdma_intr_ring_info { - /** Interrupt Vector ID */ - UINT32 vec_id; - /** Interrupt ring start index */ - UINT32 start_idx; - /** Interrupt ring end index */ - UINT32 end_idx; - /** Data Buffer available size */ - size_t buffer_len; - /** Returned Data size */ - size_t ret_len; - /** Size of the interrupt ring entry */ - size_t ring_entry_sz; - /** Buffer to hold interrupt ring information */ - unsigned char *pbuffer; -}; - -/** qdma_reg_dump_info - Structure contains required members to - * retrieve register dump information - * - * All the QDMA registers and its contents will be copied into - * <b><em>pbuffer</em></b> - * - * Caller must allocate memory for <b><em>pbuffer</em></b> and - * the size must be specified in <b><em>buf_len</em></b> - * - * The driver specifies the actual length of data copied - * into <b><em>pbuffer</em></b> in <b><em>ret_len</em></b> field. - */ -struct qdma_reg_dump_info { - /** Data Buffer available size */ - size_t buffer_len; - /** Returned Data size */ - size_t ret_len; - /** Buffer to hold regsiter dump information */ - char *pbuffer; -}; - -/** qdma_queue_stats - Structure contains required members to - * retrieve queue stats information - * - * All the queue statistics for this function is copied. - */ -struct qdma_qstat_info { - /** Queue base for this device */ - UINT32 qbase; - /** Maximum allocated queues for this device */ - UINT32 qmax; - /** Active host to card queues for this device */ - UINT32 active_h2c_queues; - /** Active card to host queues for this device */ - UINT32 active_c2h_queues; - /** Active completion queues for this device */ - UINT32 active_cmpt_queues; -}; - -/** qdma_reg_info - Structure contains required members to - * retrieve requested qdma registers information - */ -struct qdma_reg_info { - /** PCIe bar number */ - UINT32 bar_no; - /** Register address offset */ - UINT32 address; - /** number of registers to retrieve */ - UINT32 reg_cnt; - /** Length of the buffer pointed by pbuffer */ - size_t buf_len; - /** Length of the data present in pbuffer */ - size_t ret_len; - /** output buffer to copy the register info */ - char *pbuffer; -}; - -/** - * qdma_interface - libqdma interface class - * - * This class defines the interfaces that can be used while using - * the libqdma library. - */ -class qdma_interface { -public: - /** Handle to WDF DMA Enabler object to enable and start DMA operations */ - WDFDMAENABLER dma_enabler = nullptr; - - /*****************************************************************************/ - /** - * init() - Initializes the qdma device with operation mode and - * config bar number to use - * - * @param[in] conf: Device operation configuration - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS init(qdma_drv_config conf) = 0; - - /*****************************************************************************/ - /** - * open() - Prepares the qdma_device with all necessary information - * like allocating memory for resources, BAR mappings, - * Initializes the hardware structure, Initializes queues etc., - * - * @param[in] device: WDF Device - * @param[in] resources: Handle to WDF Framework raw - * HW resources list - * @param[in] resources_translated: Handle to WDF Framework translated - * HW resources list - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS open(WDFDEVICE device, WDFCMRESLIST resources, WDFCMRESLIST resources_translated) = 0; - - /*****************************************************************************/ - /** - * close() - Closes the QDMA device by freeing memory for resources, - * unmapping BARs, De-initializes the hardware structure, - * De-initializes queues etc., - * - * @return void - *****************************************************************************/ - virtual void close(void) = 0; - - /*****************************************************************************/ - /** - * qdma_is_device_online() - Checks if qdma device is ready for operations. - * - * @return true when device is online state. - * false when device is offline state. - *****************************************************************************/ - virtual bool qdma_is_device_online(void) = 0; - - /*****************************************************************************/ - /** - * read_bar() - Performs PCIe read operation on specified BAR number at - * requested offset of requested size - * - * @param[in] bar_type: BAR Type - * @param[in] offset: address offset to read the data from - * @param[out] data: data buffer to store the read data - * @param[in] size: size of the requested read operation(in bytes) - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS read_bar(qdma_bar_type bar_type, size_t offset, void* data, size_t size) = 0; - - /*****************************************************************************/ - /** - * write_bar() - Performs PCIe write operation on specified BAR number at - * requested offset of requested size - * - * @param[in] bar_type: BAR Type - * @param[in] offset: address offset to write the data to - * @param[in] data: data buffer contains the data bytes to write - * @param[in] size: size of the requested write operation(in bytes) - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS write_bar(qdma_bar_type bar_type, size_t offset, void* data, size_t size) = 0; - - /*****************************************************************************/ - /** - * write_bar() - Performs PCIe write operation on specified BAR number at - * requested offset of requested size - * - * @param[in] bar_type: BAR Type - * @param[out] bar_base: BAR base mapped address - * @param[out] bar_lenght: Bar length(in bytes) - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS get_bar_info(qdma_bar_type bar_type, PVOID &bar_base, size_t &bar_length) = 0; - - /*****************************************************************************/ - /** - * qdma_get_queues_state() - Retrieves the state of the specified queue - * - * @param[in] qid: queue id relative to this QDMA device - * @param[out] qstate: state of the queue specified as enumeration - * @param[out] state: state of the queue specified as character string - * @param[in] sz: size of the state character array - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_get_queues_state(UINT16 qid, enum queue_state *qstate, char *state, size_t sz) = 0; - - /*****************************************************************************/ - /** - * qdma_add_queue() - Configures the specified queue addition process with - * provided configuration - * - * @param[in] qid: queue id relative to this QDMA device - * @param[in] conf: configuration parameters for qid - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_add_queue(UINT16 qid, queue_config& conf) = 0; - - /*****************************************************************************/ - /** - * qdma_start_queue() - Starts the configured queue(qid) and the queue will be - * in operational state - * - * @param[in] qid: queue id relative to this QDMA device - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_start_queue(UINT16 qid) = 0; - - /*****************************************************************************/ - /** - * qdma_stop_queue() - Stops the queue(qid) and the queue will be - * in non operational state - * - * @param[in] qid: queue id relative to this QDMA device - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_stop_queue(UINT16 qid) = 0; - - /*****************************************************************************/ - /** - * qdma_remove_queue() - Removes the queue(qid) configuration and - * puts in available state for re-use - * - * @param[in] qid: queue id relative to this QDMA device - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_remove_queue(UINT16 qid) = 0; - - /*****************************************************************************/ - /** - * qdma_is_queue_in_range() - Validate qid of a queue for this device - * - * @param[in] qid: queue id relative to this QDMA device - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_is_queue_in_range(UINT16 qid) = 0; - - /*****************************************************************************/ - /** - * qdma_enqueue_mm_request() - enqueues an MM request into specified queue - * - * @param[in] qid: queue id relative to this QDMA device - * @param[in] direction: DMA direction (read or write) - * @param[in] sg_list: scatter-gather list of data buffers - * @param[in] device_offset: Device address to write/from read - * @param[in] compl_cb: completion call back function - * @param[in] priv: private data that gets passed to - * compl_cb function - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_enqueue_mm_request(UINT16 qid, WDF_DMA_DIRECTION direction, PSCATTER_GATHER_LIST sg_list, LONGLONG device_offset, dma_completion_cb compl_cb, VOID *priv) = 0; - - /*****************************************************************************/ - /** - * qdma_enqueue_st_tx_request() - enqueues an ST write request into specified queue - * - * @param[in] qid: queue id relative to this QDMA device - * @param[in] sg_list: scatter-gather list of data buffers - * @param[in,out] compl_cb: completion call back function - * to indicate write operation is completed - * @param[in,out] priv: private data that gets passed to - * compl_cb function - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_enqueue_st_tx_request(UINT16 qid, PSCATTER_GATHER_LIST sg_list, dma_completion_cb compl_cb, VOID *priv) = 0; - - /*****************************************************************************/ - /** - * qdma_enqueue_st_rx_request() - enqueues an ST read request into specified queue - * - * @param[in] qid: queue id relative to this QDMA device - * @param[in] length: desired data length to be received - * @param[in,out] compl_cb: completion call back function - * once data is available - * @param[in,out] priv: private data that gets passed to - * compl_cb function - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_enqueue_st_rx_request(UINT16 qid, size_t length, st_rx_completion_cb compl_cb, VOID *priv) = 0; - - /*****************************************************************************/ - /** - * qdma_retrieve_st_udd_data() - Retrieves the User Defined Data(side band data) - * from ST C2H descriptors - * - * @param[in] qid: queue id relative to this QDMA device - * @param[in] addr: UDD address in descriptor - * @param[out] buf: buffer to store user defined data - * @param[out] len: specifies the length of UDD in bytes - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_retrieve_st_udd_data(UINT16 qid, void *addr, UINT8 *buf, UINT32 *len) = 0; - - /*****************************************************************************/ - /** - * qdma_retrieve_last_st_udd_data() - Retrieves the User Defined Data - * (side band data) from ST C2H descriptors - * that can be consumed in driver - * - * @param[in] qid: queue id relative to this QDMA device - * @param[out] buf: buffer to store user defined data - * @param[out] len: specifies the length of UDD in bytes - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_retrieve_last_st_udd_data(UINT16 qid, UINT8 *buf, UINT32 *len) = 0; - - /*****************************************************************************/ - /** - * qdma_queue_desc_dump() - Retrieves the descriptors data into desc_info - * - * @param[in,out] desc_info: pointer to qdma_desc_info - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_queue_desc_dump(qdma_desc_info *desc_info) = 0; - - /*****************************************************************************/ - /** - * qdma_read_mm_cmpt_data() - Retrieves the User Defined Data(side band data) - * from MM write back ring (if HW support available) - * - * @param[in,out] cmpt_info: user defined data(completion) information - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_read_mm_cmpt_data(qdma_cmpt_info *cmpt_info) = 0; - - /*****************************************************************************/ - /** - * qdma_queue_dump_context() - Dumps the queue context information of given - * direction - * - * @param[in,out] ctx_info: context information structure - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_queue_dump_context(qdma_ctx_info *ctx_info) = 0; - - /*****************************************************************************/ - /** - * qdma_intring_dump() - Dumps the interrupt ring context information of given - * vector ID from start index to end index - * - * @param[in,out] intring_info: interrupt ring context information - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_intring_dump(qdma_intr_ring_info *intring_info) = 0; - - /*****************************************************************************/ - /** - * qdma_regdump() - Dumps all the QDMA registers to given buffer - * - * @param[in,out] regdump_info: Register dump information - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_regdump(qdma_reg_dump_info *regdump_info) = 0; - - /*****************************************************************************/ - /** - * qdma_read_csr_conf() - Retrieves the CSR registers information - * - * @param[out] conf: CSR registers information - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_read_csr_conf(qdma_glbl_csr_conf *conf) = 0; - - /*****************************************************************************/ - /** - * qdma_get_dev_capabilities_info() - Retrieves the HW device features info - * - * @param[out] dev_attr: HW device attributes - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_get_dev_capabilities_info(qdma_device_attributes_info &dev_attr) = 0; - - /*****************************************************************************/ - /** - * qdma_device_version_info() - Retrieves the QDMA HW and SW versions - * in character array format - * - * @param[out] version_info: HW & SW versions information in character - * array format - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_device_version_info(qdma_version_info &version_info) = 0; - - /*****************************************************************************/ - /** - * qdma_set_qmax() - Set maximum queues number for this QDMA function. - * - * @param[in] qmax: Maximum number of queues for this function. - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_set_qmax(UINT32 qmax) = 0; - - /*****************************************************************************/ - /** - * qdma_get_qstats_info() - Retrieves the QDMA statistics for queue resources - * - * @param[out] qstats: Total queues for function with occupied H2C, C2H and - * CMPT queues count. - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_get_qstats_info(qdma_qstat_info &qstats) = 0; - - /*****************************************************************************/ - /** - * qdma_get_reg_info() - Retrieves the requested QDMA registers information - * - * @param[out] reg_info: Register information (Address, Len, etc.,) - * - * @return STATUS_SUCCESS for success else error - *****************************************************************************/ - virtual NTSTATUS qdma_get_reg_info(qdma_reg_info* reg_info) = 0; - - /*****************************************************************************/ - /** - * create_qdma_device() - Allocates an instance for qdma device - * - * @return Address of qdma_interface class or NULL in case of error - *****************************************************************************/ - static qdma_interface* create_qdma_device(void); - - /*****************************************************************************/ - /** - * remove_qdma_device() - frees the allocated instance for qdma_device - * - * @param[in] qdma_dev: address of the qdma_device instance - * - * @return void - *****************************************************************************/ - static void remove_qdma_device(qdma_interface *qdma_dev); - - /// @cond - /*****************************************************************************/ - /** - * new - Overloaded new operator to allocate the memory - * - * @param[in] num_bytes: number of bytes of memory to allocate - * - * @return void * - *****************************************************************************/ - _IRQL_requires_max_(PASSIVE_LEVEL) - void *operator new(_In_ size_t num_bytes); - - /*****************************************************************************/ - /** - * delete - Overloaded delete operator to free the memory - * - * @param[in] addr: address of the memory - * - * @return void - *****************************************************************************/ - _IRQL_requires_max_(PASSIVE_LEVEL) - void operator delete(_In_ void *addr); - - /*****************************************************************************/ - /** - * ~qdma_interface() - destructor - * - * @return void - *****************************************************************************/ - virtual ~qdma_interface() {} - /// @endcond -}; - -} -#include <poppack.h> diff --git a/QDMA/windows/sys/libqdma/include/xversion.hpp b/QDMA/windows/sys/libqdma/include/xversion.hpp deleted file mode 100644 index 86f8f8a..0000000 --- a/QDMA/windows/sys/libqdma/include/xversion.hpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -/** Product Version (common.ver resources compatible) ***********************/ - -#undef VER_PRODUCTMAJORVERSION -#define VER_PRODUCTMAJORVERSION (2020) -#undef VER_PRODUCTMINORVERSION -#define VER_PRODUCTMINORVERSION (2) -#undef VER_PRODUCTREVISION -#define VER_PRODUCTREVISION (0) -#undef VER_PRODUCTBUILD -#define VER_PRODUCTBUILD (0) - -/** Company Details *********************************************************/ - -#undef VER_COMPANYNAME_STR -#define VER_COMPANYNAME_STR "Xilinx, Inc." - -/** Copyright Details *******************************************************/ - -#undef VER_LEGALCOPYRIGHT_YEARS -#define VER_LEGALCOPYRIGHT_YEARS "2019-2020" -#undef VER_LEGALCOPYRIGHT_STR_WITH_YEARS -#define VER_LEGALCOPYRIGHT_STR_WITH_YEARS \ - "Copyright 2019-2020 Xilinx, Inc." -#undef VER_LEGALCOPYRIGHT_STR -#if defined(RC_INVOKED) -#define VER_LEGALCOPYRIGHT_STR \ - "\251 Copyright Xilinx, Inc. All rights reserved." -#else -#define VER_LEGALCOPYRIGHT_STR \ - "(c) Copyright Xilinx, Inc. All rights reserved." -#endif - -/** Product Details *********************************************************/ - -#undef VER_PRODUCTNAME_STR -#define VER_PRODUCTNAME_STR \ - "Xilinx PCIe Multi-Queue-DMA Reference Driver" - -// Version number (in format needed for version resources) -#undef VER_PRODUCTVERSION -#define VER_PRODUCTVERSION 2020,2,0,0 - -// Version number string -#undef VER_PRODUCTVERSION_STR -#define VER_PRODUCTVERSION_STR "2020.2.0.0" - -/** File Details ************************************************************/ - -// Default file version to be the same as product version -#define VER_FILEVERSION VER_PRODUCTVERSION -#define VER_FILEVERSION_STR VER_PRODUCTVERSION_STR - -// Default to language-independent software -#define VER_LANGNEUTRAL - -// Don't append a build machine tag to the file version string -#undef __BUILDMACHINE__ diff --git a/QDMA/windows/sys/libqdma/libqdma.vcxproj b/QDMA/windows/sys/libqdma/libqdma.vcxproj deleted file mode 100644 index f059ff2..0000000 --- a/QDMA/windows/sys/libqdma/libqdma.vcxproj +++ /dev/null @@ -1,229 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{359143E6-933A-49CC-806C-C5376E1809A4}</ProjectGuid> - <TemplateGuid>{497e31cb-056b-4f31-abb8-447fd55ee5a5}</TemplateGuid> - <TargetFrameworkVersion> - </TargetFrameworkVersion> - <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> - <Configuration>Debug</Configuration> - <Platform Condition="'$(Platform)' == ''">Win32</Platform> - <RootNamespace>MDMA</RootNamespace> - <ProjectName>libqdma</ProjectName> - <WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> - <ConfigurationType>Driver</ConfigurationType> - <DriverType>KMDF</DriverType> - <DriverTargetPlatform>Desktop</DriverTargetPlatform> - <SupportsPackaging>true</SupportsPackaging> - <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> - <ConfigurationType>Driver</ConfigurationType> - <DriverType>KMDF</DriverType> - <DriverTargetPlatform>Desktop</DriverTargetPlatform> - <SupportsPackaging>true</SupportsPackaging> - <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> - <ConfigurationType>StaticLibrary</ConfigurationType> - <DriverType>KMDF</DriverType> - <DriverTargetPlatform>Desktop</DriverTargetPlatform> - <SupportsPackaging>true</SupportsPackaging> - <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <TargetVersion>Windows10</TargetVersion> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> - <ConfigurationType>StaticLibrary</ConfigurationType> - <DriverType>KMDF</DriverType> - <DriverTargetPlatform>Desktop</DriverTargetPlatform> - <SupportsPackaging>true</SupportsPackaging> - <ALLOW_DATE_TIME>1</ALLOW_DATE_TIME> - <SpectreMitigation>false</SpectreMitigation> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\sys\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <TargetName>QDMA</TargetName> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\sys\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <TargetName>QDMA</TargetName> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\libqdma\</OutDir> - <TargetName>QDMA</TargetName> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <TargetExt>.lib</TargetExt> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> - <OutDir>$(SolutionDir)build\$(Platform)\$(ConfigurationName)\libqdma\</OutDir> - <IntDir>$(SolutionDir).tmp\$(Platform)\$(ConfigurationName)\$(ProjectName)\</IntDir> - <TargetName>QDMA</TargetName> - <TargetExt>.lib</TargetExt> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <WppEnabled>true</WppEnabled> - <WppRecorderEnabled>false</WppRecorderEnabled> - <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">include\trace.h</WppScanConfigurationData> - <WppKernelMode>true</WppKernelMode> - <CompileAs>CompileAsCpp</CompileAs> - <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> - <AdditionalIncludeDirectories>$(ProjectDir)\..\libqdma\include;$(ProjectDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <WppModuleName>qdma</WppModuleName> - <LanguageStandard>stdcpp17</LanguageStandard> - <SupportJustMyCode>false</SupportJustMyCode> - </ClCompile> - <Inf /> - <ResourceCompile /> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <WppEnabled>false</WppEnabled> - <WppRecorderEnabled>false</WppRecorderEnabled> - <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">include\trace.h</WppScanConfigurationData> - <WppKernelMode>true</WppKernelMode> - <CompileAs>CompileAsCpp</CompileAs> - <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> - <AdditionalIncludeDirectories>$(ProjectDir)\..\libqdma\include;$(ProjectDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <WppModuleName>qdma</WppModuleName> - <LanguageStandard>stdcpp17</LanguageStandard> - </ClCompile> - <Inf /> - <Inf /> - <Inf /> - <Inf /> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <WppEnabled>true</WppEnabled> - <WppRecorderEnabled>false</WppRecorderEnabled> - <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">source\trace.h</WppScanConfigurationData> - <WppKernelMode>true</WppKernelMode> - <CompileAs>CompileAsCpp</CompileAs> - <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> - <AdditionalIncludeDirectories>$(ProjectDir)\include\;$(ProjectDir)\source\;$(ProjectDir)\source\qdma_access\;$(ProjectDir)\source\qdma_access\eqdma_soft_access;$(ProjectDir)\source\qdma_access\qdma_soft_access;$(ProjectDir)\source\qdma_access\qdma_s80_hard_access;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <WppModuleName>qdma</WppModuleName> - <LanguageStandard>stdcpp17</LanguageStandard> - <SupportJustMyCode>false</SupportJustMyCode> - <AdditionalOptions>$(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions> - </ClCompile> - <Inf /> - <ResourceCompile /> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <WppEnabled>false</WppEnabled> - <WppRecorderEnabled>false</WppRecorderEnabled> - <WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">source\trace.h</WppScanConfigurationData> - <WppKernelMode>true</WppKernelMode> - <CompileAs>CompileAsCpp</CompileAs> - <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> - <AdditionalIncludeDirectories>$(ProjectDir)\include\;$(ProjectDir)\source\;$(ProjectDir)\source\qdma_access\;$(ProjectDir)\source\qdma_access\eqdma_soft_access;$(ProjectDir)\source\qdma_access\qdma_soft_access;$(ProjectDir)\source\qdma_access\qdma_s80_hard_access;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <WppModuleName>qdma</WppModuleName> - <LanguageStandard>stdcpp17</LanguageStandard> - <AdditionalOptions>$(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions> - </ClCompile> - <Inf /> - <Inf /> - <Inf /> - <Inf /> - </ItemDefinitionGroup> - <ItemGroup> - <FilesToPackage Include="$(TargetPath)" /> - </ItemGroup> - <ItemGroup> - <ClInclude Include="include\qdma_exports.h" /> - <ClInclude Include="include\xversion.hpp" /> - <ClInclude Include="source\interrupts.hpp" /> - <ClInclude Include="source\qdma.h" /> - <ClInclude Include="source\qdma_access\eqdma_soft_access\eqdma_soft_access.h" /> - <ClInclude Include="source\qdma_access\eqdma_soft_access\eqdma_soft_reg.h" /> - <ClInclude Include="source\qdma_access\qdma_access_common.h" /> - <ClInclude Include="source\qdma_access\qdma_access_errors.h" /> - <ClInclude Include="source\qdma_access\qdma_access_export.h" /> - <ClInclude Include="source\qdma_access\qdma_access_version.h" /> - <ClInclude Include="source\qdma_access\qdma_list.h" /> - <ClInclude Include="source\qdma_access\qdma_platform.h" /> - <ClInclude Include="source\qdma_access\qdma_reg_dump.h" /> - <ClInclude Include="source\qdma_access\qdma_resource_mgmt.h" /> - <ClInclude Include="source\qdma_access\qdma_s80_hard_access\qdma_s80_hard_access.h" /> - <ClInclude Include="source\qdma_access\qdma_s80_hard_access\qdma_s80_hard_reg.h" /> - <ClInclude Include="source\qdma_access\qdma_soft_access\qdma_soft_access.h" /> - <ClInclude Include="source\qdma_access\qdma_soft_access\qdma_soft_reg.h" /> - <ClInclude Include="source\qdma_config.h" /> - <ClInclude Include="source\qdma_license.h" /> - <ClInclude Include="source\qdma_platform_env.h" /> - <ClInclude Include="source\qdma_reg_ext.h" /> - <ClInclude Include="source\thread.h" /> - <ClInclude Include="source\trace.h" /> - <ClInclude Include="source\xpcie.hpp" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="source\interrupts.cpp" /> - <ClCompile Include="source\qdma.cpp" /> - <ClCompile Include="source\qdma_access\eqdma_soft_access\eqdma_soft_access.c" /> - <ClCompile Include="source\qdma_access\eqdma_soft_access\eqdma_soft_reg_dump.c" /> - <ClCompile Include="source\qdma_access\qdma_access_common.c" /> - <ClCompile Include="source\qdma_access\qdma_list.c" /> - <ClCompile Include="source\qdma_access\qdma_resource_mgmt.c" /> - <ClCompile Include="source\qdma_access\qdma_s80_hard_access\qdma_s80_hard_access.c" /> - <ClCompile Include="source\qdma_access\qdma_s80_hard_access\qdma_s80_hard_reg_dump.c" /> - <ClCompile Include="source\qdma_access\qdma_soft_access\qdma_soft_access.c" /> - <ClCompile Include="source\qdma_platform.cpp" /> - <ClCompile Include="source\thread.cpp" /> - <ClCompile Include="source\xpcie.cpp" /> - </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/sys/libqdma/libqdma.vcxproj.filters b/QDMA/windows/sys/libqdma/libqdma.vcxproj.filters deleted file mode 100644 index ac01025..0000000 --- a/QDMA/windows/sys/libqdma/libqdma.vcxproj.filters +++ /dev/null @@ -1,129 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup> - <Filter Include="Header Files"> - <UniqueIdentifier>{e1da9a0a-858f-49d8-bf70-e04880baf8b3}</UniqueIdentifier> - </Filter> - <Filter Include="Source Files"> - <UniqueIdentifier>{6c2a1f5c-8444-46b2-95e9-8c53ee5ab032}</UniqueIdentifier> - </Filter> - </ItemGroup> - <ItemGroup> - <ClInclude Include="include\qdma_exports.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="include\xversion.hpp"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\interrupts.hpp"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_config.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_license.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_platform_env.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_reg_ext.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\thread.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\trace.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\xpcie.hpp"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_access_common.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_access_errors.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_access_export.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_access_version.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_list.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_platform.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_reg_dump.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_resource_mgmt.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\eqdma_soft_access\eqdma_soft_access.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\eqdma_soft_access\eqdma_soft_reg.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_s80_hard_access\qdma_s80_hard_access.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_s80_hard_access\qdma_s80_hard_reg.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_soft_access\qdma_soft_access.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="source\qdma_access\qdma_soft_access\qdma_soft_reg.h"> - <Filter>Header Files</Filter> - </ClInclude> - </ItemGroup> - <ItemGroup> - <ClCompile Include="source\qdma_access\qdma_soft_access\qdma_soft_access.c"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma_access\qdma_s80_hard_access\qdma_s80_hard_access.c"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma_access\eqdma_soft_access\eqdma_soft_access.c"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma_access\qdma_access_common.c"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma_access\qdma_list.c"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma_access\qdma_resource_mgmt.c"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\interrupts.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma_platform.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\thread.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\xpcie.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma_access\eqdma_soft_access\eqdma_soft_reg_dump.c"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="source\qdma_access\qdma_s80_hard_access\qdma_s80_hard_reg_dump.c"> - <Filter>Source Files</Filter> - </ClCompile> - </ItemGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/sys/libqdma/libqdma.vcxproj.user b/QDMA/windows/sys/libqdma/libqdma.vcxproj.user deleted file mode 100644 index a667f8f..0000000 --- a/QDMA/windows/sys/libqdma/libqdma.vcxproj.user +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <RemoveDriver>False</RemoveDriver> - <InstallMode>None</InstallMode> - <HardwareIdString /> - <CommandLine /> - <ScriptPath>C:\Program Files (x86)\Windows Kits\10\Testing\Tests\Utilities\DefaultDriverPackageInstallationTask.dll</ScriptPath> - <DbgengRemoteMachineName>XIRIPDSLAB20</DbgengRemoteMachineName> - <DbgengKernelMachineName>XIRIPDSLAB20</DbgengKernelMachineName> - <DeployFiles /> - <ScriptName>Microsoft.DriverKit.DefaultDriverPackageInstallationClass.PerformDefaultDriverPackageInstallation</ScriptName> - <ScriptDeviceQuery /> - <EnableVerifier>True</EnableVerifier> - <AllDrivers>False</AllDrivers> - <VerifyProjectOutput>True</VerifyProjectOutput> - <VerifyDrivers /> - <VerifyFlags>133563</VerifyFlags> - <FrameWorkInteraction>FvOn</FrameWorkInteraction> - <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> - <TestCertificate> - </TestCertificate> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <TestCertificate> - </TestCertificate> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <TestCertificate> - </TestCertificate> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <TestCertificate> - </TestCertificate> - </PropertyGroup> -</Project> \ No newline at end of file diff --git a/QDMA/windows/sys/libqdma/source/interrupts.cpp b/QDMA/windows/sys/libqdma/source/interrupts.cpp deleted file mode 100644 index 581c8c4..0000000 --- a/QDMA/windows/sys/libqdma/source/interrupts.cpp +++ /dev/null @@ -1,947 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "qdma.h" -#include "interrupts.hpp" -#include "trace.h" - -#ifdef ENABLE_WPP_TRACING -#include "interrupts.tmh" -#endif - -using namespace xlnx; - -/* ------- Interrupt Queue ------- */ -NTSTATUS intr_queue::create( - WDFDMAENABLER& dma_enabler) -{ - auto buffer_size = size * sizeof(intr_entry); - - /* Align to page size */ - if (buffer_size % PAGE_SIZE) { - buffer_size = ((buffer_size / PAGE_SIZE) + 1) * PAGE_SIZE; - } - - TraceVerbose(TRACE_INTR, "%s: Intr Queue : %d, Buffer size : %llu, Ring size : %llu", - qdma->dev_conf.name, idx_abs, buffer_size, size); - - capacity = buffer_size / sizeof(intr_entry); - npages = buffer_size / PAGE_SIZE; - color = 1; - - TraceVerbose(TRACE_INTR, "Intr Queue : %d, Page size : %llu, Capacity : %llu", - idx_abs, npages, capacity); - - auto status = WdfCommonBufferCreate(dma_enabler, - buffer_size, - WDF_NO_OBJECT_ATTRIBUTES, - &buffer); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: Interrupt WdfCommonBufferCreate failed for " - "intr queue : %d, : %!STATUS!", qdma->dev_conf.name, idx_abs, status); - return status; - } - - buffer_va = static_cast<void*>(WdfCommonBufferGetAlignedVirtualAddress(buffer)); - - clear_contents(); - - return status; -} - -void intr_queue::clear_contents(void) -{ - auto buffer_size = size * sizeof(intr_entry); - RtlZeroMemory(buffer_va, buffer_size); - sw_index = 0; - intr_cidx_info.rng_idx = 0; - intr_cidx_info.sw_cidx = 0; -} - -void intr_queue::advance_sw_index(void) -{ - ++sw_index; - - if (sw_index == capacity) { - sw_index = 0; - /* Flip the color */ - color = color ? 0 : 1; - } -} - -PFORCEINLINE void intr_queue::update_csr_cidx( - queue_pair *q, - UINT32 new_cidx) -{ - TraceVerbose(TRACE_INTR, "%s: Intr queue_%u updating c2h pidx to %u", qdma->dev_conf.name, idx, new_cidx); - intr_cidx_info.rng_idx = (UINT8)idx_abs; - intr_cidx_info.sw_cidx = (UINT16)new_cidx; - - qdma->hw.qdma_queue_intr_cidx_update(qdma, false /* is_vf */, q->idx, &intr_cidx_info); -} - -NTSTATUS intr_queue::intring_dump(qdma_intr_ring_info *intring_info) -{ - size_t len; - size_t buf_idx; - size_t ring_entry_sz; - UINT8 *ring_buff_addr; - UINT8 *buf = intring_info->pbuffer; - size_t buf_len = intring_info->buffer_len; - - if ((intring_info->start_idx >= size) || - (intring_info->end_idx >= size)) { - TraceError(TRACE_INTR, "%s: Intr Ring index Range is incorrect : start : %d, end : %d, RING SIZE : %d", - qdma->dev_conf.name, intring_info->start_idx, intring_info->end_idx, size); - return STATUS_ACCESS_VIOLATION; - } - - ring_entry_sz = sizeof(intr_entry); - intring_info->ring_entry_sz = ring_entry_sz; - if (intring_info->start_idx <= intring_info->end_idx) { - len = ((size_t)intring_info->end_idx - (size_t)intring_info->start_idx + 1) * ring_entry_sz; - len = min(len, buf_len); - buf_idx = intring_info->start_idx * ring_entry_sz; - ring_buff_addr = &((UINT8 *)buffer_va)[buf_idx]; - RtlCopyMemory(buf, ring_buff_addr, len); - intring_info->ret_len = len; - } - else { - len = (size - intring_info->start_idx) * ring_entry_sz; - len = min(len, buf_len); - buf_idx = intring_info->start_idx * ring_entry_sz; - ring_buff_addr = &((UINT8 *)buffer_va)[buf_idx]; - RtlCopyMemory(buf, ring_buff_addr, len); - intring_info->ret_len = len; - - size_t remain_len = ((size_t)intring_info->end_idx + 1) * ring_entry_sz; - len = min(remain_len, (buf_len - len)); - ring_buff_addr = &((UINT8 *)buffer_va)[0]; - RtlCopyMemory(&buf[intring_info->ret_len], ring_buff_addr, len); - intring_info->ret_len += len; - } - - return STATUS_SUCCESS; -} - -/* --------------*/ - -inline static size_t get_msix_mask_offset( - UINT32 vector) -{ - return (qdma_trq_cmc_msix_table + (((size_t)vector + 1) * qdma_msix_vectors_mask_step)); -}; - -void qdma_device::mask_msi_entry( - UINT32 vector) -{ - /* MSIx mask value - * [bit 0 ] - 0 : Unmask, 1 : Mask - * [bit 1-31] - Reserved - */ - UINT32 mask_val = 1u; - qdma_conf_reg_write(get_msix_mask_offset(vector), mask_val); -} - -void qdma_device::unmask_msi_entry( - UINT32 vector) -{ - /* MSIx mask value - * [bit 0 ] - 0 : Unmask, 1 : Mask - * [bit 1-31] - Reserved - */ - UINT32 mask_val = 0u; - qdma_conf_reg_write(get_msix_mask_offset(vector), mask_val); -} - -BOOLEAN EvtErrorInterruptIsr( - WDFINTERRUPT interrupt, - ULONG MessageID) -{ - UNREFERENCED_PARAMETER(interrupt); - UNREFERENCED_PARAMETER(MessageID); - - return WdfInterruptQueueDpcForIsr(interrupt); -} - -VOID EvtErrorInterruptDpc( - WDFINTERRUPT interrupt, - WDFOBJECT device) -{ - UNREFERENCED_PARAMETER(device); - UNREFERENCED_PARAMETER(interrupt); - - TraceError(TRACE_INTR, "Error IRQ Fired on Master PF"); - - auto irq_ctx = get_qdma_irq_context(interrupt); - if (nullptr == irq_ctx) { - TraceError(TRACE_INTR, "Err: null irq_ctx in EvtErrorInterruptDpc"); - return; - } - - auto qdma_dev = irq_ctx->qdma_dev; - qdma_dev->hw.qdma_hw_error_process(qdma_dev); - qdma_dev->hw.qdma_hw_error_intr_rearm(qdma_dev); - - return; -} - -NTSTATUS EvtUserInterruptEnable( - WDFINTERRUPT interrupt, - WDFDEVICE device) -{ - UNREFERENCED_PARAMETER(device); - auto irq_ctx = get_qdma_irq_context(interrupt); - if (irq_ctx->qdma_dev->drv_conf.user_interrupt_enable_handler) { - irq_ctx->qdma_dev->drv_conf.user_interrupt_enable_handler(irq_ctx->vector_id, - irq_ctx->qdma_dev->drv_conf.user_data); - } - - TraceVerbose(TRACE_INTR, "%s: --> %s", irq_ctx->qdma_dev->dev_conf.name, __func__); - return STATUS_SUCCESS; -} - -NTSTATUS EvtUserInterruptDisable( - WDFINTERRUPT interrupt, - WDFDEVICE device) -{ - UNREFERENCED_PARAMETER(device); - auto irq_ctx = get_qdma_irq_context(interrupt); - if (irq_ctx->qdma_dev->drv_conf.user_interrupt_disable_handler) { - irq_ctx->qdma_dev->drv_conf.user_interrupt_disable_handler(irq_ctx->vector_id, - irq_ctx->qdma_dev->drv_conf.user_data); - } - - TraceVerbose(TRACE_INTR, "%s: %s <--", irq_ctx->qdma_dev->dev_conf.name, __func__); - return STATUS_SUCCESS; -} - -BOOLEAN EvtUserInterruptIsr( - WDFINTERRUPT interrupt, - ULONG MessageID) -{ - UNREFERENCED_PARAMETER(interrupt); - UNREFERENCED_PARAMETER(MessageID); - - TraceVerbose(TRACE_INTR, "User Interrupt ISR CALLED %lu SUCCESSFull", MessageID); - - return WdfInterruptQueueDpcForIsr(interrupt); -} - -VOID EvtUserInterruptDpc( - WDFINTERRUPT interrupt, - WDFOBJECT device) -{ - UNREFERENCED_PARAMETER(device); - auto irq_ctx = get_qdma_irq_context(interrupt); - - TraceVerbose(TRACE_INTR, "%s: User Interrupt DPC for vector : %u", irq_ctx->qdma_dev->dev_conf.name, irq_ctx->vector_id); - - if (irq_ctx->qdma_dev->drv_conf.user_isr_handler) { - irq_ctx->qdma_dev->drv_conf.user_isr_handler(irq_ctx->vector_id, - irq_ctx->qdma_dev->drv_conf.user_data); - } - - return; -} - -BOOLEAN EvtDataInterruptIsr( - WDFINTERRUPT interrupt, - ULONG MessageID) -{ - UNREFERENCED_PARAMETER(MessageID); - auto irq_ctx = get_qdma_irq_context(interrupt); - auto qdma_dev = irq_ctx->qdma_dev; - - if ((irq_ctx->intr_type == interrupt_type::LEGACY) && - (qdma_dev->hw.qdma_legacy_intr_conf != nullptr)) { - TraceVerbose(TRACE_INTR, "LEGACY INTERRUPT RECEIVED"); - auto ret = qdma_dev->hw.qdma_is_legacy_intr_pend(qdma_dev); - if (ret < 0) { - /* No interrupt pending, Hence returning from ISR */ - return false; - } - - qdma_dev->hw.qdma_clear_pend_legacy_intr(qdma_dev); - } - - irq_ctx->interrupt_handler(irq_ctx); - - if ((irq_ctx->intr_type == interrupt_type::LEGACY) && - (qdma_dev->hw.qdma_legacy_intr_conf != nullptr)) { - qdma_dev->hw.qdma_legacy_intr_conf(qdma_dev, ENABLE); - TraceVerbose(TRACE_INTR, "LEGACY INTERRUPT RE-ENABLED"); - } - - return true; -} - -BOOLEAN schedule_dpc(queue_pair* q, UINT8 is_c2h, CCHAR active_processors) -{ - BOOLEAN status = FALSE; - poll_operation_entry* poll_entry = nullptr; - PRKDPC dpc = nullptr; - PVOID arg1 = nullptr; - - poll_entry = (is_c2h) ? q->c2h_q.poll_entry : q->h2c_q.poll_entry; - if (poll_entry) { - dpc = &poll_entry->thread->dpc; - arg1 = poll_entry->thread; - - KeSetTargetProcessorDpc(dpc, (CCHAR)(q->idx % active_processors)); - status = KeInsertQueueDpc(dpc, arg1, NULL); - } - - return status; -} - -void cpm_handle_indirect_interrupt( - PQDMA_IRQ_CONTEXT irq_ctx) -{ - queue_pair *q = nullptr; - UINT8 is_c2h = 0; - CCHAR active_processors = (CCHAR)KeQueryActiveProcessorCount(NULL); - - auto intr_queue = irq_ctx->intr_q; - if (nullptr == intr_queue) { - TraceError(TRACE_INTR, "%s: Invalid vector %lu was called in coal mode", - irq_ctx->qdma_dev->dev_conf.name, irq_ctx->vector_id); - return; - } - - const auto ring_va = static_cast<cpm_intr_entry *>(intr_queue->buffer_va); - - TraceVerbose(TRACE_INTR, "%s: CPM Coal queue SW Index : %u", - irq_ctx->qdma_dev->dev_conf.name, intr_queue->sw_index); - TraceVerbose(TRACE_INTR, "%s: CPM Intr PIDX : %u, Intr CIDX : %u", - irq_ctx->qdma_dev->dev_conf.name, ring_va[intr_queue->sw_index].desc_pidx, - ring_va[intr_queue->sw_index].desc_cidx); - - while (ring_va[intr_queue->sw_index].color == intr_queue->color) { - q = irq_ctx->qdma_dev->qdma_get_queue_pair_by_hwid(ring_va[intr_queue->sw_index].qid); - if (nullptr == q) { - TraceError(TRACE_INTR, "%s: Queue not found hw qid : %u Intr qid : %u", - irq_ctx->qdma_dev->dev_conf.name, - ring_va[intr_queue->sw_index].qid, - intr_queue->idx); - intr_queue->advance_sw_index(); - continue; - } - - is_c2h = ring_va[intr_queue->sw_index].intr_type; - - schedule_dpc(q, is_c2h, active_processors); - - intr_queue->advance_sw_index(); - - TraceVerbose(TRACE_INTR, "%s: CPM QUEUE ID : %u, is_c2h : %d", - irq_ctx->qdma_dev->dev_conf.name, - ring_va[intr_queue->sw_index].qid, is_c2h); - } - - if (q) { - intr_queue->update_csr_cidx(q, intr_queue->sw_index); - } -} - -void handle_indirect_interrupt( - PQDMA_IRQ_CONTEXT irq_ctx) -{ - queue_pair *q = nullptr; - UINT8 is_c2h = 0; - CCHAR active_processors = (CCHAR)KeQueryActiveProcessorCount(NULL); - - auto intr_queue = irq_ctx->intr_q; - if (nullptr == intr_queue) { - TraceError(TRACE_INTR, "%s: Invalid vector %lu was called in coal mode", - irq_ctx->qdma_dev->dev_conf.name, irq_ctx->vector_id); - return; - } - - const auto ring_va = static_cast<intr_entry *>(intr_queue->buffer_va); - - TraceVerbose(TRACE_INTR, "%s: Coal queue SW Index : %u", - irq_ctx->qdma_dev->dev_conf.name, intr_queue->sw_index); - TraceVerbose(TRACE_INTR, "%s: Intr PIDX : %u, Intr CIDX : %u", - irq_ctx->qdma_dev->dev_conf.name, - ring_va[intr_queue->sw_index].desc_pidx, - ring_va[intr_queue->sw_index].desc_cidx); - - while (ring_va[intr_queue->sw_index].color == intr_queue->color) { - q = irq_ctx->qdma_dev->qdma_get_queue_pair_by_hwid(ring_va[intr_queue->sw_index].qid); - if (nullptr == q) { - TraceError(TRACE_INTR, "%s: Queue not found hw qid : %u Intr qid : %u", - irq_ctx->qdma_dev->dev_conf.name, - ring_va[intr_queue->sw_index].qid, intr_queue->idx); - intr_queue->advance_sw_index(); - continue; - } - - is_c2h = ring_va[intr_queue->sw_index].intr_type; - - schedule_dpc(q, is_c2h, active_processors); - - intr_queue->advance_sw_index(); - - TraceVerbose(TRACE_INTR, "%s: QUEUE ID : %u, is_c2h : %d", - irq_ctx->qdma_dev->dev_conf.name, ring_va[intr_queue->sw_index].qid, is_c2h); - } - - if (q) { - intr_queue->update_csr_cidx(q, intr_queue->sw_index); - } -} - -void handle_direct_interrupt( - PQDMA_IRQ_CONTEXT irq_ctx) -{ - CCHAR active_processors = (CCHAR)KeQueryActiveProcessorCount(NULL); - PLIST_ENTRY entry; - PLIST_ENTRY temp; - - LIST_FOR_EACH_ENTRY_SAFE(&irq_ctx->queue_list_head, temp, entry) { - queue_pair *queue = CONTAINING_RECORD(entry, queue_pair, list_entry); - - TraceVerbose(TRACE_INTR, "%s: SERVICING QUEUE : %u IN DIRECT INTERRUPT", - irq_ctx->qdma_dev->dev_conf.name, queue->idx); - schedule_dpc(queue, 0 /* H2C */, active_processors); - schedule_dpc(queue, 1 /* C2H */, active_processors); - - } -} - -int qdma_device::setup_legacy_vector(queue_pair& q) -{ - int ret = 0; - int status = 0; - int legacy_vec = 0; - - WdfInterruptAcquireLock(irq_mgr.irq[legacy_vec]); - - auto irq_ctx = get_qdma_irq_context(irq_mgr.irq[legacy_vec]); - if (false == IS_LIST_EMPTY(&irq_ctx->queue_list_head)) { - TraceError(TRACE_INTR, "%s: Only One queue is supported " - "in legacy interrupt mode", dev_conf.name); - status = -(STATUS_UNSUCCESSFUL); - goto ErrExit; - } - - if (hw.qdma_legacy_intr_conf == nullptr) { - TraceError(TRACE_INTR, "%s: legacy interrupt mode " - "not supported", dev_conf.name); - status = -(STATUS_UNSUCCESSFUL); - goto ErrExit; - } - - ret = hw.qdma_legacy_intr_conf(this, DISABLE); - if (ret < 0) { - TraceError(TRACE_INTR, "%s: qdma_disable_legacy_interrupt " - "failed, ret : %d", dev_conf.name, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - - LIST_ADD_TAIL(&irq_ctx->queue_list_head, &q.list_entry); - - ret = hw.qdma_legacy_intr_conf(this, ENABLE); - if (ret < 0) { - TraceError(TRACE_INTR, "%s: qdma_enable_legacy_interrupt " - "failed, ret : %d", dev_conf.name, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - - TraceVerbose(TRACE_INTR, "%s: Vector Allocated [0] for legacy interrupt mode", - dev_conf.name); - - WdfInterruptReleaseLock(irq_mgr.irq[legacy_vec]); - - return legacy_vec; - -ErrExit: - WdfInterruptReleaseLock(irq_mgr.irq[legacy_vec]); - return status; -} - -/* Allocate MSIx Vector position */ -UINT32 qdma_device::alloc_msix_vector_position(queue_pair& q) -{ - UINT32 weight; - UINT32 vector; - - WdfSpinLockAcquire(irq_mgr.lock); - - vector = irq_mgr.data_vector_id_start; - weight = irq_mgr.irq_weight[vector]; - - for (UINT32 i = irq_mgr.data_vector_id_start + 1; i <= irq_mgr.data_vector_id_end; ++i) { - if (irq_mgr.irq_weight[i] < weight) { - weight = irq_mgr.irq_weight[i]; - vector = i; - } - } - - ++irq_mgr.irq_weight[vector]; - - WdfSpinLockRelease(irq_mgr.lock); - - if (drv_conf.operation_mode == queue_op_mode::INTR_MODE) { - WdfInterruptAcquireLock(irq_mgr.irq[vector]); - - auto irq_ctx = get_qdma_irq_context(irq_mgr.irq[vector]); - LIST_ADD_TAIL(&irq_ctx->queue_list_head, &queue_pairs[q.idx].list_entry); - - WdfInterruptReleaseLock(irq_mgr.irq[vector]); - } - else if (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) { - /* For indirect interrupt, return absolute interrupt queue index */ - auto irq_ctx = get_qdma_irq_context(irq_mgr.irq[vector]); - vector = irq_ctx->intr_q->idx_abs; - } - - TraceVerbose(TRACE_INTR, "%s: Vector Allocated [%u]. Weight : %u", - dev_conf.name, vector, irq_mgr.irq_weight[vector]); - - return vector; -} - -/* Free MSIX vector position */ -void qdma_device::free_msix_vector_position( - queue_pair& q, - UINT32 vector) -{ - auto RELATIVE_INTR_QID = [](auto q) { return q % (UINT32)qdma_max_msix_vectors_per_pf; }; - if (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) - vector = RELATIVE_INTR_QID(vector); - else if (drv_conf.operation_mode == queue_op_mode::INTR_MODE) { - WdfInterruptAcquireLock(irq_mgr.irq[vector]); - auto irq_ctx = get_qdma_irq_context(irq_mgr.irq[vector]); - PLIST_ENTRY entry; - LIST_FOR_EACH_ENTRY(&irq_ctx->queue_list_head, entry) { - queue_pair *queue = CONTAINING_RECORD(entry, queue_pair, list_entry); - if (queue->idx == q.idx) { - LIST_DEL_NODE(entry); - break; - } - } - WdfInterruptReleaseLock(irq_mgr.irq[vector]); - } - - WdfSpinLockAcquire(irq_mgr.lock); - - --irq_mgr.irq_weight[vector]; - - TraceVerbose(TRACE_INTR, "%s: Vector Released. New weight : %u", - dev_conf.name, irq_mgr.irq_weight[vector]); - WdfSpinLockRelease(irq_mgr.lock); -} - -int qdma_device::assign_interrupt_vector(queue_pair& q) -{ - UINT32 vec; - - if (irq_mgr.intr_type == interrupt_type::MSIX) - vec = alloc_msix_vector_position(q); - else { - vec = setup_legacy_vector(q); - } - return vec; -} - -void qdma_device::free_interrupt_vector(queue_pair& q, UINT32 vec_id) -{ - if (irq_mgr.intr_type == interrupt_type::MSIX) - free_msix_vector_position(q, vec_id); - else - clear_legacy_vector(q, vec_id); -} - -/* Clear legacy vector and disable interrupts */ -void qdma_device::clear_legacy_vector( - queue_pair& q, - UINT32 vector) -{ - UNREFERENCED_PARAMETER(q); - - WdfInterruptAcquireLock(irq_mgr.irq[vector]); - - auto irq_ctx = get_qdma_irq_context(irq_mgr.irq[vector]); - auto queue_item = irq_ctx->queue_list_head; - - if (hw.qdma_legacy_intr_conf != nullptr) { - hw.qdma_legacy_intr_conf(this, DISABLE); - } - - INIT_LIST_HEAD(&irq_ctx->queue_list_head); - WdfInterruptReleaseLock(irq_mgr.irq[vector]); -} - -NTSTATUS qdma_device::configure_irq( - PQDMA_IRQ_CONTEXT irq_context, - ULONG vec) -{ - irq_context->vector_id = vec; - irq_context->qdma_dev = this; - - if ((vec >= irq_mgr.data_vector_id_start) && (vec <= irq_mgr.data_vector_id_end)) { - /* Data interrupts */ - irq_mgr.irq_weight[vec] = 0u; - - if (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) { /* Indirect interrupt */ - irq_context->intr_q = &irq_mgr.intr_q[vec]; - irq_mgr.intr_q[vec].vector = vec; - irq_context->is_coal = true; - if (hw_version_info.ip_type == QDMA_VERSAL_HARD_IP) { - irq_context->interrupt_handler = &cpm_handle_indirect_interrupt; - } - else { - irq_context->interrupt_handler = &handle_indirect_interrupt; - } - } - else { /* Direct interrupt */ - INIT_LIST_HEAD(&irq_context->queue_list_head); - - irq_context->is_coal = false; - irq_context->interrupt_handler = &handle_direct_interrupt; - } - irq_context->intr_type = irq_mgr.intr_type; - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::arrange_msix_vector_types(void) -{ - ULONG vector = 0; - ULONG req_vec; - ULONG num_msix_vectors = pcie.get_num_msix_vectors(); - - if (num_msix_vectors == 0ul) { - TraceError(TRACE_INTR, "%s: Not enough MSIx vectors : [%u]", - dev_conf.name, num_msix_vectors); - return STATUS_UNSUCCESSFUL; - } - - /** Reserve one vector for Error Interrupt which reports out - * the QDMA internal HW errors to the user - * - * Master PF will own this option and hence other PFs dont need - * to reserve vector for error interrupt - */ - if (dev_conf.is_master_pf) { /* Master PF */ - TraceInfo(TRACE_INTR, "%s: Setting Error Interrupt by Master PF", - dev_conf.name); - irq_mgr.err_vector_id = vector; - ++vector; - /** Error interrupt consumes 1 vector from data interrupt vectors */ - drv_conf.data_msix_max = drv_conf.data_msix_max - 1; - } - - req_vec = vector + drv_conf.data_msix_max + drv_conf.user_msix_max; - - if (num_msix_vectors < req_vec) { - TraceError(TRACE_INTR, "%s: Not enough MSIx vectors : [%u]. Requested : [%u]\n", - dev_conf.name, num_msix_vectors, req_vec); - return STATUS_UNSUCCESSFUL; - } - - irq_mgr.user_vector_id_start = vector; - irq_mgr.user_vector_id_end = vector + drv_conf.user_msix_max - 1 ; - vector += drv_conf.user_msix_max; - - irq_mgr.data_vector_id_start = vector; - - if (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) - irq_mgr.data_vector_id_end = irq_mgr.data_vector_id_start + IND_INTR_MAX_DATA_VECTORS - 1; - else - irq_mgr.data_vector_id_end = vector + drv_conf.data_msix_max - 1; - - TraceVerbose(TRACE_INTR, "%s: Function: %0X, Err vec : %lu, User vec : [%u : %u] Data vec : [%u : %u]", - dev_conf.name, dev_conf.dev_sbdf.sbdf.fun_no, irq_mgr.err_vector_id, - irq_mgr.user_vector_id_start, irq_mgr.user_vector_id_end, - irq_mgr.data_vector_id_start, irq_mgr.data_vector_id_end); - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::setup_msix_interrupt( - WDFCMRESLIST resources, - const WDFCMRESLIST resources_translated) -{ - NTSTATUS status; - - /* Setup interrupts */ - PCM_PARTIAL_RESOURCE_DESCRIPTOR resource; - PCM_PARTIAL_RESOURCE_DESCRIPTOR resource_translated; - - ULONG numResources = WdfCmResourceListGetCount(resources_translated); - TraceVerbose(TRACE_INTR, "%s: Total number of resource : %lu", - dev_conf.name, numResources); - - status = arrange_msix_vector_types(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: Failed to arrange MSIx vectors", dev_conf.name); - return status; - } - - for (UINT i = 0, vec = 0; i < numResources && vec < pcie.get_num_msix_vectors(); i++) { - - resource = WdfCmResourceListGetDescriptor(resources, i); - resource_translated = WdfCmResourceListGetDescriptor(resources_translated, i); - if (resource_translated->Type != CmResourceTypeInterrupt) { - continue; - } - - WDF_INTERRUPT_CONFIG config; - - if ((irq_mgr.err_vector_id == vec) && (dev_conf.is_master_pf)) { - WDF_INTERRUPT_CONFIG_INIT(&config, EvtErrorInterruptIsr, EvtErrorInterruptDpc); - config.EvtInterruptEnable = nullptr; - config.EvtInterruptDisable = nullptr; - TraceVerbose(TRACE_INTR, "%s: [%u] - Error interrupt configuration", - dev_conf.name, vec); - } - else if ((vec >= irq_mgr.user_vector_id_start) && (vec <= irq_mgr.user_vector_id_end)) { - WDF_INTERRUPT_CONFIG_INIT(&config, EvtUserInterruptIsr, EvtUserInterruptDpc); - config.EvtInterruptEnable = EvtUserInterruptEnable; - config.EvtInterruptDisable = EvtUserInterruptDisable; - TraceVerbose(TRACE_INTR, "%s: [%u] - User interrupt configuration", - dev_conf.name, vec); - } - else if ((vec >= irq_mgr.data_vector_id_start) && (vec <= irq_mgr.data_vector_id_end)) { /* Data interrupts */ - WDF_INTERRUPT_CONFIG_INIT(&config, EvtDataInterruptIsr, nullptr); - config.EvtInterruptEnable = nullptr; - config.EvtInterruptDisable = nullptr; - TraceVerbose(TRACE_INTR, "%s: [%u] - Data interrupt configuration", dev_conf.name, vec); - } - else { - TraceVerbose(TRACE_INTR, "%s: [%u] - No configuration", dev_conf.name, vec); - continue; - } - - config.InterruptRaw = resource; - config.InterruptTranslated = resource_translated; - config.AutomaticSerialization = TRUE; - - WDF_OBJECT_ATTRIBUTES attribs; - WDF_OBJECT_ATTRIBUTES_INIT(&attribs); - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attribs, QDMA_IRQ_CONTEXT); - - status = WdfInterruptCreate(wdf_dev, &config, &attribs, &irq_mgr.irq[vec]); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "WdfInterruptCreate failed: %!STATUS!", status); - return status; - } - - /* FIXME: 2018.2 Bitstream Issue?? Unmasking of the MSIX vectors not happening. So doing it manually */ - if (hw_version_info.ip_type == QDMA_VERSAL_HARD_IP) { - unmask_msi_entry(vec); - } - - auto irq_context = get_qdma_irq_context(irq_mgr.irq[vec]); - status = configure_irq(irq_context, vec); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: WdfInterruptCreate failed: %!STATUS!", - dev_conf.name, status); - return status; - } - - if ((irq_mgr.err_vector_id == vec) && (dev_conf.is_master_pf)) { - int ret = hw.qdma_hw_error_intr_setup((void *)this, - (uint16_t)dev_conf.dev_sbdf.sbdf.fun_no, (uint8_t)irq_mgr.err_vector_id); - if (ret < 0) { - TraceError(TRACE_INTR, "%s: qdma_error_interrupt_setup() failed with error %d", - dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_hw_error_enable((void *)this, hw.qdma_max_errors); - if (ret < 0) { - TraceError(TRACE_INTR, "%s: qdma_error_enable() failed with error %d", - dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_hw_error_intr_rearm((void *)this); - if (ret < 0) { - TraceError(TRACE_INTR, "%s: qdma_error_interrupt_rearm() failed with error %d", - dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - } - - ++vec; - - TraceInfo(TRACE_INTR, "%s: INTERRUPT REGISTERED FOR VECTOR ID: : %d WEIGHT : %d", - dev_conf.name, irq_context->vector_id, irq_context->weight); - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::setup_legacy_interrupt( - WDFCMRESLIST resources, - const WDFCMRESLIST resources_translated) -{ - NTSTATUS status; - - /* Setup interrupts */ - PCM_PARTIAL_RESOURCE_DESCRIPTOR resource; - PCM_PARTIAL_RESOURCE_DESCRIPTOR resource_translated; - - ULONG numResources = WdfCmResourceListGetCount(resources_translated); - TraceVerbose(TRACE_INTR, "%s: Total number of resource : %lu", - dev_conf.name, numResources); - - - for (UINT i = 0, vec = 0; i < numResources; i++) { - - resource = WdfCmResourceListGetDescriptor(resources, i); - resource_translated = WdfCmResourceListGetDescriptor(resources_translated, i); - if (resource_translated->Type != CmResourceTypeInterrupt) { - continue; - } - - WDF_INTERRUPT_CONFIG config; - - /* Initializing the interrupt config with Data ISR and DPC handlers */ - WDF_INTERRUPT_CONFIG_INIT(&config, EvtDataInterruptIsr, nullptr); - - config.InterruptRaw = resource; - config.InterruptTranslated = resource_translated; - config.EvtInterruptEnable = nullptr; - config.EvtInterruptDisable = nullptr; - config.AutomaticSerialization = TRUE; - - WDF_OBJECT_ATTRIBUTES attribs; - WDF_OBJECT_ATTRIBUTES_INIT(&attribs); - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attribs, QDMA_IRQ_CONTEXT); - - status = WdfInterruptCreate(wdf_dev, &config, &attribs, &irq_mgr.irq[vec]); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: WdfInterruptCreate failed: %!STATUS!", - dev_conf.name, status); - return status; - } - - auto irq_context = get_qdma_irq_context(irq_mgr.irq[vec]); - status = configure_irq(irq_context, vec); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: WdfInterruptCreate failed: %!STATUS!", - dev_conf.name, status); - return status; - } - - ++vec; - - TraceInfo(TRACE_INTR, "%s: LEGACY INTERRUPT REGISTERED FOR VECTOR ID: : %d WEIGHT : %d", - dev_conf.name, irq_context->vector_id, irq_context->weight); - - /* Only One Vector for Legacy interrupt */ - break; - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::intr_setup( - WDFCMRESLIST resources, - const WDFCMRESLIST resources_translated) -{ - UINT32 i; - NTSTATUS status = STATUS_SUCCESS; - PCM_PARTIAL_RESOURCE_DESCRIPTOR resource_desc; - ULONG numResources = WdfCmResourceListGetCount(resources_translated); - - /* Initialize IRQ spin lock */ - WDF_OBJECT_ATTRIBUTES attr; - WDF_OBJECT_ATTRIBUTES_INIT(&attr); - attr.ParentObject = wdf_dev; - - status = WdfSpinLockCreate(&attr, &irq_mgr.lock); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: WdfSpinLockCreate failed: %!STATUS!", - dev_conf.name, status); - return status; - } - - irq_mgr.intr_type = interrupt_type::NONE; - for (i = 0; i < numResources; i++) { - resource_desc = WdfCmResourceListGetDescriptor(resources_translated, i); - if (resource_desc->Type != CmResourceTypeInterrupt) { - TraceVerbose(TRACE_INTR, "Non Interrupt Resource : %d", resource_desc->Type); - continue; - } - - if (resource_desc->Flags & CM_RESOURCE_INTERRUPT_MESSAGE) { - irq_mgr.intr_type = interrupt_type::MSIX; - - TraceVerbose(TRACE_INTR, - "Message Interrupt level 0x%0x, Vector 0x%0x, MessageCount %u\n" - , resource_desc->u.MessageInterrupt.Translated.Level - , resource_desc->u.MessageInterrupt.Translated.Vector - , resource_desc->u.MessageInterrupt.Raw.MessageCount - ); - } - else { - irq_mgr.intr_type = interrupt_type::LEGACY; - - TraceVerbose(TRACE_INTR, - "Legacy Interrupt level: 0x%0x, Vector: 0x%0x\n" - , resource_desc->u.Interrupt.Level - , resource_desc->u.Interrupt.Vector - ); - } - break; - } - - if (irq_mgr.intr_type == interrupt_type::LEGACY) { - status = setup_legacy_interrupt(resources, resources_translated); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: setup_legacy_interrupt() failed: %!STATUS!", - dev_conf.name, status); - } - } - else if (irq_mgr.intr_type == interrupt_type::MSIX) { - status = setup_msix_interrupt(resources, resources_translated); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: setup_msix_interrupt() failed: %!STATUS!", - dev_conf.name, status); - } - } - else { - TraceError(TRACE_INTR, "%s: Invalid Interrupt Type : %d " - "(valid are legacy and msix)", dev_conf.name, (int)irq_mgr.intr_type); - return STATUS_UNSUCCESSFUL; - } - - return status; -} - -void qdma_device::intr_teardown(void) -{ - if ((irq_mgr.intr_type == interrupt_type::LEGACY) && - (hw.qdma_legacy_intr_conf != nullptr)) - hw.qdma_legacy_intr_conf((void *)this, DISABLE); - else { - /* FIXME: 2018.2 Bitstream issue?? Mask the msix vectors */ - if (hw_version_info.ip_type == QDMA_VERSAL_HARD_IP) { - for (auto i = 0u; i < pcie.get_num_msix_vectors(); ++i) { - mask_msi_entry(i); - } - } - } -} diff --git a/QDMA/windows/sys/libqdma/source/interrupts.hpp b/QDMA/windows/sys/libqdma/source/interrupts.hpp deleted file mode 100644 index 9344430..0000000 --- a/QDMA/windows/sys/libqdma/source/interrupts.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include "qdma_platform_env.h" -#include "qdma_config.h" -#include "qdma_reg_ext.h" - -namespace xlnx { -/* Forward declaration */ -class qdma_device; -struct queue_pair; - -#define VECTOR_TYPE_ERROR 0 -#define VECTOR_TYPE_USER 1 -#define VECTOR_TYPE_DATA_START 2 - -#define IND_INTR_MAX_DATA_VECTORS QDMA_NUM_DATA_VEC_FOR_INTR_CXT - -enum class interrupt_type { - NONE, - LEGACY, - MSIX -}; - -struct intr_queue { - static constexpr size_t size = 512; - size_t capacity = size; - size_t npages = 1; - - UINT16 idx = 0; /* queue index - relative to this PF */ - UINT16 idx_abs = 0; /* queue index - abolute across all PF */ - - UINT8 color = 1; - ULONG vector = 0; - - qdma_intr_cidx_reg_info intr_cidx_info; - qdma_device* qdma = nullptr; - WDFCOMMONBUFFER buffer = nullptr; - void *buffer_va = nullptr; - - volatile UINT32 sw_index = 0; /* Driver CIDX */ - - NTSTATUS create(WDFDMAENABLER& dma_enabler); - void clear_contents(void); - - void advance_sw_index(void); - PFORCEINLINE void update_csr_cidx(queue_pair *q, UINT32 new_cidx); - NTSTATUS intring_dump(qdma_intr_ring_info *intring_info); -}; - -typedef struct QDMA_IRQ_CONTEXT { - bool is_coal; - interrupt_type intr_type = interrupt_type::NONE; - ULONG vector_id; - UINT32 weight; - - /* For user interrupt handling */ - void *user_data; - - /* For Error interrupt handling */ - qdma_device *qdma_dev = nullptr; - - /* For direct interrupt handling */ - LIST_ENTRY queue_list_head; - - /* For indirect interrupt handling */ - intr_queue *intr_q = nullptr; - - /* Interrupt handler function */ - void (*interrupt_handler)(QDMA_IRQ_CONTEXT *); - -}*PQDMA_IRQ_CONTEXT; - -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(QDMA_IRQ_CONTEXT, get_qdma_irq_context); - -struct interrupt_manager { - interrupt_type intr_type = interrupt_type::NONE; - ULONG err_vector_id = 0; - ULONG user_vector_id_start = 0; - ULONG user_vector_id_end = 0; - ULONG data_vector_id_end = 0; - ULONG data_vector_id_start = 0; - - WDFSPINLOCK lock = nullptr; - UINT32 irq_weight[qdma_max_msix_vectors_per_pf]; - WDFINTERRUPT irq[qdma_max_msix_vectors_per_pf]; - intr_queue intr_q[qdma_max_msix_vectors_per_pf]; -}; - -} /* namespace xlnx */ - - diff --git a/QDMA/windows/sys/libqdma/source/qdma.cpp b/QDMA/windows/sys/libqdma/source/qdma.cpp deleted file mode 100644 index 645542f..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma.cpp +++ /dev/null @@ -1,4235 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "qdma.h" -#include "interrupts.hpp" -#include "qdma_platform.h" -#include "trace.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma.tmh" -#endif - -using namespace xlnx; - -/* Below are per driver global variables */ -static LIST_ENTRY qdma_dev_list_head; -static WDFWAITLOCK qdma_list_lock; -static volatile LONG qdma_active_pf_count = 0; - -static struct drv_mode_name mode_name_list[] = { - { POLL_MODE, "poll"}, - { INTR_MODE, "direct interrupt"}, - { INTR_COAL_MODE, "indirect interrupt"}, -}; - -NTSTATUS qdma_device::list_add_qdma_device_and_set_gbl_csr(void) -{ - if ((LONG)1 == InterlockedIncrement(&qdma_active_pf_count)) { - TraceVerbose(TRACE_QDMA, "%s: ** Initializing global device list and wait lock **", dev_conf.name); - - /* First device in the list, Initialize the list head */ - INIT_LIST_HEAD(&qdma_dev_list_head); - - WDF_OBJECT_ATTRIBUTES attr; - WDF_OBJECT_ATTRIBUTES_INIT(&attr); - attr.ParentObject = WDFDRIVER(); - - NTSTATUS status = WdfWaitLockCreate(&attr, &qdma_list_lock); - if (!(NT_SUCCESS(status))) { - TraceError(TRACE_QDMA, "%s: Failed to create qdma list wait lock %!STATUS!", dev_conf.name, status); - qdma_list_lock = nullptr; - return status; - } - } - else { - /* To avoid race, Wait for some time - * if list head and wait lock initialization already in progress. - */ - LARGE_INTEGER wait_time; - wait_time.QuadPart = WDF_REL_TIMEOUT_IN_US(100); - KeDelayExecutionThread(KernelMode, FALSE, &wait_time); - - if (nullptr == qdma_list_lock) { - TraceError(TRACE_QDMA, "%s: qdma list wait lock not initialized", dev_conf.name); - return STATUS_UNSUCCESSFUL; - } - } - - TraceVerbose(TRACE_QDMA, "%s: ++ Active pf count : %u ++", dev_conf.name, qdma_active_pf_count); - - WdfWaitLockAcquire(qdma_list_lock, NULL); - - dev_conf.is_master_pf = is_first_qdma_pf_device(); - if (true == dev_conf.is_master_pf) { - TraceInfo(TRACE_QDMA, "Configuring '%04X:%02X:%02X.%x' as master pf\n", - dev_conf.dev_sbdf.sbdf.seg_no, dev_conf.dev_sbdf.sbdf.bus_no, - dev_conf.dev_sbdf.sbdf.dev_no, dev_conf.dev_sbdf.sbdf.fun_no); - - TraceVerbose(TRACE_QDMA, "%s: Setting Global CSR", dev_conf.name); - - int ret = hw.qdma_set_default_global_csr(this); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed to set global CSR Configuration, ret : %d", dev_conf.name, ret); - WdfWaitLockRelease(qdma_list_lock); - return hw.qdma_get_error_code(ret); - } - } - - LIST_ADD_TAIL(&qdma_dev_list_head, &list_entry); - - WdfWaitLockRelease(qdma_list_lock); - - return STATUS_SUCCESS; -} - -bool qdma_device::is_first_qdma_pf_device(void) -{ - PLIST_ENTRY entry, temp; - - LIST_FOR_EACH_ENTRY_SAFE(&qdma_dev_list_head, temp, entry) { - qdma_device *qdma_dev = CONTAINING_RECORD(entry, qdma_device, list_entry); - if (qdma_dev->dev_conf.dev_sbdf.sbdf.bus_no == dev_conf.dev_sbdf.sbdf.bus_no) { - return false; - } - } - - return true; -} - -void qdma_device::list_remove_qdma_device(void) -{ - if (nullptr == list_entry.Flink && nullptr == list_entry.Blink) - return; - - WdfWaitLockAcquire(qdma_list_lock, nullptr); - LIST_DEL_NODE(&list_entry); - WdfWaitLockRelease(qdma_list_lock); - auto cnt = InterlockedDecrement(&qdma_active_pf_count); - TraceVerbose(TRACE_QDMA, "%s: -- Active pf count : %u --", dev_conf.name, cnt); -} - -/* --------------------------- debug prints of structs --------------------------- */ - -#ifdef ENABLE_WPP_TRACING - -static void dump(const mm_descriptor& desc) -{ - TraceVerbose( - TRACE_DBG, - "descriptor={valid=%u, sop=%u, eop=%u, length=%u, addr=0x%llX," - "dest_addr=0x%llX }", - desc.valid, desc.sop, desc.eop, desc.length, desc.addr, - desc.dest_addr); -} - -static void dump(const h2c_descriptor& desc) -{ - TraceVerbose( - TRACE_DBG, - "descriptor={sop=%u, eop=%u, length=%u, addr=0x%llX}", - desc.sop, desc.eop, desc.length, desc.addr); -} - -static void dump(const char* dir, const qdma_descq_hw_ctxt& ctxt) -{ - TraceVerbose( - TRACE_QDMA, - "%s_hw_desc_ctxt={cidx=%u, credit_use=%u, desc_pending=%u, " - "idle_stop=%u evt_pending=%u fetch_pending=%u}", - dir, ctxt.cidx, ctxt.crd_use, ctxt.dsc_pend, ctxt.idl_stp_b, - ctxt.evt_pnd, ctxt.fetch_pnd); -} - -static void dump(const char* dir, const qdma_descq_sw_ctxt& ctxt) -{ - TraceVerbose(TRACE_QDMA, - "%s_sw_desc_ctxt={pidx=%u irq_arm=%u, funid=%u, qen=%u, " - "frcd_en=%u, wbi_chk=%u, wbi_intvl_en=%u at=%u, fetch_max=%u, " - "rngsz_idx=%u, desc_sz=%u, bypass=%u, mm_ch=%u wb_en=%u" - "irq_en=%u, portid=%u, irq_no_last=%u, err=%u, err_wb=%u, " - "irq_req=%u, mrkr_dis=%u is_mm=%u, ring_bs_addr=%llX, " - "vec=%u, int_aggr=%u}", - dir, ctxt.pidx, ctxt.irq_arm, ctxt.fnc_id, ctxt.qen, - ctxt.frcd_en, ctxt.wbi_chk, ctxt.wbi_intvl_en, ctxt.at, - ctxt.fetch_max, ctxt.rngsz_idx, ctxt.desc_sz, ctxt.bypass, - ctxt.mm_chn, ctxt.wbk_en, ctxt.irq_en, ctxt.port_id, - ctxt.irq_no_last, ctxt.err, ctxt.err_wb_sent, ctxt.irq_req, - ctxt.mrkr_dis, ctxt.is_mm, ctxt.ring_bs_addr, - ctxt.vec, ctxt.intr_aggr); -} - -static void dump(const qdma_descq_prefetch_ctxt& ctxt) -{ - TraceVerbose( - TRACE_DBG, - "c2h_prefetch_ctxt={bypass=%u, buffer_size_idx=%u, " - "sw_credit=%u, valid=%u}", - ctxt.bypass, ctxt.bufsz_idx, ctxt.sw_crdt, ctxt.valid); -} - -static void dump(const qdma_descq_credit_ctxt& ctxt) -{ - TraceVerbose( - TRACE_DBG, - "c2h_credit_ctxt={credits=%u}", - ctxt.credit); -} - -static void dump(const qdma_descq_cmpt_ctxt& ctxt) -{ - TraceVerbose( - TRACE_DBG, - "c2h_cmpt_ctxt={en_stat_desc=%u, en_int=%u, trig_mode=%u, " - "funid=%u, cntr_idx=%u, tmr_idx=%u, int_st=%u, color=%u, " - "ringsz_idx=%u, bs_addr=%llX, desc_sz=%u, pidx=%u, cidx=%u, " - "valid=%u, err=%u, usr_trig_pnd=%u, tmr_runing=%u, fupd=%u, " - "ovf_chk_dis=%u, at=%u, vec=%u, int_aggr=%u}", - ctxt.en_stat_desc, ctxt.en_int, ctxt.trig_mode, ctxt.fnc_id, - ctxt.counter_idx, ctxt.timer_idx, ctxt.in_st, ctxt.color, ctxt.ringsz_idx, - ctxt.bs_addr, ctxt.desc_sz, ctxt.pidx, ctxt.cidx, ctxt.valid, - ctxt.err, ctxt.user_trig_pend, ctxt.timer_running, ctxt.full_upd, - ctxt.ovf_chk_dis, ctxt.at, ctxt.vec, ctxt.int_aggr); -} - -static void dump(const qdma_qid2vec& ctxt) { - TraceVerbose( - TRACE_DBG, - "qid2vec_ctxt={c2h_coal_en=%u, c2h_vec=%u, h2c_coal_en=%u, " - "h2c_vec=%u}", - ctxt.c2h_en_coal, ctxt.c2h_vector, ctxt.h2c_en_coal, ctxt.h2c_vector); -} - -static void dump(qdma_device *qdma_dev, const queue_type q_type, const UINT16 qid) -{ - TraceVerbose(TRACE_DBG, "------------ QUEUE_%u CONTEXT DUMPS ------------", qid); - qdma_descq_sw_ctxt sw_ctxt = { 0 }; - qdma_dev->hw.qdma_sw_ctx_conf((void *)qdma_dev, false, qid, &sw_ctxt, QDMA_HW_ACCESS_READ); - dump("H2C", sw_ctxt); - qdma_dev->hw.qdma_sw_ctx_conf((void *)qdma_dev, true, qid, &sw_ctxt, QDMA_HW_ACCESS_READ); - dump("C2H", sw_ctxt); - - qdma_descq_hw_ctxt hw_ctxt = { 0 }; - qdma_dev->hw.qdma_hw_ctx_conf((void *)qdma_dev, false, qid, &hw_ctxt, QDMA_HW_ACCESS_READ); - dump("H2C", hw_ctxt); - qdma_dev->hw.qdma_hw_ctx_conf((void *)qdma_dev, true, qid, &hw_ctxt, QDMA_HW_ACCESS_READ); - dump("C2H", hw_ctxt); - - if (qdma_dev->hw.qdma_qid2vec_conf) { - qdma_qid2vec qid2vec_ctxt = { 0 }; - qdma_dev->hw.qdma_qid2vec_conf((void *)qdma_dev, false, qid, &qid2vec_ctxt, QDMA_HW_ACCESS_READ); - dump(qid2vec_ctxt); - qdma_dev->hw.qdma_qid2vec_conf((void *)qdma_dev, true, qid, &qid2vec_ctxt, QDMA_HW_ACCESS_READ); - dump(qid2vec_ctxt); - } - - if (q_type == queue_type::STREAMING) { - qdma_descq_cmpt_ctxt cmpt_ctxt = { 0 }; - qdma_dev->hw.qdma_cmpt_ctx_conf((void *)qdma_dev, qid, &cmpt_ctxt, QDMA_HW_ACCESS_READ); - dump(cmpt_ctxt); - - qdma_descq_prefetch_ctxt pfch_ctxt = { 0 }; - qdma_dev->hw.qdma_pfetch_ctx_conf((void *)qdma_dev, qid, &pfch_ctxt, QDMA_HW_ACCESS_READ); - dump(pfch_ctxt); - - qdma_descq_credit_ctxt credit_ctxt = { 0 }; - qdma_dev->hw.qdma_credit_ctx_conf((void *)qdma_dev, true, qid, &credit_ctxt, QDMA_HW_ACCESS_READ); - dump(credit_ctxt); - } - TraceVerbose(TRACE_DBG, "------------ ------------"); -} - -static void dump(const c2h_wb_status& status) -{ - TraceVerbose( - TRACE_DBG, - "c2h_wb_status={pidx=%u, cidx=%u, color=%u, irq_state=%u}", - status.pidx, status.cidx, status.color, status.irq_state); -} - -static void dump(int index, const c2h_wb_header_8B& status) -{ - TraceVerbose( - TRACE_DBG, - "c2h_cmpt_ring[%u]={length=%u, color=%u, desc_error=%u, " - "user_defined_0=0x%llx}", - index, status.length, status.color, status.desc_error, - status.user_defined_0); -} -#else -#define dump(...) (__VA_ARGS__) -#endif - -static size_t get_descriptor_size(qdma_desc_sz desc_sz) -{ - size_t size_in_bytes = 0; - - size_in_bytes = static_cast<size_t>(1) << (3 + static_cast<size_t>(desc_sz)); - - return size_in_bytes; -} - -//======================= private member function implemenations ================================== - -_IRQL_requires_max_(PASSIVE_LEVEL) -void *qdma_interface::operator new(_In_ size_t num_bytes) -{ - VERIFY_IS_IRQL_PASSIVE_LEVEL(); - - void *mem = qdma_calloc(1, (uint32_t)num_bytes); - if (mem) - RtlZeroMemory(mem, num_bytes); - - return mem; -} - -_IRQL_requires_max_(PASSIVE_LEVEL) -void qdma_interface::operator delete(_In_ void *addr) -{ - VERIFY_IS_IRQL_PASSIVE_LEVEL(); - if (addr != nullptr) { - qdma_memfree(addr); - } -} - -qdma_interface* qdma_interface::create_qdma_device(void) -{ - qdma_interface *dev_interface = nullptr; - - dev_interface = new xlnx::qdma_device; - if (dev_interface == nullptr) - TraceError(TRACE_QDMA, "qdma_interface allocation Failed"); - else - TraceVerbose(TRACE_QDMA, "qdma_interface allocation Success : %d", sizeof(xlnx::qdma_device)); - - return dev_interface; -} - -void qdma_interface::remove_qdma_device(qdma_interface *qdma_dev) -{ - delete qdma_dev; -} - -NTSTATUS qdma_device::init_qdma_global() -{ - NTSTATUS status; - int ret; - - status = qdma_read_csr_conf(&csr_conf); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: Failed to read CSR Configuration", dev_conf.name); - return status; - } - - ret = hw.qdma_hw_error_enable((void *)this, hw.qdma_max_errors); - if (ret < 0) { - TraceInfo(TRACE_QDMA, "%s: Failed to enable qdma errors, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::init_func() -{ - int ret; - struct qdma_fmap_cfg config = { 0 }; - - UINT8 h2c = 0, c2h = 1; - for (UINT8 i = 0; i < dev_conf.dev_info.mm_channel_max; i++) { - ret = hw.qdma_mm_channel_conf((void *)this, i, h2c, TRUE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed to configure H2C MM channel %d, ret : %d", - dev_conf.name, i, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_mm_channel_conf((void *)this, i, c2h, TRUE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed to configure C2H MM channel %d, ret : %d", - dev_conf.name, i, ret); - return hw.qdma_get_error_code(ret); - } - } - - config.qbase = static_cast<UINT16>(qbase); - config.qmax = static_cast<UINT16>(drv_conf.qsets_max); - - ret = hw.qdma_fmap_conf((void *)this, - dev_conf.dev_sbdf.sbdf.fun_no, - &config, - QDMA_HW_ACCESS_WRITE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed FMAP Programming for PF %d, ret: %d", - dev_conf.name, dev_conf.dev_sbdf.sbdf.fun_no, ret); - return hw.qdma_get_error_code(ret); - } - - return STATUS_SUCCESS; -} - -void qdma_device::destroy_func(void) -{ - struct qdma_fmap_cfg config = {}; - config.qbase = 0; - config.qmax = 0; - - if (hw.qdma_fmap_conf) { - hw.qdma_fmap_conf((void *)this, - dev_conf.dev_sbdf.sbdf.fun_no, - &config, - QDMA_HW_ACCESS_WRITE); - } -} - - -NTSTATUS qdma_device::assign_bar_types() -{ - UINT8 user_bar_id = 0; - int ret = hw.qdma_get_user_bar((void *)this, - false, - dev_conf.dev_sbdf.sbdf.fun_no, - &user_bar_id); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed to get AXI Master Lite BAR, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - user_bar_id = user_bar_id / 2; - - NTSTATUS status = pcie.assign_bar_types(user_bar_id); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: pcie assign_bar_types() failed: %!STATUS!", dev_conf.name, status); - return status; - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::init_dma_queues() -{ - NTSTATUS status = STATUS_SUCCESS; - - if (drv_conf.qsets_max == 0) - return STATUS_SUCCESS; - - queue_pairs = (queue_pair *)qdma_calloc(drv_conf.qsets_max, sizeof(queue_pair)); - if (nullptr == queue_pairs) { - TraceError(TRACE_QDMA, "%s: Failed to allocate queue_pair memory", dev_conf.name); - return STATUS_INSUFFICIENT_RESOURCES; - } - - for (UINT16 qid = 0; qid < drv_conf.qsets_max; qid++) { - auto& q = queue_pairs[qid]; - q.idx = qid; - q.idx_abs = qid + static_cast<UINT16>(qbase); - q.qdma = this; - q.state = queue_state::QUEUE_AVAILABLE; - - if (drv_conf.operation_mode != queue_op_mode::POLL_MODE) - q.h2c_q.lib_config.irq_en = q.c2h_q.lib_config.irq_en = true; - else - q.h2c_q.lib_config.irq_en = q.c2h_q.lib_config.irq_en = false; - - /* clear all context fields for this queue */ - status = clear_contexts(q); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: queue_pair::clear_contexts() failed for queue %d! %!STATUS!", dev_conf.name, q.idx_abs, status); - destroy_dma_queues(); - return status; - } - } - - TraceVerbose(TRACE_QDMA, "%s: All queue contexts are cleared", dev_conf.name); - - return STATUS_SUCCESS; -} - -void qdma_device::destroy_dma_queues(void) -{ - if (nullptr != queue_pairs) { - qdma_memfree(queue_pairs); - queue_pairs = nullptr; - } -} - -NTSTATUS qdma_device::init_interrupt_queues() -{ - NTSTATUS status = STATUS_SUCCESS; - int ret; - qdma_indirect_intr_ctxt intr_ctx = { 0 }; - - /* Initialize interrupt queues */ - for (auto vec = irq_mgr.data_vector_id_start; vec <= irq_mgr.data_vector_id_end; ++vec) { - auto& intr_q = irq_mgr.intr_q[vec]; - intr_q.idx = (UINT16)vec; - intr_q.idx_abs = (UINT16)(vec + (dev_conf.dev_sbdf.sbdf.fun_no * qdma_max_msix_vectors_per_pf)); - intr_q.qdma = this; - - status = intr_q.create(dma_enabler); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: intr_queue::create_resources() failed! %!STATUS!", dev_conf.name, status); - return status; - } - - /* Any failures onwards does not need cleanup. Common buffer created by q.create() - * is freed when dma_enabler object is deleted. - */ - - /* clear context for this queue */ - ret = hw.qdma_indirect_intr_ctx_conf((void *)this, - intr_q.idx_abs, - NULL, - QDMA_HW_ACCESS_CLEAR); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed to clear interrupt context \ - for intr queue %d, ret : %d", dev_conf.name, intr_q.idx_abs, ret); - return hw.qdma_get_error_code(ret); - } - - /* set the interrupt context for this queue */ - intr_ctx.valid = true; - intr_ctx.vec = (UINT16)intr_q.vector; - intr_ctx.color = intr_q.color; - intr_ctx.func_id = dev_conf.dev_sbdf.sbdf.fun_no; - intr_ctx.page_size = (UINT8)(intr_q.npages - 1); - intr_ctx.baddr_4k = WdfCommonBufferGetAlignedLogicalAddress(intr_q.buffer).QuadPart; - - TraceVerbose(TRACE_DBG, "%s: SETTING intr_ctxt={ \ - BaseAddr=%llX, color=%u, page_sz=%u, vector=%u }", - dev_conf.name, intr_ctx.baddr_4k, intr_ctx.color, intr_ctx.page_size, intr_ctx.vec); - - ret = hw.qdma_indirect_intr_ctx_conf((void *)this, - intr_q.idx_abs, - &intr_ctx, - QDMA_HW_ACCESS_WRITE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed to program interrupt \ - ring for intr queue %d, ret: %d", dev_conf.name, intr_q.idx_abs, ret); - return hw.qdma_get_error_code(ret); - } - } - - return status; -} - -NTSTATUS qdma_device::init_os_resources( - WDFCMRESLIST resources, - const WDFCMRESLIST resources_translated) -{ - WDF_OBJECT_ATTRIBUTES attr; - WDF_OBJECT_ATTRIBUTES_INIT(&attr); - attr.ParentObject = wdf_dev; - - WdfDeviceSetAlignmentRequirement(wdf_dev, FILE_64_BYTE_ALIGNMENT); - WDF_DMA_ENABLER_CONFIG dma_enabler_config; - WDF_DMA_ENABLER_CONFIG_INIT(&dma_enabler_config, - WdfDmaProfileScatterGather64Duplex, - 1024 * 1024 * 1024); /* TODO: Magic */ - NTSTATUS status = WdfDmaEnablerCreate(wdf_dev, - &dma_enabler_config, - &attr, - &dma_enabler); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: WdfDmaEnablerCreate() failed: %!STATUS!", dev_conf.name, status); - return status; - } - - if ((dev_conf.is_master_pf) && - (drv_conf.operation_mode == queue_op_mode::POLL_MODE)) { - int ret = hw.qdma_hw_error_enable(this, hw.qdma_max_errors); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: qdma_error_enable() failed, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - /* Create a thread for polling errors */ - status = th_mgr.create_err_poll_thread(this); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: create_err_poll_thread() failed: %!STATUS!", dev_conf.name, status); - return status; - } - } - - status = th_mgr.create_sys_threads(drv_conf.operation_mode); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: create_sys_threads() failed: %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - /* INTERRUPT HANDLING */ - if (drv_conf.operation_mode != queue_op_mode::POLL_MODE) { - /* Get MSIx vector count */ - status = pcie.find_num_msix_vectors(wdf_dev); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: pcie.get_num_msix_vectors() failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - status = intr_setup(resources, resources_translated); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: intr_setup() failed: %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - } - - return status; - -ErrExit: - destroy_os_resources(); - return status; -} - -void qdma_device::destroy_os_resources(void) -{ - /* dma_enabler will be free by wdf_dev cleanup */ - - if (drv_conf.operation_mode == queue_op_mode::POLL_MODE) { - if (dev_conf.is_master_pf) - th_mgr.terminate_err_poll_thread(); - } - else { - intr_teardown(); - } - - th_mgr.terminate_sys_threads(); -} - -NTSTATUS qdma_device::init_resource_manager() -{ - NTSTATUS status = STATUS_SUCCESS; - - if (qdma_resource_lock_init()) { - TraceError(TRACE_QDMA, "%s: Resource lock creation failed!", dev_conf.name); - return STATUS_UNSUCCESSFUL; - } - - int ret = qdma_master_resource_create(dev_conf.dev_sbdf.sbdf.bus_no, - dev_conf.dev_sbdf.sbdf.bus_no, - QDMA_QBASE, - QDMA_TOTAL_Q, - &dma_dev_index); - if (ret < 0 && ret != -QDMA_ERR_RM_RES_EXISTS) { - TraceError(TRACE_QDMA, "%s: qdma_master_resource_create() failed!, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - TraceVerbose(TRACE_QDMA, "%s: Device Index : %u Bus start : %u Bus End : %u", - dev_conf.name, dma_dev_index, dev_conf.dev_sbdf.sbdf.bus_no, dev_conf.dev_sbdf.sbdf.bus_no); - - ret = qdma_dev_entry_create(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: qdma_dev_entry_create() failed for function : %u, ret : %d", - dev_conf.name, dev_conf.dev_sbdf.sbdf.fun_no, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - - ret = qdma_dev_update(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no, drv_conf.qsets_max, &qbase); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: qdma_dev_update() failed for function : %u, ret : %d", - dev_conf.name, dev_conf.dev_sbdf.sbdf.fun_no, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - - TraceVerbose(TRACE_QDMA, "%s: QDMA Function : %u, qbase : %u, qmax : %u", - dev_conf.name, dev_conf.dev_sbdf.sbdf.fun_no, qbase, drv_conf.qsets_max); - - return status; - -ErrExit: - destroy_resource_manager(); - return status; -} - - -void qdma_device::destroy_resource_manager(void) -{ - qdma_dev_entry_destroy(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no); - qdma_master_resource_destroy(dma_dev_index); -} - -void qdma_device::inc_queue_pair_count(bool is_cmpt_valid) -{ - qdma_dev_increment_active_queue(dma_dev_index, - dev_conf.dev_sbdf.sbdf.fun_no, - QDMA_DEV_Q_TYPE_H2C); - - qdma_dev_increment_active_queue(dma_dev_index, - dev_conf.dev_sbdf.sbdf.fun_no, - QDMA_DEV_Q_TYPE_C2H); - - if (true == is_cmpt_valid) { - qdma_dev_increment_active_queue(dma_dev_index, - dev_conf.dev_sbdf.sbdf.fun_no, - QDMA_DEV_Q_TYPE_CMPT); - } -} - -void qdma_device::dec_queue_pair_count(bool is_cmpt_valid) -{ - qdma_dev_decrement_active_queue(dma_dev_index, - dev_conf.dev_sbdf.sbdf.fun_no, - QDMA_DEV_Q_TYPE_H2C); - - qdma_dev_decrement_active_queue(dma_dev_index, - dev_conf.dev_sbdf.sbdf.fun_no, - QDMA_DEV_Q_TYPE_C2H); - - if (true == is_cmpt_valid) { - qdma_dev_decrement_active_queue(dma_dev_index, - dev_conf.dev_sbdf.sbdf.fun_no, - QDMA_DEV_Q_TYPE_CMPT); - } -} - - -/* ----- received packet fragment functions ----- */ -NTSTATUS st_c2h_pkt_frag_queue::create(UINT32 entries) -{ - max_q_size = entries; - - frags = static_cast<st_c2h_pkt_fragment*>(qdma_calloc(entries, - sizeof(st_c2h_pkt_fragment))); - if (nullptr == frags) { - TraceError(TRACE_QDMA, "Failed to allocate memory for rcvd pkts"); - return STATUS_INSUFFICIENT_RESOURCES; - } - - pidx = cidx = 0; - avail_byte_cnt = 0; - avail_frag_cnt = 0; - - return STATUS_SUCCESS; -} - -void st_c2h_pkt_frag_queue::destroy(void) -{ - if(avail_frag_cnt != 0) - TraceError(TRACE_QDMA, "Error: Still there are packets to process in" - " received_pkts : count : %d", avail_frag_cnt); - - if (frags != nullptr) { - qdma_memfree(frags); - frags = nullptr; - } -} - -PFORCEINLINE bool st_c2h_pkt_frag_queue::is_queue_full(void) -{ - if (((pidx + 1) % max_q_size) == cidx) { - return true; - } - return false; -} - -PFORCEINLINE bool st_c2h_pkt_frag_queue::is_queue_empty(void) -{ - if (cidx == pidx) { - return true; - } - return false; -} - -inline LONG st_c2h_pkt_frag_queue::get_avail_frag_cnt(void) -{ - return avail_frag_cnt; -} - -inline size_t st_c2h_pkt_frag_queue::get_avail_byte_cnt(void) -{ - return avail_byte_cnt; -} - -NTSTATUS st_c2h_pkt_frag_queue::add(st_c2h_pkt_fragment &elem) -{ - if(is_queue_full() == true) - return STATUS_DESTINATION_ELEMENT_FULL; - - frags[pidx] = elem; - - pidx++; - if (pidx >= max_q_size) - pidx = 0; - - avail_byte_cnt += elem.length; - ++avail_frag_cnt; - - return STATUS_SUCCESS; -} - -NTSTATUS st_c2h_pkt_frag_queue::consume(st_c2h_pkt_fragment &elem) -{ - if (is_queue_empty() == true) - return STATUS_SOURCE_ELEMENT_EMPTY; - - elem = frags[cidx]; - - cidx++; - if (cidx >= max_q_size) - cidx = 0; - - avail_byte_cnt -= elem.length; - --avail_frag_cnt; - - return STATUS_SUCCESS; -} -/* ----- -----*/ - -PFORCEINLINE void ring_buffer::advance_idx(volatile UINT32& idx) -{ - NT_ASSERT(idx < capacity); - - /* This condition is to ensure that idx update should happen only once - (either roll back to 0 or increment by 1) - */ - if ((idx + 1) == capacity) - idx = 0; - else - idx++; -} - -PFORCEINLINE void ring_buffer::advance_idx( - volatile UINT32& idx, - const UINT32 num) -{ - if ((idx + num) < capacity) - idx = idx + num; - else - idx = num - (capacity - idx); -} - -NTSTATUS ring_buffer::create( - WDFDMAENABLER& dma_enabler, - UINT32 num_entries, - size_t desc_sz_bytes) -{ - const size_t buffer_sz = num_entries * desc_sz_bytes; - - /** Descriptor Capacity of the ring (does not include write back status entry) - total ring size = capacity + 1; - - descriptor ring uses (capacity - 1) entries for queue full condition - */ - capacity = num_entries - 1; - hw_index = sw_index = 0u; - stats.tot_desc_accepted = stats.tot_desc_processed = 0; - - TraceVerbose(TRACE_QDMA, "Allocate DMA buffer size : %llu ring depth : %llu, capacity : %llu", - buffer_sz, num_entries, capacity); - - auto status = WdfCommonBufferCreate(dma_enabler, - buffer_sz, - WDF_NO_OBJECT_ATTRIBUTES, - &buffer); - - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "WdfCommonBufferCreate failed: %!STATUS!", status); - return status; - } - - buffer_va = WdfCommonBufferGetAlignedVirtualAddress(buffer); - RtlZeroMemory(buffer_va, buffer_sz); - - wb_status = WDF_PTR_ADD_OFFSET_TYPE(buffer_va, - capacity * desc_sz_bytes, - wb_status_base *); - - wb_status->cidx = wb_status->pidx = 0; - return status; -} - -void ring_buffer::destroy(void) -{ - capacity = 0; - buffer_va = nullptr; - wb_status = nullptr; - sw_index = 0; - hw_index = 0; - stats.tot_desc_accepted = 0; - stats.tot_desc_processed = 0; - if (buffer) { - TraceVerbose(TRACE_QDMA, "Deleting buffer object"); - WdfObjectDelete(buffer); - buffer = nullptr; - } -} - -PFORCEINLINE UINT32 ring_buffer::idx_delta(UINT32 start_idx, UINT32 end_idx) -{ - NT_ASSERT(start_idx < capacity); - NT_ASSERT(end_idx < capacity); - - if (start_idx <= end_idx) - return end_idx - start_idx; - else - return capacity - start_idx + end_idx; -} - -void *ring_buffer::get_va(void) -{ - return buffer_va; -} - -UINT32 ring_buffer::get_capacity(void) -{ - return capacity; -} - -UINT32 ring_buffer::get_num_free_entries(void) -{ - /* As hw_index is proper 32-bit aligned address, - reading and writing gets done in single cycle - and hence not using any synchronization for performance - */ - UINT32 wb_index = hw_index; - - if (wb_index > sw_index) - return ((wb_index - sw_index) - 1); - else - return (capacity - 1 - (sw_index - wb_index)); -} - -NTSTATUS h2c_queue::create( - qdma_device *qdma, - queue_config& q_conf) -{ - user_conf = q_conf; - - INIT_LIST_HEAD(&req_list_head); - - if ((user_conf.desc_bypass_en) && - (user_conf.sw_desc_sz == static_cast<UINT8>(qdma_desc_sz::QDMA_DESC_SZ_64B))) { - lib_config.desc_sz = qdma_desc_sz::QDMA_DESC_SZ_64B; - } - else { - lib_config.desc_sz = user_conf.is_st ? qdma_desc_sz::QDMA_DESC_SZ_16B : qdma_desc_sz::QDMA_DESC_SZ_32B; - } - - size_t desc_sz_bytes = get_descriptor_size(lib_config.desc_sz); - lib_config.ring_sz = qdma->csr_conf.ring_sz[user_conf.h2c_ring_sz_index]; - - auto status = desc_ring.create(qdma->dma_enabler, - lib_config.ring_sz, - desc_sz_bytes); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: desc_ring.create failed: %!STATUS!", - qdma->dev_conf.name, status); - return status; - } - - init_csr_h2c_pidx_info(); - - /** Create and initialize MM/ST_H2C request tracker of - * descriptor ring size, This is shadow ring and hence the - * size is exact descriptor ring size - */ - status = req_tracker.create(lib_config.ring_sz); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_dma_req_tracker() failed: %!STATUS!", - qdma->dev_conf.name, status); - goto ErrExit; - } - - status = WdfSpinLockCreate(WDF_NO_OBJECT_ATTRIBUTES, &lock); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: WdfSpinLockCreate() failed: %!STATUS!", - qdma->dev_conf.name, status); - goto ErrExit; - } - -#ifdef TEST_64B_DESC_BYPASS_FEATURE - if (user_conf.is_st && user_conf.desc_bypass_en && user_conf.sw_desc_sz == 3) { - TraceVerbose(TRACE_QDMA, "%s: Initializing the descriptors with " - "preloaded data to test TEST_64B_DESC_BYPASS_FEATURE", qdma->dev_conf.name); - - for (UINT32 desc_idx = 0; desc_idx < lib_config.ring_sz; desc_idx++) { - UINT8 *desc = - WDF_PTR_ADD_OFFSET_TYPE(desc_ring.buffer_va, - (desc_sz_bytes * desc_idx), - UINT8 *); - RtlFillMemory(desc, desc_sz_bytes, desc_idx + 1); - } - } -#endif - return status; - -ErrExit: - destroy(); - return status; -} - -void h2c_queue::destroy(void) -{ - desc_ring.destroy(); - req_tracker.destroy(); - if (nullptr != lock) { - WdfObjectDelete(lock); - lock = nullptr; - } -} - -void h2c_queue::init_csr_h2c_pidx_info(void) -{ - csr_pidx_info.irq_en = lib_config.irq_en; - csr_pidx_info.pidx = 0u; -} - -NTSTATUS c2h_queue::create( - qdma_device *qdma, - queue_config& q_conf) -{ - user_conf = q_conf; - - INIT_LIST_HEAD(&req_list_head); - - if ((user_conf.desc_bypass_en) && - (user_conf.sw_desc_sz == static_cast<UINT8>(qdma_desc_sz::QDMA_DESC_SZ_64B))) { - lib_config.desc_sz = qdma_desc_sz::QDMA_DESC_SZ_64B; - } - else { - lib_config.desc_sz = user_conf.is_st ? qdma_desc_sz::QDMA_DESC_SZ_8B : qdma_desc_sz::QDMA_DESC_SZ_32B; - } - - size_t desc_sz_bytes = get_descriptor_size(lib_config.desc_sz); - lib_config.ring_sz = qdma->csr_conf.ring_sz[user_conf.c2h_ring_sz_index]; - - INT32 cmpt_ring_idx = - get_cmpt_ring_index(&qdma->csr_conf.ring_sz[0], - user_conf.c2h_ring_sz_index); - - /** If cmpt_ring_idx is found, that is cmpt_ring index */ - if (cmpt_ring_idx >= 0) - lib_config.cmpt_ring_id = cmpt_ring_idx; - /** Else, cmpt_ring index is same as descriptor ring index */ - else - lib_config.cmpt_ring_id = user_conf.c2h_ring_sz_index; - - lib_config.cmpt_ring_sz = qdma->csr_conf.ring_sz[lib_config.cmpt_ring_id]; - - NTSTATUS status = desc_ring.create(qdma->dma_enabler, lib_config.ring_sz, desc_sz_bytes); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: desc_ring.create failed: %!STATUS!", qdma->dev_conf.name, status); - return status; - } - - status = WdfSpinLockCreate(WDF_NO_OBJECT_ATTRIBUTES, &lock); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "%s: WdfSpinLockCreate failed: %!STATUS!", qdma->dev_conf.name, status); - goto ErrExit; - } - - if (user_conf.is_st) { - /** Create and initialize ST C2H dma request tracker of - * descriptor ring size to allow minimum of desc_ring entry requests - * when each request occupies a single desc_ring entry - */ - status = st_c2h_req_tracker.create(lib_config.ring_sz); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: Failed to init() ST C2H req tracker failed: %!STATUS!", - qdma->dev_conf.name, status); - goto ErrExit; - } - } - else { - /** Create and initialize MM/ST_H2C request tracker of - * descriptor ring size, This is shadow ring and hence the - * size is exact descriptor ring size - */ - status = req_tracker.create(lib_config.ring_sz); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: Failed to init() MM C2H req tracker failed: %!STATUS!", - qdma->dev_conf.name, status); - goto ErrExit; - } - } - - init_csr_c2h_pidx_info(); - is_cmpt_valid = false; - if ((user_conf.is_st) || - (!user_conf.is_st && user_conf.en_mm_cmpl && qdma->dev_conf.dev_info.mm_cmpt_en)) { - /* Completion ring resources */ - is_cmpt_valid = true; - size_t cmpt_sz_bytes = get_descriptor_size(user_conf.cmpt_sz); - - status = cmpt_ring.create(qdma->dma_enabler, lib_config.cmpt_ring_sz, cmpt_sz_bytes); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: desc_ring.create failed: %!STATUS!", - qdma->dev_conf.name, status); - goto ErrExit; - } - - init_csr_cmpt_cidx_info(); - - /* Identify completion offset */ - qdma_hw_version_info hw_version_info = { }; - qdma->qdma_get_hw_version_info(hw_version_info); - if (hw_version_info.ip_type == QDMA_VERSAL_HARD_IP) { - /* UDD starts from index 2 for Versal Hard IP */ - cmpt_offset = 2; - } - else { - cmpt_offset = 0; - } - } - - if (!user_conf.is_st) - return status; - - lib_config.data_buf_size = qdma->csr_conf.c2h_buff_sz[user_conf.c2h_buff_sz_index]; - const auto c2h_desc_ring = static_cast<c2h_descriptor*>(desc_ring.get_va()); - - auto desc_ring_capacity = desc_ring.get_capacity(); - pkt_buffer = static_cast<st_c2h_pkt_buffer *>(qdma_calloc(desc_ring_capacity, - sizeof(st_c2h_pkt_buffer))); - - if (nullptr == pkt_buffer) { - TraceError(TRACE_QDMA, "%s: rx_buffers qdma_calloc failed: %!STATUS!", - qdma->dev_conf.name, status); - status = STATUS_INSUFFICIENT_RESOURCES; - goto ErrExit; - } - - bool rx_contiguous_alloc; - PVOID buff_va = nullptr; - PHYSICAL_ADDRESS buff_dma; - - /* Try allocating contigous DMA common buffer */ - status = pkt_buffer[0].create(qdma->dma_enabler, - (desc_ring_capacity * lib_config.data_buf_size)); - if (!NT_SUCCESS(status)) { - rx_contiguous_alloc = false; - no_allocated_rx_common_buffs = desc_ring_capacity; - buff_dma.QuadPart = 0; - } - else { - rx_contiguous_alloc = true; - no_allocated_rx_common_buffs = 1; - buff_va = pkt_buffer[0].get_va(); - buff_dma.QuadPart = pkt_buffer[0].get_dma_addr().QuadPart; - } - - for (UINT32 i = 0; i < desc_ring_capacity; ++i) { - if (true == rx_contiguous_alloc) { - /* Split the contiguous buffer */ - pkt_buffer[i].fill_rx_buff(buff_va, buff_dma); - - buff_va = (PVOID)((UINT8 *)buff_va + lib_config.data_buf_size); - buff_dma.QuadPart = buff_dma.QuadPart + lib_config.data_buf_size; - } - else { - /* Allocate DMA buffers for Rx Ring */ - status = pkt_buffer[i].create(qdma->dma_enabler, lib_config.data_buf_size); - if (!NT_SUCCESS(status)) { - no_allocated_rx_common_buffs = i - 1; - goto ErrExit; - } - } - - /* Fill DMA Address for QDMA Rx Descriptor Ring */ - c2h_desc_ring[i].addr = pkt_buffer[i].get_dma_addr().QuadPart; - } - - status = pkt_frag_queue.create(lib_config.cmpt_ring_sz); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: received pkts init failed: %!STATUS!", qdma->dev_conf.name, status); - goto ErrExit; - } - - pkt_frag_list = static_cast<st_c2h_pkt_fragment*>(qdma_calloc(desc_ring_capacity, - sizeof(st_c2h_pkt_fragment))); - if (nullptr == pkt_frag_list) { - TraceError(TRACE_QDMA, "%s: rx_buffers qdma_calloc failed: %!STATUS!", qdma->dev_conf.name, status); - status = STATUS_INSUFFICIENT_RESOURCES; - goto ErrExit; - } - - return status; -ErrExit: - destroy(); - return status; -} - -void c2h_queue::destroy(void) -{ - desc_ring.destroy(); - - if (lock) { - WdfObjectDelete(lock); - lock = nullptr; - } - - cmpt_ring.destroy(); - is_cmpt_valid = false; - - if (user_conf.is_st) { - if (pkt_buffer) { - TraceVerbose(TRACE_QDMA, "Deleting ST Rx buffer objects"); - - for (UINT32 i = 0u; i < no_allocated_rx_common_buffs; ++i) { - pkt_buffer[i].destroy(); - } - no_allocated_rx_common_buffs = 0; - - qdma_memfree(pkt_buffer); - pkt_buffer = nullptr; - } - - st_c2h_req_tracker.destroy(); - pkt_frag_queue.destroy(); - - if (nullptr != pkt_frag_list) { - qdma_memfree(pkt_frag_list); - pkt_frag_list = nullptr; - } - } - else { - req_tracker.destroy(); - } -} - -INT32 c2h_queue::get_cmpt_ring_index(UINT32* csr_ring_sz_table, UINT32 desc_ring_idx) -{ - UINT32 csr_idx; - - /** Completion Ring size deduction */ - int best_fit_idx = -1; - for (csr_idx = 0; csr_idx < QDMA_GLOBAL_CSR_ARRAY_SZ; csr_idx++) { - /** Check for ring size larger than descriptor ring size (lib_config.ring_sz) */ - if (csr_ring_sz_table[csr_idx] > csr_ring_sz_table[desc_ring_idx]) { - - /** best_fit_index is the index where its size is - * next higher than descriptor ring size - * (should be in one of the CSR ring size registers) - */ - if (best_fit_idx < 0) - best_fit_idx = csr_idx; - else if ((best_fit_idx >= 0) && - (csr_ring_sz_table[csr_idx] < - csr_ring_sz_table[best_fit_idx])) - best_fit_idx = csr_idx; - } - } - - return best_fit_idx; -} - -void c2h_queue::init_csr_c2h_pidx_info(void) -{ - csr_pidx_info.irq_en = lib_config.irq_en; - csr_pidx_info.pidx = 0u; -} - -void c2h_queue::init_csr_cmpt_cidx_info(void) -{ - csr_cmpt_cidx_info.counter_idx = user_conf.c2h_th_cnt_index; - csr_cmpt_cidx_info.irq_en = lib_config.irq_en; - csr_cmpt_cidx_info.timer_idx = user_conf.c2h_timer_cnt_index; - csr_cmpt_cidx_info.trig_mode = static_cast<uint8_t>(user_conf.trig_mode); - csr_cmpt_cidx_info.wrb_en = true; - csr_cmpt_cidx_info.wrb_cidx = 0u; -} - -NTSTATUS dma_req_tracker::create(UINT32 entries) -{ - requests = static_cast<req_ctx *>(qdma_calloc(entries, sizeof(req_ctx))); - if (nullptr == requests) { - return STATUS_INSUFFICIENT_RESOURCES; - } - - return STATUS_SUCCESS; -} - -void dma_req_tracker::destroy() -{ - if (nullptr != requests) { - qdma_memfree(requests); - requests = nullptr; - } -} - -NTSTATUS st_c2h_dma_req_tracker::create(UINT32 entries) -{ - requests = static_cast<st_c2h_req*>(qdma_calloc(entries, sizeof(st_c2h_req))); - if (nullptr == requests) { - return STATUS_INSUFFICIENT_RESOURCES; - } - - NTSTATUS status = WdfSpinLockCreate(WDF_NO_OBJECT_ATTRIBUTES, &lock); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_INTR, "WdfSpinLockCreate failed: %!STATUS!", status); - qdma_memfree(requests); - return status; - } - - capacity = entries; - pidx = cidx = 0u; - - return STATUS_SUCCESS; -} - -void st_c2h_dma_req_tracker::destroy(void) -{ - if (nullptr != requests) { - qdma_memfree(requests); - requests = nullptr; - } - - if (nullptr != lock) { - WdfObjectDelete(lock); - lock = nullptr; - } -} - -NTSTATUS st_c2h_dma_req_tracker::st_push_dma_req(st_c2h_req& req) -{ - WdfSpinLockAcquire(lock); - if (((pidx + 1) % capacity) == cidx) { - WdfSpinLockRelease(lock); - return STATUS_DESTINATION_ELEMENT_FULL; - } - - requests[pidx].len = req.len; - requests[pidx].priv = req.priv; - requests[pidx].st_compl_cb = req.st_compl_cb; - - pidx = (pidx + 1) % capacity; - - WdfSpinLockRelease(lock); - - return STATUS_SUCCESS; -} - -NTSTATUS st_c2h_dma_req_tracker::st_peek_dma_req(st_c2h_req& req) -{ - WdfSpinLockAcquire(lock); - if (pidx == cidx) { - WdfSpinLockRelease(lock); - return STATUS_SOURCE_ELEMENT_EMPTY; - } - WdfSpinLockRelease(lock); - - /* Released the spin above, this call st_peek_dma_req is - designed to use for sequential execution and hence - is not thread safe - */ - - req.len = requests[cidx].len; - req.priv = requests[cidx].priv; - req.st_compl_cb = requests[cidx].st_compl_cb; - - return STATUS_SUCCESS; -} - -NTSTATUS st_c2h_dma_req_tracker::st_pop_dma_req(void) -{ - WdfSpinLockAcquire(lock); - if (pidx == cidx) { - WdfSpinLockRelease(lock); - return STATUS_SOURCE_ELEMENT_EMPTY; - } - WdfSpinLockRelease(lock); - - /* Released the spin above, this call st_peek_dma_req is - designed to use for sequential execution and hence - is not thread safe - */ - requests[cidx].len = 0; - requests[cidx].priv = nullptr; - requests[cidx].st_compl_cb = nullptr; - - cidx = (cidx + 1) % capacity; - return STATUS_SUCCESS; -} - -inline NTSTATUS st_c2h_pkt_buffer::create( - WDFDMAENABLER dma_enabler, - size_t size) -{ - WDF_COMMON_BUFFER_CONFIG common_buff_config; - WDF_COMMON_BUFFER_CONFIG_INIT(&common_buff_config, FILE_64_BYTE_ALIGNMENT); - - NTSTATUS status = WdfCommonBufferCreateWithConfig(dma_enabler, - size, - &common_buff_config, - WDF_NO_OBJECT_ATTRIBUTES, - &rx_buff_common); - - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "WdfCommonBufferCreate failed %!STATUS!", status); - return status; - } - - rx_buff_va = WdfCommonBufferGetAlignedVirtualAddress(rx_buff_common); - rx_buff_dma = WdfCommonBufferGetAlignedLogicalAddress(rx_buff_common); - - RtlZeroMemory(rx_buff_va, size); - - return status; -} - -inline void st_c2h_pkt_buffer::destroy(void) -{ - WdfObjectDelete(rx_buff_common); -} - -inline void st_c2h_pkt_buffer::fill_rx_buff(PVOID buff_va, PHYSICAL_ADDRESS buff_dma) -{ - rx_buff_va = buff_va; - rx_buff_dma = buff_dma; -} - -inline PHYSICAL_ADDRESS st_c2h_pkt_buffer::get_dma_addr(void) -{ - return rx_buff_dma; -} - -inline PVOID st_c2h_pkt_buffer::get_va(void) -{ - return rx_buff_va; -} - -NTSTATUS queue_pair::create( - queue_config& conf) -{ - NTSTATUS status; - - type = conf.is_st ? queue_type::STREAMING : queue_type::MEMORY_MAPPED; - - RtlStringCchPrintfA(name, ARRAYSIZE(name), "%s-%s-%d", - qdma->dev_conf.name, ((conf.is_st) ? "ST" : "MM"), idx); - - /* h2c common buffer */ - status = h2c_q.create(qdma, conf); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s h2c_q.create failed: %!STATUS!", this->name, status); - return status; - } - - /* c2h common buffer */ - status = c2h_q.create(qdma, conf); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s c2h_q.create failed: %!STATUS!", this->name, status); - h2c_q.destroy(); - return status; - } - - return status; -} - -void queue_pair::destroy(void) -{ - h2c_q.destroy(); - c2h_q.destroy(); -} - -void queue_pair::init_csr(void) -{ - if (c2h_q.is_cmpt_valid == true) { - update_sw_index_with_csr_h2c_pidx(0); - update_sw_index_with_csr_wb(0); - update_sw_index_with_csr_c2h_pidx(static_cast<UINT32>(c2h_q.desc_ring.capacity - 1)); - } - else { - update_sw_index_with_csr_h2c_pidx(0); - update_sw_index_with_csr_c2h_pidx(0); - } -} - -PFORCEINLINE void queue_pair::update_sw_index_with_csr_h2c_pidx(UINT32 new_pidx) -{ - TraceVerbose(TRACE_QDMA, "%s-H2C updating h2c pidx to %u", this->name, new_pidx); - - MemoryBarrier(); - h2c_q.desc_ring.sw_index = new_pidx; - h2c_q.csr_pidx_info.pidx = (UINT16)new_pidx; - qdma->hw.qdma_queue_pidx_update(qdma, false /* is_vf */, - idx, false /* is_c2h */, - &h2c_q.csr_pidx_info); -} - -PFORCEINLINE void queue_pair::update_sw_index_with_csr_c2h_pidx(UINT32 new_pidx) -{ - TraceVerbose(TRACE_QDMA, "%s-C2H updating c2h pidx to %u", this->name, new_pidx); - - MemoryBarrier(); - c2h_q.desc_ring.sw_index = new_pidx; - c2h_q.csr_pidx_info.pidx = (UINT16)new_pidx; - qdma->hw.qdma_queue_pidx_update(qdma, false /* is_vf */, - idx, true /* is_c2h */, - &c2h_q.csr_pidx_info); -} - -PFORCEINLINE void queue_pair::update_sw_index_with_csr_wb(UINT32 new_cidx) -{ - TraceVerbose(TRACE_QDMA, "%s-C2H updating wb cidx to %u", this->name, new_cidx); - - c2h_q.cmpt_ring.sw_index = new_cidx; - c2h_q.csr_cmpt_cidx_info.wrb_cidx = (UINT16)new_cidx; - qdma->hw.qdma_queue_cmpt_cidx_update(qdma, false, idx, - &c2h_q.csr_cmpt_cidx_info); -} - -service_status queue_pair::process_mm_request(dma_request* request, size_t* xfer_len) -{ - bool poll; - ring_buffer *desc_ring; - dma_req_tracker *tracker; - ULONG no_of_sub_elem = 0; - UINT32 credits = 0; - ULONG sg_index; - WDF_DMA_DIRECTION direction; - PSCATTER_GATHER_LIST sg_list; - LONGLONG device_offset; - dma_completion_cb compl_cb; - VOID *priv; - poll_operation_entry *poll_entry; - char *dir_name; - service_status status = service_status::SERVICE_CONTINUE; - - /** Validate the parameters */ - if ((request == nullptr) || (xfer_len == NULL)) - return service_status::SERVICE_ERROR; - - /** Read the request parameters */ - direction = request->direction; - sg_list = request->sg_list; - device_offset = (request->device_offset + request->offset_idx); - compl_cb = request->compl_cb; - priv = request->priv; - - if (direction == WdfDmaDirectionWriteToDevice) { - desc_ring = &h2c_q.desc_ring; - tracker = &h2c_q.req_tracker; - poll = !h2c_q.lib_config.irq_en; - poll_entry = h2c_q.poll_entry; - dir_name = (char *)"H2C"; - } - else { - desc_ring = &c2h_q.desc_ring; - tracker = &c2h_q.req_tracker; - poll = !c2h_q.lib_config.irq_en; - poll_entry = c2h_q.poll_entry; - dir_name = (char *)"C2H"; - } - - credits = desc_ring->get_num_free_entries(); - if (credits == 0) { - TraceError(TRACE_QDMA, "%s-%s: No space [%u] in sg dma list", - this->name, dir_name, credits); - return status; - } - - UINT32 ring_idx = desc_ring->sw_index; - bool is_credit_avail = true; - size_t dmaed_len = 0; - - TraceVerbose(TRACE_QDMA, "%s-%s enqueueing %u sg list at ring_index=%u FreeDesc : %u", - this->name, dir_name, (sg_list->NumberOfElements - request->sg_index), ring_idx, credits); - - const auto desc = static_cast<mm_descriptor*>(desc_ring->get_va()); - - for (sg_index = request->sg_index; - ((sg_index < sg_list->NumberOfElements) && (is_credit_avail)); sg_index++) { - - size_t len = 0; - size_t remain_len = sg_list->Elements[sg_index].Length; - size_t frag_len = mm_max_desc_data_len; - - if (sg_list->Elements[sg_index].Length > mm_max_desc_data_len) { - UINT32 frag_cnt = (UINT32)(sg_list->Elements[sg_index].Length / sg_frag_len); - if (sg_list->Elements[sg_index].Length % sg_frag_len) - frag_cnt++; - - if (frag_cnt > credits) { - TraceInfo(TRACE_QDMA, "%s-%s Sufficient credts are not available to fit sg element, " - "frag_cnt : %d, credits : %d\n", this->name, dir_name, frag_cnt, credits); - - break; - } - - frag_len = sg_frag_len; - TraceInfo(TRACE_QDMA, "%s-%s sg_list len > mm_max_desc_data_len(%lld > %lld), " - "splitting at idx: %d", this->name, dir_name, sg_list->Elements[sg_index].Length, - mm_max_desc_data_len, sg_index); - } - - while (remain_len != 0) { - size_t part_len = min(remain_len, frag_len); - - desc[ring_idx].length = part_len; - desc[ring_idx].valid = true; - desc[ring_idx].sop = (sg_index == 0); - desc[ring_idx].eop = (sg_index == (sg_list->NumberOfElements - 1)) && (remain_len == part_len); - - if (direction == WdfDmaDirectionWriteToDevice) { - desc[ring_idx].addr = sg_list->Elements[sg_index].Address.QuadPart + len; - desc[ring_idx].dest_addr = device_offset; - } - else { - desc[ring_idx].addr = device_offset; - desc[ring_idx].dest_addr = sg_list->Elements[sg_index].Address.QuadPart + len; - } - - len = len + part_len; - remain_len = remain_len - part_len; - - device_offset += part_len; - dump(desc[ring_idx]); - - tracker->requests[ring_idx].compl_cb = nullptr; - /** Set Call back function if EOP is SET */ - if (desc[ring_idx].eop == true) { - tracker->requests[ring_idx].compl_cb = (dma_completion_cb)compl_cb; - tracker->requests[ring_idx].priv = priv; - desc[ring_idx].eop = true; - } - - desc_ring->advance_idx(ring_idx); - - no_of_sub_elem++; - /** Descriptor ring boundary checking */ - credits--; - if (credits == 0) { - is_credit_avail = false; - break; - } - } - /** Discard the main element count in sg_list->NumberOfElements */ - no_of_sub_elem--; - dmaed_len += len; - } - - if (sg_index != request->sg_index) { - request->sg_index = sg_index; - request->offset_idx = device_offset - request->device_offset; - - /** When sg_index reaches the end, request forward done */ - if (request->sg_index >= sg_list->NumberOfElements) - status = service_status::SERVICE_FINISHED; - - UINT32 accepted_desc = desc_ring->idx_delta(desc_ring->sw_index, ring_idx); - desc_ring->stats.tot_desc_accepted += accepted_desc; - - *xfer_len = dmaed_len; - - TraceVerbose(TRACE_QDMA, "%s-%s +++ Request added at : %u +++", - this->name, dir_name, (ring_idx - 1)); - TraceVerbose(TRACE_QDMA, "%s-%s MM Accepted Desc : %d", - this->name, dir_name, accepted_desc); - -#ifdef STRESS_TEST - KeStallExecutionProcessor(2); -#endif - - if (direction == WdfDmaDirectionWriteToDevice) { - update_sw_index_with_csr_h2c_pidx(ring_idx); - TraceVerbose(TRACE_QDMA, "%s-%s csr[%u].h2c_dsc_pidx=%u", - this->name, dir_name, idx_abs, ring_idx); - } - else { - update_sw_index_with_csr_c2h_pidx(ring_idx); - TraceVerbose(TRACE_QDMA, "%s-%s csr[%u].c2h_dsc_pidx=%u", - this->name, dir_name, idx_abs, ring_idx); - } - - if (poll) - wakeup_thread(poll_entry->thread); - } - - return status; -} - -service_status queue_pair::process_st_h2c_request(dma_request* request, size_t* xfer_len) -{ - bool poll; - ring_buffer *desc_ring; - dma_req_tracker *tracker; - poll_operation_entry *poll_entry; - ULONG NumberOfElements; - ULONG no_of_sub_elem = 0; - UINT32 credits; - PSCATTER_GATHER_LIST sg_list; - dma_completion_cb compl_cb; - VOID *priv; - ULONG sg_index; - service_status status = service_status::SERVICE_CONTINUE; - - /** Validate the parameters */ - if ((request == nullptr) || (xfer_len == NULL)) - return service_status::SERVICE_ERROR; - - /** ST C2H has different execution flow */ - if (request->direction != WdfDmaDirectionWriteToDevice) - return service_status::SERVICE_ERROR; - - /** Read the request parameters */ - sg_list = request->sg_list; - compl_cb = request->compl_cb; - priv = request->priv; - - desc_ring = &h2c_q.desc_ring; - tracker = &h2c_q.req_tracker; - poll = !h2c_q.lib_config.irq_en; - poll_entry = h2c_q.poll_entry; - NumberOfElements = sg_list->NumberOfElements; - - credits = desc_ring->get_num_free_entries(); - if (credits == 0) { - TraceError(TRACE_QDMA, "%s-H2C: No space [%u] in sg dma list", this->name, credits); - return status; - } - - UINT32 pidx = desc_ring->sw_index; - const auto desc = static_cast<h2c_descriptor *>(desc_ring->get_va()); - bool is_credit_avail = true; - size_t dmaed_len = 0; - - TraceVerbose(TRACE_QDMA, "%s-H2C enqueueing %u sg list at ring_index=%u FreeDesc : %u", - this->name, (NumberOfElements - request->sg_index), pidx, credits); - - for (sg_index = request->sg_index; ((sg_index < NumberOfElements) && (is_credit_avail)); sg_index++) { - size_t len = 0; - size_t remain_len = sg_list->Elements[sg_index].Length; - size_t frag_len = st_max_desc_data_len; - - /* If the SG element length is more than ST supported len, - * then Fragment the SG element into sub SG elements */ - if (sg_list->Elements[sg_index].Length > st_max_desc_data_len) { - UINT32 frag_cnt = (UINT32)(sg_list->Elements[sg_index].Length / sg_frag_len); - if (sg_list->Elements[sg_index].Length % sg_frag_len) - frag_cnt++; - - if (frag_cnt > credits) { - TraceInfo(TRACE_QDMA, "%s-H2C: Sufficient credits are not available to fit sg element, " - "frag_cnt : %d, credits : %d\n", this->name, frag_cnt, credits); - - break; - } - - frag_len = sg_frag_len; - TraceInfo(TRACE_QDMA, "%s-H2C sg_list len > st_max_desc_data_len(%lld > %lld), " - "splitting at idx: %d", this->name, sg_list->Elements[sg_index].Length, - st_max_desc_data_len, sg_index); - } - - /** do while loop is to support ST Zero length packet transfers */ - do { - size_t part_len = min(remain_len, frag_len); - - desc[pidx].addr = sg_list->Elements[sg_index].Address.QuadPart + len; - desc[pidx].length = (UINT16)part_len; - desc[pidx].pld_len = (UINT16)part_len; - desc[pidx].sop = (sg_index == 0); - desc[pidx].eop = (sg_index == (NumberOfElements - 1) && (remain_len == part_len)); - - len = len + part_len; - remain_len = remain_len - part_len; - - dump(desc[pidx]); - - tracker->requests[pidx].compl_cb = nullptr; - /** Set Call back function if EOP is SET */ - if (desc[pidx].eop == true) { - tracker->requests[pidx].compl_cb = (dma_completion_cb)compl_cb; - tracker->requests[pidx].priv = priv; - } - - desc_ring->advance_idx(pidx); - - no_of_sub_elem++; - /** Descriptor ring boundary checking */ - credits--; - if (credits == 0) { - is_credit_avail = false; - break; - } - } while (remain_len != 0); - /** Discard the main element count in sg_list->NumberOfElements */ - no_of_sub_elem--; - dmaed_len += len; - } - - if (sg_index != request->sg_index) { - request->sg_index = sg_index; - - /** When sg_index reaches the end, request forward done */ - if (request->sg_index >= sg_list->NumberOfElements) - status = service_status::SERVICE_FINISHED; - - UINT32 accepted_desc = desc_ring->idx_delta(desc_ring->sw_index, pidx); - desc_ring->stats.tot_desc_accepted += accepted_desc; - - *xfer_len = dmaed_len; - - TraceVerbose(TRACE_QDMA, "%s-H2C +++ Request added at : %u +++", this->name, (pidx - 1)); - TraceVerbose(TRACE_QDMA, "%s-H2C ST Accepted Desc : %d", this->name, accepted_desc); - - update_sw_index_with_csr_h2c_pidx(pidx); - TraceVerbose(TRACE_QDMA, "%s-H2C csr[%u].h2c_dsc_pidx=%u", this->name, idx_abs, pidx); - - if (poll) - wakeup_thread(poll_entry->thread); - - } - return status; -} - -service_status queue_pair::service_mm_st_h2c_completions(ring_buffer *desc_ring, - dma_req_tracker *tracker, UINT32 budget, UINT32 &proc_desc_cnt) -{ - UINT32 old_cidx = desc_ring->hw_index; - UINT32 new_cidx = desc_ring->wb_status->cidx; - UINT32 index; - - /** Complete requests covered by the descriptors in the interval - * [old_cidx, new_cidx] */ - for (index = old_cidx; - ((index != new_cidx) && (budget > 0)); - desc_ring->advance_idx(index), budget--) { - req_ctx &completed_req = tracker->requests[index]; - - if (completed_req.compl_cb != nullptr) { - TraceVerbose(TRACE_QDMA, "%s: --- COMPLETING REQ AT : %u ---", this->name, index); - completed_req.compl_cb(completed_req.priv, STATUS_SUCCESS); - completed_req.compl_cb = nullptr; - completed_req.priv = nullptr; - } - } - - proc_desc_cnt = desc_ring->idx_delta(old_cidx, index); - desc_ring->stats.tot_desc_processed += proc_desc_cnt; - - /* Update stored copy of the ring's consumer index */ - desc_ring->hw_index = index; - - if (index != new_cidx || desc_ring->sw_index != new_cidx) { - /** Ran out of completion budget or still have pending requests. - * In interrupt mode while ISR is running, driver might miss the - * new interrupts. So, check if any pending jobs are for ring to - * continue polling service. - */ - return service_status::SERVICE_CONTINUE; - } - else { - return service_status::SERVICE_FINISHED; - } -} - -NTSTATUS queue_pair::check_cmpt_error(c2h_wb_header_8B *cmpt_data) -{ - NTSTATUS status = STATUS_SUCCESS; - - if (cmpt_data->data_frmt) { - /** - * format = 1 does not have length field, so the driver cannot - * figure out how many descriptor is used - */ - status = STATUS_UNSUCCESSFUL; - } - - if (cmpt_data->desc_error) { - /** - * descriptor has error - */ - status = STATUS_UNSUCCESSFUL; - } - - return status; -} - -PFORCEINLINE void queue_pair::update_c2h_pidx_in_batch(UINT32 processed_desc_cnt) -{ - TraceVerbose(TRACE_QDMA, "%s: Completed desc count qid[%u] : %ld", - this->name, idx_abs, processed_desc_cnt); - if (processed_desc_cnt) { - UINT32 new_pidx = c2h_q.desc_ring.sw_index; - c2h_q.desc_ring.advance_idx(new_pidx, processed_desc_cnt); - update_sw_index_with_csr_c2h_pidx(new_pidx); - } -} - -service_status queue_pair::st_service_c2h_queue(UINT32 budget) -{ - NTSTATUS status; - service_status ret = service_status::SERVICE_FINISHED; - ring_buffer *cmpt_ring = &c2h_q.cmpt_ring; - const auto wb_status = reinterpret_cast<volatile c2h_wb_status*>(cmpt_ring->wb_status); - auto current_pidx = wb_status->pidx; - auto prev_pidx = c2h_q.cmpt_ring.sw_index; - - /* Process WB ring */ - if (prev_pidx != current_pidx) { - TraceVerbose(TRACE_QDMA, "%s: Completion ring sw index : %u hw pidx : %u", this->name, prev_pidx, current_pidx); - dump(*const_cast<c2h_wb_status*>(wb_status)); - - c2h_wb_header_8B *c2h_cmpt_ring_va; - UINT32 wb_desc_shift = (3 + static_cast<size_t>(c2h_q.user_conf.cmpt_sz)); - const auto c2h_cmpt_ring_base_va = static_cast<c2h_wb_header_8B*>(c2h_q.cmpt_ring.get_va()); - - for (; prev_pidx != current_pidx; c2h_q.cmpt_ring.advance_idx(prev_pidx)) { - c2h_cmpt_ring_va = (c2h_wb_header_8B *)((UINT8 *)c2h_cmpt_ring_base_va + ((UINT64)prev_pidx << wb_desc_shift)); - - dump(prev_pidx, *c2h_cmpt_ring_va); - - /** Check completion descriptor for any errors */ - status = check_cmpt_error(c2h_cmpt_ring_va); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: check_cmpt_error returned error", this->name); - return service_status::SERVICE_ERROR; - } - - if (c2h_cmpt_ring_va->desc_used) { - /* Consume the used packet */ - status = process_st_c2h_data_pkt((void *)c2h_cmpt_ring_va, c2h_cmpt_ring_va->length); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: process_st_c2h_data_pkt() failed: %!STATUS!", this->name, status); - break; - } - } - else { - /* If user provides a call back function during queue addition, - * callback function will be called and user can process the UDD data, - * else, data will be discarded - * - * This is UDD_ONLY packets, i.e, data is not associated with this completion - * Data associated UDD packets will be given as part of read requests - */ - if (c2h_q.user_conf.proc_st_udd_cb) - c2h_q.user_conf.proc_st_udd_cb(idx, (void *)c2h_cmpt_ring_va, (void *)qdma); - } - } - - update_sw_index_with_csr_wb(prev_pidx); - } - - /* Process pending ST DMA Requests */ - UINT32 processed_dma_requests = 0; - st_c2h_req req = { 0 }; - UINT32 processed_desc_cnt = 0; - constexpr UINT8 pidx_update_interval = 16; - - /** For ST C2H Queues, budget acts as Upper cut-off for - * the dma requests from user that are pending for completion */ - while (processed_dma_requests < budget) { - status = c2h_q.st_c2h_req_tracker.st_peek_dma_req(req); - if (!NT_SUCCESS(status)) { - /* No more pending requests, Update PIDX and break the loop */ - update_c2h_pidx_in_batch(processed_desc_cnt); - LONG pkt_cnt = c2h_q.pkt_frag_queue.get_avail_frag_cnt(); - if (pkt_cnt) { - TraceVerbose(TRACE_QDMA, "%s: No pending requests. Available Packets : %Iu", this->name, pkt_cnt); - ret = service_status::SERVICE_CONTINUE; - } - break; - } - - if (req.len <= c2h_q.pkt_frag_queue.get_avail_byte_cnt()) { - UINT32 n = 0; - /* For Zero length packets */ - if (req.len == 0) { - status = c2h_q.pkt_frag_queue.consume(c2h_q.pkt_frag_list[n]); - if (!NT_SUCCESS(status)) { - break; - } - n++; - } - else { - size_t length; - for (n = 0u, length = 0u; ((n < c2h_q.desc_ring.get_capacity()) && - (length < req.len)); ++n) { - status = c2h_q.pkt_frag_queue.consume(c2h_q.pkt_frag_list[n]); - if (!NT_SUCCESS(status)) { - break; - } - length += c2h_q.pkt_frag_list[n].length; - } - } - - if (req.st_compl_cb != nullptr) { - req.st_compl_cb(c2h_q.pkt_frag_list, n, req.priv, status); - req.st_compl_cb = nullptr; - } - - c2h_q.st_c2h_req_tracker.st_pop_dma_req(); - ++processed_dma_requests; - processed_desc_cnt += n; - c2h_q.desc_ring.stats.tot_desc_processed += n; - - if (processed_desc_cnt >= pidx_update_interval) { - /* Return ST Buffers to desc ring */ - update_c2h_pidx_in_batch(processed_desc_cnt); - processed_desc_cnt = 0; - } - } - else { - TraceInfo(TRACE_QDMA, "%s: req_len : %lld, rxd_len:%lld", - this->name, req.len, c2h_q.pkt_frag_queue.get_avail_byte_cnt()); - update_c2h_pidx_in_batch(processed_desc_cnt); - ret = service_status::SERVICE_CONTINUE; - break; - } - } - - TraceVerbose(TRACE_QDMA, "%s: Completed Request count : %ld", - this->name, processed_dma_requests); - return ret; -} - -void process_queue_req(queue_pair* queue, WDFSPINLOCK lock, PLIST_ENTRY req_list_head) -{ - PLIST_ENTRY entry; - PLIST_ENTRY temp; - service_status status; - UINT32 req_service_cnt = 0; - size_t xfer_len = 0; - - if ((queue == nullptr) || (lock == nullptr) || (req_list_head == nullptr)) { - TraceError(TRACE_QDMA, "Invalid Parameters : queue : %p, " - "lock : %p, req_list_head : %p", queue, lock, req_list_head); - return; - } - - if (queue->state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state: %d", - queue->name, queue->state); - return; - } - - /** Come out of the loop only - * "when the list is empty" or - * "when there is no room in descriptor ring (!SERVICE_FINISHED)" or - * "when max request service reached" - */ - LIST_FOR_EACH_ENTRY_SAFE(req_list_head, temp, entry) { - dma_request* request = LIST_GET_ENTRY(entry, dma_request, list_entry); - if (queue->type == queue_type::STREAMING) { - status = queue->process_st_h2c_request(request, &xfer_len); - } - else { - status = queue->process_mm_request(request, &xfer_len); - } - switch (status) { - case service_status::SERVICE_CONTINUE: - /** Exit the loop as there is no room in descriptor ring */ - req_service_cnt = max_req_service_cnt; - TraceVerbose(TRACE_QDMA, "%s-%s: Request Split", queue->name, - ((request->direction == WdfDmaDirectionReadFromDevice) ? "C2H" : "H2C")); - break; - - case service_status::SERVICE_FINISHED: - req_service_cnt++; - WdfSpinLockAcquire(lock); - LIST_DEL_NODE(entry); - WdfSpinLockRelease(lock); - qdma_memfree(request); - break; - - case service_status::SERVICE_ERROR: - /** Remove the request from the list, - * Can be NULL pointer or ST C2H packet */ - WdfSpinLockAcquire(lock); - LIST_DEL_NODE(entry); - WdfSpinLockRelease(lock); - - if (request) { - TraceError(TRACE_QDMA, "%s-%s: queue->process_XXX_request() SERVICE_ERROR", - ((request->direction == WdfDmaDirectionReadFromDevice) ? "C2H" : "H2C"), - queue->name); - qdma_memfree(request); - } - break; - default: - TraceError(TRACE_QDMA, "%s-%s: queue->process_XXX_request() " - "invalid return value (0x%X)", queue->name, - ((request->direction == WdfDmaDirectionReadFromDevice)? "C2H" : "H2C"), - static_cast<UINT32>(status)); - break; - } - - if (req_service_cnt >= max_req_service_cnt) { - TraceInfo(TRACE_QDMA, "%s: Max Requests serviced (%d)", queue->name, req_service_cnt); - break; - } - } -} - -void process_mm_h2c_req(void* arg) -{ - queue_pair* queue = static_cast<queue_pair*>(arg); - - process_queue_req(queue, queue->h2c_q.lock, &queue->h2c_q.req_list_head); -} - -void process_mm_c2h_req(void* arg) -{ - queue_pair* queue = static_cast<queue_pair*>(arg); - - process_queue_req(queue, queue->c2h_q.lock, &queue->c2h_q.req_list_head); -} - -void service_h2c_mm_queue(void* arg) -{ - queue_pair *queue = static_cast<queue_pair *>(arg); - UINT32 budget = mm_h2c_completion_weight; - ring_buffer *desc_ring = &queue->h2c_q.desc_ring; - dma_req_tracker *tracker = &queue->h2c_q.req_tracker; - UINT32 proc_desc_cnt = 0; - - service_status status = - queue->service_mm_st_h2c_completions(desc_ring, tracker, budget, proc_desc_cnt); - switch (status) { - case service_status::SERVICE_CONTINUE: - if (proc_desc_cnt != 0) { - TraceVerbose(TRACE_QDMA, "%s: MM H2C [%u] Flag request, " - "proc_desc_cnt:%d", queue->name, queue->idx_abs, proc_desc_cnt); - wakeup_thread(queue->h2c_q.req_proc_entry->thread); - } - wakeup_thread(queue->h2c_q.poll_entry->thread); - break; - case service_status::SERVICE_ERROR: - TraceError(TRACE_QDMA, "%s: MM H2C [%u] service error", queue->name, queue->idx_abs); - break; - case service_status::SERVICE_FINISHED: - wakeup_thread(queue->h2c_q.req_proc_entry->thread); - TraceVerbose(TRACE_QDMA, "%s: ervice_h2c_mm_queue [%u] Completed", queue->name, queue->idx_abs); - default: - break; - } -} - -void service_c2h_mm_queue(void *arg) -{ - queue_pair *queue = static_cast<queue_pair *>(arg); - UINT32 budget = mm_c2h_completion_weight; - ring_buffer* desc_ring = &queue->c2h_q.desc_ring; - dma_req_tracker* tracker = &queue->c2h_q.req_tracker; - UINT32 proc_desc_cnt = 0; - - service_status status = - queue->service_mm_st_h2c_completions(desc_ring, tracker, budget, proc_desc_cnt); - switch (status) { - case service_status::SERVICE_CONTINUE: - if (proc_desc_cnt != 0) { - TraceVerbose(TRACE_QDMA, "%s: MM C2H [%u] Flag request, " - "proc_desc_cnt:%d", queue->name, queue->idx_abs, proc_desc_cnt); - wakeup_thread(queue->c2h_q.req_proc_entry->thread); - } - wakeup_thread(queue->c2h_q.poll_entry->thread); - break; - case service_status::SERVICE_ERROR: - TraceError(TRACE_QDMA, "%s: MM C2H [%u] service error", queue->name, queue->idx_abs); - break; - case service_status::SERVICE_FINISHED: - wakeup_thread(queue->c2h_q.req_proc_entry->thread); - TraceVerbose(TRACE_QDMA, "%s: service_c2h_mm_queue [%u] Completed", queue->name, queue->idx_abs); - default: - break; - } -} - -void process_st_h2c_req(void* arg) -{ - queue_pair* queue = static_cast<queue_pair*>(arg); - - process_queue_req(queue, queue->h2c_q.lock, &queue->h2c_q.req_list_head); -} - -void service_h2c_st_queue(void *arg) -{ - queue_pair *queue = static_cast<queue_pair *>(arg); - UINT32 budget = st_h2c_completion_weight; - ring_buffer* desc_ring = &queue->h2c_q.desc_ring; - dma_req_tracker* tracker = &queue->h2c_q.req_tracker; - UINT32 proc_desc_cnt = 0; - - service_status status = - queue->service_mm_st_h2c_completions(desc_ring, tracker, budget, proc_desc_cnt); - switch (status) { - case service_status::SERVICE_CONTINUE: - if (proc_desc_cnt != 0) { - TraceVerbose(TRACE_QDMA, "%s: ST H2C [%u] Flag request, " - "proc_desc_cnt:%d", queue->name, queue->idx_abs, proc_desc_cnt); - wakeup_thread(queue->h2c_q.req_proc_entry->thread); - } - wakeup_thread(queue->h2c_q.poll_entry->thread); - break; - case service_status::SERVICE_ERROR: - TraceError(TRACE_QDMA, "%s: ST H2C [%u] service error", queue->name, queue->idx_abs); - break; - case service_status::SERVICE_FINISHED: - wakeup_thread(queue->h2c_q.req_proc_entry->thread); - TraceVerbose(TRACE_QDMA, "%s: service_h2c_st_queue [%u] Completed", queue->name, queue->idx_abs); - default: - break; - } -} - -void service_c2h_st_queue(void *arg) -{ - queue_pair *queue = static_cast<queue_pair *>(arg); - UINT32 budget = st_c2h_completion_weight; - service_status status = queue->st_service_c2h_queue(budget); - - switch (status) { - case service_status::SERVICE_CONTINUE: - wakeup_thread(queue->c2h_q.poll_entry->thread); - break; - case service_status::SERVICE_ERROR: - TraceError(TRACE_QDMA, "%s: ST C2H [%u] service error", queue->name, queue->idx_abs); - break; - case service_status::SERVICE_FINISHED: - TraceVerbose(TRACE_QDMA, "%s: service_c2h_st_queue [%u] Completed", queue->name, queue->idx_abs); - default: - break; - } -} - -NTSTATUS queue_pair::enqueue_dma_request(dma_request *request) -{ - WDFSPINLOCK lock; - PLIST_ENTRY req_list_head; - dma_request* req_entry; - poll_operation_entry* req_proc_entry; - char *dir_name; - - if (request == nullptr) - return STATUS_INVALID_PARAMETER; - - /** This function Only Support MM H2C, MM C2H and ST C2H. - * Rule out the unsupported case - */ - if ((request->is_st == true) && - (request->direction != WdfDmaDirectionWriteToDevice)) { - return STATUS_NOT_SUPPORTED; - } - - if (request->direction == WdfDmaDirectionWriteToDevice) { - lock = h2c_q.lock; - req_list_head = &h2c_q.req_list_head; - req_proc_entry = h2c_q.req_proc_entry; - dir_name = (char *)"H2C"; - } - else { - lock = c2h_q.lock; - req_list_head = &c2h_q.req_list_head; - req_proc_entry = c2h_q.req_proc_entry; - dir_name = (char*)"C2H"; - } - - req_entry = static_cast<dma_request*>(qdma_calloc(1, sizeof(dma_request))); - if (req_entry == nullptr) { - TraceError(TRACE_QDMA, "%s: req_entry allocation failed", this->name); - return STATUS_NO_MEMORY; - } - - /** Copy the request details */ - RtlCopyMemory(req_entry, request, sizeof(dma_request)); - - TraceVerbose(TRACE_QDMA, "%s-%s Req Added, Abs Queue: %d, Entry : %p", - this->name, dir_name, idx_abs, - static_cast<void*>(&req_entry->list_entry)); - - /** Add to the request linked list head */ - WdfSpinLockAcquire(lock); - LIST_ADD_TAIL(req_list_head, &req_entry->list_entry); - WdfSpinLockRelease(lock); - - /** Wake up the thread to forward the request to DMA engine */ - wakeup_thread(req_proc_entry->thread); - - return STATUS_SUCCESS; -} - -NTSTATUS queue_pair::enqueue_dma_request( - size_t length, - st_rx_completion_cb compl_cb, - void *priv) -{ - bool poll = !c2h_q.lib_config.irq_en; - st_c2h_req req; - req.len = length; - req.priv = priv; - req.st_compl_cb = compl_cb; - - NTSTATUS status = c2h_q.st_c2h_req_tracker.st_push_dma_req(req); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: Failed to add ST C2H request %!STATUS!", this->name, status); - return status; - } - - if (poll) { - wakeup_thread(c2h_q.poll_entry->thread); - } - - return status; -} - -NTSTATUS queue_pair::process_st_c2h_data_pkt( - void *udd_ptr, - const UINT32 length) -{ - st_c2h_pkt_fragment elem; - UINT32 data_buff_sz = c2h_q.lib_config.data_buf_size; - UINT32 remain_len = length; - auto num_descriptors = (length + data_buff_sz - 1) / data_buff_sz; - auto& c2h_hw_idx = c2h_q.desc_ring.hw_index; - NTSTATUS status = STATUS_SUCCESS; - - /* For Zero Length Packet */ - if (length == 0) { - num_descriptors = 1; - } - - for (UINT32 i = 0; i < num_descriptors; ++i) { - elem.pkt_type = st_c2h_pkt_type::ST_C2H_DATA_PKT; - elem.data = c2h_q.pkt_buffer[c2h_hw_idx].get_va(); - elem.length = min(remain_len, data_buff_sz); - remain_len -= data_buff_sz; - - if (i == (UINT32)0) { - elem.udd_data = udd_ptr; - elem.sop = 1; - elem.eop = 0; - } - else { - elem.udd_data = nullptr; - elem.sop = elem.eop = 0 ; - } - - elem.eop = (i == num_descriptors - 1) ? 1 : 0; - - status = c2h_q.pkt_frag_queue.add(elem); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: add fragment failed: %!STATUS!", this->name, status); - return status; - } - - c2h_q.desc_ring.advance_idx(c2h_hw_idx); - } - - return status; -} - -void queue_pair::cancel_mm_st_h2c_pending_requests( - ring_buffer *desc_ring, - dma_req_tracker *tracker, - WDFSPINLOCK lock) -{ - /** From hw_index to sw_index [all pending requests in queue], - * cancel all the requests for given descriptor ring */ - - /* Acquire spin lock for rundown protection */ - WdfSpinLockAcquire(lock); - for (UINT32 index = desc_ring->hw_index; - index != desc_ring->sw_index; desc_ring->advance_idx(index)) { - if (tracker->requests[index].compl_cb != nullptr) { - dma_completion_cb compl_cb = tracker->requests[index].compl_cb; - compl_cb(tracker->requests[index].priv, STATUS_CANCELLED); - tracker->requests[index].compl_cb = nullptr; - tracker->requests[index].priv = nullptr; - } - } - WdfSpinLockRelease(lock); -} - -void queue_pair::flush_queue(void) -{ - /* Cancel all the pending requests */ - cancel_mm_st_h2c_pending_requests(&h2c_q.desc_ring, &h2c_q.req_tracker, h2c_q.lock); - if (type == queue_type::MEMORY_MAPPED) { - cancel_mm_st_h2c_pending_requests(&c2h_q.desc_ring, &c2h_q.req_tracker, c2h_q.lock); - } - else { - /** Cancelling ST C2H pending requests */ - st_c2h_req req; - while (NT_SUCCESS(c2h_q.st_c2h_req_tracker.st_peek_dma_req(req))) { - if (req.st_compl_cb != nullptr) { - req.st_compl_cb(nullptr, 0, req.priv, STATUS_CANCELLED); - req.st_compl_cb = nullptr; - } - c2h_q.st_c2h_req_tracker.st_pop_dma_req(); - } - } -} - -NTSTATUS queue_pair::read_st_udd_data(void *addr, UINT8 *buf, UINT32 *len) -{ - UINT32 udd_len = (UINT32)get_descriptor_size(c2h_q.user_conf.cmpt_sz); - UINT8 *cmpt = (UINT8 *)addr; - UINT8 loc = 0; - UINT32 index = c2h_q.cmpt_offset; - - if ((nullptr == addr) || (nullptr == buf) || (nullptr == len)) - return STATUS_INVALID_PARAMETER; - - for (loc = 0; index < udd_len; loc++, index++) { - if (loc == 0) { - buf[loc] = cmpt[index] & 0xF0; - } - else { - buf[loc] = cmpt[index]; - } - } - - *len = loc; - - TraceVerbose(TRACE_QDMA, "%s: UDD Len : %u", this->name, loc); - - return STATUS_SUCCESS; -} - -void * queue_pair::get_last_udd_addr(void) -{ - UINT8 *udd_addr = nullptr; - UINT32 udd_len = (UINT32)get_descriptor_size(c2h_q.user_conf.cmpt_sz); - const auto c2h_cmpt_ring_va = static_cast<c2h_wb_header_8B*>(c2h_q.cmpt_ring.get_va()); - - volatile wb_status_base *wb_status = c2h_q.cmpt_ring.wb_status; - UINT16 latest_pidx = wb_status->pidx; - - if (latest_pidx == 0) - latest_pidx = (UINT16)(c2h_q.cmpt_ring.get_capacity() - 1); - else - latest_pidx = latest_pidx - 1; - - udd_addr = (UINT8 *)c2h_cmpt_ring_va + ((UINT64)latest_pidx * udd_len); - - return udd_addr; -} - -NTSTATUS queue_pair::desc_dump(qdma_desc_info *desc_info) -{ - size_t desc_sz; - size_t desc_len; - size_t len; - size_t buf_idx; - ring_buffer *desc_ring; - UINT8 *desc_buff_addr; - UINT8 *buf = desc_info->pbuffer; - size_t buff_sz = desc_info->buffer_sz; - WDFSPINLOCK lock; - - - if (desc_info->desc_type == qdma_desc_type::CMPT_DESCRIPTOR) { - if (c2h_q.is_cmpt_valid == true) { - desc_ring = &c2h_q.cmpt_ring; - desc_sz = (size_t)c2h_q.user_conf.cmpt_sz; - lock = c2h_q.lock; - } - else { - TraceError(TRACE_QDMA, "%s: MM CMPT is not valid, HW MM CMPT EN : %d, SW MM CMPT EN : %d\n", - this->name, qdma->dev_conf.dev_info.mm_cmpt_en, c2h_q.user_conf.en_mm_cmpl); - return STATUS_NOT_SUPPORTED; - } - } - else { - if (desc_info->dir == qdma_queue_dir::QDMA_QUEUE_DIR_H2C) { - desc_ring = &h2c_q.desc_ring; - desc_sz = static_cast<size_t>(h2c_q.lib_config.desc_sz); - lock = h2c_q.lock; - } - else { - desc_ring = &c2h_q.desc_ring; - desc_sz = static_cast<size_t>(c2h_q.lib_config.desc_sz); - lock = c2h_q.lock; - } - } - - if ((desc_info->desc_start > desc_ring->get_capacity()) || - (desc_info->desc_end > desc_ring->get_capacity())) { - TraceError(TRACE_QDMA, "%s: Descriptor Range is incorrect : start : %d, end : %d, RING SIZE : %d", - this->name, desc_info->desc_start, desc_info->desc_end, desc_ring->get_capacity()); - return STATUS_ACCESS_VIOLATION; - } - - desc_len = (static_cast<size_t>(1) << (3 + desc_sz)); - - desc_info->desc_sz = desc_len; - - /** This lock is to prevent queue stop/delete operations when descriptor - * data is captured. There is no guarantee that the descriptor data - * won't change (Ex: completion entries are filled by HW). - * - * This will grab instantaneous information present in the descriptors - */ - WdfSpinLockAcquire(lock); - if (desc_info->desc_start <= desc_info->desc_end) { - len = ((size_t)desc_info->desc_end - (size_t)desc_info->desc_start + 1) * desc_len; - if (buff_sz < len) { - WdfSpinLockRelease(lock); - return STATUS_BUFFER_TOO_SMALL; - } - - buf_idx = desc_info->desc_start * desc_len; - desc_buff_addr = &((UINT8 *)desc_ring->get_va())[buf_idx]; - RtlCopyMemory(buf, desc_buff_addr, len); - desc_info->data_sz = len; - } - else { - len = ((size_t)desc_ring->get_capacity() - (size_t)desc_info->desc_start + 1) * desc_len; - if (buff_sz < len) { - WdfSpinLockRelease(lock); - return STATUS_BUFFER_TOO_SMALL; - } - - buf_idx = desc_info->desc_start * desc_len; - desc_buff_addr = &((UINT8 *)desc_ring->get_va())[buf_idx]; - RtlCopyMemory(buf, desc_buff_addr, len); - desc_info->data_sz = len; - - size_t remain_len = ((size_t)desc_info->desc_end + 1) * desc_len; - if ((buff_sz - len) < remain_len) { - WdfSpinLockRelease(lock); - return STATUS_BUFFER_TOO_SMALL; - } - - desc_buff_addr = &((UINT8 *)desc_ring->get_va())[0]; - RtlCopyMemory(&buf[desc_info->data_sz], desc_buff_addr, len); - desc_info->data_sz += len; - } - WdfSpinLockRelease(lock); - - return STATUS_SUCCESS; -} - -NTSTATUS queue_pair::read_mm_cmpt_data(qdma_cmpt_info *cmpt_info) -{ - if (type != queue_type::MEMORY_MAPPED) { - TraceError(TRACE_QDMA, "%s: read_mm_cmpt_data supported only for MM queues", this->name); - return STATUS_NOT_SUPPORTED; - } - - if (!c2h_q.is_cmpt_valid) { - TraceError(TRACE_QDMA, "%s: MM Completion is not enabled, " - "HW En Status : %d, SW En Status : %d", this->name, - qdma->dev_conf.dev_info.mm_cmpt_en, c2h_q.user_conf.en_mm_cmpl); - - return STATUS_NOT_CAPABLE; - } - - WdfSpinLockAcquire(c2h_q.lock); - const auto wb_status = reinterpret_cast<volatile c2h_wb_status*>(c2h_q.cmpt_ring.wb_status); - auto prev_pidx = c2h_q.cmpt_ring.sw_index; - auto current_pidx = wb_status->pidx; - - if (prev_pidx == current_pidx) { - TraceError(TRACE_QDMA, "%s: No Completion data available : " - "Prev PIDX : %d, Pres PIDX : %d", this->name, prev_pidx, current_pidx); - WdfSpinLockRelease(c2h_q.lock); - return STATUS_SOURCE_ELEMENT_EMPTY; - } - - UINT8 *dest_buff = cmpt_info->pbuffer; - size_t index = 0; - const UINT8 *src_buff = static_cast<UINT8 *>(c2h_q.cmpt_ring.get_va()); - size_t desc_sz = get_descriptor_size(c2h_q.user_conf.cmpt_sz);; - - for (; prev_pidx != current_pidx; c2h_q.cmpt_ring.advance_idx(prev_pidx)) { - - if ((index >= cmpt_info->buffer_len) || ((index + desc_sz) > cmpt_info->buffer_len)) { - break; - } - - memcpy_s(&dest_buff[index], (cmpt_info->buffer_len - index), &src_buff[prev_pidx * desc_sz], desc_sz); - /** The first 4 bits are example design specific and - * which contains Err, color, two user logic bits. - * - * Its the user design choice on the format of the completion data and - * This part of the code is to demonstrate the MM CMPT functionality - */ - dest_buff[index] = dest_buff[index] & 0xF0; - index = index + desc_sz; - } - - cmpt_info->ret_len = index; - cmpt_info->cmpt_desc_sz = desc_sz; - - update_sw_index_with_csr_wb(prev_pidx); - - WdfSpinLockRelease(c2h_q.lock); - - return STATUS_SUCCESS; -} - -//======================= indirect programming ==================================================== - -NTSTATUS qdma_device::clear_queue_contexts(bool is_c2h, UINT16 qid, qdma_hw_access_type context_op) const -{ - const bool irq_enable = (drv_conf.operation_mode == queue_op_mode::POLL_MODE) ? false : true; - int ret = hw.qdma_sw_ctx_conf((void *)this, is_c2h, qid, nullptr, context_op); - if (ret < 0) - return hw.qdma_get_error_code(ret); - - ret = hw.qdma_hw_ctx_conf((void *)this, is_c2h, qid, nullptr, context_op); - if (ret < 0) - return hw.qdma_get_error_code(ret); - - ret = hw.qdma_credit_ctx_conf((void *)this, is_c2h, qid, nullptr, context_op); - if (ret < 0) - return hw.qdma_get_error_code(ret); - - if ((nullptr != hw.qdma_qid2vec_conf) && irq_enable) { - /** Versal Hard IP supports explicit qid2vec context programming. - * For other versions, vector Id is accommodated in software context. - */ - ret = hw.qdma_qid2vec_conf((void *)this, is_c2h, qid, nullptr, context_op); - if (ret < 0) { - return hw.qdma_get_error_code(ret); - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::clear_cmpt_contexts(UINT16 qid, qdma_hw_access_type context_op) const -{ - int ret = hw.qdma_cmpt_ctx_conf((void *)this, qid, nullptr, context_op); - if (ret < 0) - return hw.qdma_get_error_code(ret); - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::clear_pfetch_contexts(UINT16 qid, qdma_hw_access_type context_op) const -{ - int ret = hw.qdma_pfetch_ctx_conf((void *)this, qid, nullptr, context_op); - if (ret < 0) - return hw.qdma_get_error_code(ret); - - return STATUS_SUCCESS; -} - - -NTSTATUS qdma_device::clear_contexts(queue_pair& q, bool invalidate) const -{ - auto idx_abs = q.idx_abs; - qdma_hw_access_type context_op = (invalidate == true) ? QDMA_HW_ACCESS_INVALIDATE : QDMA_HW_ACCESS_CLEAR; - - /* Clear/Invalidate H2C contexts */ - NTSTATUS status = clear_queue_contexts(false, idx_abs, context_op); - if (!NT_SUCCESS(status)) { - return status; - } - - /* Clear/Invalidate C2H contexts */ - status = clear_queue_contexts(true, idx_abs, context_op); - if (!NT_SUCCESS(status)) { - return status; - } - - /** - * clear Completion context when completion ring is valid for the queue - */ - if(q.c2h_q.is_cmpt_valid == true) { - status = clear_cmpt_contexts(idx_abs, context_op); - if (!NT_SUCCESS(status)) { - return status; - } - } - - /** - * Clear Prefetch context if queue is added in streaming mode - */ - if (q.c2h_q.user_conf.is_st) { - status = clear_pfetch_contexts(idx_abs, context_op); - if (!NT_SUCCESS(status)) { - return status; - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::set_h2c_ctx( - queue_pair& q) -{ - int ret; - - TraceVerbose(TRACE_QDMA, "%s setting h2c contexts...", q.name); - - const bool irq_enable = (drv_conf.operation_mode == queue_op_mode::POLL_MODE) ? false : true; - - if (irq_enable) - TraceVerbose(TRACE_QDMA, "%s Programming with IRQ", q.name); - - qdma_descq_sw_ctxt sw_ctx = {}; - - sw_ctx.pidx = 0; - sw_ctx.qen = true; - sw_ctx.frcd_en = false; - sw_ctx.wbi_chk = true; - sw_ctx.wbi_intvl_en = true; - sw_ctx.fnc_id = dev_conf.dev_sbdf.sbdf.fun_no; - sw_ctx.rngsz_idx = q.h2c_q.user_conf.h2c_ring_sz_index; - sw_ctx.bypass = q.h2c_q.user_conf.desc_bypass_en; - sw_ctx.mm_chn = 0; - sw_ctx.wbk_en = true; - sw_ctx.irq_en = irq_enable; - sw_ctx.is_mm = q.type == queue_type::MEMORY_MAPPED ? 1 : 0; - sw_ctx.desc_sz = (UINT8)q.h2c_q.lib_config.desc_sz; - sw_ctx.at = 0; - sw_ctx.ring_bs_addr = WdfCommonBufferGetAlignedLogicalAddress(q.h2c_q.desc_ring.buffer).QuadPart; - - if (irq_enable) { - sw_ctx.vec = (UINT16)q.h2c_q.lib_config.vector_id; - sw_ctx.intr_aggr = (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) ? true : false; - } - - ret = hw.qdma_sw_ctx_conf((void *)this, false, q.idx_abs, &sw_ctx, QDMA_HW_ACCESS_WRITE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to program H2C Software context! ret : %d", q.name, ret); - return hw.qdma_get_error_code(ret); - } - - if ((nullptr != hw.qdma_qid2vec_conf) && irq_enable) { - /** Versal Hard IP supports explicit qid2vec context programming. - * For other versions, vector Id is accommodated in software context. - */ - qdma_qid2vec intr_ctx = {}; - intr_ctx.h2c_vector = (UINT8)q.h2c_q.lib_config.vector_id; - intr_ctx.h2c_en_coal = (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) ? true : false; - - ret = hw.qdma_qid2vec_conf((void *)this, false, q.idx_abs, &intr_ctx, QDMA_HW_ACCESS_WRITE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to program qid2vec context! ret : %d", q.name, ret); - clear_queue_contexts(false, q.idx_abs, QDMA_HW_ACCESS_CLEAR); - return hw.qdma_get_error_code(ret); - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::set_c2h_ctx( - queue_pair& q) -{ - int ret; - NTSTATUS status = STATUS_SUCCESS; - - TraceVerbose(TRACE_QDMA, "%s setting c2h contexts...", q.name); - - const bool irq_enable = (drv_conf.operation_mode == queue_op_mode::POLL_MODE) ? false : true; - - if (irq_enable) - TraceVerbose(TRACE_QDMA, "%s Programming with IRQ", q.name); - - qdma_descq_sw_ctxt sw_ctx = {}; - - sw_ctx.pidx = 0; - sw_ctx.qen = true; - sw_ctx.frcd_en = false; - sw_ctx.wbi_chk = true; - sw_ctx.wbi_intvl_en = false; - sw_ctx.fnc_id = dev_conf.dev_sbdf.sbdf.fun_no; - sw_ctx.rngsz_idx = q.c2h_q.user_conf.c2h_ring_sz_index; - sw_ctx.bypass = q.c2h_q.user_conf.desc_bypass_en; - sw_ctx.wbk_en = true; - sw_ctx.irq_en = irq_enable; - sw_ctx.is_mm = q.type == queue_type::MEMORY_MAPPED ? 1 : 0; - sw_ctx.desc_sz = (UINT8)q.c2h_q.lib_config.desc_sz; - sw_ctx.at = 0; - sw_ctx.ring_bs_addr = WdfCommonBufferGetAlignedLogicalAddress(q.c2h_q.desc_ring.buffer).QuadPart; - - if (q.type == queue_type::STREAMING) { - sw_ctx.frcd_en = true; - } - - if (irq_enable) { - sw_ctx.vec = (UINT16)q.c2h_q.lib_config.vector_id; - sw_ctx.intr_aggr = (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) ? true : false; - } - - ret = hw.qdma_sw_ctx_conf((void *)this, true, q.idx_abs, &sw_ctx, QDMA_HW_ACCESS_WRITE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to program C2H Software context! ret : %d", q.name, ret); - return hw.qdma_get_error_code(ret); - } - - if ((nullptr != hw.qdma_qid2vec_conf) && irq_enable) { - /** Versal Hard IP supports explicit qid2vec context programming. - * For other versions, vector Id is accommodated in software context. - */ - qdma_qid2vec intr_ctx = {}; - intr_ctx.c2h_vector = (UINT8)q.c2h_q.lib_config.vector_id; - intr_ctx.c2h_en_coal = (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) ? true : false; - - ret = hw.qdma_qid2vec_conf((void *)this, true, q.idx_abs, &intr_ctx, QDMA_HW_ACCESS_WRITE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to program qid2vec context!, ret : %d", q.name, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - } - - /* CMPT context programming */ - if (q.c2h_q.is_cmpt_valid == true) { - qdma_descq_cmpt_ctxt cmp_ctx = {}; - cmp_ctx.en_stat_desc = true; - cmp_ctx.en_int = irq_enable; - cmp_ctx.trig_mode = (uint8_t)q.c2h_q.user_conf.trig_mode; - cmp_ctx.fnc_id = dev_conf.dev_sbdf.sbdf.fun_no; - cmp_ctx.counter_idx = q.c2h_q.user_conf.c2h_th_cnt_index; - cmp_ctx.timer_idx = q.c2h_q.user_conf.c2h_timer_cnt_index; - cmp_ctx.ringsz_idx = (UINT8)q.c2h_q.lib_config.cmpt_ring_id; - cmp_ctx.ovf_chk_dis = q.c2h_q.user_conf.cmpl_ovf_dis; - cmp_ctx.color = 1; - cmp_ctx.pidx = 0; - cmp_ctx.valid = true; - cmp_ctx.full_upd = false; - cmp_ctx.desc_sz = (uint8_t)q.c2h_q.user_conf.cmpt_sz; - cmp_ctx.bs_addr = WdfCommonBufferGetAlignedLogicalAddress(q.c2h_q.cmpt_ring.buffer).QuadPart; - - if (irq_enable) { - cmp_ctx.vec = (UINT16)q.c2h_q.lib_config.vector_id; - cmp_ctx.int_aggr = (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) ? true : false; - } - - ret = hw.qdma_cmpt_ctx_conf((void *)this, q.idx_abs, &cmp_ctx, QDMA_HW_ACCESS_WRITE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to program completion context! ret : %d", q.name, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - } - - /* Pre-fetch context programming */ - if (q.type == queue_type::STREAMING) { - qdma_descq_prefetch_ctxt pf_ctx = {}; - pf_ctx.bufsz_idx = q.c2h_q.user_conf.c2h_buff_sz_index; - pf_ctx.valid = true; - pf_ctx.pfch_en = q.c2h_q.user_conf.pfch_en; - pf_ctx.bypass = q.c2h_q.user_conf.pfch_bypass_en; - - ret = hw.qdma_pfetch_ctx_conf((void *)this, q.idx_abs, &pf_ctx, QDMA_HW_ACCESS_WRITE); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to program prefetch context!, ret : %d", q.name, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - } - - return STATUS_SUCCESS; - -ErrExit: - clear_queue_contexts(true, q.idx_abs, QDMA_HW_ACCESS_CLEAR); - - if (q.c2h_q.is_cmpt_valid == true) { - clear_cmpt_contexts(q.idx_abs, QDMA_HW_ACCESS_CLEAR); - } - - if (q.type == queue_type::STREAMING) { - clear_pfetch_contexts(q.idx_abs, QDMA_HW_ACCESS_CLEAR); - } - - return status; -} - -NTSTATUS qdma_device::queue_program( - queue_pair& q) -{ - TraceVerbose(TRACE_QDMA, "%s programming...", q.name); - - auto status = set_h2c_ctx(q); - if (!NT_SUCCESS(status)) { - return status; - } - - status = set_c2h_ctx(q); - if (!NT_SUCCESS(status)) { - /* Clear H2C queue contexts */ - clear_queue_contexts(false, q.idx_abs, QDMA_HW_ACCESS_CLEAR); - return status; - } - - return status; -} - -/* ---------- public qdma member function implemenations ---------- */ - -NTSTATUS qdma_device::init(qdma_drv_config conf) -{ - NTSTATUS status; - - TraceInfo(TRACE_QDMA, "Xilinx QDMA PF Reference Driver v%u.%u.%u", - qdma_version.major, qdma_version.minor, qdma_version.patch); - - InterlockedExchange(&qdma_device_state, device_state::DEVICE_INIT); - - drv_conf = conf; - status = WdfSpinLockCreate(WDF_NO_OBJECT_ATTRIBUTES, ®ister_access_lock); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "Register access lock creation failed!"); - return status; - } - - return STATUS_SUCCESS; -} - -ULONG qdma_device::qdma_conf_reg_read(size_t offset) -{ - return pcie.conf_reg_read(offset); -} - -void qdma_device::qdma_conf_reg_write(size_t offset, ULONG data) -{ - pcie.conf_reg_write(offset, data); -} - -NTSTATUS qdma_device::read_bar( - qdma_bar_type bar_type, - size_t offset, - void* data, - size_t size) -{ - return pcie.read_bar(bar_type, offset, data, size); -} - -NTSTATUS qdma_device::write_bar( - qdma_bar_type bar_type, - size_t offset, - void* data, - size_t size) -{ - return pcie.write_bar(bar_type, offset, data, size); -} - -NTSTATUS qdma_device::get_bar_info( - qdma_bar_type bar_type, - PVOID &bar_base, - size_t &bar_length) -{ - return pcie.get_bar_info(bar_type, bar_base, bar_length); -} - -NTSTATUS qdma_device::qdma_is_queue_in_range(UINT16 qid) -{ - if (qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Provided qid : %u is more than allocated : %u", dev_conf.name, qid, drv_conf.qsets_max); - return STATUS_INVALID_PARAMETER; - } - - return STATUS_SUCCESS; -} - -_IRQL_requires_(PASSIVE_LEVEL) -NTSTATUS qdma_device::qdma_get_queues_state( - _In_ UINT16 qid, - _Out_ enum queue_state *qstate, - _Out_writes_(str_maxlen) CHAR *str, - _In_ size_t str_maxlen) -{ - NTSTATUS status = STATUS_SUCCESS; - - if (qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, qid); - return STATUS_INVALID_PARAMETER; - } - if (qstate == NULL) { - TraceError(TRACE_QDMA, "%s: qstate is NULL", dev_conf.name); - return STATUS_INVALID_PARAMETER; - } - - switch (queue_pairs[qid].state) { - case queue_state::QUEUE_ADDED: - *qstate = queue_state::QUEUE_ADDED; - if (str != NULL) - status = RtlStringCchCopyA(str, str_maxlen, "QUEUE ADDED"); - break; - case queue_state::QUEUE_STARTED: - *qstate = queue_state::QUEUE_STARTED; - if (str != NULL) - status = RtlStringCchCopyA(str, str_maxlen, "QUEUE ACTIVE"); - break; - case queue_state::QUEUE_AVAILABLE: - *qstate = queue_state::QUEUE_AVAILABLE; - if (str != NULL) - status = RtlStringCchCopyA(str, str_maxlen, "QUEUE IS AVAILABLE"); - break; - case queue_state::QUEUE_BUSY: - *qstate = queue_state::QUEUE_BUSY; - if (str != NULL) - status = RtlStringCchCopyA(str, str_maxlen, "QUEUE BUSY"); - break; - default: - NT_ASSERT(FALSE); - *qstate = queue_state::QUEUE_INVALID_STATE; - if (str != NULL) - status = RtlStringCchCopyA(str, str_maxlen, "<INVALID>"); - break; - } - - return status; -} - -NTSTATUS qdma_device::qdma_set_qmax(UINT32 queue_max) -{ - INT32 queue_base = -1; - NTSTATUS status = STATUS_SUCCESS; - - LONG state = InterlockedCompareExchange(&qdma_device_state, - device_state::DEVICE_OFFLINE, - device_state::DEVICE_ONLINE); - if (state == device_state::DEVICE_OFFLINE) { - TraceError(TRACE_QDMA, "%s: Device OFFLINE, Can't proceed.", dev_conf.name); - return STATUS_UNSUCCESSFUL; - } - - UINT32 active_queues = qdma_get_active_queue_count(dma_dev_index); - if (active_queues) { - TraceError(TRACE_QDMA, "%s: Not possible to update qmax, %u queues are active", - dev_conf.name, active_queues); - status = STATUS_INVALID_PARAMETER; - goto ErrExit; - } - - int rv = qdma_dev_update(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no, queue_max, &queue_base); - if (rv < 0) { - TraceError(TRACE_QDMA, "%s: qdma_dev_update() Failed! %d", dev_conf.name, rv); - status = hw.qdma_get_error_code(rv); - goto ErrExit; - } - - rv = qdma_dev_qinfo_get(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no, &queue_base, &queue_max); - if (rv < 0) { - TraceError(TRACE_QDMA, "%s: qdma_dev_qinfo_get() Failed! %d", dev_conf.name, rv); - status = hw.qdma_get_error_code(rv); - goto ErrExit; - } - - TraceInfo(TRACE_QDMA, "%s: qmax updated. Old qmax : %u, New qmax : %u, " - "Old qbase : %d, New qbase : %d", - dev_conf.name, drv_conf.qsets_max, queue_max, qbase, queue_base); - - drv_conf.qsets_max = queue_max; - qbase = queue_base; - - if (queue_pairs) { - qdma_memfree(queue_pairs); - queue_pairs = nullptr; - } - - status = init_dma_queues(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_dma_queues() failed! %!STATUS!", dev_conf.name, status); - drv_conf.qsets_max = 0u; - qbase = -1; - } - - status = init_func(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_func() failed! %!STATUS!", dev_conf.name, status); - return status; - } - -ErrExit: - InterlockedExchange(&qdma_device_state, device_state::DEVICE_ONLINE); - return status; -} - -NTSTATUS qdma_device::validate_qconfig(queue_config& conf) -{ - /** check if the requested mode is enabled? - * the request modes are read from the HW. - * before serving any request, first check if the - * HW has the capability or not, else return error - */ - - if ((conf.is_st && !dev_conf.dev_info.st_en) || - (!conf.is_st && !dev_conf.dev_info.mm_en)) { - TraceError(TRACE_QDMA, "%s: %s mode is not enabled in device", - dev_conf.name, (conf.is_st ? "ST" : "MM")); - return STATUS_INVALID_PARAMETER; - } - - - if ((hw_version_info.ip_type == EQDMA_SOFT_IP) && - (hw_version_info.vivado_release >= QDMA_VIVADO_2020_2)) { - - if (dev_conf.dev_info.desc_eng_mode == QDMA_DESC_ENG_BYPASS_ONLY) { - TraceError(TRACE_QDMA, "Bypass only mode design is not supported"); - return STATUS_NOT_SUPPORTED; - } - - if ((conf.desc_bypass_en == true) && - (dev_conf.dev_info.desc_eng_mode == QDMA_DESC_ENG_INTERNAL_ONLY)) { - TraceError(TRACE_QDMA, - "Queue config in bypass " - "mode not supported on internal only mode design"); - return STATUS_NOT_SUPPORTED; - } - } - - - if ((conf.h2c_ring_sz_index >= QDMA_GLBL_CSR_REG_CNT) || - (conf.c2h_ring_sz_index >= QDMA_GLBL_CSR_REG_CNT) || - (conf.c2h_buff_sz_index >= QDMA_GLBL_CSR_REG_CNT) || - (conf.c2h_th_cnt_index >= QDMA_GLBL_CSR_REG_CNT) || - (conf.c2h_timer_cnt_index >= QDMA_GLBL_CSR_REG_CNT)) { - TraceError(TRACE_QDMA, "%s: One or more invalid global CSR indexes provided", dev_conf.name); - return STATUS_INVALID_PARAMETER; - } - - if (conf.cmpt_sz >= qdma_desc_sz::QDMA_DESC_SZ_MAX) { - TraceError(TRACE_QDMA, "%s: Invalid completion descriptor size provided", dev_conf.name); - return STATUS_INVALID_PARAMETER; - } - - if (conf.trig_mode >= qdma_trig_mode::QDMA_TRIG_MODE_MAX) { - TraceError(TRACE_QDMA, "%s: Invalid Trigger mode provided", dev_conf.name); - return STATUS_INVALID_PARAMETER; - } - - if ((conf.en_mm_cmpl) && (!dev_conf.dev_info.mm_cmpt_en)) { - TraceError(TRACE_QDMA, "%s: MM Completion not supported in HW", dev_conf.name); - return STATUS_NOT_SUPPORTED; - } - - if ((conf.cmpl_ovf_dis) && (!dev_conf.dev_info.cmpt_ovf_chk_dis)) { - TraceError(TRACE_QDMA, "%s: Completion overflow disable option not supported in HW", dev_conf.name); - return STATUS_NOT_SUPPORTED; - } - - if (hw_version_info.ip_type == QDMA_VERSAL_HARD_IP) { - /** 64B Descriptors not supportd for the versal hard IP (i.e., s80 device) */ - if ((conf.sw_desc_sz == static_cast<UINT8>(qdma_desc_sz::QDMA_DESC_SZ_64B)) || - (conf.cmpt_sz == qdma_desc_sz::QDMA_DESC_SZ_64B)) { - TraceError(TRACE_QDMA, "%s: 64B Descriptor not supported for Versal Hard IP(S80)", dev_conf.name); - return STATUS_NOT_SUPPORTED; - } - - if ((conf.trig_mode == qdma_trig_mode::QDMA_TRIG_MODE_USER_TIMER_COUNT) || - (conf.trig_mode == qdma_trig_mode::QDMA_TRIG_MODE_USER_COUNT)) { - TraceError(TRACE_QDMA, "%s: Counter, Timer+Counter modes are not supported for Versal Hard IP(S80)", dev_conf.name); - return STATUS_NOT_SUPPORTED; - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_add_queue(UINT16 qid, queue_config& conf) -{ - if (qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, qid); - return STATUS_INVALID_PARAMETER; - } - - NTSTATUS status = validate_qconfig(conf); - if (!NT_SUCCESS(status)) - return status; - - auto& q = queue_pairs[qid]; - - auto old_state = InterlockedCompareExchange(&q.state, - queue_state::QUEUE_BUSY, - queue_state::QUEUE_AVAILABLE); - if (old_state != queue_state::QUEUE_AVAILABLE) { - TraceError(TRACE_QDMA, "%s : Queue %u is not available, q_state %d!", dev_conf.name, qid, q.state); - return STATUS_UNSUCCESSFUL; - } - - TraceVerbose(TRACE_QDMA, "%s: Adding the queue : %u", dev_conf.name, qid); - - status = q.create(conf); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: Failed to allocate resource for queue %u, status: %!STATUS!", dev_conf.name, qid, status); - goto ErrExit; - } - - /* Increament resource manager active queue count */ - inc_queue_pair_count(q.c2h_q.is_cmpt_valid); - - InterlockedExchange(&q.state, queue_state::QUEUE_ADDED); - - TraceInfo(TRACE_QDMA, "%s: queue added : %s", dev_conf.name, q.name); - - return status; - -ErrExit: - InterlockedExchange(&q.state, queue_state::QUEUE_AVAILABLE); - return status; -} - -NTSTATUS qdma_device::qdma_start_queue(UINT16 qid) -{ - if (qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, qid); - return STATUS_INVALID_PARAMETER; - } - - auto& q = queue_pairs[qid]; - - auto old_state = InterlockedCompareExchange(&q.state, - queue_state::QUEUE_BUSY, - queue_state::QUEUE_ADDED); - if (old_state != queue_state::QUEUE_ADDED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_UNSUCCESSFUL; - } - - TraceVerbose(TRACE_QDMA, "%s: Starting the queue : %u", dev_conf.name, qid); - - bool is_intr_vec_allocated = false; - NTSTATUS status = STATUS_SUCCESS; - - if (drv_conf.operation_mode != queue_op_mode::POLL_MODE) { - auto vec = assign_interrupt_vector(q); - if (vec < 0) { - TraceError(TRACE_QDMA, "%s Failed to assign interrupt vector", q.name); - status = STATUS_UNSUCCESSFUL; - goto ErrExit; - } - - q.h2c_q.lib_config.vector_id = q.c2h_q.lib_config.vector_id = vec; - is_intr_vec_allocated = true; - - TraceInfo(TRACE_QDMA, "%s Allocated vector Id : %u", q.name, q.c2h_q.lib_config.vector_id); - } - - /* H2C request process function registration */ - poll_op req_op; - bool is_st = q.h2c_q.user_conf.is_st; - req_op.fn = is_st ? process_st_h2c_req : process_mm_h2c_req; - req_op.arg = &queue_pairs[qid]; - - q.h2c_q.req_proc_entry = th_mgr.register_poll_function(req_op); - if (nullptr == q.h2c_q.req_proc_entry) { - TraceError(TRACE_QDMA, "%s Failed to register H2C request process method", q.name); - status = STATUS_UNSUCCESSFUL; - goto ErrExit; - } - - /* C2H request process function registration */ - is_st = q.c2h_q.user_conf.is_st; - if (is_st == false) { - req_op.fn = process_mm_c2h_req; - - q.c2h_q.req_proc_entry = th_mgr.register_poll_function(req_op); - if (nullptr == q.c2h_q.req_proc_entry) { - TraceError(TRACE_QDMA, "%s Failed to register C2H request process method", q.name); - status = STATUS_UNSUCCESSFUL; - goto ErrExit; - } - } - - /* H2C Poll function registration */ - poll_op compl_op; - is_st = q.h2c_q.user_conf.is_st; - compl_op.fn = is_st ? service_h2c_st_queue : service_h2c_mm_queue; - compl_op.arg = &queue_pairs[qid]; - - q.h2c_q.poll_entry = th_mgr.register_poll_function(compl_op); - if (nullptr == q.h2c_q.poll_entry) { - TraceError(TRACE_QDMA, "%s Failed to register H2C Completion poll method", q.name); - status = STATUS_UNSUCCESSFUL; - goto ErrExit; - } - - /* C2H Poll function registration */ - is_st = q.c2h_q.user_conf.is_st; - compl_op.fn = is_st ? service_c2h_st_queue : service_c2h_mm_queue; - - q.c2h_q.poll_entry = th_mgr.register_poll_function(compl_op); - if (nullptr == q.c2h_q.poll_entry) { - TraceError(TRACE_QDMA, "%s Failed to register C2H Completion poll method", q.name); - status = STATUS_UNSUCCESSFUL; - goto ErrExit; - } - - status = queue_program(q); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s failed to program contexts, status : %!STATUS!", q.name, status); - goto ErrExit; - } - - dump(this, q.type, q.idx_abs); - - q.init_csr(); - - InterlockedExchange(&q.state, queue_state::QUEUE_STARTED); - - TraceInfo(TRACE_QDMA, "%s: queue started : %s", dev_conf.name, q.name); - - return status; - -ErrExit: - if (nullptr != q.h2c_q.poll_entry) { - th_mgr.unregister_poll_function(q.h2c_q.req_proc_entry); - q.h2c_q.req_proc_entry = nullptr; - } - - if (q.c2h_q.req_proc_entry) { - if (q.type == queue_type::MEMORY_MAPPED) { - th_mgr.unregister_poll_function(q.c2h_q.req_proc_entry); - q.c2h_q.req_proc_entry = nullptr; - } - } - - if (nullptr != q.h2c_q.poll_entry) { - th_mgr.unregister_poll_function(q.h2c_q.poll_entry); - q.h2c_q.poll_entry = nullptr; - } - - if (nullptr != q.c2h_q.poll_entry) { - th_mgr.unregister_poll_function(q.c2h_q.poll_entry); - q.c2h_q.poll_entry = nullptr; - } - - if (is_intr_vec_allocated) - free_interrupt_vector(q, q.c2h_q.lib_config.vector_id); - - InterlockedExchange(&q.state, queue_state::QUEUE_ADDED); - return status; -} - -NTSTATUS qdma_device::qdma_stop_queue(UINT16 qid) -{ - if (qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, qid); - return STATUS_INVALID_PARAMETER; - } - - NTSTATUS status = STATUS_SUCCESS; - - auto& q = queue_pairs[qid]; - - TraceVerbose(TRACE_QDMA, "%s: Stopping the queue : %u", dev_conf.name, qid); - - /* Stop further traffic on the queue */ - auto old_state = InterlockedCompareExchange(&q.state, - queue_state::QUEUE_BUSY, - queue_state::QUEUE_STARTED); - if (old_state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_UNSUCCESSFUL; - } - - /* Wait till incoming traffic stops & let HW finish any pending jobs */ - LARGE_INTEGER wait_time; - wait_time.QuadPart = WDF_REL_TIMEOUT_IN_MS(2); - /** Re-adjust the system tick for better resolution - * - * As the system tick in windows can go up to 15.625 msec - * the delay is varying between 1 msec to 15 msec - */ - ExSetTimerResolution((ULONG)(2 * WDF_TIMEOUT_TO_MS), TRUE); - - KeDelayExecutionThread(KernelMode, FALSE, &wait_time); - - /** Revert back the system tick to default */ - ExSetTimerResolution(0, FALSE); - - th_mgr.unregister_poll_function(q.h2c_q.poll_entry); - th_mgr.unregister_poll_function(q.c2h_q.poll_entry); - - th_mgr.unregister_poll_function(q.h2c_q.req_proc_entry); - if (q.type == queue_type::MEMORY_MAPPED) - th_mgr.unregister_poll_function(q.c2h_q.req_proc_entry); - - q.h2c_q.poll_entry = nullptr; - q.c2h_q.poll_entry = nullptr; - - if (drv_conf.operation_mode != queue_op_mode::POLL_MODE) - free_interrupt_vector(q, q.c2h_q.lib_config.vector_id); - - /* Drain any pending requests */ - q.flush_queue(); - - /* Invalidate the contexts */ - status = clear_contexts(q, true); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s Failed to invalidate the context", q.name); - /* Continue further even in error scenario */ - } - - InterlockedExchange(&q.state, queue_state::QUEUE_ADDED); - - TraceInfo(TRACE_QDMA, "%s: queue stopped : %s", dev_conf.name, q.name); - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_remove_queue(UINT16 qid) -{ - if (qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, qid); - return STATUS_INVALID_PARAMETER; - } - - auto& q = queue_pairs[qid]; - - TraceVerbose(TRACE_QDMA, "%s: Removing the queue : %u", dev_conf.name, qid); - - auto old_state = InterlockedCompareExchange(&q.state, - queue_state::QUEUE_BUSY, - queue_state::QUEUE_ADDED); - if (old_state != queue_state::QUEUE_ADDED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_UNSUCCESSFUL; - } - - /* Clear queue context */ - NTSTATUS status = clear_contexts(q); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s Failed to clear the context", q.name); - /* Continue further even in error scenario */ - } - - auto is_cmpt_valid = q.c2h_q.is_cmpt_valid; - - q.destroy(); - - /* Decreament resource manager active queue count */ - dec_queue_pair_count(is_cmpt_valid); - - InterlockedExchange(&q.state, queue_state::QUEUE_AVAILABLE); - - TraceInfo(TRACE_QDMA, "%s: queue removed : %s", dev_conf.name, q.name); - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_enqueue_mm_request( - UINT16 qid, - WDF_DMA_DIRECTION direction, - PSCATTER_GATHER_LIST sg_list, - LONGLONG device_offset, - dma_completion_cb compl_cb, - VOID *priv) -{ - if ((qid >= drv_conf.qsets_max) || (compl_cb == nullptr) || - (sg_list == nullptr)) { - TraceError(TRACE_QDMA, "%s : Incorrect Parameters, qid : %d, " - "compl_cb : %p, sg_list : %p", dev_conf.name, qid, compl_cb, sg_list); - return STATUS_INVALID_PARAMETER; - } - - auto& q = queue_pairs[qid]; - - if (q.state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_INVALID_DEVICE_STATE; - } - - if (q.type != queue_type::MEMORY_MAPPED) { - TraceError(TRACE_QDMA, "%s is not configured in MM mode!", q.name); - return STATUS_ACCESS_VIOLATION; - } - - TraceVerbose(TRACE_QDMA, "%s enqueue request", q.name); - - dma_request request; - - request.is_st = false; - request.direction = direction; - request.sg_list = sg_list; - request.device_offset = device_offset; - request.compl_cb = compl_cb; - request.priv = priv; - request.sg_index = 0; - request.offset_idx = 0; - - NTSTATUS status = q.enqueue_dma_request(&request); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s Failed to enqueue the MM request, Status : %!STATUS!", q.name, status); - return status; - } - - return status; -} - -NTSTATUS qdma_device::qdma_enqueue_st_tx_request( - UINT16 qid, - PSCATTER_GATHER_LIST sg_list, - dma_completion_cb compl_cb, - VOID *priv) -{ - if ((qid >= drv_conf.qsets_max) || (compl_cb == nullptr) || - (sg_list == nullptr)) { - TraceError(TRACE_QDMA, "%s : Incorrect Parameters, qid : %d, " - "compl_cb : %p, sg_list : %p", dev_conf.name, qid, compl_cb, sg_list); - return STATUS_INVALID_PARAMETER; - } - - auto& q = queue_pairs[qid]; - - if (q.state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_INVALID_DEVICE_STATE; - } - - if (q.type != queue_type::STREAMING) { - TraceError(TRACE_QDMA, "Queue %d is not configured in ST mode!", qid); - return STATUS_ACCESS_VIOLATION; - } - - TraceVerbose(TRACE_QDMA, "%s TX enqueue request", q.name); - - dma_request request; - - request.is_st = true; - request.direction = WdfDmaDirectionWriteToDevice; - request.sg_list = sg_list; - request.compl_cb = compl_cb; - request.priv = priv; - request.sg_index = 0; - request.offset_idx = 0; - - NTSTATUS status = q.enqueue_dma_request(&request); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s Failed to enqueue the ST TX request, Status : %!STATUS!", q.name, status); - return status; - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_enqueue_st_rx_request( - UINT16 qid, - size_t length, - st_rx_completion_cb compl_cb, - VOID *priv) -{ - if ((qid >= drv_conf.qsets_max) || (compl_cb == nullptr)) { - TraceError(TRACE_QDMA, "%s: Incorrect Parameters, qid : %d, compl_cb : %p len : %Iu", - dev_conf.name, qid, compl_cb, length); - return STATUS_INVALID_PARAMETER; - } - - auto& q = queue_pairs[qid]; - - if (q.state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_INVALID_DEVICE_STATE; - } - - if (q.type != queue_type::STREAMING) { - TraceError(TRACE_QDMA, "Queue %d is not configured in ST mode!", qid); - return STATUS_ACCESS_VIOLATION; - } - - TraceVerbose(TRACE_QDMA, "%s RX enqueue request", q.name); - - NTSTATUS status = q.enqueue_dma_request(length, compl_cb, priv); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s Failed to enqueue the ST RX request, Status : %!STATUS!", q.name, status); - } - - return status; -} - -NTSTATUS qdma_device::qdma_retrieve_st_udd_data(UINT16 qid, void *addr, UINT8 *buf, UINT32 *len) -{ - if (qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, qid); - return STATUS_INVALID_PARAMETER; - } - - if ((addr == nullptr) || (buf == nullptr) || (len == nullptr)) - return STATUS_INVALID_PARAMETER; - - auto& q = queue_pairs[qid]; - - if (q.state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_INVALID_DEVICE_STATE; - } - - if (q.type != queue_type::STREAMING) { - TraceError(TRACE_QDMA, "Queue %d is not configured in ST mode!", qid); - return STATUS_ACCESS_VIOLATION; - } - - TraceVerbose(TRACE_QDMA, "%s Retrieving UDD data", q.name); - - return q.read_st_udd_data(addr, buf, len); -} - -NTSTATUS qdma_device::qdma_retrieve_last_st_udd_data(UINT16 qid, UINT8 *buf, UINT32 *len) -{ - if (qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, qid); - return STATUS_INVALID_PARAMETER; - } - - if ((buf == nullptr) || (len == nullptr)) - return STATUS_INVALID_PARAMETER; - - auto& q = queue_pairs[qid]; - - if (q.state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_INVALID_DEVICE_STATE; - } - - if (q.type != queue_type::STREAMING) { - TraceError(TRACE_QDMA, "Queue %d is not configured in ST mode!", qid); - return STATUS_ACCESS_VIOLATION; - } - - TraceVerbose(TRACE_QDMA, "%s Reading latest UDD data", q.name); - - void *udd_addr = q.get_last_udd_addr(); - - return q.read_st_udd_data(udd_addr, buf, len); -} - -NTSTATUS qdma_device::qdma_queue_desc_dump(qdma_desc_info *desc_info) -{ - if (desc_info->qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, desc_info->qid); - return STATUS_INVALID_PARAMETER; - } - - if ((desc_info == nullptr) || (desc_info->pbuffer == nullptr) || (desc_info->buffer_sz == 0)) - return STATUS_INVALID_PARAMETER; - - auto& q = queue_pairs[desc_info->qid]; - - auto old_state = InterlockedCompareExchange(&q.state, - queue_state::QUEUE_BUSY, - queue_state::QUEUE_ADDED); - if (old_state == queue_state::QUEUE_AVAILABLE) { - TraceError(TRACE_QDMA, "Queue %u is not added or started to get dump", desc_info->qid); - return STATUS_UNSUCCESSFUL; - } - - TraceVerbose(TRACE_QDMA, "%s descripor data dump", q.name); - - NTSTATUS status = q.desc_dump(desc_info); - - InterlockedExchange(&q.state, old_state); - - return status; -} - -NTSTATUS qdma_device::qdma_read_mm_cmpt_data(qdma_cmpt_info *cmpt_info) -{ - if (cmpt_info->qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, cmpt_info->qid); - return STATUS_INVALID_PARAMETER; - } - - if ((cmpt_info == nullptr) || (cmpt_info->pbuffer == nullptr) || (cmpt_info->buffer_len == 0)) - return STATUS_INVALID_PARAMETER; - - auto& q = queue_pairs[cmpt_info->qid]; - - if (q.state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_INVALID_DEVICE_STATE; - } - - if (q.type != queue_type::MEMORY_MAPPED) { - TraceError(TRACE_QDMA, "Queue %d is not configured in MM mode!", cmpt_info->qid); - return STATUS_ACCESS_VIOLATION; - } - - TraceVerbose(TRACE_QDMA, "%s Read MM completion data", q.name); - - return q.read_mm_cmpt_data(cmpt_info); -} - -NTSTATUS qdma_device::qdma_queue_context_read(UINT16 qid, enum qdma_dev_q_type ctx_type, struct qdma_descq_context *ctxt) -{ - if ((qid >= drv_conf.qsets_max) || - (ctx_type >= qdma_dev_q_type::QDMA_DEV_Q_TYPE_MAX) || - (ctxt == nullptr)) { - TraceError(TRACE_QDMA, "%s: Incorrect Parameters, qid : %d, ctx_type : %d, ctxt : %p", - dev_conf.name, qid, ctx_type, ctxt); - return STATUS_INVALID_PARAMETER; - } - - auto& q = queue_pairs[qid]; - - if (q.state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_INVALID_DEVICE_STATE; - } - - uint8_t is_c2h = (ctx_type == qdma_dev_q_type::QDMA_DEV_Q_TYPE_C2H) ? true : false; - uint16_t hw_qid = q.idx_abs; - int ret; - bool dump = false; - - if (ctx_type != qdma_dev_q_type::QDMA_DEV_Q_TYPE_CMPT) { - ret = hw.qdma_sw_ctx_conf(this, is_c2h, hw_qid, &ctxt->sw_ctxt, QDMA_HW_ACCESS_READ); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to read SW context, ret : %d", q.name, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_hw_ctx_conf(this, is_c2h, hw_qid, &ctxt->hw_ctxt, QDMA_HW_ACCESS_READ); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to read HW context, ret : %d", q.name, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_credit_ctx_conf(this, is_c2h, hw_qid, &ctxt->cr_ctxt, QDMA_HW_ACCESS_READ); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to read credit context, ret : %d", q.name, ret); - return hw.qdma_get_error_code(ret); - } - - if ((q.type == queue_type::STREAMING) && (is_c2h)) { - ret = hw.qdma_pfetch_ctx_conf(this, hw_qid, &ctxt->pfetch_ctxt, QDMA_HW_ACCESS_READ); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to read pre-fetch context, ret : %d", q.name, ret); - return hw.qdma_get_error_code(ret); - } - } - - dump = true; - } - - if (((q.type == queue_type::STREAMING) && (is_c2h)) || - ((q.type == queue_type::MEMORY_MAPPED) && (ctx_type == qdma_dev_q_type::QDMA_DEV_Q_TYPE_CMPT) && - (dev_conf.dev_info.mm_cmpt_en) && (q.c2h_q.user_conf.en_mm_cmpl))) { - - ret = hw.qdma_cmpt_ctx_conf(this, hw_qid, &ctxt->cmpt_ctxt, QDMA_HW_ACCESS_READ); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s Failed to read completion " - "context, ret : %d", q.name, ret); - return hw.qdma_get_error_code(ret); - } - dump = true; - } - - if (!dump) - return STATUS_UNSUCCESSFUL; - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_intr_context_read(UINT8 ring_idx_abs, struct qdma_indirect_intr_ctxt *ctxt) -{ - int ret; - - if (drv_conf.operation_mode != queue_op_mode::INTR_COAL_MODE) - return STATUS_ACCESS_VIOLATION; - - ret = hw.qdma_indirect_intr_ctx_conf(this, ring_idx_abs, ctxt, QDMA_HW_ACCESS_READ); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s : Failed to read interrupt context for ring index %d!, ret : %d", - dev_conf.name, ring_idx_abs, ret); - return hw.qdma_get_error_code(ret); - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_queue_dump_context(qdma_ctx_info *ctx_info) -{ - if (ctx_info->qid >= drv_conf.qsets_max) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, ctx_info->qid); - return STATUS_INVALID_PARAMETER; - } - - if ((ctx_info == nullptr) || - (ctx_info->ring_type >= qdma_q_type::QDMA_Q_TYPE_MAX) || - (ctx_info->pbuffer == nullptr) || (ctx_info->buffer_sz == 0)) - return STATUS_INVALID_PARAMETER; - - queue_pair &q = queue_pairs[ctx_info->qid]; - - if (q.state != queue_state::QUEUE_STARTED) { - TraceError(TRACE_QDMA, "%s invalid state, q_state %d", q.name, q.state); - return STATUS_INVALID_DEVICE_STATE; - } - - uint8_t st = (q.type == queue_type::STREAMING) ? 1 : 0; - size_t len = 0; - NTSTATUS status; - bool dump = false; - - if (ctx_info->ring_type != qdma_q_type::QDMA_Q_TYPE_CMPT) { - dump = true; - } - else if ((q.type == queue_type::MEMORY_MAPPED) && - (ctx_info->ring_type == qdma_q_type::QDMA_Q_TYPE_CMPT) && - (dev_conf.dev_info.mm_cmpt_en) && (q.c2h_q.user_conf.en_mm_cmpl)) { - dump = true; - } - - if (!dump) - return STATUS_UNSUCCESSFUL; - - int ctx_len = hw.qdma_read_dump_queue_context(this, q.idx_abs, - st, (qdma_dev_q_type)ctx_info->ring_type, - ctx_info->pbuffer, (uint32_t)ctx_info->buffer_sz); - if (ctx_len < 0) { - TraceError(TRACE_QDMA, "%s hw.qdma_dump_queue_context failed : %d", q.name, ctx_len); - return hw.qdma_get_error_code(ctx_len); - } - - len = len + ctx_len; - - if (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) { - if (ctx_info->buffer_sz < len) { - TraceError(TRACE_QDMA, "%s Insufficient Buffer Length, " - "buffer has %lld bytes, needs %lld bytes", q.name, ctx_info->buffer_sz, len); - return STATUS_BUFFER_TOO_SMALL; - } - - UINT8 ring_index = 0; - if (ctx_info->ring_type == qdma_q_type::QDMA_Q_TYPE_H2C) - ring_index = (UINT8)q.h2c_q.lib_config.vector_id; - else if (ctx_info->ring_type != qdma_q_type::QDMA_Q_TYPE_MAX) - ring_index = (UINT8)q.c2h_q.lib_config.vector_id; - - struct qdma_indirect_intr_ctxt intr_ctxt; - status = qdma_intr_context_read(ring_index, &intr_ctxt); - if (!NT_SUCCESS(status)) - return status; - - int intr_len = hw.qdma_dump_intr_context(this, &intr_ctxt, ring_index, - &ctx_info->pbuffer[len], (uint32_t)(ctx_info->buffer_sz - len)); - if (intr_len < 0) { - TraceError(TRACE_QDMA, "%s : hw.qdma_dump_intr_context returned error : %d", dev_conf.name, intr_len); - return hw.qdma_get_error_code(intr_len); - } - - len = len + intr_len; - } - - ctx_info->ret_sz = len; - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_intring_dump(qdma_intr_ring_info *intring_info) -{ - if (drv_conf.operation_mode != queue_op_mode::INTR_COAL_MODE) { - TraceError(TRACE_QDMA, "Interrupt ring is valid only in Aggregation Mode"); - return STATUS_INVALID_DEVICE_REQUEST; - } - - if ((intring_info == nullptr) || - (intring_info->pbuffer == nullptr) || (intring_info->buffer_len == 0)) { - TraceError(TRACE_QDMA, "Invalid Parameters"); - return STATUS_INVALID_PARAMETER; - } - - if ((intring_info->vec_id < irq_mgr.data_vector_id_start) || - (intring_info->vec_id >= irq_mgr.data_vector_id_end)) { - TraceError(TRACE_QDMA, "Invalid Vector ID : %d, Valid range : %u ~ %u", - intring_info->vec_id, irq_mgr.data_vector_id_start, irq_mgr.data_vector_id_end); - return STATUS_INVALID_PARAMETER; - } - - if (drv_conf.operation_mode != queue_op_mode::INTR_COAL_MODE) { - TraceError(TRACE_QDMA, "%s is not configured in Interrupt Aggregation mode", dev_conf.name); - return STATUS_INVALID_DEVICE_REQUEST; - } - - NTSTATUS status = irq_mgr.intr_q[intring_info->vec_id].intring_dump(intring_info); - - return status; -} - -NTSTATUS qdma_device::qdma_regdump(qdma_reg_dump_info *regdump_info) -{ - bool is_vf = false; - - if ((regdump_info == nullptr) || (regdump_info->pbuffer == nullptr) || (regdump_info->buffer_len == 0)) - return STATUS_INVALID_PARAMETER; - - int len = hw.qdma_dump_config_regs(this, is_vf, regdump_info->pbuffer, (uint32_t)regdump_info->buffer_len); - if (len < 0) { - TraceError(TRACE_QDMA, " %s : hw.qdma_dump_config_regs failed with err : %d", dev_conf.name, len); - return hw.qdma_get_error_code(len); - } - - regdump_info->ret_len = len; - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_get_qstats_info(qdma_qstat_info &qstats) -{ - INT32 queue_base = -1; /* qdma_dev_qinfo_get() requires qbase to be int pointer */ - - qdma_dev_qinfo_get(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no, &queue_base, &qstats.qmax); - qstats.qbase = queue_base; - qstats.active_h2c_queues = - qdma_get_device_active_queue_count(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no, QDMA_DEV_Q_TYPE_H2C); - qstats.active_c2h_queues = - qdma_get_device_active_queue_count(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no, QDMA_DEV_Q_TYPE_C2H); - qstats.active_cmpt_queues = - qdma_get_device_active_queue_count(dma_dev_index, dev_conf.dev_sbdf.sbdf.fun_no, QDMA_DEV_Q_TYPE_CMPT); - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_get_reg_info(qdma_reg_info* reg_info) -{ - int len = 0; - - if (reg_info == nullptr) - return STATUS_INVALID_PARAMETER; - - if (!hw.qdma_dump_reg_info) - return STATUS_NOT_SUPPORTED; - - len = hw.qdma_dump_reg_info(this, - reg_info->address, reg_info->reg_cnt, - reg_info->pbuffer, (int)reg_info->buf_len); - - if (len < 0) { - TraceError(TRACE_QDMA, "hw.qdma_dump_reg_info Failed with error : %d", len); - return STATUS_UNSUCCESSFUL; - } - - if (len == 0) { - TraceError(TRACE_QDMA, "Register %d is not present in the design", reg_info->address); - return STATUS_INVALID_PARAMETER; - } - - reg_info->ret_len = len; - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::open(const WDFDEVICE device, WDFCMRESLIST resources, - const WDFCMRESLIST resources_translated) -{ - NTSTATUS status = STATUS_SUCCESS; - int ret = 0; - - wdf_dev = device; - - status = pcie.get_bdf(wdf_dev, dev_conf.dev_sbdf.val); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "pcie.get_bdf failed! %!STATUS!", status); - return status; - } - - RtlStringCchPrintfA(dev_conf.name, - ARRAYSIZE(dev_conf.name), "qdma%02X%02X%x", - dev_conf.dev_sbdf.sbdf.bus_no, - dev_conf.dev_sbdf.sbdf.dev_no, - dev_conf.dev_sbdf.sbdf.fun_no); - - TraceInfo(TRACE_QDMA, "%04X:%02X:%02X.%X: func : %X, p/v 1/0", - dev_conf.dev_sbdf.sbdf.seg_no, dev_conf.dev_sbdf.sbdf.bus_no, - dev_conf.dev_sbdf.sbdf.dev_no, dev_conf.dev_sbdf.sbdf.fun_no, - dev_conf.dev_sbdf.sbdf.fun_no); - - status = pcie.map(resources_translated); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s : pcie.map failed! %!STATUS!", dev_conf.name, status); - return status; - } - - status = pcie.assign_config_bar(drv_conf.cfg_bar); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: Failed to assign config BAR", dev_conf.name); - return status; - } - - ret = qdma_hw_access_init((void*)this, 0, &hw); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed to initialize hw access", dev_conf.name); - return STATUS_UNSUCCESSFUL; - } - - /** Change device state to offline after acquiring the HW callbacks */ - InterlockedExchange(&qdma_device_state, device_state::DEVICE_OFFLINE); - - ret = hw.qdma_get_version((void *)this, QDMA_DEV_PF, &hw_version_info); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: qdma_get_version failed!, ret : %d", dev_conf.name, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - - status = assign_bar_types(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s : assign_bar_types failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - ret = hw.qdma_get_device_attributes((void *)this, &dev_conf.dev_info); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: qdma_get_device_attributes failed!, ret : %d", dev_conf.name, ret); - status = hw.qdma_get_error_code(ret); - goto ErrExit; - } - - TraceInfo(TRACE_QDMA, "qdma_get_device_attributes: %s: num_pfs:%d, num_qs:%d, flr_present:%d, st_en:%d, " - "mm_en:%d, mm_cmpt_en:%d, mailbox_en:%d, mm_channel_max:%d, qid2vec_ctx:%d, ", - dev_conf.name, - dev_conf.dev_info.num_pfs, - dev_conf.dev_info.num_qs, - dev_conf.dev_info.flr_present, - dev_conf.dev_info.st_en, - dev_conf.dev_info.mm_en, - dev_conf.dev_info.mm_cmpt_en, - dev_conf.dev_info.mailbox_en, - dev_conf.dev_info.mm_channel_max, - dev_conf.dev_info.qid2vec_ctx); - - TraceInfo(TRACE_QDMA, "cmpt_ovf_chk_dis:%d, mailbox_intr:%d, sw_desc_64b:%d, cmpt_desc_64b:%d, " - "dynamic_bar:%d, legacy_intr:%d, cmpt_trig_count_timer:%d", - dev_conf.dev_info.cmpt_ovf_chk_dis, - dev_conf.dev_info.mailbox_intr, - dev_conf.dev_info.sw_desc_64b, - dev_conf.dev_info.cmpt_desc_64b, - dev_conf.dev_info.dynamic_bar, - dev_conf.dev_info.legacy_intr, - dev_conf.dev_info.cmpt_trig_count_timer); - - if ((dev_conf.dev_info.st_en == 0) && - (dev_conf.dev_info.mm_en == 0)) { - TraceError(TRACE_QDMA, "%s: None of the modes ( ST or MM) are enabled", dev_conf.name); - status = STATUS_INVALID_HW_PROFILE; - goto ErrExit; - } - - status = list_add_qdma_device_and_set_gbl_csr(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: list_add_qdma_device_and_set_gbl_csr failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - TraceInfo(TRACE_QDMA, "Driver is loaded in %s(%d) mode", - mode_name_list[drv_conf.operation_mode].name, drv_conf.operation_mode); - - status = init_resource_manager(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_resource_manager failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - status = init_os_resources(resources, resources_translated); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_os_resources() failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - status = init_qdma_global(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_qdma_global() failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - status = init_func(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_func() failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - status = init_dma_queues(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_dma_queues() failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - - if (drv_conf.operation_mode == queue_op_mode::INTR_COAL_MODE) { - status = init_interrupt_queues(); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "%s: init_interrupt_queues() failed! %!STATUS!", dev_conf.name, status); - goto ErrExit; - } - } - - InterlockedExchange(&qdma_device_state, device_state::DEVICE_ONLINE); - - TraceInfo(TRACE_QDMA, "%s, %05x, qdma_device %p, ch %u, q %u.", - dev_conf.name, dev_conf.dev_sbdf.val, this, - dev_conf.dev_info.mm_channel_max, drv_conf.qsets_max); - - return status; - -ErrExit: - close(); - return status; -} - -void qdma_device::close() -{ - /** Make sure to not perform multiple cleanups on same device */ - if (qdma_device_state != device_state::DEVICE_INIT) { - - TraceInfo(TRACE_QDMA, "%04X:%02X:%02X.%X qdma_device 0x%p, %s.\n", - dev_conf.dev_sbdf.sbdf.seg_no, dev_conf.dev_sbdf.sbdf.bus_no, - dev_conf.dev_sbdf.sbdf.dev_no, dev_conf.dev_sbdf.sbdf.fun_no, - this, dev_conf.name); - - destroy_dma_queues(); - - destroy_func(); - - destroy_os_resources(); - - destroy_resource_manager(); - - list_remove_qdma_device(); - - pcie.unmap(); - - if (nullptr != register_access_lock) { - WdfObjectDelete(register_access_lock); - register_access_lock = nullptr; - } - InterlockedExchange(&qdma_device_state, device_state::DEVICE_INIT); - } -} - -bool qdma_device::qdma_is_device_online(void) -{ - if (qdma_device_state == device_state::DEVICE_ONLINE) - return true; - - return false; -} - -NTSTATUS qdma_device::qdma_read_csr_conf(qdma_glbl_csr_conf *conf) -{ - int ret; - - ret = hw.qdma_global_csr_conf((void *)this, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - conf->ring_sz, QDMA_CSR_RING_SZ, QDMA_HW_ACCESS_READ); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: Failed to read CSR global ring size, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_global_csr_conf((void *)this, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - conf->c2h_timer_cnt, QDMA_CSR_TIMER_CNT, QDMA_HW_ACCESS_READ); - if ((ret < 0) && (ret != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) { - TraceError(TRACE_QDMA, "%s: Failed to read CSR global timer count, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_global_csr_conf((void *)this, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - conf->c2h_th_cnt, QDMA_CSR_CNT_TH, QDMA_HW_ACCESS_READ); - if ((ret < 0) && (ret != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) { - TraceError(TRACE_QDMA, "%s: Failed to read CSR global counter threshold, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_global_csr_conf((void *)this, 0, QDMA_GLOBAL_CSR_ARRAY_SZ, - conf->c2h_buff_sz, QDMA_CSR_BUF_SZ, QDMA_HW_ACCESS_READ); - if ((ret < 0) && (ret != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) { - TraceError(TRACE_QDMA, "%s: Failed to read CSR global buffer size, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - ret = hw.qdma_global_writeback_interval_conf((void *)this, - (qdma_wrb_interval *)&conf->wb_interval, QDMA_HW_ACCESS_READ); - if ((ret < 0) && (ret != -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED)) { - TraceError(TRACE_QDMA, "%s: Failed to read CSR global write back interval, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - return STATUS_SUCCESS; -} - -NTSTATUS qdma_device::qdma_get_dev_capabilities_info(qdma_device_attributes_info &dev_attr) -{ - int ret; - struct qdma_dev_attributes dev_info; - - ret = hw.qdma_get_device_attributes((void *)this, &dev_info); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: qdma_get_device_attributes Failed, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - dev_attr.num_pfs = dev_info.num_pfs; - dev_attr.num_qs = dev_info.num_qs; - dev_attr.flr_present = dev_info.flr_present; - dev_attr.st_en = dev_info.st_en; - dev_attr.mm_en = dev_info.mm_en; - dev_attr.mm_cmpl_en = dev_info.mm_cmpt_en; - dev_attr.mailbox_en = dev_info.mailbox_en; - dev_attr.num_mm_channels = dev_info.mm_channel_max; - dev_attr.debug_mode = dev_info.debug_mode; - dev_attr.desc_eng_mode = dev_info.desc_eng_mode; - - return STATUS_SUCCESS; -} -void qdma_device::qdma_get_hw_version_info( - qdma_hw_version_info &version_info) -{ - version_info = hw_version_info; -} - -_IRQL_requires_(PASSIVE_LEVEL) -NTSTATUS qdma_device::qdma_device_version_info( - qdma_version_info &version_info) -{ - NTSTATUS status; - struct qdma_hw_version_info info; - - int ret = hw.qdma_get_version((void *)this, QDMA_DEV_PF, &info); - if (ret < 0) { - TraceError(TRACE_QDMA, "%s: qdma_get_version failed!, ret : %d", dev_conf.name, ret); - return hw.qdma_get_error_code(ret); - } - - status = RtlStringCchCopyNA(version_info.qdma_rtl_version_str, - ARRAYSIZE(version_info.qdma_rtl_version_str), - info.qdma_rtl_version_str, - ARRAYSIZE(info.qdma_rtl_version_str)); - if (!NT_SUCCESS(status)) { - return status; - } - - status = RtlStringCchCopyNA(version_info.qdma_vivado_release_id_str, - ARRAYSIZE(version_info.qdma_vivado_release_id_str), - info.qdma_vivado_release_id_str, - ARRAYSIZE(info.qdma_vivado_release_id_str)); - if (!NT_SUCCESS(status)) { - return status; - } - - status = RtlStringCchCopyNA(version_info.qdma_device_type_str, - ARRAYSIZE(version_info.qdma_device_type_str), - info.qdma_device_type_str, - ARRAYSIZE(info.qdma_device_type_str)); - if (!NT_SUCCESS(status)) { - return status; - } - - status = RtlStringCchCopyNA(version_info.qdma_versal_ip_type_str, - ARRAYSIZE(version_info.qdma_versal_ip_type_str), - info.qdma_ip_type_str, - ARRAYSIZE(info.qdma_ip_type_str)); - if (!NT_SUCCESS(status)) { - return status; - } - - status = RtlStringCchPrintfA(version_info.qdma_sw_version_str, - ARRAYSIZE(version_info.qdma_sw_version_str), - "%d.%d.%d", qdma_version.major, - qdma_version.minor, qdma_version.patch); - - return status; -} - -queue_pair *qdma_device::qdma_get_queue_pair_by_hwid(UINT16 qid_abs) -{ - if (qid_abs >= (qbase + drv_conf.qsets_max)) { - TraceError(TRACE_QDMA, "%s: Invalid Qid %d provided", dev_conf.name, qid_abs); - return nullptr; - } - - UINT16 qid_rel = qid_abs - static_cast<UINT16>(qbase); - TraceVerbose(TRACE_QDMA, "%s: Absolute qid : %u Relative qid : %u", dev_conf.name, qid_abs, qid_rel); - return &queue_pairs[qid_rel]; -} \ No newline at end of file diff --git a/QDMA/windows/sys/libqdma/source/qdma.h b/QDMA/windows/sys/libqdma/source/qdma.h deleted file mode 100644 index 4949f6a..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma.h +++ /dev/null @@ -1,616 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -/** - * @file - * @brief This file contains the declarations for libqdma interfaces - * - */ - -#include "qdma_platform_env.h" -#include "xversion.hpp" -#include "xpcie.hpp" -#include "qdma_reg_ext.h" -#include "qdma_config.h" -#include "thread.h" -#include "qdma_exports.h" -#include "qdma_access_common.h" -#include "qdma_resource_mgmt.h" -#include "interrupts.hpp" -#include "qdma_platform.h" - -/* Xilinx namespace */ -namespace xlnx { - -#pragma pack(1) -struct version { - UINT8 patch; - UINT8 minor; - UINT16 major; - - constexpr version(const UINT16 major_, const UINT8 minor_, const UINT8 patch_) - : patch(patch_), minor(minor_), major(major_) {} - - constexpr UINT32 hash() const { - return UINT32((major << 16) + (minor << 8) + patch); - } - - constexpr bool operator==(const version& other) const { - return hash() == other.hash(); - } - - constexpr bool operator!=(const version& other) const { - return !(*this == other); - } -}; -#pragma pack() - -/* ensure that version is evaluated at compile time */ -static_assert(version(65535, 0, 0).major == 65535 && - version(0, 255, 0).minor == 255 && - version(0, 0, 255).patch == 255, "incorrect bits in version"); -static_assert(sizeof(version) == sizeof(UINT32), "size of version struct is not 32bits"); - -static_assert(version(0x1234, 0x56, 0x78).hash() == 0x12345678, "error in version hash function"); - -static_assert(version(1, 2, 3) == version(1, 2, 3), "error in version equality comparison"); -static_assert(version(1, 2, 3) != version(1, 2, 0), "error in version equality comparison"); -static_assert(version(1, 2, 3) != version(1, 0, 3), "error in version equality comparison"); -static_assert(version(1, 2, 3) != version(0, 2, 3), "error in version equality comparison"); - - - -/** libqdma version number */ -static constexpr version qdma_version = version(VER_PRODUCTMAJORVERSION, VER_PRODUCTMINORVERSION, VER_PRODUCTREVISION); - -static constexpr size_t sg_frag_len = 61440; /** 15 * 4K Fragment size */ -static constexpr size_t st_max_desc_data_len = 65535; -static constexpr size_t mm_max_desc_data_len = 65535; - -static constexpr unsigned int mm_h2c_completion_weight = 2048; -static constexpr unsigned int mm_c2h_completion_weight = 2048; -static constexpr unsigned int st_h2c_completion_weight = 2048; -static constexpr unsigned int st_c2h_completion_weight = 2048; - -static constexpr unsigned int max_req_service_cnt = 10; - -/** - * Structure to hold the driver name and mode - */ -struct drv_mode_name { - /** Mode of the function */ - queue_op_mode mode; - /** Driver Name */ - char name[20]; -}; - -class qdma_device; -struct queue_pair; - -#define IS_LIST_EMPTY(list_head) \ - IsListEmpty(list_head) - -#define INIT_LIST_HEAD(list_head) \ - InitializeListHead(list_head) - -#define LIST_ADD_HEAD(list_head, entry) \ - InsertHeadList(list_head, entry) - -#define LIST_ADD_TAIL(list_head, entry) \ - InsertTailList(list_head, entry) - -#define LIST_DEL_NODE(entry) \ - RemoveEntryList(entry) - -#define LIST_FOR_EACH_ENTRY(list_head, entry) \ - for ((entry)= (list_head)->Flink; (entry) != (list_head); (entry) = (entry)->Flink) - -#define LIST_FOR_EACH_ENTRY_SAFE(list_head, n, entry) \ - for ((entry) = (list_head)->Flink, (n) = (entry)->Flink; (entry) != (list_head); (entry) = (n), (n) = (entry)->Flink) - -#define LIST_GET_ENTRY(entry, type, member) \ - CONTAINING_RECORD(entry, type, member) - -/** queue_type - QDMA queue type */ -enum class queue_type { - /** Memory mapped queue type */ - MEMORY_MAPPED, - /** Streaming queue type */ - STREAMING, - /** Invalid queue type */ - NONE -}; - -/** device_state - State of the QDMA device */ -enum device_state { - /** Device is in Init State */ - DEVICE_INIT, - /** Device is offline */ - DEVICE_OFFLINE, - /** Device is online */ - DEVICE_ONLINE, -}; - -/** - * Maxinum length of the QDMA device name - */ -#define QDMA_DEV_NAME_MAXLEN 32 - - /** - * QDMA_QUEUE_NAME_MAXLEN - Maximum queue name length - */ -#define QDMA_QUEUE_NAME_MAXLEN 32 - - /** - * qdma_dev_conf - defines the per-device qdma property. - */ -struct qdma_dev_conf { - /** PCIe Segment-Bus-Device-Function of QDMA device */ - union pci_sbdf dev_sbdf; - /** Indicates whether this QDMA device is master */ - UINT32 is_master_pf : 1; - /** Reserved Field, not being used */ - UINT32 reserved02 : 31; - /** The name of the QDMA device, in 'qdma<BBDDF>' format */ - char name[QDMA_DEV_NAME_MAXLEN]; - /** Attributes of the QDMA device specifies the supported features */ - struct qdma_dev_attributes dev_info; -}; - -/** - * st_c2h_pkt_frag_queue - Structure to manage streamed - * c2h packet fragments. - */ -struct st_c2h_pkt_frag_queue { - st_c2h_pkt_fragment *frags = nullptr; - UINT32 avail_frag_cnt = 0; - size_t avail_byte_cnt = 0; - /** Maximum size of the queue, - * (max_q_size - 1) packets will fit in this queue - */ - UINT32 max_q_size; - UINT32 pidx; - UINT32 cidx; - - NTSTATUS create(UINT32 entries); - void destroy(void); - NTSTATUS add(st_c2h_pkt_fragment &elem); - NTSTATUS consume(st_c2h_pkt_fragment &elem); - PFORCEINLINE bool is_queue_full(void); - PFORCEINLINE bool is_queue_empty(void); - inline LONG get_avail_frag_cnt(void); - inline size_t get_avail_byte_cnt(void); -}; - -struct ring_buffer { - UINT32 capacity; /* NOT including status write-back */ - - WDFCOMMONBUFFER buffer = nullptr; - void *buffer_va = nullptr; - volatile wb_status_base* wb_status = nullptr; - - volatile UINT32 sw_index = 0; /* usage: e.g. [1] pidx for MM C2H, MM H2C, ST H2C. [2] cidx for ST WB */ - volatile UINT32 hw_index = 0; /* usage: e.g. [1] cidx for MM C2H, MM H2C, ST H2C. [2] pidx for ST WB */ - - struct { - UINT32 tot_desc_accepted; - UINT32 tot_desc_processed; - }stats; - - PFORCEINLINE void advance_idx(volatile UINT32& idx); - PFORCEINLINE void advance_idx(volatile UINT32& idx, UINT32 num); - PFORCEINLINE UINT32 idx_delta(UINT32 start_idx, UINT32 end_idx); - - NTSTATUS create(WDFDMAENABLER& dma_enabler, UINT32 num_entries, size_t desc_sz_in_bytes); - void destroy(void); - UINT32 get_num_free_entries(void); - void *get_va(void); - UINT32 get_capacity(void); -}; - -/** libqdma_queue_config -- This structure holds - * the QDMA configuration parameters which are - * deduced from the user requested while adding the queue - */ -struct libqdma_queue_config { - /** Flag indicates the interrupt enabled or not */ - bool irq_en; - /** Holds the vector id (MSIX/Legacy) assigned for the queue */ - UINT32 vector_id; - /** Holds the descriptor size of the ring */ - qdma_desc_sz desc_sz; - /** Holds the size of the descriptor ring (i.e., no of entries) */ - UINT32 ring_sz; - /** Holds the size of the completion ring (i.e., no of entries) */ - UINT32 cmpt_ring_sz; - /** Holds the index of the completion ring (one of the Global CSR register index) */ - UINT32 cmpt_ring_id; - /** Holds the size of the single data buffer (Valid for ST C2H only) */ - UINT32 data_buf_size; -}; - -/** req_ctx -- Stores the request completion parameters */ -struct req_ctx { - /** User supplied private data */ - void *priv; - /** Completion callback routine */ - dma_completion_cb compl_cb; -}; - -/** dma_req_tracker -- This is a shadow ring tracker for - * MM and ST H2C transfers. This structure holds the data - * required for making request completions - * - * This shadow ring tracker is used to avoid the - * use of synchronization primitives for the performance - * cost - */ -struct dma_req_tracker { - /** Holds the completion parameters for user requests */ - req_ctx *requests = nullptr; - - /** Allocates and initializes the request tracker */ - NTSTATUS create(UINT32 entries); - /** Frees the memory allocated for request tracker */ - void destroy(); -}; - -/** st_c2h_req -- Stores the ST C2H request completion parameters */ -struct st_c2h_req { - /** Length of the packet requested */ - size_t len; - /** User supplied private data */ - void *priv; - /** Completion callback routine */ - st_rx_completion_cb st_compl_cb; -}; - -/** st_c2h_dma_req_tracker -- This structure holds the user requests - * for ST C2H direction. This tracker has the same size as descriptor - * ring (i.e., no of entries) - */ -struct st_c2h_dma_req_tracker { - st_c2h_req *requests = nullptr; - - /* This lock is to ensure enqueueing/adding - ST C2H requests properly to request tracker and - dequeueing/popping the requests during completions - */ - WDFSPINLOCK lock = nullptr; - - /** The size of this request tracker (no of entries) - * This tracker is a bounded queue with max capacity specified - * during initialization by the caller. - */ - UINT32 capacity; - UINT32 pidx; - UINT32 cidx; - - NTSTATUS create(UINT32 entries); - void destroy(void); - - NTSTATUS st_push_dma_req(st_c2h_req& req); - NTSTATUS st_peek_dma_req(st_c2h_req& req); - NTSTATUS st_pop_dma_req(void); -}; - -struct st_c2h_pkt_buffer { - WDFCOMMONBUFFER rx_buff_common; - PVOID rx_buff_va; - PHYSICAL_ADDRESS rx_buff_dma; - - NTSTATUS create(WDFDMAENABLER dma_enabler, size_t size); - void destroy(void); - void fill_rx_buff(PVOID buff_va, PHYSICAL_ADDRESS buff_dma); - PHYSICAL_ADDRESS get_dma_addr(void); - PVOID get_va(void); -}; - -struct dma_request { - /** Linked list entry to form request queue */ - LIST_ENTRY list_entry; - /** DMA Mode (ST/MM) */ - bool is_st; - /** Direction of DMA */ - WDF_DMA_DIRECTION direction; - /** SG list of request */ - PSCATTER_GATHER_LIST sg_list; - /** Completion callback handler */ - dma_completion_cb compl_cb; - /** Private data to pass during completion callback */ - VOID *priv; - /** The device address to/from DMA - * (Only Valid for MM transfers) */ - LONGLONG device_offset; - /** Holds the next index to resume - * request transfer for split request */ - UINT32 sg_index; - /** Holds the next device offset to resume - * request transfer for split request - * (Only valid for MM transfers ) */ - LONGLONG offset_idx; -}; - -struct h2c_queue { - queue_config user_conf; - libqdma_queue_config lib_config; - - ring_buffer desc_ring; - dma_req_tracker req_tracker; - - /** This forms a chain of h2c requests */ - LIST_ENTRY req_list_head; - - /* This lock is to ensure enqueueing/adding - the requests to the descriptor ring properly - - During completions this lock is not needed and - request tracker design will make sure proper execution - */ - WDFSPINLOCK lock = nullptr; - poll_operation_entry *req_proc_entry; - poll_operation_entry *poll_entry; - qdma_q_pidx_reg_info csr_pidx_info; - - NTSTATUS create(qdma_device *qdma, queue_config& conf); - void destroy(void); - void init_csr_h2c_pidx_info(void); -}; - -struct c2h_queue { - queue_config user_conf; - libqdma_queue_config lib_config; - - ring_buffer desc_ring; - dma_req_tracker req_tracker; - - /** This forms a chain of c2h requests */ - LIST_ENTRY req_list_head; - - /* This lock is to ensure MM enqueueing/adding - the requests to the descriptor ring properly - - For completions of MM requests: lock is not needed - request tracker design takes care - */ - WDFSPINLOCK lock = nullptr; - poll_operation_entry *req_proc_entry; - poll_operation_entry *poll_entry; - qdma_q_pidx_reg_info csr_pidx_info; - qdma_q_cmpt_cidx_reg_info csr_cmpt_cidx_info; - bool is_cmpt_valid = false; - UINT32 cmpt_offset = 0; - ring_buffer cmpt_ring; - - /* Only for streaming */ - st_c2h_dma_req_tracker st_c2h_req_tracker; - UINT32 no_allocated_rx_common_buffs = 0; - st_c2h_pkt_buffer *pkt_buffer = nullptr; - st_c2h_pkt_fragment *pkt_frag_list = nullptr; - st_c2h_pkt_frag_queue pkt_frag_queue; - - NTSTATUS create(qdma_device *qdma, queue_config& conf); - void destroy(void); - INT32 get_cmpt_ring_index(UINT32* csr_ring_sz_table, UINT32 desc_ring_index); - void init_csr_c2h_pidx_info(void); - void init_csr_cmpt_cidx_info(void); -}; - -enum class service_status { - SERVICE_CONTINUE, - SERVICE_FINISHED, - SERVICE_ERROR, -}; - -struct queue_pair { - LIST_ENTRY list_entry; - qdma_device *qdma = nullptr; - - queue_type type; - char name[QDMA_QUEUE_NAME_MAXLEN]; - volatile LONG state; - - UINT16 idx = 0; /* queue index - relative to this PF */ - UINT16 idx_abs = 0; /* queue index - absolute across all PF */ - - h2c_queue h2c_q; - c2h_queue c2h_q; - - /** Initialization and De-Initialization functions */ - NTSTATUS create(queue_config& conf); - void destroy(void); - void init_csr(void); - - /** CSR update functions */ - PFORCEINLINE void update_sw_index_with_csr_wb(UINT32 new_cidx); - PFORCEINLINE void update_sw_index_with_csr_h2c_pidx(UINT32 new_pidx); - PFORCEINLINE void update_sw_index_with_csr_c2h_pidx(UINT32 new_pidx); - - /** Transfer initiate functions */ - NTSTATUS enqueue_dma_request(dma_request *request); - NTSTATUS enqueue_dma_request(size_t length, st_rx_completion_cb compl_cb, void *priv); - - /** Transfer processing functions */ - service_status process_mm_request(dma_request* request, size_t* xfer_len); - service_status process_st_h2c_request(dma_request* request, size_t* xfer_len); - NTSTATUS process_st_c2h_data_pkt(void* udd_ptr, const UINT32 length); - - /** Transfer completion functions */ - service_status service_mm_st_h2c_completions(ring_buffer *desc_ring, dma_req_tracker *tracker, UINT32 budget, UINT32& proc_desc_cnt); - service_status st_service_c2h_queue(UINT32 budget); - - PFORCEINLINE void update_c2h_pidx_in_batch(UINT32 processed_desc_cnt); - NTSTATUS check_cmpt_error(c2h_wb_header_8B *cmpt_data); - - /** User-Defined Data(Side band data) funtions */ - NTSTATUS read_st_udd_data(void *addr, UINT8 *buf, UINT32 *len); - void * get_last_udd_addr(void); - - /** Reads MM Completion ring (UDD) data, - * This is independent ring and not related to data packets */ - NTSTATUS read_mm_cmpt_data(qdma_cmpt_info *cmpt_info); - - /** Cleanup related functions */ - void flush_queue(void); - void cancel_mm_st_h2c_pending_requests(ring_buffer* desc_ring, dma_req_tracker* tracker, WDFSPINLOCK lock); - - /** Debug Functions */ - NTSTATUS desc_dump(qdma_desc_info *desc_info); -}; - -/** - * qdma_device - Master class for QDMA device - * - * This class defines the interface structures/unions/classes - * and interface functions that can be used while using - * the libqdma library - */ -class qdma_device : public qdma_interface { -public: - /** Spinlock to serialize all the HW registers */ - WDFSPINLOCK register_access_lock = nullptr; - /** Structure that provides set of call back functions to access hardware */ - qdma_hw_access hw; - /** Structure that provides QDMA device properties */ - qdma_dev_conf dev_conf; - /** Structure that contains QDMA global CSR registers information */ - qdma_glbl_csr_conf csr_conf; - /** Structure that contains QDMA driver configuration */ - qdma_drv_config drv_conf; - - /** DMA Initialization/Teardown APIs */ - NTSTATUS init(qdma_drv_config conf); - NTSTATUS open(WDFDEVICE device, WDFCMRESLIST resources, WDFCMRESLIST resources_translated); - void close(void); - bool qdma_is_device_online(void); - - /** PCIe BAR Read and Write APIs */ - NTSTATUS read_bar(qdma_bar_type bar_type, size_t offset, void* data, size_t size); - NTSTATUS write_bar(qdma_bar_type bar_type, size_t offset, void* data, size_t size); - ULONG qdma_conf_reg_read(size_t offset); - void qdma_conf_reg_write(size_t offset, ULONG data); - NTSTATUS get_bar_info(qdma_bar_type bar_type, PVOID &bar_base, size_t &bar_length); - - /** Queue Configuration APIs (Add, Start Stop, Delete, state) */ - NTSTATUS qdma_add_queue(UINT16 qid, queue_config& conf); - NTSTATUS qdma_start_queue(UINT16 qid); - NTSTATUS qdma_stop_queue(UINT16 qid); - NTSTATUS qdma_remove_queue(UINT16 qid); - NTSTATUS qdma_is_queue_in_range(UINT16 qid); - NTSTATUS qdma_get_queues_state(UINT16 qid, enum queue_state *qstate, CHAR *str, size_t str_maxlen); - NTSTATUS qdma_set_qmax(UINT32 queue_max); - - /** DMA transfer APIs (From Device and To Device) */ - NTSTATUS qdma_enqueue_mm_request(UINT16 qid, WDF_DMA_DIRECTION direction, PSCATTER_GATHER_LIST sg_list, LONGLONG device_offset, dma_completion_cb compl_cb, VOID *priv); - NTSTATUS qdma_enqueue_st_tx_request(UINT16 qid, PSCATTER_GATHER_LIST sg_list, dma_completion_cb compl_cb, VOID *priv); - NTSTATUS qdma_enqueue_st_rx_request(UINT16 qid, size_t length, st_rx_completion_cb compl_cb, VOID *priv); - - /** DMA Completion ring APIs */ - NTSTATUS qdma_retrieve_st_udd_data(UINT16 qid, void *addr, UINT8 *buf, UINT32 *len); - NTSTATUS qdma_retrieve_last_st_udd_data(UINT16 qid, UINT8 *buf, UINT32 *len); - NTSTATUS qdma_read_mm_cmpt_data(qdma_cmpt_info *cmpt_info); - - /** DMA Configuration Read APIs */ - NTSTATUS qdma_read_csr_conf(qdma_glbl_csr_conf *conf); - NTSTATUS qdma_get_dev_capabilities_info(qdma_device_attributes_info &dev_attr); - NTSTATUS qdma_queue_context_read(UINT16 qid, enum qdma_dev_q_type ctx_type, struct qdma_descq_context *ctxt); - - /** DMA Configuration dump APIs */ - NTSTATUS qdma_queue_desc_dump(qdma_desc_info *desc_info); - NTSTATUS qdma_queue_dump_context(qdma_ctx_info *ctx_info); - NTSTATUS qdma_intring_dump(qdma_intr_ring_info *intring_info); - NTSTATUS qdma_regdump(qdma_reg_dump_info *regdump_info); - NTSTATUS qdma_get_qstats_info(qdma_qstat_info &qstats); - NTSTATUS qdma_get_reg_info(qdma_reg_info *reg_info); - - /** DMA Versioning APIs */ - NTSTATUS qdma_device_version_info(qdma_version_info &version_info); - void qdma_get_hw_version_info(qdma_hw_version_info &version_info); - - /** Misc APIs */ - queue_pair *qdma_get_queue_pair_by_hwid(UINT16 qid_abs); -private: - LIST_ENTRY list_entry; - /** Identifier returned by resource manager */ - UINT32 dma_dev_index = 0; - /** Start/base queue number for this device */ - INT32 qbase = -1; - /** Device state */ - volatile LONG qdma_device_state; - - xpcie_device pcie; - WDFDEVICE wdf_dev = nullptr; - qdma_hw_version_info hw_version_info; - queue_pair *queue_pairs = nullptr; - interrupt_manager irq_mgr; - thread_manager th_mgr; - - NTSTATUS validate_qconfig(queue_config& conf); - - /* QDMA Device(s) list helper functions */ - NTSTATUS list_add_qdma_device_and_set_gbl_csr(void); - bool is_first_qdma_pf_device(void); - void list_remove_qdma_device(void); - - /* Context programming */ - NTSTATUS clear_queue_contexts(bool is_c2h, UINT16 qid, qdma_hw_access_type context_op) const; - NTSTATUS clear_cmpt_contexts(UINT16 qid, qdma_hw_access_type context_op) const; - NTSTATUS clear_pfetch_contexts(UINT16 qid, qdma_hw_access_type context_op) const; - NTSTATUS clear_contexts(queue_pair& q, bool invalidate = false) const; - NTSTATUS queue_program(queue_pair& q); - NTSTATUS set_h2c_ctx(queue_pair& q); - NTSTATUS set_c2h_ctx(queue_pair& q); - - NTSTATUS init_qdma_global(); - NTSTATUS init_func(); - NTSTATUS assign_bar_types(); - NTSTATUS init_dma_queues(); - NTSTATUS init_interrupt_queues(); - NTSTATUS init_os_resources(WDFCMRESLIST resources, const WDFCMRESLIST resources_translated); - NTSTATUS init_resource_manager(); - void inc_queue_pair_count(bool is_cmpt_valid); - void dec_queue_pair_count(bool is_cmpt_valid); - - void destroy_dma_queues(void); - void destroy_os_resources(void); - void destroy_func(void); - void destroy_resource_manager(void); - - NTSTATUS configure_irq(PQDMA_IRQ_CONTEXT irq_context, ULONG vec); - NTSTATUS intr_setup(WDFCMRESLIST resources, const WDFCMRESLIST resources_translated); - void intr_teardown(void); - NTSTATUS setup_legacy_interrupt(WDFCMRESLIST resources, const WDFCMRESLIST resources_translated); - int setup_legacy_vector(queue_pair& q); - void clear_legacy_vector(queue_pair& q, UINT32 vector); - NTSTATUS arrange_msix_vector_types(void); - NTSTATUS setup_msix_interrupt(WDFCMRESLIST resources, const WDFCMRESLIST resources_translated); - UINT32 alloc_msix_vector_position(queue_pair& q); - int assign_interrupt_vector(queue_pair& q); - void free_interrupt_vector(queue_pair& q, UINT32 vec_id); - void free_msix_vector_position(queue_pair& q, UINT32 vector); - void mask_msi_entry(UINT32 vector); - void unmask_msi_entry(UINT32 vector); - NTSTATUS qdma_intr_context_read(UINT8 ring_idx_abs, struct qdma_indirect_intr_ctxt *ctxt); -}; - -typedef struct devices_list { - qdma_device *qdma_dev; - devices_list *next; -}devices_list, *pdevices_list; - -} /* namespace xlnx */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_access.c b/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_access.c deleted file mode 100644 index 90c6bba..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_access.c +++ /dev/null @@ -1,5868 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "eqdma_soft_access.h" -#include "eqdma_soft_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_soft_access.tmh" -#endif - -/** EQDMA Context array size */ -#define EQDMA_SW_CONTEXT_NUM_WORDS 8 -#define EQDMA_HW_CONTEXT_NUM_WORDS 2 -#define EQDMA_PFETCH_CONTEXT_NUM_WORDS 2 -#define EQDMA_CR_CONTEXT_NUM_WORDS 1 -#define EQDMA_CMPT_CONTEXT_NUM_WORDS 6 -#define EQDMA_IND_INTR_CONTEXT_NUM_WORDS 4 - -#define EQDMA_VF_USER_BAR_ID 2 - -#define EQDMA_REG_GROUP_1_START_ADDR 0x000 -#define EQDMA_REG_GROUP_2_START_ADDR 0x804 -#define EQDMA_REG_GROUP_3_START_ADDR 0xB00 -#define EQDMA_REG_GROUP_4_START_ADDR 0x5014 - -#define EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS 9 -#define EQDMA_GLBL_TRQ_ERR_ALL_MASK 0XB3 -#define EQDMA_GLBL_DSC_ERR_ALL_MASK 0X1F9037E -#define EQDMA_C2H_ERR_ALL_MASK 0X3F6DF -#define EQDMA_C2H_FATAL_ERR_ALL_MASK 0X1FDF1B -#define EQDMA_H2C_ERR_ALL_MASK 0X3F -#define EQDMA_SBE_ERR_ALL_MASK 0XFFFFFFFF -#define EQDMA_DBE_ERR_ALL_MASK 0XFFFFFFFF - -/* H2C Throttle settings */ -#define EQDMA_H2C_THROT_DATA_THRESH 0x5000 -#define EQDMA_THROT_EN_DATA 1 -#define EQDMA_THROT_EN_REQ 0 -#define EQDMA_H2C_THROT_REQ_THRESH 0xC0 - - -/** Auxillary Bitmasks for fields spanning multiple words */ -#define EQDMA_SW_CTXT_PASID_GET_H_MASK GENMASK(21, 12) -#define EQDMA_SW_CTXT_PASID_GET_L_MASK GENMASK(11, 0) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK GENMASK_ULL(63, 53) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK GENMASK_ULL(52, 21) -#define EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK GENMASK_ULL(20, 0) -#define EQDMA_CMPL_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_CMPL_CTXT_PASID_GET_L_MASK GENMASK(8, 0) -#define EQDMA_INTR_CTXT_PASID_GET_H_MASK GENMASK(21, 9) -#define EQDMA_INTR_CTXT_PASID_GET_L_MASK GENMASK(8, 0) - - -#define EQDMA_OFFSET_GLBL2_PF_BARLITE_EXT 0x10C - -#define QDMA_OFFSET_GLBL2_PF_BARLITE_INT 0x104 -#define QDMA_GLBL2_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define QDMA_GLBL2_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define QDMA_GLBL2_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define QDMA_GLBL2_PF0_BAR_MAP_MASK GENMASK(5, 0) - -#define EQDMA_GLBL2_DBG_MODE_EN_MASK BIT(4) -#define EQDMA_GLBL2_DESC_ENG_MODE_MASK GENMASK(3, 2) -#define EQDMA_GLBL2_FLR_PRESENT_MASK BIT(1) -#define EQDMA_GLBL2_MAILBOX_EN_MASK BIT(0) - -static void eqdma_hw_st_h2c_err_process(void *dev_hndl); -static void eqdma_hw_st_c2h_err_process(void *dev_hndl); -static void eqdma_hw_desc_err_process(void *dev_hndl); -static void eqdma_hw_trq_err_process(void *dev_hndl); -static void eqdma_hw_ram_sbe_err_process(void *dev_hndl); -static void eqdma_hw_ram_dbe_err_process(void *dev_hndl); - -static struct eqdma_hw_err_info eqdma_err_info[EQDMA_ERRS_ALL] = { - /* Descriptor errors */ - { - EQDMA_DSC_ERR_POISON, - "Poison error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_UR_CA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_BCNT, - "Unexpected Byte count in completion error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_BCNT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_PARAM, - "Parameter mismatch error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PARAM_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_ADDR, - "Address mismatch error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_ADDR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_TAG, - "Unexpected tag error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TAG_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_FLR, - "FLR error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_TIMEOUT, - "Timed out error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DAT_POISON, - "Poison data error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DAT_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DMA, - "DMA engine error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DMA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DSC, - "Invalid PIDX update error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DSC_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_SBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - { - EQDMA_DSC_ERR_ALL, - "All Descriptor errors", - EQDMA_GLBL_DSC_ERR_MSK_ADDR, - EQDMA_GLBL_DSC_ERR_STS_ADDR, - EQDMA_GLBL_DSC_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &eqdma_hw_desc_err_process - }, - - /* TRQ errors */ - { - EQDMA_TRQ_ERR_CSR_UNMAPPED, - "Access targeted unmapped register space via CSR pathway error", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_VF_ACCESS, - "VF attempted to access Global register space or Function map", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_TCP_CSR_TIMEOUT, - "Timeout on request to dma internal csr register", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_QSPC_UNMAPPED, - "Access targeted unmapped register via queue space pathway", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_QID_RANGE, - "Qid range error", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QID_RANGE_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_TCP_QSPC_TIMEOUT, - "Timeout on request to dma internal queue space register", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - { - EQDMA_TRQ_ERR_ALL, - "All TRQ errors", - EQDMA_GLBL_TRQ_ERR_MSK_ADDR, - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_GLBL_TRQ_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &eqdma_hw_trq_err_process - }, - - /* C2H Errors*/ - { - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_SH_CMPT_DSC, - "A Shared CMPT queue has encountered a descriptor error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_DESC_RSP_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MSI_INT_FAIL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ERR_DESC_CNT_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - "Writeback on invalid queue error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - "Completion queue gets full error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_QFULL_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - "Bad CIDX update by the software error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_CIDX_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - "C2H completion Parity error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PRTY_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_AVL_RING_DSC, - "Available ring fetch returns descriptor with error", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_HDR_ECC_UNC, - "multi-bit ecc error on c2h packet header", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_HDR_ECC_COR, - "single-bit ecc error on c2h packet header", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_C2H_ERR_ALL, - "All C2h errors", - EQDMA_C2H_ERR_MASK_ADDR, - EQDMA_C2H_ERR_STAT_ADDR, - EQDMA_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_WPL_DATA_PAR, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_HDR_ECC_UNC, - "RAM double bit fatal error", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - { - EQDMA_ST_FATAL_ERR_ALL, - "All fatal errors", - EQDMA_C2H_FATAL_ERR_MASK_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_C2H_FATAL_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &eqdma_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - "Zero length descriptor error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_ZERO_LEN_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - "A non-EOP descriptor received", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_NO_DMA_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_DBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_PAR, - "Internal data parity error", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - { - EQDMA_ST_H2C_ERR_ALL, - "All H2C errors", - EQDMA_H2C_ERR_MASK_ADDR, - EQDMA_H2C_ERR_STAT_ADDR, - EQDMA_H2C_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &eqdma_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Even RAM single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM 1 single bit ECC error.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_1_ERR_ALL, - "All SBE Errors.", - EQDMA_RAM_SBE_MSK_1_A_ADDR, - EQDMA_RAM_SBE_STS_1_A_ADDR, - EQDMA_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, -{ - EQDMA_SBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slavle FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM single bit ECC error", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM single bit ECC error.", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - { - EQDMA_SBE_ERR_ALL, - "All SBE errors", - EQDMA_RAM_SBE_MSK_A_ADDR, - EQDMA_RAM_SBE_STS_A_ADDR, - EQDMA_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &eqdma_hw_ram_sbe_err_process - }, - - - /* DBE errors */ - { - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_TAG_ODD_RAM, - "Tag Odd Ram double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_TAG_EVEN_RAM, - "Tag Even Ram double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - "Pfch Ctxt CAM RAM 0 double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - "Pfch Ctxt CAM RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_1_ERR_ALL, - "All DBE errors", - EQDMA_RAM_DBE_MSK_1_A_ADDR, - EQDMA_RAM_DBE_STS_1_A_ADDR, - EQDMA_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C1_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C2_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_H2C3_DAT, - "H2C MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H1_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H1_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H2_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H2_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_C2H3_DAT, - "C2H MM data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H3_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_FUNC_MAP, - "Function map RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_MI_TL_SLV_FIFO_RAM, - "TL Slave FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_PEND_FIFO_RAM, - "Pend FIFO RAM double bit ECC error", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_RC_RRQ_ODD_RAM, - "RC RRQ Odd RAM double bit ECC error.", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - }, - { - EQDMA_DBE_ERR_ALL, - "All DBE errors", - EQDMA_RAM_DBE_MSK_A_ADDR, - EQDMA_RAM_DBE_STS_A_ADDR, - EQDMA_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &eqdma_hw_ram_dbe_err_process - } -}; - -static int32_t all_eqdma_hw_errs[EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS] = { - - EQDMA_DSC_ERR_ALL, - EQDMA_TRQ_ERR_ALL, - EQDMA_ST_C2H_ERR_ALL, - EQDMA_ST_FATAL_ERR_ALL, - EQDMA_ST_H2C_ERR_ALL, - EQDMA_SBE_1_ERR_ALL, - EQDMA_SBE_ERR_ALL, - EQDMA_DBE_1_ERR_ALL, - EQDMA_DBE_ERR_ALL -}; - -static struct qctx_entry eqdma_sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Function Id", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Address Translation", 0}, - {"Fetch Max", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Interrupt with VF", 0}, - {"Pack descriptor output interface", 0}, - {"Irq Bypass", 0}, -}; - -static struct qctx_entry eqdma_hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry eqdma_credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry eqdma_cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Addr High (L)[37:6]", 0}, - {"Base Addr High(H)[63:38]", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, - {"Over Flow Check Disable", 0}, - {"Address Translation", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, - {"Disable Insterrupt with VF", 0}, - {"c2h Direction", 0}, - {"Base Addr Low[5:2]", 0}, - {"Shared Completion Queue", 0}, -}; - -static struct qctx_entry eqdma_c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Variable Descriptor", 0}, - {"Number of descriptors prefetched", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry eqdma_ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, - {"at", 0}, - {"Function Id", 0}, -}; - -static int eqdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int eqdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int eqdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - -uint32_t eqdma_get_config_num_regs(void) -{ - return eqdma_config_num_regs_get(); -} - -struct xreg_info *eqdma_get_config_regs(void) -{ - return eqdma_config_regs_get(); -} - -uint32_t eqdma_reg_dump_buf_len(void) -{ - uint32_t length = (eqdma_config_num_regs_get() + 1) - * REG_DUMP_SIZE_PER_LINE; - return length; -} - -int eqdma_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - int len = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(eqdma_cmpt_ctxt_entries) / - sizeof(eqdma_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(eqdma_sw_ctxt_entries) / - sizeof(eqdma_sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_hw_ctxt_entries) / - sizeof(eqdma_hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_credit_ctxt_entries) / - sizeof(eqdma_credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(eqdma_cmpt_ctxt_entries) / - sizeof(eqdma_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(eqdma_c2h_pftch_ctxt_entries) / - sizeof(eqdma_c2h_pftch_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } - } - - *buflen = len; - return 0; -} - -static uint32_t eqdma_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(eqdma_ind_intr_ctxt_entries) / - sizeof(eqdma_ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * eqdma_indirect_reg_invalidate() - helper function to invalidate indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = EQDMA_IND_CTXT_DATA_ADDR; - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - - qdma_reg_write(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int eqdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_IND_CTXT_DATA_NUM_REGS; index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = EQDMA_IND_CTXT_DATA_ADDR; - - for (index = 0; index < ((2 * QDMA_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, EQDMA_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * eqdma_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void eqdma_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - int i = 0; - - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->pidx; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_arm; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->fnc_id; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->qen; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->frcd_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbi_chk; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbi_intvl_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->at; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->fetch_max; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->rngsz_idx; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->desc_sz; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->bypass; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->mm_chn; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->wbk_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_en; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->port_id; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_no_last; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->err; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->err_wb_sent; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_req; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->mrkr_dis; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->is_mm; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - eqdma_sw_ctxt_entries[i++].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->vec; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->intr_aggr; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->dis_intr_on_vf; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->pack_byp_out; - eqdma_sw_ctxt_entries[i++].value = sw_ctxt->irq_byp; - -} - -/* - * eqdma_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void eqdma_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - int i = 0; - - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_stat_desc; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->en_int; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->trig_mode; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->fnc_id; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->counter_idx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_idx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->in_st; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->color; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ringsz_idx; - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->desc_sz; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->pidx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->cidx; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->valid; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->err; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->user_trig_pend; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->timer_running; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->full_upd; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->ovf_chk_dis; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->at; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->vec; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->int_aggr; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dis_intr_on_vf; - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->dir_c2h; - eqdma_cmpt_ctxt_entries[i++].value = (uint32_t)FIELD_GET( - EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - cmpt_ctxt->bs_addr); - eqdma_cmpt_ctxt_entries[i++].value = cmpt_ctxt->sh_cmpt; -} - -/* - * eqdma_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void eqdma_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - int i = 0; - - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->cidx; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->crd_use; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->dsc_pend; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->idl_stp_b; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->evt_pnd; - eqdma_hw_ctxt_entries[i++].value = hw_ctxt->fetch_pnd; -} - -/* - * eqdma_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void eqdma_fill_credit_ctxt(struct qdma_descq_credit_ctxt *cr_ctxt) -{ - eqdma_credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * eqdma_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void eqdma_fill_pfetch_ctxt(struct qdma_descq_prefetch_ctxt - *pfetch_ctxt) -{ - int i = 0; - - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->bypass; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->bufsz_idx; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->port_id; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->var_desc; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->num_pftch; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->err; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch_en; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->pfch; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->sw_crdt; - eqdma_c2h_pftch_ctxt_entries[i++].value = pfetch_ctxt->valid; -} - -/* - * eqdma_fill_intr_ctxt() - Helper function to fill interrupt context - * into structure - * - */ -static void eqdma_fill_intr_ctxt(struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - int i = 0; - - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->valid; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->vec; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->int_st; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->color; - eqdma_ind_intr_ctxt_entries[i++].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - eqdma_ind_intr_ctxt_entries[i++].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->page_size; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->pidx; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->at; - eqdma_ind_intr_ctxt_entries[i++].value = intr_ctxt->func_id; -} - -/*****************************************************************************/ -/** - * eqdma_set_default_global_csr() - function to set the global CSR register to - * default values. The value can be modified later by using the set/get csr - * functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t cfg_val = 0, reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, 385, - 513, 769, 1025, 1537, 3073, 4097, 6145, 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, 32, 48, 64, - 80, 96, 112, 128, 144, 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 8192, - 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_TIMER_CNT_ADDR, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR, reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - - cfg_val = qdma_reg_read(dev_hndl, - EQDMA_C2H_PFCH_CACHE_DEPTH_ADDR); - - reg_val = - FIELD_SET(C2H_PFCH_CFG_FL_TH_MASK, - DEFAULT_PFCH_STOP_THRESH); - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_ADDR, reg_val); - - reg_val = FIELD_SET(C2H_PFCH_CFG_1_QCNT_MASK, (cfg_val >> 1)) | - FIELD_SET(C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK, - ((cfg_val >> 1) - 2)); - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_1_ADDR, reg_val); - - reg_val = FIELD_SET(C2H_PFCH_CFG_2_NUM_MASK, - DEFAULT_PFCH_NUM_ENTRIES_PER_Q); - - qdma_reg_write(dev_hndl, EQDMA_C2H_PFCH_CFG_2_ADDR, reg_val); - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, EQDMA_C2H_INT_TIMER_TICK_ADDR, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - EQDMA_C2H_WRB_COAL_BUF_DEPTH_ADDR); - reg_val = - FIELD_SET(C2H_WRB_COAL_CFG_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(C2H_WRB_COAL_CFG_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK, cfg_val); - qdma_reg_write(dev_hndl, EQDMA_C2H_WRB_COAL_CFG_ADDR, reg_val); - - /* H2C throttle Configuration*/ - - reg_val = - FIELD_SET(H2C_REQ_THROT_PCIE_DATA_THRESH_MASK, - EQDMA_H2C_THROT_DATA_THRESH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_DATA_MASK, - EQDMA_THROT_EN_DATA) | - FIELD_SET(H2C_REQ_THROT_PCIE_MASK, - EQDMA_H2C_THROT_REQ_THRESH) | - FIELD_SET(H2C_REQ_THROT_PCIE_EN_REQ_MASK, - EQDMA_THROT_EN_REQ); - qdma_reg_write(dev_hndl, EQDMA_H2C_REQ_THROT_PCIE_ADDR, - reg_val); - } - - return QDMA_SUCCESS; -} - -/* - * dump_eqdma_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - eqdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_H2C) { - eqdma_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_fill_credit_ctxt(&queue_context->cr_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_C2H) { - eqdma_fill_sw_ctxt(&queue_context->sw_ctxt); - eqdma_fill_hw_ctxt(&queue_context->hw_ctxt); - eqdma_fill_credit_ctxt(&queue_context->cr_ctxt); - if (st) { - eqdma_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - eqdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - } - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* SW context dump */ - n = sizeof(eqdma_sw_ctxt_entries) / - sizeof((eqdma_sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_sw_ctxt_entries[i].name, - eqdma_sw_ctxt_entries[i].value, - eqdma_sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(eqdma_hw_ctxt_entries) / - sizeof((eqdma_hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_hw_ctxt_entries[i].name, - eqdma_hw_ctxt_entries[i].value, - eqdma_hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(eqdma_credit_ctxt_entries) / - sizeof((eqdma_credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_credit_ctxt_entries[i].name, - eqdma_credit_ctxt_entries[i].value, - eqdma_credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(eqdma_cmpt_ctxt_entries) / - sizeof((eqdma_cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_cmpt_ctxt_entries[i].name, - eqdma_cmpt_ctxt_entries[i].value, - eqdma_cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(eqdma_c2h_pftch_ctxt_entries) / - sizeof(eqdma_c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_c2h_pftch_ctxt_entries[i].name, - eqdma_c2h_pftch_ctxt_entries[i].value, - eqdma_c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * dump_eqdma_intr_context() - Helper function to dump interrupt context into - * string - * - * return len - length of the string copied into buffer - */ -static int dump_eqdma_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - eqdma_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(eqdma_ind_intr_ctxt_entries) / - sizeof((eqdma_ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - eqdma_ind_intr_ctxt_entries[i].name, - eqdma_ind_intr_ctxt_entries[i].value, - eqdma_ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/*****************************************************************************/ -/** - * eqdma_get_version() - Function to get the eqdma version - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @version_info: pointer to hold the version info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_OFFSET_VF_VERSION : - EQDMA_GLBL2_MISC_CAP_ADDR; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - qdma_fetch_version_details(is_vf, reg_val, version_info); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[EQDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - pasid_l = - FIELD_GET(EQDMA_SW_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_SW_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - virtio_desc_base_l = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_m = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - ctxt->virtio_dsc_base); - virtio_desc_base_h = (uint32_t)FIELD_GET( - EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - ctxt->virtio_dsc_base); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W0_PIDX_MASK, ctxt->pidx) | - FIELD_SET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, ctxt->irq_arm) | - FIELD_SET(SW_IND_CTXT_DATA_W0_FNC_MASK, ctxt->fnc_id); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x\n", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - ctxt->wbi_intvl_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_AT_MASK, ctxt->at) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, ctxt->fetch_max) | - FIELD_SET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - ctxt->irq_no_last) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_MASK, ctxt->err) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - ctxt->err_wb_sent) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, ctxt->is_mm); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,err=%x", - __func__, ctxt->port_id, ctxt->irq_no_last, ctxt->err); - qdma_log_debug(", err_wb_sent=%x\n", ctxt->err_wb_sent); - - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->intr_aggr) | - FIELD_SET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - ctxt->virtio_en) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - ctxt->pack_byp_out) | - FIELD_SET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, ctxt->irq_byp) | - FIELD_SET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - virtio_desc_base_l); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - virtio_desc_base_m); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - virtio_desc_base_h); - - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t sw_ctxt[EQDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint32_t pasid_l, pasid_h; - uint32_t virtio_desc_base_l, virtio_desc_base_m, virtio_desc_base_h; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(SW_IND_CTXT_DATA_W0_PIDX_MASK, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, - sw_ctxt[0])); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_FNC_MASK, - sw_ctxt[0])); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - ctxt->qen = FIELD_GET(SW_IND_CTXT_DATA_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, sw_ctxt[1]); - ctxt->at = FIELD_GET(SW_IND_CTXT_DATA_W1_AT_MASK, sw_ctxt[1]); - ctxt->fetch_max = - (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK, - sw_ctxt[1]); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, - sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, - sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, - sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, - sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, - sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, - sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, - sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, - sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, - sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, - sw_ctxt[1])); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,", - __func__, ctxt->port_id, ctxt->irq_no_last); - qdma_log_debug(" err=%x, err_wb_sent=%x\n", - ctxt->err, ctxt->err_wb_sent); - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - ctxt->vec = FIELD_GET(SW_IND_CTXT_DATA_W4_VEC_MASK, sw_ctxt[4]); - ctxt->intr_aggr = (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_INT_AGGR_MASK, - sw_ctxt[4])); - ctxt->dis_intr_on_vf = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - sw_ctxt[4])); - ctxt->virtio_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK, - sw_ctxt[4])); - ctxt->pack_byp_out = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK, - sw_ctxt[4])); - ctxt->irq_byp = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK, - sw_ctxt[4])); - ctxt->host_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W4_HOST_ID_MASK, - sw_ctxt[4])); - pasid_l = FIELD_GET(SW_IND_CTXT_DATA_W4_PASID_L_MASK, sw_ctxt[4]); - - pasid_h = FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_H_MASK, sw_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(SW_IND_CTXT_DATA_W5_PASID_EN_MASK, - sw_ctxt[5]); - virtio_desc_base_l = - FIELD_GET(SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK, - sw_ctxt[5]); - virtio_desc_base_m = - FIELD_GET(SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK, - sw_ctxt[6]); - - virtio_desc_base_h = - FIELD_GET(SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK, - sw_ctxt[6]); - - ctxt->pasid = - FIELD_SET(EQDMA_SW_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_SW_CTXT_PASID_GET_H_MASK, pasid_h); - - ctxt->virtio_dsc_base = - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_L_MASK, - (uint64_t)virtio_desc_base_l) | - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_M_MASK, - (uint64_t)virtio_desc_base_m) | - FIELD_SET(EQDMA_SW_CTXT_VIRTIO_DSC_BASE_GET_H_MASK, - (uint64_t)virtio_desc_base_h); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_sw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_sw_context_write(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_sw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[EQDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, - ctxt->num_pftch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - ctxt->var_desc) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_ERR_MASK, ctxt->err) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, ctxt->pfch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, sw_crdt_l); - - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(PREFETCH_CTXT_DATA_W1_VALID_MASK, ctxt->valid); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t pfetch_ctxt[EQDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, pfetch_ctxt[0]); - ctxt->bufsz_idx = - FIELD_GET(PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK, - pfetch_ctxt[0]); - ctxt->num_pftch = (uint16_t) FIELD_GET( - PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK, pfetch_ctxt[0]); - ctxt->port_id = - FIELD_GET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, pfetch_ctxt[0]); - ctxt->var_desc = (uint8_t) - FIELD_GET(PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK, - pfetch_ctxt[0]); - ctxt->err = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - FIELD_GET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, pfetch_ctxt[0]); - - sw_crdt_h = - FIELD_GET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_pfetch_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_pfetch_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_pfetch_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_pfetch_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[EQDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr4_high_l, baddr4_high_h, - baddr4_low, pidx_l, pidx_h, pasid_l, pasid_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR) { - qdma_log_error("%s: trig_mode(%d) > (%d) is invalid, err:%d\n", - __func__, - ctxt->trig_mode, - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr4_high_l = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - ctxt->bs_addr); - baddr4_high_h = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - ctxt->bs_addr); - baddr4_low = (uint32_t)FIELD_GET(EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - ctxt->bs_addr); - - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, ctxt->pidx); - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, ctxt->pidx); - - pasid_l = - FIELD_GET(EQDMA_CMPL_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_CMPL_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(CMPL_CTXT_DATA_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - ctxt->counter_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, ctxt->timer_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_INT_ST_MASK, ctxt->in_st) | - FIELD_SET(CMPL_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, ctxt->ringsz_idx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, baddr4_high_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, baddr4_high_h) | - FIELD_SET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, ctxt->desc_sz) | - FIELD_SET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, pidx_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, pidx_h) | - FIELD_SET(CMPL_CTXT_DATA_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(CMPL_CTXT_DATA_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(CMPL_CTXT_DATA_W3_ERR_MASK, ctxt->err) | - FIELD_SET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - ctxt->user_trig_pend); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, - ctxt->timer_running) | - FIELD_SET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, ctxt->full_upd) | - FIELD_SET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, - ctxt->ovf_chk_dis) | - FIELD_SET(CMPL_CTXT_DATA_W4_AT_MASK, ctxt->at) | - FIELD_SET(CMPL_CTXT_DATA_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, ctxt->int_aggr) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - ctxt->dis_intr_on_vf) | - FIELD_SET(CMPL_CTXT_DATA_W4_VIO_MASK, ctxt->vio) | - FIELD_SET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, ctxt->dir_c2h) | - FIELD_SET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(CMPL_CTXT_DATA_W4_PASID_L_MASK, pasid_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_H_MASK, pasid_h) | - FIELD_SET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - ctxt->pasid_en) | - FIELD_SET(CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, - baddr4_low) | - FIELD_SET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, ctxt->vio_eop) | - FIELD_SET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, ctxt->sh_cmpt); - - return eqdma_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cmpt_ctxt[EQDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr4_high_l, baddr4_high_h, baddr4_low, - pidx_l, pidx_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(CMPL_CTXT_DATA_W0_EN_INT_MASK, cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_CNTER_IX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_TIMER_IX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_QSIZE_IX_MASK, - cmpt_ctxt[0])); - - baddr4_high_l = FIELD_GET(CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK, - cmpt_ctxt[1]); - - baddr4_high_h = FIELD_GET(CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK, - cmpt_ctxt[2]); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, cmpt_ctxt[2]); - - pidx_h = FIELD_GET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(CMPL_CTXT_DATA_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_ERR_MASK, - cmpt_ctxt[3])); - ctxt->user_trig_pend = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - cmpt_ctxt[3])); - - ctxt->timer_running = - FIELD_GET(CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK, cmpt_ctxt[4]); - ctxt->full_upd = - FIELD_GET(CMPL_CTXT_DATA_W4_FULL_UPD_MASK, cmpt_ctxt[4]); - ctxt->ovf_chk_dis = - FIELD_GET(CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK, cmpt_ctxt[4]); - ctxt->at = FIELD_GET(CMPL_CTXT_DATA_W4_AT_MASK, cmpt_ctxt[4]); - ctxt->vec = FIELD_GET(CMPL_CTXT_DATA_W4_VEC_MASK, cmpt_ctxt[4]); - ctxt->int_aggr = (uint8_t) - (FIELD_GET(CMPL_CTXT_DATA_W4_INT_AGGR_MASK, cmpt_ctxt[4])); - ctxt->dis_intr_on_vf = (uint8_t) - FIELD_GET(CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK, - cmpt_ctxt[4]); - ctxt->vio = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_VIO_MASK, - cmpt_ctxt[4]); - ctxt->dir_c2h = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_DIR_C2H_MASK, - cmpt_ctxt[4]); - ctxt->host_id = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W4_HOST_ID_MASK, - cmpt_ctxt[4]); - pasid_l = FIELD_GET(CMPL_CTXT_DATA_W4_PASID_L_MASK, cmpt_ctxt[4]); - - pasid_h = (uint32_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_H_MASK, - cmpt_ctxt[5]); - ctxt->pasid_en = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_PASID_EN_MASK, - cmpt_ctxt[5]); - baddr4_low = (uint8_t)FIELD_GET( - CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK, cmpt_ctxt[5]); - ctxt->vio_eop = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_VIO_EOP_MASK, - cmpt_ctxt[5]); - ctxt->sh_cmpt = (uint8_t)FIELD_GET(CMPL_CTXT_DATA_W5_SH_CMPT_MASK, - cmpt_ctxt[5]); - - ctxt->bs_addr = - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK, - (uint64_t)baddr4_high_l) | - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK, - (uint64_t)baddr4_high_h) | - FIELD_SET(EQDMA_COMPL_CTXT_BADDR_LOW_MASK, - (uint64_t)baddr4_low); - - ctxt->pasid = - FIELD_SET(EQDMA_CMPL_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_CMPL_CTXT_PASID_GET_H_MASK, - (uint64_t)pasid_h); - - ctxt->pidx = - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, pidx_l) | - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, pidx_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_cmpt_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_cmpt_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_cmpt_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_cmpt_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t hw_ctxt[EQDMA_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or hw_ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(HW_IND_CTXT_DATA_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(HW_IND_CTXT_DATA_W0_CRD_USE_MASK, - hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, - hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->evt_pnd = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_EVT_PND_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = (uint8_t) - (FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, hw_ctxt[1])); - - qdma_log_debug("%s: cidx=%hu, crd_use=%hu, dsc_pend=%x\n", - __func__, ctxt->cidx, ctxt->crd_use, ctxt->dsc_pend); - qdma_log_debug("%s: idl_stp_b=%x, evt_pnd=%x, fetch_pnd=%x\n", - __func__, ctxt->idl_stp_b, ctxt->evt_pnd, - ctxt->fetch_pnd); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_hw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_hw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[EQDMA_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, hw_qid, - EQDMA_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(CRED_CTXT_DATA_W0_CREDT_MASK, cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * eqdma_credit_ctx_conf() - configure credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_credit_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_credit_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_write() - create indirect interrupt context - * and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_write(void *dev_hndl, - uint16_t ring_index, const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[EQDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint32_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_m = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, - ctxt->baddr_4k); - baddr_h = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - pasid_l = - FIELD_GET(EQDMA_INTR_CTXT_PASID_GET_L_MASK, ctxt->pasid); - pasid_h = - FIELD_GET(EQDMA_INTR_CTXT_PASID_GET_H_MASK, ctxt->pasid); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(INTR_CTXT_DATA_W0_VEC_MASK, ctxt->vec) | - FIELD_SET(INTR_CTXT_DATA_W0_INT_ST_MASK, ctxt->int_st) | - FIELD_SET(INTR_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, baddr_m); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, baddr_h) | - FIELD_SET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, ctxt->page_size) | - FIELD_SET(INTR_CTXT_DATA_W2_PIDX_MASK, ctxt->pidx) | - FIELD_SET(INTR_CTXT_DATA_W2_AT_MASK, ctxt->at) | - FIELD_SET(INTR_CTXT_DATA_W2_HOST_ID_MASK, ctxt->host_id) | - FIELD_SET(INTR_CTXT_DATA_W2_PASID_L_MASK, pasid_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W3_PASID_H_MASK, pasid_h) | - FIELD_SET(INTR_CTXT_DATA_W3_PASID_EN_MASK, ctxt->pasid_en) | - FIELD_SET(INTR_CTXT_DATA_W3_FUNC_MASK, ctxt->func_id); - - return eqdma_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_read(void *dev_hndl, - uint16_t ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t intr_ctxt[EQDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_m, baddr_h, pasid_l, pasid_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_indirect_reg_read(dev_hndl, sel, ring_index, - EQDMA_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(INTR_CTXT_DATA_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(INTR_CTXT_DATA_W0_VEC_MASK, intr_ctxt[0]); - ctxt->int_st = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_INT_ST_MASK, - intr_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_COLOR_MASK, - intr_ctxt[0])); - baddr_l = FIELD_GET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, intr_ctxt[0]); - - baddr_m = FIELD_GET(INTR_CTXT_DATA_W1_BADDR_4K_M_MASK, intr_ctxt[1]); - - baddr_h = FIELD_GET(INTR_CTXT_DATA_W2_BADDR_4K_H_MASK, intr_ctxt[2]); - ctxt->page_size = - FIELD_GET(INTR_CTXT_DATA_W2_PAGE_SIZE_MASK, intr_ctxt[2]); - ctxt->pidx = - (uint16_t)(FIELD_GET(INTR_CTXT_DATA_W2_PIDX_MASK, - intr_ctxt[2])); - ctxt->at = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_AT_MASK, intr_ctxt[2])); - ctxt->host_id = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_HOST_ID_MASK, - intr_ctxt[2])); - pasid_l = (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W2_PASID_L_MASK, - intr_ctxt[2])); - - pasid_h = FIELD_GET(INTR_CTXT_DATA_W3_PASID_H_MASK, intr_ctxt[3]); - ctxt->pasid_en = (uint8_t)FIELD_GET(INTR_CTXT_DATA_W3_PASID_EN_MASK, - intr_ctxt[3]); - - ctxt->func_id = (uint16_t)FIELD_GET(INTR_CTXT_DATA_W3_FUNC_MASK, - intr_ctxt[3]); - - ctxt->baddr_4k = - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, baddr_m) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - ctxt->pasid = - FIELD_SET(EQDMA_INTR_CTXT_PASID_GET_L_MASK, pasid_l) | - FIELD_SET(EQDMA_INTR_CTXT_PASID_GET_H_MASK, pasid_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_clear() - clear indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_clear(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_context_invalidate() - invalidate indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return eqdma_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * eqdma_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_indirect_intr_context_read(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_indirect_intr_context_write(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = eqdma_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = eqdma_indirect_intr_context_invalidate(dev_hndl, - ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < eqdma_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = eqdma_config_regs_get(); - - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s", reg_info[i].name); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/*****************************************************************************/ -/** - * qdma_dump_cpm_queue_context() - Function to get qdma queue context dump - * in a buffer - * - * @dev_hndl: device handle - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @context: Queue Context - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_context(ctxt_data, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_dump_intr_context() - Function to get qdma interrupt context dump - * in a buffer - * - * @dev_hndl: device handle - * @intr_ctx: Interrupt Context - * @ring_index: Ring index - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - req_buflen = eqdma_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_eqdma_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int eqdma_read_dump_queue_context(void *dev_hndl, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = eqdma_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = eqdma_sw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.sw_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read sw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_hw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.hw_ctxt), QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read hw context, err = %d", - __func__, rv); - return rv; - } - - rv = eqdma_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read credit context, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = eqdma_pfetch_ctx_conf(dev_hndl, - qid_hw, - &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read pftech context, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = eqdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read cmpt context, err = %d", - __func__, rv); - return rv; - } - } - - - rv = dump_eqdma_context(&context, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_get_user_bar() - Function to get the AXI Master Lite(user bar) number - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite bar number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint8_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = (is_vf) ? EQDMA_OFFSET_VF_USER_BAR : - EQDMA_OFFSET_GLBL2_PF_BARLITE_EXT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: AXI Master Lite bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_hw_ram_sbe_err_process() - Function to dump SBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_ram_sbe_err_process(void *dev_hndl) -{ - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_SBE_STS_A_ADDR, - 1, NULL, 0); - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_SBE_STS_1_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_hw_ram_dbe_err_process() - Function to dump DBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_ram_dbe_err_process(void *dev_hndl) -{ - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_DBE_STS_A_ADDR, - 1, NULL, 0); - eqdma_dump_reg_info(dev_hndl, EQDMA_RAM_DBE_STS_1_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * eqdma_hw_desc_err_process() - Function to dump Descriptor Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - EQDMA_GLBL_DSC_ERR_STS_ADDR, - EQDMA_GLBL_DSC_ERR_LOG0_ADDR, - EQDMA_GLBL_DSC_ERR_LOG1_ADDR, - EQDMA_GLBL_DSC_DBG_DAT0_ADDR, - EQDMA_GLBL_DSC_DBG_DAT1_ADDR, - EQDMA_GLBL_DSC_ERR_LOG2_ADDR - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_hw_trq_err_process() - Function to dump Target Access Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - EQDMA_GLBL_TRQ_ERR_STS_ADDR, - EQDMA_GLBL_TRQ_ERR_LOG_ADDR - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * eqdma_hw_st_h2c_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - EQDMA_H2C_ERR_STAT_ADDR, - EQDMA_H2C_FIRST_ERR_QID_ADDR, - EQDMA_H2C_DBG_REG0_ADDR, - EQDMA_H2C_DBG_REG1_ADDR, - EQDMA_H2C_DBG_REG2_ADDR, - EQDMA_H2C_DBG_REG3_ADDR, - EQDMA_H2C_DBG_REG4_ADDR - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, st_h2c_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * eqdma_hw_st_c2h_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void eqdma_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - EQDMA_C2H_ERR_STAT_ADDR, - EQDMA_C2H_FATAL_ERR_STAT_ADDR, - EQDMA_C2H_FIRST_ERR_QID_ADDR, - EQDMA_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR, - EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR, - EQDMA_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR, - EQDMA_C2H_STAT_AXIS_PKG_CMP_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_0_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_1_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_2_ADDR, - EQDMA_C2H_STAT_DBG_DMA_ENG_3_ADDR, - EQDMA_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR, - EQDMA_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - eqdma_dump_reg_info(dev_hndl, st_c2h_err_reg_list[i], - 1, NULL, 0); - } -} - - - -/*****************************************************************************/ -/** - * eqdma_hw_get_error_name() - Function to get the error in string format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *eqdma_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= EQDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, (enum eqdma_error_idx)err_idx); - return NULL; - } - - return eqdma_err_info[(enum eqdma_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * eqdma_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t bit = 0, i = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS] = { - EQDMA_DSC_ERR_POISON, - EQDMA_TRQ_ERR_CSR_UNMAPPED, - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_SBE_ERR_MI_H2C0_DAT, - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_DBE_ERR_MI_H2C0_DAT - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, EQDMA_GLBL_ERR_STAT_ADDR); - - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - - qdma_log_info("%s: Global Err Reg(0x%x) = 0x%x\n", - __func__, EQDMA_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - for (i = 0; i < EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - bit = hw_err_position[i]; - - if ((!dev_cap.st_en) && (bit == EQDMA_ST_C2H_ERR_MTY_MISMATCH || - bit == EQDMA_ST_FATAL_ERR_MTY_MISMATCH || - bit == EQDMA_ST_H2C_ERR_ZERO_LEN_DESC)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - eqdma_err_info[bit].stat_reg_addr); - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - eqdma_err_info[bit].stat_reg_addr, - err_stat); - - eqdma_err_info[bit].eqdma_hw_err_process( - dev_hndl); - for (idx = bit; idx < all_eqdma_hw_errs[i]; idx++) { - /* call the platform specific handler */ - if (err_stat & - eqdma_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s\n", - __func__, - eqdma_hw_get_error_name(idx)); - } - qdma_reg_write(dev_hndl, - eqdma_err_info[bit].stat_reg_addr, - err_stat); - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_STAT_ADDR, glbl_err_stat); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > EQDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, (enum eqdma_error_idx)err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == EQDMA_ERRS_ALL) { - for (i = 0; i < EQDMA_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - - idx = all_eqdma_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == EQDMA_ST_C2H_ERR_ALL || - idx == EQDMA_ST_FATAL_ERR_ALL || - idx == EQDMA_ST_H2C_ERR_ALL) - continue; - } - - reg_val = eqdma_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - eqdma_err_info[idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, - EQDMA_GLBL_ERR_MASK_ADDR); - reg_val |= FIELD_SET( - eqdma_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= EQDMA_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= EQDMA_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - eqdma_err_info[err_idx].mask_reg_addr); - reg_val |= FIELD_SET(eqdma_err_info[err_idx].leaf_err_mask, 1); - qdma_reg_write(dev_hndl, - eqdma_err_info[err_idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR); - reg_val |= - FIELD_SET(eqdma_err_info[err_idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, EQDMA_GLBL_ERR_MASK_ADDR, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_get_device_attributes() - Function to get the qdma device - * attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_PF_BARLITE_INT); - if (FIELD_GET(QDMA_GLBL2_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_CHANNEL_CAP_ADDR); - dev_info->num_qs = - FIELD_GET(GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK, reg_val); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_MISC_CAP_ADDR); - dev_info->mailbox_en = FIELD_GET(EQDMA_GLBL2_MAILBOX_EN_MASK, - reg_val); - dev_info->flr_present = FIELD_GET(EQDMA_GLBL2_FLR_PRESENT_MASK, - reg_val); - dev_info->mm_cmpt_en = 0; - dev_info->debug_mode = FIELD_GET(EQDMA_GLBL2_DBG_MODE_EN_MASK, - reg_val); - dev_info->desc_eng_mode = FIELD_GET(EQDMA_GLBL2_DESC_ENG_MODE_MASK, - reg_val); - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL2_CHANNEL_MDMA_ADDR); - dev_info->st_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ST_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ST_MASK, reg_val)) ? 1 : 0; - dev_info->mm_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ENG_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ENG_MASK, reg_val)) ? 1 : 0; - - /* num of mm channels */ - /* TODO : Register not yet defined for this. Hard coding it to 1.*/ - dev_info->mm_channel_max = 1; - - dev_info->qid2vec_ctx = 0; - dev_info->cmpt_ovf_chk_dis = 1; - dev_info->mailbox_intr = 1; - dev_info->sw_desc_64b = 1; - dev_info->cmpt_desc_64b = 1; - dev_info->dynamic_bar = 1; - dev_info->legacy_intr = 1; - dev_info->cmpt_trig_count_timer = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_init_ctxt_memory() - function to initialize the context memory - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - eqdma_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = eqdma_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - eqdma_indirect_reg_clear(dev_hndl, - QDMA_CTXT_SEL_FMAP, i); - -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return QDMA_SUCCESS; - -} - - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - - reg_info = eqdma_config_regs_get(); - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * eqdma_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - for (reg_count = 0; - (reg_count < total_regs);) { - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[reg_count].is_debug_reg == 1) - continue; - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; - -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int eqdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = eqdma_config_num_regs_get(); - struct xreg_info *eqdma_config_regs = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_group) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = EQDMA_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = EQDMA_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = EQDMA_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = EQDMA_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid slot received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - reg_info = &eqdma_config_regs[reg_index]; - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - reg_info[i].is_debug_reg == 1) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_ring_sizes() - function to set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_ring_sizes() - function to get the global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, EQDMA_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_TIMER_CNT_ADDR, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - EQDMA_C2H_TIMER_CNT_ADDR, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_counter_threshold() - function to get the counter threshold - * values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, EQDMA_C2H_CNT_TH_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_write_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, EQDMA_C2H_BUF_SZ_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - eqdma_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - eqdma_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_write() - function to set the writeback - * interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR); - reg_val |= FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - qdma_reg_write(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_read() - function to get the writeback - * interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int eqdma_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, EQDMA_GLBL_DSC_CFG_ADDR); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * eqdma_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = eqdma_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = eqdma_global_writeback_interval_write(dev_hndl, *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * eqdma_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int eqdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? EQDMA_C2H_MM_CTL_ADDR : - EQDMA_H2C_MM_CTL_ADDR; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - - - return QDMA_SUCCESS; -} - -int eqdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = eqdma_config_num_regs_get(); - struct xreg_info *config_regs = eqdma_config_regs_get(); - struct qdma_dev_attributes dev_cap; - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - eqdma_get_device_attributes(dev_hndl, &dev_cap); - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - /* If Debug Mode not enabled and the current register - * is debug register, skip reading it. - */ - if (dev_cap.debug_mode == 0 && - config_regs[j].is_debug_reg == 1) - continue; - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; -} - diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_access.h b/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_access.h deleted file mode 100644 index 4f37f24..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_access.h +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __EQDMA_SOFT_ACCESS_H_ -#define __EQDMA_SOFT_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum eqdma_error_idx { - /* Descriptor errors */ - EQDMA_DSC_ERR_POISON, - EQDMA_DSC_ERR_UR_CA, - EQDMA_DSC_ERR_BCNT, - EQDMA_DSC_ERR_PARAM, - EQDMA_DSC_ERR_ADDR, - EQDMA_DSC_ERR_TAG, - EQDMA_DSC_ERR_FLR, - EQDMA_DSC_ERR_TIMEOUT, - EQDMA_DSC_ERR_DAT_POISON, - EQDMA_DSC_ERR_FLR_CANCEL, - EQDMA_DSC_ERR_DMA, - EQDMA_DSC_ERR_DSC, - EQDMA_DSC_ERR_RQ_CANCEL, - EQDMA_DSC_ERR_DBE, - EQDMA_DSC_ERR_SBE, - EQDMA_DSC_ERR_ALL, - - /* TRQ Errors */ - EQDMA_TRQ_ERR_CSR_UNMAPPED, - EQDMA_TRQ_ERR_VF_ACCESS, - EQDMA_TRQ_ERR_TCP_CSR_TIMEOUT, - EQDMA_TRQ_ERR_QSPC_UNMAPPED, - EQDMA_TRQ_ERR_QID_RANGE, - EQDMA_TRQ_ERR_TCP_QSPC_TIMEOUT, - EQDMA_TRQ_ERR_ALL, - - /* C2H Errors */ - EQDMA_ST_C2H_ERR_MTY_MISMATCH, - EQDMA_ST_C2H_ERR_LEN_MISMATCH, - EQDMA_ST_C2H_ERR_SH_CMPT_DSC, - EQDMA_ST_C2H_ERR_QID_MISMATCH, - EQDMA_ST_C2H_ERR_DESC_RSP_ERR, - EQDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - EQDMA_ST_C2H_ERR_MSI_INT_FAIL, - EQDMA_ST_C2H_ERR_ERR_DESC_CNT, - EQDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - EQDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - EQDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - EQDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - EQDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - EQDMA_ST_C2H_ERR_AVL_RING_DSC, - EQDMA_ST_C2H_ERR_HDR_ECC_UNC, - EQDMA_ST_C2H_ERR_HDR_ECC_COR, - EQDMA_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - EQDMA_ST_FATAL_ERR_MTY_MISMATCH, - EQDMA_ST_FATAL_ERR_LEN_MISMATCH, - EQDMA_ST_FATAL_ERR_QID_MISMATCH, - EQDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - EQDMA_ST_FATAL_ERR_CMPT_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_WPL_DATA_PAR, - EQDMA_ST_FATAL_ERR_AVL_RING_FIFO_RAM_RDBE, - EQDMA_ST_FATAL_ERR_HDR_ECC_UNC, - EQDMA_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - EQDMA_ST_H2C_ERR_ZERO_LEN_DESC, - EQDMA_ST_H2C_ERR_SDI_MRKR_REQ_MOP, - EQDMA_ST_H2C_ERR_NO_DMA_DSC, - EQDMA_ST_H2C_ERR_SBE, - EQDMA_ST_H2C_ERR_DBE, - EQDMA_ST_H2C_ERR_PAR, - EQDMA_ST_H2C_ERR_ALL, - - /* Single bit errors */ - EQDMA_SBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_SBE_1_ERR_TAG_ODD_RAM, - EQDMA_SBE_1_ERR_TAG_EVEN_RAM, - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_SBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_SBE_1_ERR_ALL, - - /* Single bit errors */ - EQDMA_SBE_ERR_MI_H2C0_DAT, - EQDMA_SBE_ERR_MI_H2C1_DAT, - EQDMA_SBE_ERR_MI_H2C2_DAT, - EQDMA_SBE_ERR_MI_H2C3_DAT, - EQDMA_SBE_ERR_MI_C2H0_DAT, - EQDMA_SBE_ERR_MI_C2H1_DAT, - EQDMA_SBE_ERR_MI_C2H2_DAT, - EQDMA_SBE_ERR_MI_C2H3_DAT, - EQDMA_SBE_ERR_H2C_RD_BRG_DAT, - EQDMA_SBE_ERR_H2C_WR_BRG_DAT, - EQDMA_SBE_ERR_C2H_RD_BRG_DAT, - EQDMA_SBE_ERR_C2H_WR_BRG_DAT, - EQDMA_SBE_ERR_FUNC_MAP, - EQDMA_SBE_ERR_DSC_HW_CTXT, - EQDMA_SBE_ERR_DSC_CRD_RCV, - EQDMA_SBE_ERR_DSC_SW_CTXT, - EQDMA_SBE_ERR_DSC_CPLI, - EQDMA_SBE_ERR_DSC_CPLD, - EQDMA_SBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_SBE_ERR_TIMER_FIFO_RAM, - EQDMA_SBE_ERR_QID_FIFO_RAM, - EQDMA_SBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_SBE_ERR_INT_CTXT_RAM, - EQDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_SBE_ERR_PFCH_CTXT_RAM, - EQDMA_SBE_ERR_WRB_CTXT_RAM, - EQDMA_SBE_ERR_PFCH_LL_RAM, - EQDMA_SBE_ERR_PEND_FIFO_RAM, - EQDMA_SBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_SBE_ERR_ALL, - - /* Double bit Errors */ - EQDMA_DBE_1_ERR_RC_RRQ_EVEN_RAM, - EQDMA_DBE_1_ERR_TAG_ODD_RAM, - EQDMA_DBE_1_ERR_TAG_EVEN_RAM, - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_0, - EQDMA_DBE_1_ERR_PFCH_CTXT_CAM_RAM_1, - EQDMA_DBE_1_ERR_ALL, - - /* Double bit Errors */ - EQDMA_DBE_ERR_MI_H2C0_DAT, - EQDMA_DBE_ERR_MI_H2C1_DAT, - EQDMA_DBE_ERR_MI_H2C2_DAT, - EQDMA_DBE_ERR_MI_H2C3_DAT, - EQDMA_DBE_ERR_MI_C2H0_DAT, - EQDMA_DBE_ERR_MI_C2H1_DAT, - EQDMA_DBE_ERR_MI_C2H2_DAT, - EQDMA_DBE_ERR_MI_C2H3_DAT, - EQDMA_DBE_ERR_H2C_RD_BRG_DAT, - EQDMA_DBE_ERR_H2C_WR_BRG_DAT, - EQDMA_DBE_ERR_C2H_RD_BRG_DAT, - EQDMA_DBE_ERR_C2H_WR_BRG_DAT, - EQDMA_DBE_ERR_FUNC_MAP, - EQDMA_DBE_ERR_DSC_HW_CTXT, - EQDMA_DBE_ERR_DSC_CRD_RCV, - EQDMA_DBE_ERR_DSC_SW_CTXT, - EQDMA_DBE_ERR_DSC_CPLI, - EQDMA_DBE_ERR_DSC_CPLD, - EQDMA_DBE_ERR_MI_TL_SLV_FIFO_RAM, - EQDMA_DBE_ERR_TIMER_FIFO_RAM, - EQDMA_DBE_ERR_QID_FIFO_RAM, - EQDMA_DBE_ERR_WRB_COAL_DATA_RAM, - EQDMA_DBE_ERR_INT_CTXT_RAM, - EQDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - EQDMA_DBE_ERR_PFCH_CTXT_RAM, - EQDMA_DBE_ERR_WRB_CTXT_RAM, - EQDMA_DBE_ERR_PFCH_LL_RAM, - EQDMA_DBE_ERR_PEND_FIFO_RAM, - EQDMA_DBE_ERR_RC_RRQ_ODD_RAM, - EQDMA_DBE_ERR_ALL, - - EQDMA_ERRS_ALL -}; - -struct eqdma_hw_err_info { - enum eqdma_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*eqdma_hw_err_process)(void *dev_hndl); -}; - -#define EQDMA_OFFSET_VF_VERSION 0x5014 -#define EQDMA_OFFSET_VF_USER_BAR 0x5018 - -#define EQDMA_OFFSET_MBOX_BASE_PF 0x22400 -#define EQDMA_OFFSET_MBOX_BASE_VF 0x5000 - -#define EQDMA_COMPL_CTXT_BADDR_HIGH_H_MASK GENMASK_ULL(63, 38) -#define EQDMA_COMPL_CTXT_BADDR_HIGH_L_MASK GENMASK_ULL(37, 6) -#define EQDMA_COMPL_CTXT_BADDR_LOW_MASK GENMASK_ULL(5, 2) - -int eqdma_init_ctxt_memory(void *dev_hndl); - -int eqdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - -int eqdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int eqdma_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int eqdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -int eqdma_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -uint32_t eqdma_reg_dump_buf_len(void); - -int eqdma_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int eqdma_hw_error_process(void *dev_hndl); -const char *eqdma_hw_get_error_name(uint32_t err_idx); -int eqdma_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int eqdma_read_dump_queue_context(void *dev_hndl, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int eqdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -int eqdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint8_t func_id, uint8_t *user_bar); - -int eqdma_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int eqdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int eqdma_set_default_global_csr(void *dev_hndl); - -int eqdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int eqdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int eqdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable); - -int eqdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -uint32_t eqdma_get_config_num_regs(void); - -struct xreg_info *eqdma_get_config_regs(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __EQDMA_SOFT_ACCESS_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_reg.h b/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_reg.h deleted file mode 100644 index eac97ed..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_reg.h +++ /dev/null @@ -1,1226 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __EQDMA_SOFT_REG_H -#define __EQDMA_SOFT_REG_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - -#define DEBGFS_LINE_SZ (81) - -#ifdef ARRAY_SIZE -#undef ARRAY_SIZE -#endif -#define ARRAY_SIZE(arr) (sizeof(arr) / \ - sizeof(arr[0])) - - -uint32_t eqdma_config_num_regs_get(void); -struct xreg_info *eqdma_config_regs_get(void); -#define EQDMA_CFG_BLK_IDENTIFIER_ADDR 0x00 -#define CFG_BLK_IDENTIFIER_MASK GENMASK(31, 20) -#define CFG_BLK_IDENTIFIER_1_MASK GENMASK(19, 16) -#define CFG_BLK_IDENTIFIER_RSVD_1_MASK GENMASK(15, 8) -#define CFG_BLK_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_CFG_BLK_PCIE_MAX_PLD_SIZE_ADDR 0x08 -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ADDR 0x0C -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK GENMASK(6, 4) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_SYSTEM_ID_ADDR 0x10 -#define CFG_BLK_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 17) -#define CFG_BLK_SYSTEM_ID_INST_TYPE_MASK BIT(16) -#define CFG_BLK_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_CFG_BLK_MSIX_ENABLE_ADDR 0x014 -#define CFG_BLK_MSIX_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CFG_PCIE_DATA_WIDTH_ADDR 0x18 -#define CFG_PCIE_DATA_WIDTH_RSVD_1_MASK GENMASK(31, 3) -#define CFG_PCIE_DATA_WIDTH_DATAPATH_MASK GENMASK(2, 0) -#define EQDMA_CFG_PCIE_CTL_ADDR 0x1C -#define CFG_PCIE_CTL_RSVD_1_MASK GENMASK(31, 18) -#define CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK GENMASK(17, 16) -#define CFG_PCIE_CTL_RSVD_2_MASK GENMASK(15, 2) -#define CFG_PCIE_CTL_RRQ_DISABLE_MASK BIT(1) -#define CFG_PCIE_CTL_RELAXED_ORDERING_MASK BIT(0) -#define EQDMA_CFG_BLK_MSI_ENABLE_ADDR 0x20 -#define CFG_BLK_MSI_ENABLE_MASK GENMASK(31, 0) -#define EQDMA_CFG_AXI_USER_MAX_PLD_SIZE_ADDR 0x40 -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK GENMASK(2, 0) -#define EQDMA_CFG_AXI_USER_MAX_READ_REQ_SIZE_ADDR 0x44 -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK GENMASK(31, 7) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK BIT(3) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK GENMASK(2, 0) -#define EQDMA_CFG_BLK_MISC_CTL_ADDR 0x4C -#define CFG_BLK_MISC_CTL_RSVD_1_MASK GENMASK(31, 24) -#define CFG_BLK_MISC_CTL_10B_TAG_EN_MASK BIT(23) -#define CFG_BLK_MISC_CTL_RSVD_2_MASK BIT(22) -#define CFG_BLK_MISC_CTL_AXI_WBK_MASK BIT(21) -#define CFG_BLK_MISC_CTL_AXI_DSC_MASK BIT(20) -#define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) -#define CFG_BLK_MISC_CTL_RSVD_3_MASK GENMASK(7, 5) -#define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) -#define EQDMA_CFG_PL_CRED_CTL_ADDR 0x68 -#define CFG_PL_CRED_CTL_RSVD_1_MASK GENMASK(31, 5) -#define CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK BIT(4) -#define CFG_PL_CRED_CTL_RSVD_2_MASK GENMASK(3, 1) -#define CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK BIT(0) -#define EQDMA_CFG_BLK_SCRATCH_ADDR 0x80 -#define CFG_BLK_SCRATCH_MASK GENMASK(31, 0) -#define EQDMA_CFG_GIC_ADDR 0xA0 -#define CFG_GIC_RSVD_1_MASK GENMASK(31, 1) -#define CFG_GIC_GIC_IRQ_MASK BIT(0) -#define EQDMA_RAM_SBE_MSK_1_A_ADDR 0xE0 -#define RAM_SBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_SBE_STS_1_A_ADDR 0xE4 -#define RAM_SBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_RAM_DBE_MSK_1_A_ADDR 0xE8 -#define RAM_DBE_MSK_1_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_DBE_STS_1_A_ADDR 0xEC -#define RAM_DBE_STS_1_A_RSVD_MASK GENMASK(31, 5) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK BIT(4) -#define RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK BIT(3) -#define RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK BIT(2) -#define RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK BIT(1) -#define RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK BIT(0) -#define EQDMA_RAM_SBE_MSK_A_ADDR 0xF0 -#define RAM_SBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_SBE_STS_A_ADDR 0xF4 -#define RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_SBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_SBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_SBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_SBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_SBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_SBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_SBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_SBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_SBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_SBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_SBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_SBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_SBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_SBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_SBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_SBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_SBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_SBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_SBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_RAM_DBE_MSK_A_ADDR 0xF8 -#define RAM_DBE_MSK_A_MASK GENMASK(31, 0) -#define EQDMA_RAM_DBE_STS_A_ADDR 0xFC -#define RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK BIT(31) -#define RAM_DBE_STS_A_PEND_FIFO_RAM_MASK BIT(30) -#define RAM_DBE_STS_A_PFCH_LL_RAM_MASK BIT(29) -#define RAM_DBE_STS_A_WRB_CTXT_RAM_MASK BIT(28) -#define RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK BIT(27) -#define RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(26) -#define RAM_DBE_STS_A_INT_CTXT_RAM_MASK BIT(25) -#define RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_DBE_STS_A_QID_FIFO_RAM_MASK BIT(23) -#define RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK GENMASK(22, 19) -#define RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK BIT(18) -#define RAM_DBE_STS_A_DSC_CPLD_MASK BIT(17) -#define RAM_DBE_STS_A_DSC_CPLI_MASK BIT(16) -#define RAM_DBE_STS_A_DSC_SW_CTXT_MASK BIT(15) -#define RAM_DBE_STS_A_DSC_CRD_RCV_MASK BIT(14) -#define RAM_DBE_STS_A_DSC_HW_CTXT_MASK BIT(13) -#define RAM_DBE_STS_A_FUNC_MAP_MASK BIT(12) -#define RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(11) -#define RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(10) -#define RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(9) -#define RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(8) -#define RAM_DBE_STS_A_MI_C2H3_DAT_MASK BIT(7) -#define RAM_DBE_STS_A_MI_C2H2_DAT_MASK BIT(6) -#define RAM_DBE_STS_A_MI_C2H1_DAT_MASK BIT(5) -#define RAM_DBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_DBE_STS_A_MI_H2C3_DAT_MASK BIT(3) -#define RAM_DBE_STS_A_MI_H2C2_DAT_MASK BIT(2) -#define RAM_DBE_STS_A_MI_H2C1_DAT_MASK BIT(1) -#define RAM_DBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define EQDMA_GLBL2_IDENTIFIER_ADDR 0x100 -#define GLBL2_IDENTIFIER_MASK GENMASK(31, 8) -#define GLBL2_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define EQDMA_GLBL2_CHANNEL_INST_ADDR 0x114 -#define GLBL2_CHANNEL_INST_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_INST_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_INST_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_INST_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_INST_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_INST_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_INST_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_MDMA_ADDR 0x118 -#define GLBL2_CHANNEL_MDMA_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_MDMA_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_MDMA_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_MDMA_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_MDMA_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_MDMA_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_MDMA_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_STRM_ADDR 0x11C -#define GLBL2_CHANNEL_STRM_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_STRM_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_STRM_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_STRM_RSVD_2_MASK GENMASK(15, 12) -#define GLBL2_CHANNEL_STRM_C2H_ENG_MASK GENMASK(11, 8) -#define GLBL2_CHANNEL_STRM_RSVD_3_MASK GENMASK(7, 4) -#define GLBL2_CHANNEL_STRM_H2C_ENG_MASK GENMASK(3, 0) -#define EQDMA_GLBL2_CHANNEL_CAP_ADDR 0x120 -#define GLBL2_CHANNEL_CAP_RSVD_1_MASK GENMASK(31, 12) -#define GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK GENMASK(11, 0) -#define EQDMA_GLBL2_CHANNEL_PASID_CAP_ADDR 0x128 -#define GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK GENMASK(31, 2) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK BIT(1) -#define GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK BIT(0) -#define EQDMA_GLBL2_SYSTEM_ID_ADDR 0x130 -#define GLBL2_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_SYSTEM_ID_MASK GENMASK(15, 0) -#define EQDMA_GLBL2_MISC_CAP_ADDR 0x134 -#define GLBL2_MISC_CAP_MASK GENMASK(31, 0) -#define EQDMA_GLBL2_DBG_PCIE_RQ0_ADDR 0x1B8 -#define GLBL2_PCIE_RQ0_NPH_AVL_MASK GENMASK(31, 20) -#define GLBL2_PCIE_RQ0_RCB_AVL_MASK GENMASK(19, 9) -#define GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK GENMASK(8, 2) -#define GLBL2_PCIE_RQ0_TAG_EP_MASK GENMASK(1, 0) -#define EQDMA_GLBL2_DBG_PCIE_RQ1_ADDR 0x1BC -#define GLBL2_PCIE_RQ1_RSVD_1_MASK GENMASK(31, 21) -#define GLBL2_PCIE_RQ1_TAG_FL_MASK GENMASK(20, 19) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK BIT(18) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK BIT(17) -#define GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK BIT(16) -#define GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK BIT(15) -#define GLBL2_PCIE_RQ1_TLPSM_MASK GENMASK(14, 12) -#define GLBL2_PCIE_RQ1_TLPSM512_MASK GENMASK(11, 9) -#define GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK BIT(8) -#define GLBL2_PCIE_RQ1_RREQ0_SLV_MASK BIT(7) -#define GLBL2_PCIE_RQ1_RREQ0_VLD_MASK BIT(6) -#define GLBL2_PCIE_RQ1_RREQ0_RDY_MASK BIT(5) -#define GLBL2_PCIE_RQ1_RREQ1_SLV_MASK BIT(4) -#define GLBL2_PCIE_RQ1_RREQ1_VLD_MASK BIT(3) -#define GLBL2_PCIE_RQ1_RREQ1_RDY_MASK BIT(2) -#define GLBL2_PCIE_RQ1_WTLP_REQ_MASK BIT(1) -#define GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_WR0_ADDR 0x1C0 -#define GLBL2_AXIMM_WR0_RSVD_1_MASK GENMASK(31, 27) -#define GLBL2_AXIMM_WR0_WR_REQ_MASK BIT(26) -#define GLBL2_AXIMM_WR0_WR_CHN_MASK GENMASK(25, 23) -#define GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK BIT(22) -#define GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK BIT(21) -#define GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK GENMASK(20, 18) -#define GLBL2_AXIMM_WR0_WRREQ_CNT_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR0_BID_MASK GENMASK(11, 9) -#define GLBL2_AXIMM_WR0_BVALID_MASK BIT(8) -#define GLBL2_AXIMM_WR0_BREADY_MASK BIT(7) -#define GLBL2_AXIMM_WR0_WVALID_MASK BIT(6) -#define GLBL2_AXIMM_WR0_WREADY_MASK BIT(5) -#define GLBL2_AXIMM_WR0_AWID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_WR0_AWVALID_MASK BIT(1) -#define GLBL2_AXIMM_WR0_AWREADY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_WR1_ADDR 0x1C4 -#define GLBL2_AXIMM_WR1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_WR1_BRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_WR1_BRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_WR1_BRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR1_BRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_WR1_BRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_GLBL2_DBG_AXIMM_RD0_ADDR 0x1C8 -#define GLBL2_AXIMM_RD0_RSVD_1_MASK GENMASK(31, 23) -#define GLBL2_AXIMM_RD0_PND_CNT_MASK GENMASK(22, 17) -#define GLBL2_AXIMM_RD0_RD_REQ_MASK BIT(16) -#define GLBL2_AXIMM_RD0_RD_CHNL_MASK GENMASK(15, 13) -#define GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK GENMASK(12, 10) -#define GLBL2_AXIMM_RD0_RID_MASK GENMASK(9, 7) -#define GLBL2_AXIMM_RD0_RVALID_MASK BIT(6) -#define GLBL2_AXIMM_RD0_RREADY_MASK BIT(5) -#define GLBL2_AXIMM_RD0_ARID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_RD0_ARVALID_MASK BIT(1) -#define GLBL2_AXIMM_RD0_ARREADY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_AXIMM_RD1_ADDR 0x1CC -#define GLBL2_AXIMM_RD1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_RD1_RRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_RD1_RRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_RD1_RRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_RD1_RRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_RD1_RRSP_CNT0_MASK GENMASK(5, 0) -#define EQDMA_GLBL2_DBG_FAB0_ADDR 0x1D0 -#define GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK BIT(31) -#define GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK BIT(30) -#define GLBL2_FAB0_H2C_SEG_IN_VLD_MASK BIT(29) -#define GLBL2_FAB0_H2C_SEG_IN_RDY_MASK BIT(28) -#define GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK GENMASK(27, 24) -#define GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK BIT(23) -#define GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK GENMASK(22, 16) -#define GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK BIT(15) -#define GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK BIT(14) -#define GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK GENMASK(13, 10) -#define GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK BIT(9) -#define GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK BIT(8) -#define GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK BIT(7) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK BIT(6) -#define GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK BIT(5) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK BIT(3) -#define GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK BIT(2) -#define GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK BIT(1) -#define GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_FAB1_ADDR 0x1D4 -#define GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK GENMASK(31, 25) -#define GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK GENMASK(24, 18) -#define GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK BIT(17) -#define GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK BIT(16) -#define GLBL2_FAB1_RSVD_1_MASK GENMASK(15, 13) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK BIT(12) -#define GLBL2_FAB1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK BIT(8) -#define GLBL2_FAB1_RSVD_3_MASK GENMASK(7, 5) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK BIT(4) -#define GLBL2_FAB1_RSVD_4_MASK GENMASK(3, 1) -#define GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK BIT(0) -#define EQDMA_GLBL2_DBG_MATCH_SEL_ADDR 0x1F4 -#define GLBL2_MATCH_SEL_RSV_MASK GENMASK(31, 18) -#define GLBL2_MATCH_SEL_CSR_SEL_MASK GENMASK(17, 13) -#define GLBL2_MATCH_SEL_CSR_EN_MASK BIT(12) -#define GLBL2_MATCH_SEL_ROTATE1_MASK GENMASK(11, 10) -#define GLBL2_MATCH_SEL_ROTATE0_MASK GENMASK(9, 8) -#define GLBL2_MATCH_SEL_SEL_MASK GENMASK(7, 0) -#define EQDMA_GLBL2_DBG_MATCH_MSK_ADDR 0x1F8 -#define GLBL2_MATCH_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL2_DBG_MATCH_PAT_ADDR 0x1FC -#define GLBL2_MATCH_PAT_PATTERN_MASK GENMASK(31, 0) -#define EQDMA_GLBL_RNG_SZ_1_ADDR 0x204 -#define GLBL_RNG_SZ_1_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_1_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_2_ADDR 0x208 -#define GLBL_RNG_SZ_2_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_2_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_3_ADDR 0x20C -#define GLBL_RNG_SZ_3_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_3_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_4_ADDR 0x210 -#define GLBL_RNG_SZ_4_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_4_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_5_ADDR 0x214 -#define GLBL_RNG_SZ_5_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_5_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_6_ADDR 0x218 -#define GLBL_RNG_SZ_6_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_6_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_7_ADDR 0x21C -#define GLBL_RNG_SZ_7_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_7_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_8_ADDR 0x220 -#define GLBL_RNG_SZ_8_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_8_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_9_ADDR 0x224 -#define GLBL_RNG_SZ_9_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_9_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_A_ADDR 0x228 -#define GLBL_RNG_SZ_A_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_A_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_B_ADDR 0x22C -#define GLBL_RNG_SZ_B_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_B_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_C_ADDR 0x230 -#define GLBL_RNG_SZ_C_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_C_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_D_ADDR 0x234 -#define GLBL_RNG_SZ_D_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_D_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_E_ADDR 0x238 -#define GLBL_RNG_SZ_E_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_E_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_F_ADDR 0x23C -#define GLBL_RNG_SZ_F_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_F_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_RNG_SZ_10_ADDR 0x240 -#define GLBL_RNG_SZ_10_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_10_RING_SIZE_MASK GENMASK(15, 0) -#define EQDMA_GLBL_ERR_STAT_ADDR 0x248 -#define GLBL_ERR_STAT_RSVD_1_MASK GENMASK(31, 18) -#define GLBL_ERR_STAT_ERR_FAB_MASK BIT(17) -#define GLBL_ERR_STAT_ERR_H2C_ST_MASK BIT(16) -#define GLBL_ERR_STAT_ERR_BDG_MASK BIT(15) -#define GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK GENMASK(14, 9) -#define GLBL_ERR_STAT_ERR_C2H_ST_MASK BIT(8) -#define GLBL_ERR_STAT_ERR_C2H_MM_1_MASK BIT(7) -#define GLBL_ERR_STAT_ERR_C2H_MM_0_MASK BIT(6) -#define GLBL_ERR_STAT_ERR_H2C_MM_1_MASK BIT(5) -#define GLBL_ERR_STAT_ERR_H2C_MM_0_MASK BIT(4) -#define GLBL_ERR_STAT_ERR_TRQ_MASK BIT(3) -#define GLBL_ERR_STAT_ERR_DSC_MASK BIT(2) -#define GLBL_ERR_STAT_ERR_RAM_DBE_MASK BIT(1) -#define GLBL_ERR_STAT_ERR_RAM_SBE_MASK BIT(0) -#define EQDMA_GLBL_ERR_MASK_ADDR 0x24C -#define GLBL_ERR_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_CFG_ADDR 0x250 -#define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 10) -#define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) -#define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) -#define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) -#define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) -#define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define EQDMA_GLBL_DSC_ERR_STS_ADDR 0x254 -#define GLBL_DSC_ERR_STS_RSVD_1_MASK GENMASK(31, 26) -#define GLBL_DSC_ERR_STS_PORT_ID_MASK BIT(25) -#define GLBL_DSC_ERR_STS_SBE_MASK BIT(24) -#define GLBL_DSC_ERR_STS_DBE_MASK BIT(23) -#define GLBL_DSC_ERR_STS_RQ_CANCEL_MASK BIT(22) -#define GLBL_DSC_ERR_STS_DSC_MASK BIT(21) -#define GLBL_DSC_ERR_STS_DMA_MASK BIT(20) -#define GLBL_DSC_ERR_STS_FLR_CANCEL_MASK BIT(19) -#define GLBL_DSC_ERR_STS_RSVD_2_MASK GENMASK(18, 17) -#define GLBL_DSC_ERR_STS_DAT_POISON_MASK BIT(16) -#define GLBL_DSC_ERR_STS_TIMEOUT_MASK BIT(9) -#define GLBL_DSC_ERR_STS_FLR_MASK BIT(8) -#define GLBL_DSC_ERR_STS_TAG_MASK BIT(6) -#define GLBL_DSC_ERR_STS_ADDR_MASK BIT(5) -#define GLBL_DSC_ERR_STS_PARAM_MASK BIT(4) -#define GLBL_DSC_ERR_STS_BCNT_MASK BIT(3) -#define GLBL_DSC_ERR_STS_UR_CA_MASK BIT(2) -#define GLBL_DSC_ERR_STS_POISON_MASK BIT(1) -#define EQDMA_GLBL_DSC_ERR_MSK_ADDR 0x258 -#define GLBL_DSC_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL_DSC_ERR_LOG0_ADDR 0x25C -#define GLBL_DSC_ERR_LOG0_VALID_MASK BIT(31) -#define GLBL_DSC_ERR_LOG0_SEL_MASK BIT(30) -#define GLBL_DSC_ERR_LOG0_RSVD_1_MASK GENMASK(29, 13) -#define GLBL_DSC_ERR_LOG0_QID_MASK GENMASK(12, 0) -#define EQDMA_GLBL_DSC_ERR_LOG1_ADDR 0x260 -#define GLBL_DSC_ERR_LOG1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_ERR_LOG1_CIDX_MASK GENMASK(27, 12) -#define GLBL_DSC_ERR_LOG1_RSVD_2_MASK GENMASK(11, 9) -#define GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK GENMASK(8, 5) -#define GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK GENMASK(4, 0) -#define EQDMA_GLBL_TRQ_ERR_STS_ADDR 0x264 -#define GLBL_TRQ_ERR_STS_RSVD_1_MASK GENMASK(31, 8) -#define GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK BIT(7) -#define GLBL_TRQ_ERR_STS_RSVD_2_MASK BIT(6) -#define GLBL_TRQ_ERR_STS_QID_RANGE_MASK BIT(5) -#define GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK BIT(4) -#define GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK BIT(3) -#define GLBL_TRQ_ERR_STS_RSVD_3_MASK BIT(2) -#define GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK BIT(1) -#define GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK BIT(0) -#define EQDMA_GLBL_TRQ_ERR_MSK_ADDR 0x268 -#define GLBL_TRQ_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_GLBL_TRQ_ERR_LOG_ADDR 0x26C -#define GLBL_TRQ_ERR_LOG_SRC_MASK BIT(31) -#define GLBL_TRQ_ERR_LOG_TARGET_MASK GENMASK(30, 27) -#define GLBL_TRQ_ERR_LOG_FUNC_MASK GENMASK(26, 17) -#define GLBL_TRQ_ERR_LOG_ADDRESS_MASK GENMASK(16, 0) -#define EQDMA_GLBL_DSC_DBG_DAT0_ADDR 0x270 -#define GLBL_DSC_DAT0_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK BIT(29) -#define GLBL_DSC_DAT0_CTXT_ARB_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK GENMASK(16, 12) -#define GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK BIT(11) -#define GLBL_DSC_DAT0_TMSTALL_MASK BIT(10) -#define GLBL_DSC_DAT0_RRQ_STALL_MASK GENMASK(9, 8) -#define GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK GENMASK(7, 6) -#define GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK GENMASK(5, 4) -#define GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK GENMASK(3, 2) -#define GLBL_DSC_DAT0_DSC_OUT_STALL_MASK GENMASK(1, 0) -#define EQDMA_GLBL_DSC_DBG_DAT1_ADDR 0x274 -#define GLBL_DSC_DAT1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_DAT1_EVT_SPC_C2H_MASK GENMASK(27, 22) -#define GLBL_DSC_DAT1_EVT_SP_H2C_MASK GENMASK(21, 16) -#define GLBL_DSC_DAT1_DSC_SPC_C2H_MASK GENMASK(15, 8) -#define GLBL_DSC_DAT1_DSC_SPC_H2C_MASK GENMASK(7, 0) -#define EQDMA_GLBL_DSC_DBG_CTL_ADDR 0x278 -#define GLBL_DSC_CTL_RSVD_1_MASK GENMASK(31, 3) -#define GLBL_DSC_CTL_SELECT_MASK GENMASK(2, 0) -#define EQDMA_GLBL_DSC_ERR_LOG2_ADDR 0x27c -#define GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK GENMASK(31, 16) -#define GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK GENMASK(15, 0) -#define EQDMA_GLBL_GLBL_INTERRUPT_CFG_ADDR 0x2c4 -#define GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK GENMASK(31, 2) -#define GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK BIT(1) -#define GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK BIT(0) -#define EQDMA_GLBL_VCH_HOST_PROFILE_ADDR 0x2c8 -#define GLBL_VCH_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_VCH_HOST_PROFILE_2C_MM_MASK GENMASK(27, 24) -#define GLBL_VCH_HOST_PROFILE_2C_ST_MASK GENMASK(23, 20) -#define GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK GENMASK(19, 16) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK GENMASK(15, 12) -#define GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK GENMASK(11, 8) -#define GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK GENMASK(7, 4) -#define GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK GENMASK(3, 0) -#define EQDMA_GLBL_BRIDGE_HOST_PROFILE_ADDR 0x308 -#define GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK GENMASK(31, 4) -#define GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK GENMASK(3, 0) -#define EQDMA_AXIMM_IRQ_DEST_ADDR_ADDR 0x30c -#define AXIMM_IRQ_DEST_ADDR_ADDR_MASK GENMASK(31, 0) -#define EQDMA_FAB_ERR_LOG_ADDR 0x314 -#define FAB_ERR_LOG_RSVD_1_MASK GENMASK(31, 7) -#define FAB_ERR_LOG_SRC_MASK GENMASK(6, 0) -#define EQDMA_GLBL_REQ_ERR_STS_ADDR 0x318 -#define GLBL_REQ_ERR_STS_RSVD_1_MASK GENMASK(31, 11) -#define GLBL_REQ_ERR_STS_RC_DISCONTINUE_MASK BIT(10) -#define GLBL_REQ_ERR_STS_RC_PRTY_MASK BIT(9) -#define GLBL_REQ_ERR_STS_RC_FLR_MASK BIT(8) -#define GLBL_REQ_ERR_STS_RC_TIMEOUT_MASK BIT(7) -#define GLBL_REQ_ERR_STS_RC_INV_BCNT_MASK BIT(6) -#define GLBL_REQ_ERR_STS_RC_INV_TAG_MASK BIT(5) -#define GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH_MASK BIT(4) -#define GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH_MASK BIT(3) -#define GLBL_REQ_ERR_STS_RC_NO_DATA_MASK BIT(2) -#define GLBL_REQ_ERR_STS_RC_UR_CA_CRS_MASK BIT(1) -#define GLBL_REQ_ERR_STS_RC_POISONED_MASK BIT(0) -#define EQDMA_GLBL_REQ_ERR_MSK_ADDR 0x31C -#define GLBL_REQ_ERR_MSK_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_DATA_ADDR 0x804 -#define IND_CTXT_DATA_DATA_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_MASK_ADDR 0x824 -#define IND_CTXT_MASK GENMASK(31, 0) -#define EQDMA_IND_CTXT_CMD_ADDR 0x844 -#define IND_CTXT_CMD_RSVD_1_MASK GENMASK(31, 20) -#define IND_CTXT_CMD_QID_MASK GENMASK(19, 7) -#define IND_CTXT_CMD_OP_MASK GENMASK(6, 5) -#define IND_CTXT_CMD_SEL_MASK GENMASK(4, 1) -#define IND_CTXT_CMD_BUSY_MASK BIT(0) -#define EQDMA_C2H_TIMER_CNT_ADDR 0xA00 -#define C2H_TIMER_CNT_RSVD_1_MASK GENMASK(31, 16) -#define C2H_TIMER_CNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_CNT_TH_ADDR 0xA40 -#define C2H_CNT_TH_RSVD_1_MASK GENMASK(31, 16) -#define C2H_CNT_TH_THESHOLD_CNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR 0xA88 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR 0xA8C -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR 0xA90 -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_AXIS_PKG_CMP_ADDR 0xA94 -#define C2H_STAT_AXIS_PKG_CMP_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_ACCEPTED_ADDR 0xA98 -#define C2H_STAT_DESC_RSP_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_CMP_ADDR 0xA9C -#define C2H_STAT_DESC_RSP_CMP_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_WRQ_OUT_ADDR 0xAA0 -#define C2H_STAT_WRQ_OUT_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_WPL_REN_ACCEPTED_ADDR 0xAA4 -#define C2H_STAT_WPL_REN_ACCEPTED_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_TOTAL_WRQ_LEN_ADDR 0xAA8 -#define C2H_STAT_TOTAL_WRQ_LEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_TOTAL_WPL_LEN_ADDR 0xAAC -#define C2H_STAT_TOTAL_WPL_LEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_BUF_SZ_ADDR 0xAB0 -#define C2H_BUF_SZ_IZE_MASK GENMASK(31, 0) -#define EQDMA_C2H_ERR_STAT_ADDR 0xAF0 -#define C2H_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK BIT(20) -#define C2H_ERR_STAT_HDR_PAR_ERR_MASK BIT(19) -#define C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK BIT(18) -#define C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(17) -#define C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK BIT(16) -#define C2H_ERR_STAT_WRB_PRTY_ERR_MASK BIT(15) -#define C2H_ERR_STAT_WRB_CIDX_ERR_MASK BIT(14) -#define C2H_ERR_STAT_WRB_QFULL_ERR_MASK BIT(13) -#define C2H_ERR_STAT_WRB_INV_Q_ERR_MASK BIT(12) -#define C2H_ERR_STAT_RSVD_2_MASK BIT(11) -#define C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK BIT(10) -#define C2H_ERR_STAT_ERR_DESC_CNT_MASK BIT(9) -#define C2H_ERR_STAT_RSVD_3_MASK BIT(8) -#define C2H_ERR_STAT_MSI_INT_FAIL_MASK BIT(7) -#define C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define C2H_ERR_STAT_RSVD_4_MASK BIT(5) -#define C2H_ERR_STAT_DESC_RSP_ERR_MASK BIT(4) -#define C2H_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK BIT(2) -#define C2H_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_C2H_ERR_MASK_ADDR 0xAF4 -#define C2H_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_C2H_FATAL_ERR_STAT_ADDR 0xAF8 -#define C2H_FATAL_ERR_STAT_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK BIT(20) -#define C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK BIT(19) -#define C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK BIT(18) -#define C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK BIT(17) -#define C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK BIT(15) -#define C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define C2H_FATAL_ERR_STAT_RESERVED2_MASK BIT(13) -#define C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK BIT(9) -#define C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK BIT(8) -#define C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK GENMASK(7, 4) -#define C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_FATAL_ERR_STAT_RESERVED1_MASK BIT(2) -#define C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define EQDMA_C2H_FATAL_ERR_MASK_ADDR 0xAFC -#define C2H_FATAL_ERR_C2HEN_MASK GENMASK(31, 0) -#define EQDMA_C2H_FATAL_ERR_ENABLE_ADDR 0xB00 -#define C2H_FATAL_ERR_ENABLE_RSVD_1_MASK GENMASK(31, 2) -#define C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK BIT(1) -#define C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK BIT(0) -#define EQDMA_GLBL_ERR_INT_ADDR 0xB04 -#define GLBL_ERR_INT_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_ERR_INT_HOST_ID_MASK GENMASK(29, 26) -#define GLBL_ERR_INT_DIS_INTR_ON_VF_MASK BIT(25) -#define GLBL_ERR_INT_ARM_MASK BIT(24) -#define GLBL_ERR_INT_EN_COAL_MASK BIT(23) -#define GLBL_ERR_INT_VEC_MASK GENMASK(22, 12) -#define GLBL_ERR_INT_FUNC_MASK GENMASK(11, 0) -#define EQDMA_C2H_PFCH_CFG_ADDR 0xB08 -#define C2H_PFCH_CFG_EVTFL_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_FL_TH_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CFG_1_ADDR 0xA80 -#define C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK GENMASK(31, 16) -#define C2H_PFCH_CFG_1_QCNT_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CFG_2_ADDR 0xA84 -#define C2H_PFCH_CFG_2_FENCE_MASK BIT(31) -#define C2H_PFCH_CFG_2_RSVD_MASK GENMASK(30, 29) -#define C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK BIT(28) -#define C2H_PFCH_CFG_2_LL_SZ_TH_MASK GENMASK(27, 12) -#define C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK GENMASK(11, 6) -#define C2H_PFCH_CFG_2_NUM_MASK GENMASK(5, 0) -#define EQDMA_C2H_INT_TIMER_TICK_ADDR 0xB0C -#define C2H_INT_TIMER_TICK_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR 0xB10 -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR 0xB14 -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DESC_REQ_ADDR 0xB18 -#define C2H_STAT_DESC_REQ_MASK GENMASK(31, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_0_ADDR 0xB1C -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK BIT(31) -#define C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK BIT(30) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK GENMASK(29, 27) -#define C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK GENMASK(26, 24) -#define C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK BIT(23) -#define C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK BIT(22) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK BIT(21) -#define C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK GENMASK(20, 9) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK BIT(8) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK GENMASK(7, 5) -#define C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK BIT(4) -#define C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK GENMASK(3, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_1_ADDR 0xB20 -#define C2H_STAT_DMA_ENG_1_RSVD_1_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK GENMASK(6, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_2_ADDR 0xB24 -#define C2H_STAT_DMA_ENG_2_RSVD_1_MASK GENMASK(31, 29) -#define C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_MASK GENMASK(28, 18) -#define C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 7) -#define C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_MASK GENMASK(6, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_3_ADDR 0xB28 -#define C2H_STAT_DMA_ENG_3_RSVD_1_MASK GENMASK(31, 24) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT_MASK GENMASK(23, 19) -#define C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK BIT(18) -#define C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK BIT(17) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK BIT(16) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK BIT(15) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK BIT(14) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK BIT(13) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK BIT(12) -#define C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK BIT(11) -#define C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK BIT(10) -#define C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0_MASK BIT(9) -#define C2H_STAT_DMA_ENG_3_WRQ_VLD_MASK BIT(8) -#define C2H_STAT_DMA_ENG_3_WRQ_RDY_MASK BIT(7) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY_MASK BIT(6) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP_MASK BIT(5) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR_MASK BIT(4) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER_MASK BIT(3) -#define C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR_MASK BIT(2) -#define C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK BIT(1) -#define C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK BIT(0) -#define EQDMA_C2H_DBG_PFCH_ERR_CTXT_ADDR 0xB2C -#define C2H_PFCH_ERR_CTXT_RSVD_1_MASK GENMASK(31, 14) -#define C2H_PFCH_ERR_CTXT_ERR_STAT_MASK BIT(13) -#define C2H_PFCH_ERR_CTXT_CMD_WR_MASK BIT(12) -#define C2H_PFCH_ERR_CTXT_QID_MASK GENMASK(11, 1) -#define C2H_PFCH_ERR_CTXT_DONE_MASK BIT(0) -#define EQDMA_C2H_FIRST_ERR_QID_ADDR 0xB30 -#define C2H_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(20, 16) -#define C2H_FIRST_ERR_QID_RSVD_MASK GENMASK(15, 13) -#define C2H_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_STAT_NUM_WRB_IN_ADDR 0xB34 -#define STAT_NUM_WRB_IN_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_IN_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_WRB_OUT_ADDR 0xB38 -#define STAT_NUM_WRB_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_OUT_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_WRB_DRP_ADDR 0xB3C -#define STAT_NUM_WRB_DRP_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_DRP_WRB_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_STAT_DESC_OUT_ADDR 0xB40 -#define STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_STAT_DESC_OUT_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_DSC_CRDT_SENT_ADDR 0xB44 -#define STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_DSC_CRDT_SENT_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_FCH_DSC_RCVD_ADDR 0xB48 -#define STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK GENMASK(15, 0) -#define EQDMA_STAT_NUM_BYP_DSC_RCVD_ADDR 0xB4C -#define STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK GENMASK(31, 11) -#define STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK GENMASK(10, 0) -#define EQDMA_C2H_WRB_COAL_CFG_ADDR 0xB50 -#define C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define C2H_WRB_COAL_CFG_TICK_VAL_MASK GENMASK(25, 14) -#define C2H_WRB_COAL_CFG_TICK_CNT_MASK GENMASK(13, 2) -#define C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK BIT(1) -#define C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK BIT(0) -#define EQDMA_C2H_INTR_H2C_REQ_ADDR 0xB54 -#define C2H_INTR_H2C_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_MM_REQ_ADDR 0xB58 -#define C2H_INTR_C2H_MM_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_MM_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_ERR_INT_REQ_ADDR 0xB5C -#define C2H_INTR_ERR_INT_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_ERR_INT_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_REQ_ADDR 0xB60 -#define C2H_INTR_C2H_ST_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_ADDR 0xB64 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_ADDR 0xB68 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_ADDR 0xB6C -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_ADDR 0xB70 -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_MSIX_ACK_ADDR 0xB74 -#define C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_MSIX_FAIL_ADDR 0xB78 -#define C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_NO_MSIX_ADDR 0xB7C -#define C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_C2H_ST_CTXT_INVAL_ADDR 0xB80 -#define C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_WR_CMP_ADDR 0xB84 -#define C2H_STAT_WR_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WR_CMP_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_4_ADDR 0xB88 -#define C2H_STAT_DMA_ENG_4_RSVD_1_MASK GENMASK(31, 24) -#define C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT_MASK GENMASK(23, 19) -#define C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_MASK BIT(18) -#define C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_MASK BIT(17) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_MASK BIT(16) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_MASK BIT(15) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK BIT(14) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_MASK BIT(13) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_MASK BIT(12) -#define C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_MASK BIT(11) -#define C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_MASK BIT(10) -#define C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0_MASK BIT(9) -#define C2H_STAT_DMA_ENG_4_WRQ_VLD_MASK BIT(8) -#define C2H_STAT_DMA_ENG_4_WRQ_RDY_MASK BIT(7) -#define C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY_MASK BIT(6) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP_MASK BIT(5) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR_MASK BIT(4) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER_MASK BIT(3) -#define C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR_MASK BIT(2) -#define C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_MASK BIT(1) -#define C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_MASK BIT(0) -#define EQDMA_C2H_STAT_DBG_DMA_ENG_5_ADDR 0xB8C -#define C2H_STAT_DMA_ENG_5_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK BIT(29) -#define C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK GENMASK(28, 24) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK GENMASK(23, 22) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK GENMASK(21, 6) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK BIT(5) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK BIT(4) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK BIT(3) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK BIT(2) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK BIT(1) -#define C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK BIT(0) -#define EQDMA_C2H_DBG_PFCH_QID_ADDR 0xB90 -#define C2H_PFCH_QID_RSVD_1_MASK GENMASK(31, 16) -#define C2H_PFCH_QID_ERR_CTXT_MASK BIT(15) -#define C2H_PFCH_QID_TARGET_MASK GENMASK(14, 12) -#define C2H_PFCH_QID_QID_OR_TAG_MASK GENMASK(11, 0) -#define EQDMA_C2H_DBG_PFCH_ADDR 0xB94 -#define C2H_PFCH_DATA_MASK GENMASK(31, 0) -#define EQDMA_C2H_INT_DBG_ADDR 0xB98 -#define C2H_INT_RSVD_1_MASK GENMASK(31, 8) -#define C2H_INT_INT_COAL_SM_MASK GENMASK(7, 4) -#define C2H_INT_INT_SM_MASK GENMASK(3, 0) -#define EQDMA_C2H_STAT_IMM_ACCEPTED_ADDR 0xB9C -#define C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_IMM_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_MARKER_ACCEPTED_ADDR 0xBA0 -#define C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_MARKER_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_DISABLE_CMP_ACCEPTED_ADDR 0xBA4 -#define C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_PLD_FIFO_CRDT_CNT_ADDR 0xBA8 -#define C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_PLD_FIFO_CRDT_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_DYN_REQ_ADDR 0xBAC -#define C2H_INTR_DYN_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_REQ_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_INTR_DYN_MISC_ADDR 0xBB0 -#define C2H_INTR_DYN_MISC_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_DYN_MISC_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_LEN_MISMATCH_ADDR 0xBB4 -#define C2H_DROP_LEN_MISMATCH_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_LEN_MISMATCH_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_DESC_RSP_LEN_ADDR 0xBB8 -#define C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_DESC_RSP_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_QID_FIFO_LEN_ADDR 0xBBC -#define C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_QID_FIFO_LEN_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_DROP_PLD_CNT_ADDR 0xBC0 -#define C2H_DROP_PLD_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_CMPT_FORMAT_0_ADDR 0xBC4 -#define C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_0_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_1_ADDR 0xBC8 -#define C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_1_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_2_ADDR 0xBCC -#define C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_2_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_3_ADDR 0xBD0 -#define C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_3_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_4_ADDR 0xBD4 -#define C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_4_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_5_ADDR 0xBD8 -#define C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_5_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_CMPT_FORMAT_6_ADDR 0xBDC -#define C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK GENMASK(31, 16) -#define C2H_CMPT_FORMAT_6_COLOR_LOC_MASK GENMASK(15, 0) -#define EQDMA_C2H_PFCH_CACHE_DEPTH_ADDR 0xBE0 -#define C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK GENMASK(23, 16) -#define C2H_PFCH_CACHE_DEPTH_MASK GENMASK(7, 0) -#define EQDMA_C2H_WRB_COAL_BUF_DEPTH_ADDR 0xBE4 -#define C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK GENMASK(31, 8) -#define C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK GENMASK(7, 0) -#define EQDMA_C2H_PFCH_CRDT_ADDR 0xBE8 -#define C2H_PFCH_CRDT_RSVD_1_MASK GENMASK(31, 1) -#define C2H_PFCH_CRDT_RSVD_2_MASK BIT(0) -#define EQDMA_C2H_STAT_HAS_CMPT_ACCEPTED_ADDR 0xBEC -#define C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_STAT_HAS_PLD_ACCEPTED_ADDR 0xBF0 -#define C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define EQDMA_C2H_PLD_PKT_ID_ADDR 0xBF4 -#define C2H_PLD_PKT_ID_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_DATA_MASK GENMASK(15, 0) -#define EQDMA_C2H_PLD_PKT_ID_1_ADDR 0xBF8 -#define C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK GENMASK(31, 16) -#define C2H_PLD_PKT_ID_1_DATA_MASK GENMASK(15, 0) -#define EQDMA_C2H_DROP_PLD_CNT_1_ADDR 0xBFC -#define C2H_DROP_PLD_CNT_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_DROP_PLD_CNT_1_CNT_MASK GENMASK(17, 0) -#define EQDMA_H2C_ERR_STAT_ADDR 0xE00 -#define H2C_ERR_STAT_RSVD_1_MASK GENMASK(31, 6) -#define H2C_ERR_STAT_PAR_ERR_MASK BIT(5) -#define H2C_ERR_STAT_SBE_MASK BIT(4) -#define H2C_ERR_STAT_DBE_MASK BIT(3) -#define H2C_ERR_STAT_NO_DMA_DS_MASK BIT(2) -#define H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK BIT(1) -#define H2C_ERR_STAT_ZERO_LEN_DS_MASK BIT(0) -#define EQDMA_H2C_ERR_MASK_ADDR 0xE04 -#define H2C_ERR_EN_MASK GENMASK(31, 0) -#define EQDMA_H2C_FIRST_ERR_QID_ADDR 0xE08 -#define H2C_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 20) -#define H2C_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(19, 16) -#define H2C_FIRST_ERR_QID_RSVD_2_MASK GENMASK(15, 13) -#define H2C_FIRST_ERR_QID_QID_MASK GENMASK(12, 0) -#define EQDMA_H2C_DBG_REG0_ADDR 0xE0C -#define H2C_REG0_NUM_DSC_RCVD_MASK GENMASK(31, 16) -#define H2C_REG0_NUM_WRB_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG1_ADDR 0xE10 -#define H2C_REG1_NUM_REQ_SENT_MASK GENMASK(31, 16) -#define H2C_REG1_NUM_CMP_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG2_ADDR 0xE14 -#define H2C_REG2_RSVD_1_MASK GENMASK(31, 16) -#define H2C_REG2_NUM_ERR_DSC_RCVD_MASK GENMASK(15, 0) -#define EQDMA_H2C_DBG_REG3_ADDR 0xE18 -#define H2C_REG3_RSVD_1_MASK BIT(31) -#define H2C_REG3_DSCO_FIFO_EMPTY_MASK BIT(30) -#define H2C_REG3_DSCO_FIFO_FULL_MASK BIT(29) -#define H2C_REG3_CUR_RC_STATE_MASK GENMASK(28, 26) -#define H2C_REG3_RDREQ_LINES_MASK GENMASK(25, 16) -#define H2C_REG3_RDATA_LINES_AVAIL_MASK GENMASK(15, 6) -#define H2C_REG3_PEND_FIFO_EMPTY_MASK BIT(5) -#define H2C_REG3_PEND_FIFO_FULL_MASK BIT(4) -#define H2C_REG3_CUR_RQ_STATE_MASK GENMASK(3, 2) -#define H2C_REG3_DSCI_FIFO_FULL_MASK BIT(1) -#define H2C_REG3_DSCI_FIFO_EMPTY_MASK BIT(0) -#define EQDMA_H2C_DBG_REG4_ADDR 0xE1C -#define H2C_REG4_RDREQ_ADDR_MASK GENMASK(31, 0) -#define EQDMA_H2C_FATAL_ERR_EN_ADDR 0xE20 -#define H2C_FATAL_ERR_EN_RSVD_1_MASK GENMASK(31, 1) -#define H2C_FATAL_ERR_EN_H2C_MASK BIT(0) -#define EQDMA_H2C_REQ_THROT_PCIE_ADDR 0xE24 -#define H2C_REQ_THROT_PCIE_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_PCIE_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_PCIE_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_PCIE_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_H2C_ALN_DBG_REG0_ADDR 0xE28 -#define H2C_ALN_REG0_NUM_PKT_SENT_MASK GENMASK(15, 0) -#define EQDMA_H2C_REQ_THROT_AXIMM_ADDR 0xE2C -#define H2C_REQ_THROT_AXIMM_EN_REQ_MASK BIT(31) -#define H2C_REQ_THROT_AXIMM_MASK GENMASK(30, 19) -#define H2C_REQ_THROT_AXIMM_EN_DATA_MASK BIT(18) -#define H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK GENMASK(17, 0) -#define EQDMA_C2H_MM_CTL_ADDR 0x1004 -#define C2H_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define C2H_MM_CTL_ERRC_EN_MASK BIT(8) -#define C2H_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define C2H_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_C2H_MM_STATUS_ADDR 0x1040 -#define C2H_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define C2H_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_C2H_MM_CMPL_DESC_CNT_ADDR 0x1048 -#define C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1054 -#define C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK BIT(31) -#define C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK BIT(30) -#define C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK BIT(29) -#define C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK BIT(28) -#define C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK GENMASK(27, 2) -#define C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK BIT(1) -#define C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(0) -#define EQDMA_C2H_MM_ERR_CODE_ADDR 0x1058 -#define C2H_MM_ERR_CODE_RESERVED1_MASK GENMASK(31, 28) -#define C2H_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define C2H_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define C2H_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define C2H_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_C2H_MM_ERR_INFO_ADDR 0x105C -#define C2H_MM_ERR_INFO_VALID_MASK BIT(31) -#define C2H_MM_ERR_INFO_SEL_MASK BIT(30) -#define C2H_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define C2H_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_C2H_MM_PERF_MON_CTL_ADDR 0x10C0 -#define C2H_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define C2H_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define C2H_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_C2H_MM_PERF_MON_CYCLE_CNT0_ADDR 0x10C4 -#define C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_PERF_MON_CYCLE_CNT1_ADDR 0x10C8 -#define C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_C2H_MM_PERF_MON_DATA_CNT0_ADDR 0x10CC -#define C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_C2H_MM_PERF_MON_DATA_CNT1_ADDR 0x10D0 -#define C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_C2H_MM_DBG_ADDR 0x10E8 -#define C2H_MM_RSVD_1_MASK GENMASK(31, 24) -#define C2H_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define C2H_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define C2H_MM_RD_STALL_MASK BIT(6) -#define C2H_MM_RRQ_FIFO_FI_MASK BIT(5) -#define C2H_MM_WR_STALL_MASK BIT(4) -#define C2H_MM_WRQ_FIFO_FI_MASK BIT(3) -#define C2H_MM_WBK_STALL_MASK BIT(2) -#define C2H_MM_DSC_FIFO_EP_MASK BIT(1) -#define C2H_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_H2C_MM_CTL_ADDR 0x1204 -#define H2C_MM_CTL_RESERVED1_MASK GENMASK(31, 9) -#define H2C_MM_CTL_ERRC_EN_MASK BIT(8) -#define H2C_MM_CTL_RESERVED0_MASK GENMASK(7, 1) -#define H2C_MM_CTL_RUN_MASK BIT(0) -#define EQDMA_H2C_MM_STATUS_ADDR 0x1240 -#define H2C_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define H2C_MM_STATUS_RUN_MASK BIT(0) -#define EQDMA_H2C_MM_CMPL_DESC_CNT_ADDR 0x1248 -#define H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1254 -#define H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK GENMASK(31, 30) -#define H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(29) -#define H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK BIT(28) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK GENMASK(27, 23) -#define H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK BIT(22) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK GENMASK(21, 17) -#define H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK BIT(16) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK GENMASK(15, 9) -#define H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK BIT(8) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK GENMASK(7, 6) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK BIT(5) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK BIT(4) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK BIT(3) -#define H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK BIT(2) -#define H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK BIT(1) -#define H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK BIT(0) -#define EQDMA_H2C_MM_ERR_CODE_ADDR 0x1258 -#define H2C_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 28) -#define H2C_MM_ERR_CODE_CIDX_MASK GENMASK(27, 12) -#define H2C_MM_ERR_CODE_RESERVED0_MASK GENMASK(11, 10) -#define H2C_MM_ERR_CODE_SUB_TYPE_MASK GENMASK(9, 5) -#define H2C_MM_ERR_CODE_MASK GENMASK(4, 0) -#define EQDMA_H2C_MM_ERR_INFO_ADDR 0x125C -#define H2C_MM_ERR_INFO_VALID_MASK BIT(31) -#define H2C_MM_ERR_INFO_SEL_MASK BIT(30) -#define H2C_MM_ERR_INFO_RSVD_1_MASK GENMASK(29, 24) -#define H2C_MM_ERR_INFO_QID_MASK GENMASK(23, 0) -#define EQDMA_H2C_MM_PERF_MON_CTL_ADDR 0x12C0 -#define H2C_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define H2C_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define H2C_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define EQDMA_H2C_MM_PERF_MON_CYCLE_CNT0_ADDR 0x12C4 -#define H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_PERF_MON_CYCLE_CNT1_ADDR 0x12C8 -#define H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define EQDMA_H2C_MM_PERF_MON_DATA_CNT0_ADDR 0x12CC -#define H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define EQDMA_H2C_MM_PERF_MON_DATA_CNT1_ADDR 0x12D0 -#define H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define EQDMA_H2C_MM_DBG_ADDR 0x12E8 -#define H2C_MM_RSVD_1_MASK GENMASK(31, 24) -#define H2C_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define H2C_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define H2C_MM_RD_STALL_MASK BIT(6) -#define H2C_MM_RRQ_FIFO_FI_MASK BIT(5) -#define H2C_MM_WR_STALL_MASK BIT(4) -#define H2C_MM_WRQ_FIFO_FI_MASK BIT(3) -#define H2C_MM_WBK_STALL_MASK BIT(2) -#define H2C_MM_DSC_FIFO_EP_MASK BIT(1) -#define H2C_MM_DSC_FIFO_FL_MASK BIT(0) -#define EQDMA_C2H_CRDT_COAL_CFG_1_ADDR 0x1400 -#define C2H_CRDT_COAL_CFG_1_RSVD_1_MASK GENMASK(31, 18) -#define C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK GENMASK(17, 10) -#define C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK GENMASK(9, 0) -#define EQDMA_C2H_CRDT_COAL_CFG_2_ADDR 0x1404 -#define C2H_CRDT_COAL_CFG_2_RSVD_1_MASK GENMASK(31, 24) -#define C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK GENMASK(23, 16) -#define C2H_CRDT_COAL_CFG_2_RESERVED1_MASK GENMASK(15, 11) -#define C2H_CRDT_COAL_CFG_2_NT_TH_MASK GENMASK(10, 0) -#define EQDMA_C2H_PFCH_BYP_QID_ADDR 0x1408 -#define C2H_PFCH_BYP_QID_RSVD_1_MASK GENMASK(31, 12) -#define C2H_PFCH_BYP_QID_MASK GENMASK(11, 0) -#define EQDMA_C2H_PFCH_BYP_TAG_ADDR 0x140C -#define C2H_PFCH_BYP_TAG_RSVD_1_MASK GENMASK(31, 20) -#define C2H_PFCH_BYP_TAG_BYP_QID_MASK GENMASK(19, 8) -#define C2H_PFCH_BYP_TAG_RSVD_2_MASK BIT(7) -#define C2H_PFCH_BYP_TAG_MASK GENMASK(6, 0) -#define EQDMA_C2H_WATER_MARK_ADDR 0x1500 -#define C2H_WATER_MARK_HIGH_WM_MASK GENMASK(31, 16) -#define C2H_WATER_MARK_LOW_WM_MASK GENMASK(15, 0) -#define SW_IND_CTXT_DATA_W7_VIRTIO_DSC_BASE_H_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W6_VIRTIO_DSC_BASE_M_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W5_VIRTIO_DSC_BASE_L_MASK GENMASK(31, 11) -#define SW_IND_CTXT_DATA_W5_PASID_EN_MASK BIT(10) -#define SW_IND_CTXT_DATA_W5_PASID_H_MASK GENMASK(9, 0) -#define SW_IND_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 20) -#define SW_IND_CTXT_DATA_W4_HOST_ID_MASK GENMASK(19, 16) -#define SW_IND_CTXT_DATA_W4_IRQ_BYP_MASK BIT(15) -#define SW_IND_CTXT_DATA_W4_PACK_BYP_OUT_MASK BIT(14) -#define SW_IND_CTXT_DATA_W4_VIRTIO_EN_MASK BIT(13) -#define SW_IND_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(12) -#define SW_IND_CTXT_DATA_W4_INT_AGGR_MASK BIT(11) -#define SW_IND_CTXT_DATA_W4_VEC_MASK GENMASK(10, 0) -#define SW_IND_CTXT_DATA_W3_DSC_BASE_H_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W2_DSC_BASE_L_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W1_IS_MM_MASK BIT(31) -#define SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK BIT(30) -#define SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK BIT(29) -#define SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK BIT(28) -#define SW_IND_CTXT_DATA_W1_ERR_MASK GENMASK(27, 26) -#define SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK BIT(25) -#define SW_IND_CTXT_DATA_W1_PORT_ID_MASK GENMASK(24, 22) -#define SW_IND_CTXT_DATA_W1_IRQ_EN_MASK BIT(21) -#define SW_IND_CTXT_DATA_W1_WBK_EN_MASK BIT(20) -#define SW_IND_CTXT_DATA_W1_MM_CHN_MASK BIT(19) -#define SW_IND_CTXT_DATA_W1_BYPASS_MASK BIT(18) -#define SW_IND_CTXT_DATA_W1_DSC_SZ_MASK GENMASK(17, 16) -#define SW_IND_CTXT_DATA_W1_RNG_SZ_MASK GENMASK(15, 12) -#define SW_IND_CTXT_DATA_W1_RSVD_1_MASK GENMASK(11, 9) -#define SW_IND_CTXT_DATA_W1_FETCH_MAX_MASK GENMASK(8, 5) -#define SW_IND_CTXT_DATA_W1_AT_MASK BIT(4) -#define SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK BIT(3) -#define SW_IND_CTXT_DATA_W1_WBI_CHK_MASK BIT(2) -#define SW_IND_CTXT_DATA_W1_FCRD_EN_MASK BIT(1) -#define SW_IND_CTXT_DATA_W1_QEN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W0_RSV_MASK GENMASK(31, 29) -#define SW_IND_CTXT_DATA_W0_FNC_MASK GENMASK(28, 17) -#define SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK BIT(16) -#define SW_IND_CTXT_DATA_W0_PIDX_MASK GENMASK(15, 0) -#define HW_IND_CTXT_DATA_W1_RSVD_1_MASK BIT(15) -#define HW_IND_CTXT_DATA_W1_FETCH_PND_MASK GENMASK(14, 11) -#define HW_IND_CTXT_DATA_W1_EVT_PND_MASK BIT(10) -#define HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK BIT(9) -#define HW_IND_CTXT_DATA_W1_DSC_PND_MASK BIT(8) -#define HW_IND_CTXT_DATA_W1_RSVD_2_MASK GENMASK(7, 0) -#define HW_IND_CTXT_DATA_W0_CRD_USE_MASK GENMASK(31, 16) -#define HW_IND_CTXT_DATA_W0_CIDX_MASK GENMASK(15, 0) -#define CRED_CTXT_DATA_W0_RSVD_1_MASK GENMASK(31, 16) -#define CRED_CTXT_DATA_W0_CREDT_MASK GENMASK(15, 0) -#define PREFETCH_CTXT_DATA_W1_VALID_MASK BIT(13) -#define PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define PREFETCH_CTXT_DATA_W0_PFCH_MASK BIT(28) -#define PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK BIT(27) -#define PREFETCH_CTXT_DATA_W0_ERR_MASK BIT(26) -#define PREFETCH_CTXT_DATA_W0_RSVD_MASK GENMASK(25, 22) -#define PREFETCH_CTXT_DATA_W0_PFCH_NEED_MASK GENMASK(21, 16) -#define PREFETCH_CTXT_DATA_W0_NUM_PFCH_MASK GENMASK(15, 10) -#define PREFETCH_CTXT_DATA_W0_VIRTIO_MASK BIT(9) -#define PREFETCH_CTXT_DATA_W0_VAR_DESC_MASK BIT(8) -#define PREFETCH_CTXT_DATA_W0_PORT_ID_MASK GENMASK(7, 5) -#define PREFETCH_CTXT_DATA_W0_BUF_SZ_IDX_MASK GENMASK(4, 1) -#define PREFETCH_CTXT_DATA_W0_BYPASS_MASK BIT(0) -#define CMPL_CTXT_DATA_W6_RSVD_1_H_MASK GENMASK(7, 0) -#define CMPL_CTXT_DATA_W5_RSVD_1_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W5_PORT_ID_MASK GENMASK(22, 20) -#define CMPL_CTXT_DATA_W5_SH_CMPT_MASK BIT(19) -#define CMPL_CTXT_DATA_W5_VIO_EOP_MASK BIT(18) -#define CMPL_CTXT_DATA_W5_BADDR4_LOW_MASK GENMASK(17, 14) -#define CMPL_CTXT_DATA_W5_PASID_EN_MASK BIT(13) -#define CMPL_CTXT_DATA_W5_PASID_H_MASK GENMASK(12, 0) -#define CMPL_CTXT_DATA_W4_PASID_L_MASK GENMASK(31, 23) -#define CMPL_CTXT_DATA_W4_HOST_ID_MASK GENMASK(22, 19) -#define CMPL_CTXT_DATA_W4_DIR_C2H_MASK BIT(18) -#define CMPL_CTXT_DATA_W4_VIO_MASK BIT(17) -#define CMPL_CTXT_DATA_W4_DIS_INTR_ON_VF_MASK BIT(16) -#define CMPL_CTXT_DATA_W4_INT_AGGR_MASK BIT(15) -#define CMPL_CTXT_DATA_W4_VEC_MASK GENMASK(14, 4) -#define CMPL_CTXT_DATA_W4_AT_MASK BIT(3) -#define CMPL_CTXT_DATA_W4_OVF_CHK_DIS_MASK BIT(2) -#define CMPL_CTXT_DATA_W4_FULL_UPD_MASK BIT(1) -#define CMPL_CTXT_DATA_W4_TIMER_RUNNING_MASK BIT(0) -#define CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK BIT(31) -#define CMPL_CTXT_DATA_W3_ERR_MASK GENMASK(30, 29) -#define CMPL_CTXT_DATA_W3_VALID_MASK BIT(28) -#define CMPL_CTXT_DATA_W3_CIDX_MASK GENMASK(27, 12) -#define CMPL_CTXT_DATA_W3_PIDX_H_MASK GENMASK(11, 0) -#define CMPL_CTXT_DATA_W2_PIDX_L_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W2_DESC_SIZE_MASK GENMASK(27, 26) -#define CMPL_CTXT_DATA_W2_BADDR4_HIGH_H_MASK GENMASK(25, 0) -#define CMPL_CTXT_DATA_W1_BADDR4_HIGH_L_MASK GENMASK(31, 0) -#define CMPL_CTXT_DATA_W0_QSIZE_IX_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W0_COLOR_MASK BIT(27) -#define CMPL_CTXT_DATA_W0_INT_ST_MASK GENMASK(26, 25) -#define CMPL_CTXT_DATA_W0_TIMER_IX_MASK GENMASK(24, 21) -#define CMPL_CTXT_DATA_W0_CNTER_IX_MASK GENMASK(20, 17) -#define CMPL_CTXT_DATA_W0_FNC_ID_MASK GENMASK(16, 5) -#define CMPL_CTXT_DATA_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define CMPL_CTXT_DATA_W0_EN_INT_MASK BIT(1) -#define CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK BIT(0) -#define INTR_CTXT_DATA_W3_FUNC_MASK GENMASK(29, 18) -#define INTR_CTXT_DATA_W3_RSVD_MASK GENMASK(17, 14) -#define INTR_CTXT_DATA_W3_PASID_EN_MASK BIT(13) -#define INTR_CTXT_DATA_W3_PASID_H_MASK GENMASK(12, 0) -#define INTR_CTXT_DATA_W2_PASID_L_MASK GENMASK(31, 23) -#define INTR_CTXT_DATA_W2_HOST_ID_MASK GENMASK(22, 19) -#define INTR_CTXT_DATA_W2_AT_MASK BIT(18) -#define INTR_CTXT_DATA_W2_PIDX_MASK GENMASK(17, 6) -#define INTR_CTXT_DATA_W2_PAGE_SIZE_MASK GENMASK(5, 3) -#define INTR_CTXT_DATA_W2_BADDR_4K_H_MASK GENMASK(2, 0) -#define INTR_CTXT_DATA_W1_BADDR_4K_M_MASK GENMASK(31, 0) -#define INTR_CTXT_DATA_W0_BADDR_4K_L_MASK GENMASK(31, 15) -#define INTR_CTXT_DATA_W0_COLOR_MASK BIT(14) -#define INTR_CTXT_DATA_W0_INT_ST_MASK BIT(13) -#define INTR_CTXT_DATA_W0_RSVD1_MASK BIT(12) -#define INTR_CTXT_DATA_W0_VEC_MASK GENMASK(11, 1) -#define INTR_CTXT_DATA_W0_VALID_MASK BIT(0) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c b/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c deleted file mode 100644 index 8d3c088..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/eqdma_soft_access/eqdma_soft_reg_dump.c +++ /dev/null @@ -1,3938 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - - -#include "eqdma_soft_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "eqdma_soft_reg_dump.tmh" -#endif - - -static struct regfield_info - cfg_blk_identifier_field_info[] = { - {"CFG_BLK_IDENTIFIER", - CFG_BLK_IDENTIFIER_MASK}, - {"CFG_BLK_IDENTIFIER_1", - CFG_BLK_IDENTIFIER_1_MASK}, - {"CFG_BLK_IDENTIFIER_RSVD_1", - CFG_BLK_IDENTIFIER_RSVD_1_MASK}, - {"CFG_BLK_IDENTIFIER_VERSION", - CFG_BLK_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_pld_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_PROG", - CFG_BLK_PCIE_MAX_PLD_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_PLD_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_read_req_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_PROG_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ISSUED_MASK}, -}; - - -static struct regfield_info - cfg_blk_system_id_field_info[] = { - {"CFG_BLK_SYSTEM_ID_RSVD_1", - CFG_BLK_SYSTEM_ID_RSVD_1_MASK}, - {"CFG_BLK_SYSTEM_ID_INST_TYPE", - CFG_BLK_SYSTEM_ID_INST_TYPE_MASK}, - {"CFG_BLK_SYSTEM_ID", - CFG_BLK_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - cfg_blk_msix_enable_field_info[] = { - {"CFG_BLK_MSIX_ENABLE", - CFG_BLK_MSIX_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_pcie_data_width_field_info[] = { - {"CFG_PCIE_DATA_WIDTH_RSVD_1", - CFG_PCIE_DATA_WIDTH_RSVD_1_MASK}, - {"CFG_PCIE_DATA_WIDTH_DATAPATH", - CFG_PCIE_DATA_WIDTH_DATAPATH_MASK}, -}; - - -static struct regfield_info - cfg_pcie_ctl_field_info[] = { - {"CFG_PCIE_CTL_RSVD_1", - CFG_PCIE_CTL_RSVD_1_MASK}, - {"CFG_PCIE_CTL_MGMT_AXIL_CTRL", - CFG_PCIE_CTL_MGMT_AXIL_CTRL_MASK}, - {"CFG_PCIE_CTL_RSVD_2", - CFG_PCIE_CTL_RSVD_2_MASK}, - {"CFG_PCIE_CTL_RRQ_DISABLE", - CFG_PCIE_CTL_RRQ_DISABLE_MASK}, - {"CFG_PCIE_CTL_RELAXED_ORDERING", - CFG_PCIE_CTL_RELAXED_ORDERING_MASK}, -}; - - -static struct regfield_info - cfg_blk_msi_enable_field_info[] = { - {"CFG_BLK_MSI_ENABLE", - CFG_BLK_MSI_ENABLE_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_pld_size_field_info[] = { - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_ISSUED", - CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2", - CFG_AXI_USER_MAX_PLD_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_PROG", - CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_read_req_size_field_info[] = { - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_1_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2", - CFG_AXI_USER_MAX_READ_REQ_SIZE_RSVD_2_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK}, -}; - - -static struct regfield_info - cfg_blk_misc_ctl_field_info[] = { - {"CFG_BLK_MISC_CTL_RSVD_1", - CFG_BLK_MISC_CTL_RSVD_1_MASK}, - {"CFG_BLK_MISC_CTL_10B_TAG_EN", - CFG_BLK_MISC_CTL_10B_TAG_EN_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_2", - CFG_BLK_MISC_CTL_RSVD_2_MASK}, - {"CFG_BLK_MISC_CTL_AXI_WBK", - CFG_BLK_MISC_CTL_AXI_WBK_MASK}, - {"CFG_BLK_MISC_CTL_AXI_DSC", - CFG_BLK_MISC_CTL_AXI_DSC_MASK}, - {"CFG_BLK_MISC_CTL_NUM_TAG", - CFG_BLK_MISC_CTL_NUM_TAG_MASK}, - {"CFG_BLK_MISC_CTL_RSVD_3", - CFG_BLK_MISC_CTL_RSVD_3_MASK}, - {"CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER", - CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK}, -}; - - -static struct regfield_info - cfg_pl_cred_ctl_field_info[] = { - {"CFG_PL_CRED_CTL_RSVD_1", - CFG_PL_CRED_CTL_RSVD_1_MASK}, - {"CFG_PL_CRED_CTL_SLAVE_CRD_RLS", - CFG_PL_CRED_CTL_SLAVE_CRD_RLS_MASK}, - {"CFG_PL_CRED_CTL_RSVD_2", - CFG_PL_CRED_CTL_RSVD_2_MASK}, - {"CFG_PL_CRED_CTL_MASTER_CRD_RST", - CFG_PL_CRED_CTL_MASTER_CRD_RST_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_field_info[] = { - {"CFG_BLK_SCRATCH", - CFG_BLK_SCRATCH_MASK}, -}; - - -static struct regfield_info - cfg_gic_field_info[] = { - {"CFG_GIC_RSVD_1", - CFG_GIC_RSVD_1_MASK}, - {"CFG_GIC_GIC_IRQ", - CFG_GIC_GIC_IRQ_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_1_a_field_info[] = { - {"RAM_SBE_MSK_1_A", - RAM_SBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_1_a_field_info[] = { - {"RAM_SBE_STS_1_A_RSVD", - RAM_SBE_STS_1_A_RSVD_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_SBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_SBE_STS_1_A_TAG_EVEN_RAM", - RAM_SBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_SBE_STS_1_A_TAG_ODD_RAM", - RAM_SBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_SBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_1_a_field_info[] = { - {"RAM_DBE_MSK_1_A", - RAM_DBE_MSK_1_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_1_a_field_info[] = { - {"RAM_DBE_STS_1_A_RSVD", - RAM_DBE_STS_1_A_RSVD_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_1_MASK}, - {"RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0", - RAM_DBE_STS_1_A_PFCH_CTXT_CAM_RAM_0_MASK}, - {"RAM_DBE_STS_1_A_TAG_EVEN_RAM", - RAM_DBE_STS_1_A_TAG_EVEN_RAM_MASK}, - {"RAM_DBE_STS_1_A_TAG_ODD_RAM", - RAM_DBE_STS_1_A_TAG_ODD_RAM_MASK}, - {"RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM", - RAM_DBE_STS_1_A_RC_RRQ_EVEN_RAM_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_a_field_info[] = { - {"RAM_SBE_MSK_A", - RAM_SBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_a_field_info[] = { - {"RAM_SBE_STS_A_RC_RRQ_ODD_RAM", - RAM_SBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_SBE_STS_A_PEND_FIFO_RAM", - RAM_SBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_LL_RAM", - RAM_SBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_CTXT_RAM", - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_CTXT_RAM", - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_INT_CTXT_RAM", - RAM_SBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_COAL_DATA_RAM", - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_SBE_STS_A_QID_FIFO_RAM", - RAM_SBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_TIMER_FIFO_RAM", - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_SBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_DSC_CPLD", - RAM_SBE_STS_A_DSC_CPLD_MASK}, - {"RAM_SBE_STS_A_DSC_CPLI", - RAM_SBE_STS_A_DSC_CPLI_MASK}, - {"RAM_SBE_STS_A_DSC_SW_CTXT", - RAM_SBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_SBE_STS_A_DSC_CRD_RCV", - RAM_SBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_SBE_STS_A_DSC_HW_CTXT", - RAM_SBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_SBE_STS_A_FUNC_MAP", - RAM_SBE_STS_A_FUNC_MAP_MASK}, - {"RAM_SBE_STS_A_C2H_WR_BRG_DAT", - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_C2H_RD_BRG_DAT", - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_WR_BRG_DAT", - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_RD_BRG_DAT", - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H3_DAT", - RAM_SBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H2_DAT", - RAM_SBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H1_DAT", - RAM_SBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_C2H0_DAT", - RAM_SBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C3_DAT", - RAM_SBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C2_DAT", - RAM_SBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C1_DAT", - RAM_SBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_SBE_STS_A_MI_H2C0_DAT", - RAM_SBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_a_field_info[] = { - {"RAM_DBE_MSK_A", - RAM_DBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_a_field_info[] = { - {"RAM_DBE_STS_A_RC_RRQ_ODD_RAM", - RAM_DBE_STS_A_RC_RRQ_ODD_RAM_MASK}, - {"RAM_DBE_STS_A_PEND_FIFO_RAM", - RAM_DBE_STS_A_PEND_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_LL_RAM", - RAM_DBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_CTXT_RAM", - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_CTXT_RAM", - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_INT_CTXT_RAM", - RAM_DBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_COAL_DATA_RAM", - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_DBE_STS_A_QID_FIFO_RAM", - RAM_DBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_TIMER_FIFO_RAM", - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM", - RAM_DBE_STS_A_MI_TL_SLV_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_DSC_CPLD", - RAM_DBE_STS_A_DSC_CPLD_MASK}, - {"RAM_DBE_STS_A_DSC_CPLI", - RAM_DBE_STS_A_DSC_CPLI_MASK}, - {"RAM_DBE_STS_A_DSC_SW_CTXT", - RAM_DBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_DBE_STS_A_DSC_CRD_RCV", - RAM_DBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_DBE_STS_A_DSC_HW_CTXT", - RAM_DBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_DBE_STS_A_FUNC_MAP", - RAM_DBE_STS_A_FUNC_MAP_MASK}, - {"RAM_DBE_STS_A_C2H_WR_BRG_DAT", - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_C2H_RD_BRG_DAT", - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_WR_BRG_DAT", - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_RD_BRG_DAT", - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H3_DAT", - RAM_DBE_STS_A_MI_C2H3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H2_DAT", - RAM_DBE_STS_A_MI_C2H2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H1_DAT", - RAM_DBE_STS_A_MI_C2H1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_C2H0_DAT", - RAM_DBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C3_DAT", - RAM_DBE_STS_A_MI_H2C3_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C2_DAT", - RAM_DBE_STS_A_MI_H2C2_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C1_DAT", - RAM_DBE_STS_A_MI_H2C1_DAT_MASK}, - {"RAM_DBE_STS_A_MI_H2C0_DAT", - RAM_DBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_identifier_field_info[] = { - {"GLBL2_IDENTIFIER", - GLBL2_IDENTIFIER_MASK}, - {"GLBL2_IDENTIFIER_VERSION", - GLBL2_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - glbl2_channel_inst_field_info[] = { - {"GLBL2_CHANNEL_INST_RSVD_1", - GLBL2_CHANNEL_INST_RSVD_1_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ST", - GLBL2_CHANNEL_INST_C2H_ST_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ST", - GLBL2_CHANNEL_INST_H2C_ST_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_2", - GLBL2_CHANNEL_INST_RSVD_2_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ENG", - GLBL2_CHANNEL_INST_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_3", - GLBL2_CHANNEL_INST_RSVD_3_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ENG", - GLBL2_CHANNEL_INST_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_mdma_field_info[] = { - {"GLBL2_CHANNEL_MDMA_RSVD_1", - GLBL2_CHANNEL_MDMA_RSVD_1_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ST", - GLBL2_CHANNEL_MDMA_C2H_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ST", - GLBL2_CHANNEL_MDMA_H2C_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_2", - GLBL2_CHANNEL_MDMA_RSVD_2_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ENG", - GLBL2_CHANNEL_MDMA_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_3", - GLBL2_CHANNEL_MDMA_RSVD_3_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ENG", - GLBL2_CHANNEL_MDMA_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_strm_field_info[] = { - {"GLBL2_CHANNEL_STRM_RSVD_1", - GLBL2_CHANNEL_STRM_RSVD_1_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ST", - GLBL2_CHANNEL_STRM_C2H_ST_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ST", - GLBL2_CHANNEL_STRM_H2C_ST_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_2", - GLBL2_CHANNEL_STRM_RSVD_2_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ENG", - GLBL2_CHANNEL_STRM_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_3", - GLBL2_CHANNEL_STRM_RSVD_3_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ENG", - GLBL2_CHANNEL_STRM_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_cap_field_info[] = { - {"GLBL2_CHANNEL_CAP_RSVD_1", - GLBL2_CHANNEL_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_CAP_MULTIQ_MAX", - GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK}, -}; - - -static struct regfield_info - glbl2_channel_pasid_cap_field_info[] = { - {"GLBL2_CHANNEL_PASID_CAP_RSVD_1", - GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEEN", - GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_DMAEN", - GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK}, -}; - - -static struct regfield_info - glbl2_system_id_field_info[] = { - {"GLBL2_SYSTEM_ID_RSVD_1", - GLBL2_SYSTEM_ID_RSVD_1_MASK}, - {"GLBL2_SYSTEM_ID", - GLBL2_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - glbl2_misc_cap_field_info[] = { - {"GLBL2_MISC_CAP", - GLBL2_MISC_CAP_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq0_field_info[] = { - {"GLBL2_PCIE_RQ0_NPH_AVL", - GLBL2_PCIE_RQ0_NPH_AVL_MASK}, - {"GLBL2_PCIE_RQ0_RCB_AVL", - GLBL2_PCIE_RQ0_RCB_AVL_MASK}, - {"GLBL2_PCIE_RQ0_SLV_RD_CREDS", - GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK}, - {"GLBL2_PCIE_RQ0_TAG_EP", - GLBL2_PCIE_RQ0_TAG_EP_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq1_field_info[] = { - {"GLBL2_PCIE_RQ1_RSVD_1", - GLBL2_PCIE_RQ1_RSVD_1_MASK}, - {"GLBL2_PCIE_RQ1_TAG_FL", - GLBL2_PCIE_RQ1_TAG_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_EP", - GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_FL", - GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM", - GLBL2_PCIE_RQ1_TLPSM_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM512", - GLBL2_PCIE_RQ1_TLPSM512_MASK}, - {"GLBL2_PCIE_RQ1_RREQ_RCB_OK", - GLBL2_PCIE_RQ1_RREQ_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_SLV", - GLBL2_PCIE_RQ1_RREQ0_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_VLD", - GLBL2_PCIE_RQ1_RREQ0_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_RDY", - GLBL2_PCIE_RQ1_RREQ0_RDY_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_SLV", - GLBL2_PCIE_RQ1_RREQ1_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_VLD", - GLBL2_PCIE_RQ1_RREQ1_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_RDY", - GLBL2_PCIE_RQ1_RREQ1_RDY_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_REQ", - GLBL2_PCIE_RQ1_WTLP_REQ_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_STRADDLE", - GLBL2_PCIE_RQ1_WTLP_STRADDLE_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr0_field_info[] = { - {"GLBL2_AXIMM_WR0_RSVD_1", - GLBL2_AXIMM_WR0_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR0_WR_REQ", - GLBL2_AXIMM_WR0_WR_REQ_MASK}, - {"GLBL2_AXIMM_WR0_WR_CHN", - GLBL2_AXIMM_WR0_WR_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP", - GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_WPL_FIFO_EP", - GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN", - GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WRREQ_CNT", - GLBL2_AXIMM_WR0_WRREQ_CNT_MASK}, - {"GLBL2_AXIMM_WR0_BID", - GLBL2_AXIMM_WR0_BID_MASK}, - {"GLBL2_AXIMM_WR0_BVALID", - GLBL2_AXIMM_WR0_BVALID_MASK}, - {"GLBL2_AXIMM_WR0_BREADY", - GLBL2_AXIMM_WR0_BREADY_MASK}, - {"GLBL2_AXIMM_WR0_WVALID", - GLBL2_AXIMM_WR0_WVALID_MASK}, - {"GLBL2_AXIMM_WR0_WREADY", - GLBL2_AXIMM_WR0_WREADY_MASK}, - {"GLBL2_AXIMM_WR0_AWID", - GLBL2_AXIMM_WR0_AWID_MASK}, - {"GLBL2_AXIMM_WR0_AWVALID", - GLBL2_AXIMM_WR0_AWVALID_MASK}, - {"GLBL2_AXIMM_WR0_AWREADY", - GLBL2_AXIMM_WR0_AWREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr1_field_info[] = { - {"GLBL2_AXIMM_WR1_RSVD_1", - GLBL2_AXIMM_WR1_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT4", - GLBL2_AXIMM_WR1_BRSP_CNT4_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT3", - GLBL2_AXIMM_WR1_BRSP_CNT3_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT2", - GLBL2_AXIMM_WR1_BRSP_CNT2_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT1", - GLBL2_AXIMM_WR1_BRSP_CNT1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT0", - GLBL2_AXIMM_WR1_BRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd0_field_info[] = { - {"GLBL2_AXIMM_RD0_RSVD_1", - GLBL2_AXIMM_RD0_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD0_PND_CNT", - GLBL2_AXIMM_RD0_PND_CNT_MASK}, - {"GLBL2_AXIMM_RD0_RD_REQ", - GLBL2_AXIMM_RD0_RD_REQ_MASK}, - {"GLBL2_AXIMM_RD0_RD_CHNL", - GLBL2_AXIMM_RD0_RD_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL", - GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RID", - GLBL2_AXIMM_RD0_RID_MASK}, - {"GLBL2_AXIMM_RD0_RVALID", - GLBL2_AXIMM_RD0_RVALID_MASK}, - {"GLBL2_AXIMM_RD0_RREADY", - GLBL2_AXIMM_RD0_RREADY_MASK}, - {"GLBL2_AXIMM_RD0_ARID", - GLBL2_AXIMM_RD0_ARID_MASK}, - {"GLBL2_AXIMM_RD0_ARVALID", - GLBL2_AXIMM_RD0_ARVALID_MASK}, - {"GLBL2_AXIMM_RD0_ARREADY", - GLBL2_AXIMM_RD0_ARREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd1_field_info[] = { - {"GLBL2_AXIMM_RD1_RSVD_1", - GLBL2_AXIMM_RD1_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT4", - GLBL2_AXIMM_RD1_RRSP_CNT4_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT3", - GLBL2_AXIMM_RD1_RRSP_CNT3_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT2", - GLBL2_AXIMM_RD1_RRSP_CNT2_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT1", - GLBL2_AXIMM_RD1_RRSP_CNT1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT0", - GLBL2_AXIMM_RD1_RRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab0_field_info[] = { - {"GLBL2_FAB0_H2C_INB_CONV_IN_VLD", - GLBL2_FAB0_H2C_INB_CONV_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_INB_CONV_IN_RDY", - GLBL2_FAB0_H2C_INB_CONV_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_VLD", - GLBL2_FAB0_H2C_SEG_IN_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_IN_RDY", - GLBL2_FAB0_H2C_SEG_IN_RDY_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_VLD", - GLBL2_FAB0_H2C_SEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_H2C_SEG_OUT_RDY", - GLBL2_FAB0_H2C_SEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_H2C_MST_CRDT_STAT", - GLBL2_FAB0_H2C_MST_CRDT_STAT_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_FULL", - GLBL2_FAB0_C2H_SLV_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY", - GLBL2_FAB0_C2H_SLV_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_VLD", - GLBL2_FAB0_C2H_DESEG_SEG_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_SEG_RDY", - GLBL2_FAB0_C2H_DESEG_SEG_RDY_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_VLD", - GLBL2_FAB0_C2H_DESEG_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_DESEG_OUT_RDY", - GLBL2_FAB0_C2H_DESEG_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD", - GLBL2_FAB0_C2H_INB_DECONV_OUT_VLD_MASK}, - {"GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY", - GLBL2_FAB0_C2H_INB_DECONV_OUT_RDY_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY", - GLBL2_FAB0_C2H_DSC_CRDT_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_FULL", - GLBL2_FAB0_IRQ_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY", - GLBL2_FAB0_IRQ_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY", - GLBL2_FAB0_IMM_CRD_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_fab1_field_info[] = { - {"GLBL2_FAB1_BYP_OUT_CRDT_STAT", - GLBL2_FAB1_BYP_OUT_CRDT_STAT_MASK}, - {"GLBL2_FAB1_TM_DSC_STS_CRDT_STAT", - GLBL2_FAB1_TM_DSC_STS_CRDT_STAT_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_FULL", - GLBL2_FAB1_C2H_CMN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_CMN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_1", - GLBL2_FAB1_RSVD_1_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_2", - GLBL2_FAB1_RSVD_2_MASK}, - {"GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_C2H_BYP_IN_AFIFO_EMPTY_MASK}, - {"GLBL2_FAB1_RSVD_3", - GLBL2_FAB1_RSVD_3_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_FULL_MASK}, - {"GLBL2_FAB1_RSVD_4", - GLBL2_FAB1_RSVD_4_MASK}, - {"GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY", - GLBL2_FAB1_H2C_BYP_IN_AFIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_sel_field_info[] = { - {"GLBL2_MATCH_SEL_RSV", - GLBL2_MATCH_SEL_RSV_MASK}, - {"GLBL2_MATCH_SEL_CSR_SEL", - GLBL2_MATCH_SEL_CSR_SEL_MASK}, - {"GLBL2_MATCH_SEL_CSR_EN", - GLBL2_MATCH_SEL_CSR_EN_MASK}, - {"GLBL2_MATCH_SEL_ROTATE1", - GLBL2_MATCH_SEL_ROTATE1_MASK}, - {"GLBL2_MATCH_SEL_ROTATE0", - GLBL2_MATCH_SEL_ROTATE0_MASK}, - {"GLBL2_MATCH_SEL_SEL", - GLBL2_MATCH_SEL_SEL_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_msk_field_info[] = { - {"GLBL2_MATCH_MSK", - GLBL2_MATCH_MSK_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_match_pat_field_info[] = { - {"GLBL2_MATCH_PAT_PATTERN", - GLBL2_MATCH_PAT_PATTERN_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_1_field_info[] = { - {"GLBL_RNG_SZ_1_RSVD_1", - GLBL_RNG_SZ_1_RSVD_1_MASK}, - {"GLBL_RNG_SZ_1_RING_SIZE", - GLBL_RNG_SZ_1_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_2_field_info[] = { - {"GLBL_RNG_SZ_2_RSVD_1", - GLBL_RNG_SZ_2_RSVD_1_MASK}, - {"GLBL_RNG_SZ_2_RING_SIZE", - GLBL_RNG_SZ_2_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_3_field_info[] = { - {"GLBL_RNG_SZ_3_RSVD_1", - GLBL_RNG_SZ_3_RSVD_1_MASK}, - {"GLBL_RNG_SZ_3_RING_SIZE", - GLBL_RNG_SZ_3_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_4_field_info[] = { - {"GLBL_RNG_SZ_4_RSVD_1", - GLBL_RNG_SZ_4_RSVD_1_MASK}, - {"GLBL_RNG_SZ_4_RING_SIZE", - GLBL_RNG_SZ_4_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_5_field_info[] = { - {"GLBL_RNG_SZ_5_RSVD_1", - GLBL_RNG_SZ_5_RSVD_1_MASK}, - {"GLBL_RNG_SZ_5_RING_SIZE", - GLBL_RNG_SZ_5_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_6_field_info[] = { - {"GLBL_RNG_SZ_6_RSVD_1", - GLBL_RNG_SZ_6_RSVD_1_MASK}, - {"GLBL_RNG_SZ_6_RING_SIZE", - GLBL_RNG_SZ_6_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_7_field_info[] = { - {"GLBL_RNG_SZ_7_RSVD_1", - GLBL_RNG_SZ_7_RSVD_1_MASK}, - {"GLBL_RNG_SZ_7_RING_SIZE", - GLBL_RNG_SZ_7_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_8_field_info[] = { - {"GLBL_RNG_SZ_8_RSVD_1", - GLBL_RNG_SZ_8_RSVD_1_MASK}, - {"GLBL_RNG_SZ_8_RING_SIZE", - GLBL_RNG_SZ_8_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_9_field_info[] = { - {"GLBL_RNG_SZ_9_RSVD_1", - GLBL_RNG_SZ_9_RSVD_1_MASK}, - {"GLBL_RNG_SZ_9_RING_SIZE", - GLBL_RNG_SZ_9_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_a_field_info[] = { - {"GLBL_RNG_SZ_A_RSVD_1", - GLBL_RNG_SZ_A_RSVD_1_MASK}, - {"GLBL_RNG_SZ_A_RING_SIZE", - GLBL_RNG_SZ_A_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_b_field_info[] = { - {"GLBL_RNG_SZ_B_RSVD_1", - GLBL_RNG_SZ_B_RSVD_1_MASK}, - {"GLBL_RNG_SZ_B_RING_SIZE", - GLBL_RNG_SZ_B_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_c_field_info[] = { - {"GLBL_RNG_SZ_C_RSVD_1", - GLBL_RNG_SZ_C_RSVD_1_MASK}, - {"GLBL_RNG_SZ_C_RING_SIZE", - GLBL_RNG_SZ_C_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_d_field_info[] = { - {"GLBL_RNG_SZ_D_RSVD_1", - GLBL_RNG_SZ_D_RSVD_1_MASK}, - {"GLBL_RNG_SZ_D_RING_SIZE", - GLBL_RNG_SZ_D_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_e_field_info[] = { - {"GLBL_RNG_SZ_E_RSVD_1", - GLBL_RNG_SZ_E_RSVD_1_MASK}, - {"GLBL_RNG_SZ_E_RING_SIZE", - GLBL_RNG_SZ_E_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_f_field_info[] = { - {"GLBL_RNG_SZ_F_RSVD_1", - GLBL_RNG_SZ_F_RSVD_1_MASK}, - {"GLBL_RNG_SZ_F_RING_SIZE", - GLBL_RNG_SZ_F_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_10_field_info[] = { - {"GLBL_RNG_SZ_10_RSVD_1", - GLBL_RNG_SZ_10_RSVD_1_MASK}, - {"GLBL_RNG_SZ_10_RING_SIZE", - GLBL_RNG_SZ_10_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_err_stat_field_info[] = { - {"GLBL_ERR_STAT_RSVD_1", - GLBL_ERR_STAT_RSVD_1_MASK}, - {"GLBL_ERR_STAT_ERR_FAB", - GLBL_ERR_STAT_ERR_FAB_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_ST", - GLBL_ERR_STAT_ERR_H2C_ST_MASK}, - {"GLBL_ERR_STAT_ERR_BDG", - GLBL_ERR_STAT_ERR_BDG_MASK}, - {"GLBL_ERR_STAT_IND_CTXT_CMD_ERR", - GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_ST", - GLBL_ERR_STAT_ERR_C2H_ST_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_1", - GLBL_ERR_STAT_ERR_C2H_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_0", - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_1", - GLBL_ERR_STAT_ERR_H2C_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_0", - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_TRQ", - GLBL_ERR_STAT_ERR_TRQ_MASK}, - {"GLBL_ERR_STAT_ERR_DSC", - GLBL_ERR_STAT_ERR_DSC_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_DBE", - GLBL_ERR_STAT_ERR_RAM_DBE_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_SBE", - GLBL_ERR_STAT_ERR_RAM_SBE_MASK}, -}; - - -static struct regfield_info - glbl_err_mask_field_info[] = { - {"GLBL_ERR", - GLBL_ERR_MASK}, -}; - - -static struct regfield_info - glbl_dsc_cfg_field_info[] = { - {"GLBL_DSC_CFG_RSVD_1", - GLBL_DSC_CFG_RSVD_1_MASK}, - {"GLBL_DSC_CFG_UNC_OVR_COR", - GLBL_DSC_CFG_UNC_OVR_COR_MASK}, - {"GLBL_DSC_CFG_CTXT_FER_DIS", - GLBL_DSC_CFG_CTXT_FER_DIS_MASK}, - {"GLBL_DSC_CFG_RSVD_2", - GLBL_DSC_CFG_RSVD_2_MASK}, - {"GLBL_DSC_CFG_MAXFETCH", - GLBL_DSC_CFG_MAXFETCH_MASK}, - {"GLBL_DSC_CFG_WB_ACC_INT", - GLBL_DSC_CFG_WB_ACC_INT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_sts_field_info[] = { - {"GLBL_DSC_ERR_STS_RSVD_1", - GLBL_DSC_ERR_STS_RSVD_1_MASK}, - {"GLBL_DSC_ERR_STS_PORT_ID", - GLBL_DSC_ERR_STS_PORT_ID_MASK}, - {"GLBL_DSC_ERR_STS_SBE", - GLBL_DSC_ERR_STS_SBE_MASK}, - {"GLBL_DSC_ERR_STS_DBE", - GLBL_DSC_ERR_STS_DBE_MASK}, - {"GLBL_DSC_ERR_STS_RQ_CANCEL", - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_DSC", - GLBL_DSC_ERR_STS_DSC_MASK}, - {"GLBL_DSC_ERR_STS_DMA", - GLBL_DSC_ERR_STS_DMA_MASK}, - {"GLBL_DSC_ERR_STS_FLR_CANCEL", - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_RSVD_2", - GLBL_DSC_ERR_STS_RSVD_2_MASK}, - {"GLBL_DSC_ERR_STS_DAT_POISON", - GLBL_DSC_ERR_STS_DAT_POISON_MASK}, - {"GLBL_DSC_ERR_STS_TIMEOUT", - GLBL_DSC_ERR_STS_TIMEOUT_MASK}, - {"GLBL_DSC_ERR_STS_FLR", - GLBL_DSC_ERR_STS_FLR_MASK}, - {"GLBL_DSC_ERR_STS_TAG", - GLBL_DSC_ERR_STS_TAG_MASK}, - {"GLBL_DSC_ERR_STS_ADDR", - GLBL_DSC_ERR_STS_ADDR_MASK}, - {"GLBL_DSC_ERR_STS_PARAM", - GLBL_DSC_ERR_STS_PARAM_MASK}, - {"GLBL_DSC_ERR_STS_BCNT", - GLBL_DSC_ERR_STS_BCNT_MASK}, - {"GLBL_DSC_ERR_STS_UR_CA", - GLBL_DSC_ERR_STS_UR_CA_MASK}, - {"GLBL_DSC_ERR_STS_POISON", - GLBL_DSC_ERR_STS_POISON_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_msk_field_info[] = { - {"GLBL_DSC_ERR_MSK", - GLBL_DSC_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log0_field_info[] = { - {"GLBL_DSC_ERR_LOG0_VALID", - GLBL_DSC_ERR_LOG0_VALID_MASK}, - {"GLBL_DSC_ERR_LOG0_SEL", - GLBL_DSC_ERR_LOG0_SEL_MASK}, - {"GLBL_DSC_ERR_LOG0_RSVD_1", - GLBL_DSC_ERR_LOG0_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG0_QID", - GLBL_DSC_ERR_LOG0_QID_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log1_field_info[] = { - {"GLBL_DSC_ERR_LOG1_RSVD_1", - GLBL_DSC_ERR_LOG1_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG1_CIDX", - GLBL_DSC_ERR_LOG1_CIDX_MASK}, - {"GLBL_DSC_ERR_LOG1_RSVD_2", - GLBL_DSC_ERR_LOG1_RSVD_2_MASK}, - {"GLBL_DSC_ERR_LOG1_SUB_TYPE", - GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK}, - {"GLBL_DSC_ERR_LOG1_ERR_TYPE", - GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_sts_field_info[] = { - {"GLBL_TRQ_ERR_STS_RSVD_1", - GLBL_TRQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_QSPC_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_2", - GLBL_TRQ_ERR_STS_RSVD_2_MASK}, - {"GLBL_TRQ_ERR_STS_QID_RANGE", - GLBL_TRQ_ERR_STS_QID_RANGE_MASK}, - {"GLBL_TRQ_ERR_STS_QSPC_UNMAPPED", - GLBL_TRQ_ERR_STS_QSPC_UNMAPPED_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_CSR_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_RSVD_3", - GLBL_TRQ_ERR_STS_RSVD_3_MASK}, - {"GLBL_TRQ_ERR_STS_VF_ACCESS_ERR", - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK}, - {"GLBL_TRQ_ERR_STS_CSR_UNMAPPED", - GLBL_TRQ_ERR_STS_CSR_UNMAPPED_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_msk_field_info[] = { - {"GLBL_TRQ_ERR_MSK", - GLBL_TRQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_log_field_info[] = { - {"GLBL_TRQ_ERR_LOG_SRC", - GLBL_TRQ_ERR_LOG_SRC_MASK}, - {"GLBL_TRQ_ERR_LOG_TARGET", - GLBL_TRQ_ERR_LOG_TARGET_MASK}, - {"GLBL_TRQ_ERR_LOG_FUNC", - GLBL_TRQ_ERR_LOG_FUNC_MASK}, - {"GLBL_TRQ_ERR_LOG_ADDRESS", - GLBL_TRQ_ERR_LOG_ADDRESS_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat0_field_info[] = { - {"GLBL_DSC_DAT0_RSVD_1", - GLBL_DSC_DAT0_RSVD_1_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_DIR", - GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_QID", - GLBL_DSC_DAT0_CTXT_ARB_QID_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_REQ", - GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK}, - {"GLBL_DSC_DAT0_IRQ_FIFO_FL", - GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK}, - {"GLBL_DSC_DAT0_TMSTALL", - GLBL_DSC_DAT0_TMSTALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_STALL", - GLBL_DSC_DAT0_RRQ_STALL_MASK}, - {"GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL", - GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK}, - {"GLBL_DSC_DAT0_DSC_OUT_STALL", - GLBL_DSC_DAT0_DSC_OUT_STALL_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat1_field_info[] = { - {"GLBL_DSC_DAT1_RSVD_1", - GLBL_DSC_DAT1_RSVD_1_MASK}, - {"GLBL_DSC_DAT1_EVT_SPC_C2H", - GLBL_DSC_DAT1_EVT_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_EVT_SP_H2C", - GLBL_DSC_DAT1_EVT_SP_H2C_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_C2H", - GLBL_DSC_DAT1_DSC_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_H2C", - GLBL_DSC_DAT1_DSC_SPC_H2C_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_ctl_field_info[] = { - {"GLBL_DSC_CTL_RSVD_1", - GLBL_DSC_CTL_RSVD_1_MASK}, - {"GLBL_DSC_CTL_SELECT", - GLBL_DSC_CTL_SELECT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log2_field_info[] = { - {"GLBL_DSC_ERR_LOG2_OLD_PIDX", - GLBL_DSC_ERR_LOG2_OLD_PIDX_MASK}, - {"GLBL_DSC_ERR_LOG2_NEW_PIDX", - GLBL_DSC_ERR_LOG2_NEW_PIDX_MASK}, -}; - - -static struct regfield_info - glbl_glbl_interrupt_cfg_field_info[] = { - {"GLBL_GLBL_INTERRUPT_CFG_RSVD_1", - GLBL_GLBL_INTERRUPT_CFG_RSVD_1_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING", - GLBL_GLBL_INTERRUPT_CFG_LGCY_INTR_PENDING_MASK}, - {"GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR", - GLBL_GLBL_INTERRUPT_CFG_EN_LGCY_INTR_MASK}, -}; - - -static struct regfield_info - glbl_vch_host_profile_field_info[] = { - {"GLBL_VCH_HOST_PROFILE_RSVD_1", - GLBL_VCH_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_MM", - GLBL_VCH_HOST_PROFILE_2C_MM_MASK}, - {"GLBL_VCH_HOST_PROFILE_2C_ST", - GLBL_VCH_HOST_PROFILE_2C_ST_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_DSC", - GLBL_VCH_HOST_PROFILE_VCH_DSC_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_MSG", - GLBL_VCH_HOST_PROFILE_VCH_INT_MSG_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR", - GLBL_VCH_HOST_PROFILE_VCH_INT_AGGR_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_CMPT", - GLBL_VCH_HOST_PROFILE_VCH_CMPT_MASK}, - {"GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD", - GLBL_VCH_HOST_PROFILE_VCH_C2H_PLD_MASK}, -}; - - -static struct regfield_info - glbl_bridge_host_profile_field_info[] = { - {"GLBL_BRIDGE_HOST_PROFILE_RSVD_1", - GLBL_BRIDGE_HOST_PROFILE_RSVD_1_MASK}, - {"GLBL_BRIDGE_HOST_PROFILE_BDGID", - GLBL_BRIDGE_HOST_PROFILE_BDGID_MASK}, -}; - - -static struct regfield_info - aximm_irq_dest_addr_field_info[] = { - {"AXIMM_IRQ_DEST_ADDR_ADDR", - AXIMM_IRQ_DEST_ADDR_ADDR_MASK}, -}; - - -static struct regfield_info - fab_err_log_field_info[] = { - {"FAB_ERR_LOG_RSVD_1", - FAB_ERR_LOG_RSVD_1_MASK}, - {"FAB_ERR_LOG_SRC", - FAB_ERR_LOG_SRC_MASK}, -}; - - -static struct regfield_info - glbl_req_err_sts_field_info[] = { - {"GLBL_REQ_ERR_STS_RSVD_1", - GLBL_REQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_REQ_ERR_STS_RC_DISCONTINUE", - GLBL_REQ_ERR_STS_RC_DISCONTINUE_MASK}, - {"GLBL_REQ_ERR_STS_RC_PRTY", - GLBL_REQ_ERR_STS_RC_PRTY_MASK}, - {"GLBL_REQ_ERR_STS_RC_FLR", - GLBL_REQ_ERR_STS_RC_FLR_MASK}, - {"GLBL_REQ_ERR_STS_RC_TIMEOUT", - GLBL_REQ_ERR_STS_RC_TIMEOUT_MASK}, - {"GLBL_REQ_ERR_STS_RC_INV_BCNT", - GLBL_REQ_ERR_STS_RC_INV_BCNT_MASK}, - {"GLBL_REQ_ERR_STS_RC_INV_TAG", - GLBL_REQ_ERR_STS_RC_INV_TAG_MASK}, - {"GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH", - GLBL_REQ_ERR_STS_RC_START_ADDR_MISMCH_MASK}, - {"GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH", - GLBL_REQ_ERR_STS_RC_RID_TC_ATTR_MISMCH_MASK}, - {"GLBL_REQ_ERR_STS_RC_NO_DATA", - GLBL_REQ_ERR_STS_RC_NO_DATA_MASK}, - {"GLBL_REQ_ERR_STS_RC_UR_CA_CRS", - GLBL_REQ_ERR_STS_RC_UR_CA_CRS_MASK}, - {"GLBL_REQ_ERR_STS_RC_POISONED", - GLBL_REQ_ERR_STS_RC_POISONED_MASK}, -}; - - -static struct regfield_info - glbl_req_err_msk_field_info[] = { - {"GLBL_REQ_ERR_MSK", - GLBL_REQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_field_info[] = { - {"IND_CTXT_DATA_DATA", - IND_CTXT_DATA_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_mask_field_info[] = { - {"IND_CTXT", - IND_CTXT_MASK}, -}; - - -static struct regfield_info - ind_ctxt_cmd_field_info[] = { - {"IND_CTXT_CMD_RSVD_1", - IND_CTXT_CMD_RSVD_1_MASK}, - {"IND_CTXT_CMD_QID", - IND_CTXT_CMD_QID_MASK}, - {"IND_CTXT_CMD_OP", - IND_CTXT_CMD_OP_MASK}, - {"IND_CTXT_CMD_SEL", - IND_CTXT_CMD_SEL_MASK}, - {"IND_CTXT_CMD_BUSY", - IND_CTXT_CMD_BUSY_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_field_info[] = { - {"C2H_TIMER_CNT_RSVD_1", - C2H_TIMER_CNT_RSVD_1_MASK}, - {"C2H_TIMER_CNT", - C2H_TIMER_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_field_info[] = { - {"C2H_CNT_TH_RSVD_1", - C2H_CNT_TH_RSVD_1_MASK}, - {"C2H_CNT_TH_THESHOLD_CNT", - C2H_CNT_TH_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED", - C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP", - C2H_STAT_AXIS_PKG_CMP_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ACCEPTED_D", - C2H_STAT_DESC_RSP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_cmp_field_info[] = { - {"C2H_STAT_DESC_RSP_CMP_D", - C2H_STAT_DESC_RSP_CMP_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_wrq_out_field_info[] = { - {"C2H_STAT_WRQ_OUT", - C2H_STAT_WRQ_OUT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wpl_ren_accepted_field_info[] = { - {"C2H_STAT_WPL_REN_ACCEPTED", - C2H_STAT_WPL_REN_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wrq_len_field_info[] = { - {"C2H_STAT_TOTAL_WRQ_LEN", - C2H_STAT_TOTAL_WRQ_LEN_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wpl_len_field_info[] = { - {"C2H_STAT_TOTAL_WPL_LEN", - C2H_STAT_TOTAL_WPL_LEN_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_field_info[] = { - {"C2H_BUF_SZ_IZE", - C2H_BUF_SZ_IZE_MASK}, -}; - - -static struct regfield_info - c2h_err_stat_field_info[] = { - {"C2H_ERR_STAT_RSVD_1", - C2H_ERR_STAT_RSVD_1_MASK}, - {"C2H_ERR_STAT_WRB_PORT_ID_ERR", - C2H_ERR_STAT_WRB_PORT_ID_ERR_MASK}, - {"C2H_ERR_STAT_HDR_PAR_ERR", - C2H_ERR_STAT_HDR_PAR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_COR_ERR", - C2H_ERR_STAT_HDR_ECC_COR_ERR_MASK}, - {"C2H_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_ERR_STAT_AVL_RING_DSC_ERR", - C2H_ERR_STAT_AVL_RING_DSC_ERR_MASK}, - {"C2H_ERR_STAT_WRB_PRTY_ERR", - C2H_ERR_STAT_WRB_PRTY_ERR_MASK}, - {"C2H_ERR_STAT_WRB_CIDX_ERR", - C2H_ERR_STAT_WRB_CIDX_ERR_MASK}, - {"C2H_ERR_STAT_WRB_QFULL_ERR", - C2H_ERR_STAT_WRB_QFULL_ERR_MASK}, - {"C2H_ERR_STAT_WRB_INV_Q_ERR", - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_2", - C2H_ERR_STAT_RSVD_2_MASK}, - {"C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH", - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK}, - {"C2H_ERR_STAT_ERR_DESC_CNT", - C2H_ERR_STAT_ERR_DESC_CNT_MASK}, - {"C2H_ERR_STAT_RSVD_3", - C2H_ERR_STAT_RSVD_3_MASK}, - {"C2H_ERR_STAT_MSI_INT_FAIL", - C2H_ERR_STAT_MSI_INT_FAIL_MASK}, - {"C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR", - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_4", - C2H_ERR_STAT_RSVD_4_MASK}, - {"C2H_ERR_STAT_DESC_RSP_ERR", - C2H_ERR_STAT_DESC_RSP_ERR_MASK}, - {"C2H_ERR_STAT_QID_MISMATCH", - C2H_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_ERR_STAT_SH_CMPT_DSC_ERR", - C2H_ERR_STAT_SH_CMPT_DSC_ERR_MASK}, - {"C2H_ERR_STAT_LEN_MISMATCH", - C2H_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_ERR_STAT_MTY_MISMATCH", - C2H_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_err_mask_field_info[] = { - {"C2H_ERR_EN", - C2H_ERR_EN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_stat_field_info[] = { - {"C2H_FATAL_ERR_STAT_RSVD_1", - C2H_FATAL_ERR_STAT_RSVD_1_MASK}, - {"C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR", - C2H_FATAL_ERR_STAT_HDR_ECC_UNC_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_AVL_RING_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR", - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_CMPT_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED2", - C2H_FATAL_ERR_STAT_RESERVED2_MASK}, - {"C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_MISMATCH", - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_RESERVED1", - C2H_FATAL_ERR_STAT_RESERVED1_MASK}, - {"C2H_FATAL_ERR_STAT_LEN_MISMATCH", - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_MTY_MISMATCH", - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_mask_field_info[] = { - {"C2H_FATAL_ERR_C2HEN", - C2H_FATAL_ERR_C2HEN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_enable_field_info[] = { - {"C2H_FATAL_ERR_ENABLE_RSVD_1", - C2H_FATAL_ERR_ENABLE_RSVD_1_MASK}, - {"C2H_FATAL_ERR_ENABLE_WPL_PAR_INV", - C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK}, - {"C2H_FATAL_ERR_ENABLE_WRQ_DIS", - C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK}, -}; - - -static struct regfield_info - glbl_err_int_field_info[] = { - {"GLBL_ERR_INT_RSVD_1", - GLBL_ERR_INT_RSVD_1_MASK}, - {"GLBL_ERR_INT_HOST_ID", - GLBL_ERR_INT_HOST_ID_MASK}, - {"GLBL_ERR_INT_DIS_INTR_ON_VF", - GLBL_ERR_INT_DIS_INTR_ON_VF_MASK}, - {"GLBL_ERR_INT_ARM", - GLBL_ERR_INT_ARM_MASK}, - {"GLBL_ERR_INT_EN_COAL", - GLBL_ERR_INT_EN_COAL_MASK}, - {"GLBL_ERR_INT_VEC", - GLBL_ERR_INT_VEC_MASK}, - {"GLBL_ERR_INT_FUNC", - GLBL_ERR_INT_FUNC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_field_info[] = { - {"C2H_PFCH_CFG_EVTFL_TH", - C2H_PFCH_CFG_EVTFL_TH_MASK}, - {"C2H_PFCH_CFG_FL_TH", - C2H_PFCH_CFG_FL_TH_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_1_field_info[] = { - {"C2H_PFCH_CFG_1_EVT_QCNT_TH", - C2H_PFCH_CFG_1_EVT_QCNT_TH_MASK}, - {"C2H_PFCH_CFG_1_QCNT", - C2H_PFCH_CFG_1_QCNT_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_2_field_info[] = { - {"C2H_PFCH_CFG_2_FENCE", - C2H_PFCH_CFG_2_FENCE_MASK}, - {"C2H_PFCH_CFG_2_RSVD", - C2H_PFCH_CFG_2_RSVD_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NO_DROP", - C2H_PFCH_CFG_2_VAR_DESC_NO_DROP_MASK}, - {"C2H_PFCH_CFG_2_LL_SZ_TH", - C2H_PFCH_CFG_2_LL_SZ_TH_MASK}, - {"C2H_PFCH_CFG_2_VAR_DESC_NUM", - C2H_PFCH_CFG_2_VAR_DESC_NUM_MASK}, - {"C2H_PFCH_CFG_2_NUM", - C2H_PFCH_CFG_2_NUM_MASK}, -}; - - -static struct regfield_info - c2h_int_timer_tick_field_info[] = { - {"C2H_INT_TIMER_TICK", - C2H_INT_TIMER_TICK_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_drop_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_D", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_err_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_D", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_req_field_info[] = { - {"C2H_STAT_DESC_REQ", - C2H_STAT_DESC_REQ_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_0_field_info[] = { - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_C2H_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TVALID_MASK}, - {"C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY", - C2H_STAT_DMA_ENG_0_S_AXIS_WRB_TREADY_MASK}, - {"C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_PLD_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_QID_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID", - C2H_STAT_DMA_ENG_0_ARB_FIFO_OUT_QID_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_0_WRB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_SM_CS", - C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK}, - {"C2H_STAT_DMA_ENG_0_MAIN_SM_CS", - C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_1_field_info[] = { - {"C2H_STAT_DMA_ENG_1_RSVD_1", - C2H_STAT_DMA_ENG_1_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT", - C2H_STAT_DMA_ENG_1_PLD_ST_FIFO_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_2_field_info[] = { - {"C2H_STAT_DMA_ENG_2_RSVD_1", - C2H_STAT_DMA_ENG_2_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_2_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_2_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT", - C2H_STAT_DMA_ENG_2_PLD_ST_FIFO_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_3_field_info[] = { - {"C2H_STAT_DMA_ENG_3_RSVD_1", - C2H_STAT_DMA_ENG_3_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_QID_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_EOP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_CNT_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_DESC_RSP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0", - C2H_STAT_DMA_ENG_3_PLD_PKT_ID_LARGER_0_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_VLD", - C2H_STAT_DMA_ENG_3_WRQ_VLD_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_RDY", - C2H_STAT_DMA_ENG_3_WRQ_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUT_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR", - C2H_STAT_DMA_ENG_3_WRQ_PACKET_PRE_EOR_MASK}, - {"C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_WCP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_3_PLD_ST_FIFO_IN_RDY_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_err_ctxt_field_info[] = { - {"C2H_PFCH_ERR_CTXT_RSVD_1", - C2H_PFCH_ERR_CTXT_RSVD_1_MASK}, - {"C2H_PFCH_ERR_CTXT_ERR_STAT", - C2H_PFCH_ERR_CTXT_ERR_STAT_MASK}, - {"C2H_PFCH_ERR_CTXT_CMD_WR", - C2H_PFCH_ERR_CTXT_CMD_WR_MASK}, - {"C2H_PFCH_ERR_CTXT_QID", - C2H_PFCH_ERR_CTXT_QID_MASK}, - {"C2H_PFCH_ERR_CTXT_DONE", - C2H_PFCH_ERR_CTXT_DONE_MASK}, -}; - - -static struct regfield_info - c2h_first_err_qid_field_info[] = { - {"C2H_FIRST_ERR_QID_RSVD_1", - C2H_FIRST_ERR_QID_RSVD_1_MASK}, - {"C2H_FIRST_ERR_QID_ERR_TYPE", - C2H_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"C2H_FIRST_ERR_QID_RSVD", - C2H_FIRST_ERR_QID_RSVD_MASK}, - {"C2H_FIRST_ERR_QID_QID", - C2H_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_in_field_info[] = { - {"STAT_NUM_WRB_IN_RSVD_1", - STAT_NUM_WRB_IN_RSVD_1_MASK}, - {"STAT_NUM_WRB_IN_WRB_CNT", - STAT_NUM_WRB_IN_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_out_field_info[] = { - {"STAT_NUM_WRB_OUT_RSVD_1", - STAT_NUM_WRB_OUT_RSVD_1_MASK}, - {"STAT_NUM_WRB_OUT_WRB_CNT", - STAT_NUM_WRB_OUT_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_drp_field_info[] = { - {"STAT_NUM_WRB_DRP_RSVD_1", - STAT_NUM_WRB_DRP_RSVD_1_MASK}, - {"STAT_NUM_WRB_DRP_WRB_CNT", - STAT_NUM_WRB_DRP_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_stat_desc_out_field_info[] = { - {"STAT_NUM_STAT_DESC_OUT_RSVD_1", - STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK}, - {"STAT_NUM_STAT_DESC_OUT_CNT", - STAT_NUM_STAT_DESC_OUT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_dsc_crdt_sent_field_info[] = { - {"STAT_NUM_DSC_CRDT_SENT_RSVD_1", - STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK}, - {"STAT_NUM_DSC_CRDT_SENT_CNT", - STAT_NUM_DSC_CRDT_SENT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_fch_dsc_rcvd_field_info[] = { - {"STAT_NUM_FCH_DSC_RCVD_RSVD_1", - STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_FCH_DSC_RCVD_DSC_CNT", - STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_byp_dsc_rcvd_field_info[] = { - {"STAT_NUM_BYP_DSC_RCVD_RSVD_1", - STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_BYP_DSC_RCVD_DSC_CNT", - STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_cfg_field_info[] = { - {"C2H_WRB_COAL_CFG_MAX_BUF_SZ", - C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK}, - {"C2H_WRB_COAL_CFG_TICK_VAL", - C2H_WRB_COAL_CFG_TICK_VAL_MASK}, - {"C2H_WRB_COAL_CFG_TICK_CNT", - C2H_WRB_COAL_CFG_TICK_CNT_MASK}, - {"C2H_WRB_COAL_CFG_SET_GLB_FLUSH", - C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK}, - {"C2H_WRB_COAL_CFG_DONE_GLB_FLUSH", - C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_req_field_info[] = { - {"C2H_INTR_H2C_REQ_RSVD_1", - C2H_INTR_H2C_REQ_RSVD_1_MASK}, - {"C2H_INTR_H2C_REQ_CNT", - C2H_INTR_H2C_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_mm_req_field_info[] = { - {"C2H_INTR_C2H_MM_REQ_RSVD_1", - C2H_INTR_C2H_MM_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_MM_REQ_CNT", - C2H_INTR_C2H_MM_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_err_int_req_field_info[] = { - {"C2H_INTR_ERR_INT_REQ_RSVD_1", - C2H_INTR_ERR_INT_REQ_RSVD_1_MASK}, - {"C2H_INTR_ERR_INT_REQ_CNT", - C2H_INTR_ERR_INT_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_req_field_info[] = { - {"C2H_INTR_C2H_ST_REQ_RSVD_1", - C2H_INTR_C2H_ST_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_REQ_CNT", - C2H_INTR_C2H_ST_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_ack_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1", - C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_ACK_CNT", - C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_fail_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1", - C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_FAIL_CNT", - C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_no_msix_field_info[] = { - {"C2H_INTR_C2H_ST_NO_MSIX_RSVD_1", - C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_NO_MSIX_CNT", - C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_ctxt_inval_field_info[] = { - {"C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1", - C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_CTXT_INVAL_CNT", - C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wr_cmp_field_info[] = { - {"C2H_STAT_WR_CMP_RSVD_1", - C2H_STAT_WR_CMP_RSVD_1_MASK}, - {"C2H_STAT_WR_CMP_CNT", - C2H_STAT_WR_CMP_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_4_field_info[] = { - {"C2H_STAT_DMA_ENG_4_RSVD_1", - C2H_STAT_DMA_ENG_4_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_QID_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_PLD_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_EOP_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_AVL_IDX_ENABLE_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_DESC_CNT_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_DESC_RSP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0", - C2H_STAT_DMA_ENG_4_PLD_PKT_ID_LARGER_0_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_VLD", - C2H_STAT_DMA_ENG_4_WRQ_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_RDY", - C2H_STAT_DMA_ENG_4_WRQ_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY", - C2H_STAT_DMA_ENG_4_WRQ_FIFO_OUT_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_DROP_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_ERR_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR", - C2H_STAT_DMA_ENG_4_WRQ_PACKET_PRE_EOR_MASK}, - {"C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_WCP_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_PLD_ST_FIFO_IN_RDY_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_5_field_info[] = { - {"C2H_STAT_DMA_ENG_5_RSVD_1", - C2H_STAT_DMA_ENG_5_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH", - C2H_STAT_DMA_ENG_5_WRB_SM_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ", - C2H_STAT_DMA_ENG_5_WRB_FIFO_IN_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_LEN_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VIRT_CH_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_VAR_DESC_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_DROP_REQ_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_NUM_BUF_OV_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_MARKER_MASK}, - {"C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT", - C2H_STAT_DMA_ENG_5_ARB_FIFO_OUT_DATA_HAS_CMPT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_qid_field_info[] = { - {"C2H_PFCH_QID_RSVD_1", - C2H_PFCH_QID_RSVD_1_MASK}, - {"C2H_PFCH_QID_ERR_CTXT", - C2H_PFCH_QID_ERR_CTXT_MASK}, - {"C2H_PFCH_QID_TARGET", - C2H_PFCH_QID_TARGET_MASK}, - {"C2H_PFCH_QID_QID_OR_TAG", - C2H_PFCH_QID_QID_OR_TAG_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_field_info[] = { - {"C2H_PFCH_DATA", - C2H_PFCH_DATA_MASK}, -}; - - -static struct regfield_info - c2h_int_dbg_field_info[] = { - {"C2H_INT_RSVD_1", - C2H_INT_RSVD_1_MASK}, - {"C2H_INT_INT_COAL_SM", - C2H_INT_INT_COAL_SM_MASK}, - {"C2H_INT_INT_SM", - C2H_INT_INT_SM_MASK}, -}; - - -static struct regfield_info - c2h_stat_imm_accepted_field_info[] = { - {"C2H_STAT_IMM_ACCEPTED_RSVD_1", - C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_IMM_ACCEPTED_CNT", - C2H_STAT_IMM_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_marker_accepted_field_info[] = { - {"C2H_STAT_MARKER_ACCEPTED_RSVD_1", - C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_MARKER_ACCEPTED_CNT", - C2H_STAT_MARKER_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_disable_cmp_accepted_field_info[] = { - {"C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1", - C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED_CNT", - C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_crdt_cnt_field_info[] = { - {"C2H_PLD_FIFO_CRDT_CNT_RSVD_1", - C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK}, - {"C2H_PLD_FIFO_CRDT_CNT_CNT", - C2H_PLD_FIFO_CRDT_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_req_field_info[] = { - {"C2H_INTR_DYN_REQ_RSVD_1", - C2H_INTR_DYN_REQ_RSVD_1_MASK}, - {"C2H_INTR_DYN_REQ_CNT", - C2H_INTR_DYN_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_dyn_misc_field_info[] = { - {"C2H_INTR_DYN_MISC_RSVD_1", - C2H_INTR_DYN_MISC_RSVD_1_MASK}, - {"C2H_INTR_DYN_MISC_CNT", - C2H_INTR_DYN_MISC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_len_mismatch_field_info[] = { - {"C2H_DROP_LEN_MISMATCH_RSVD_1", - C2H_DROP_LEN_MISMATCH_RSVD_1_MASK}, - {"C2H_DROP_LEN_MISMATCH_CNT", - C2H_DROP_LEN_MISMATCH_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_desc_rsp_len_field_info[] = { - {"C2H_DROP_DESC_RSP_LEN_RSVD_1", - C2H_DROP_DESC_RSP_LEN_RSVD_1_MASK}, - {"C2H_DROP_DESC_RSP_LEN_CNT", - C2H_DROP_DESC_RSP_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_qid_fifo_len_field_info[] = { - {"C2H_DROP_QID_FIFO_LEN_RSVD_1", - C2H_DROP_QID_FIFO_LEN_RSVD_1_MASK}, - {"C2H_DROP_QID_FIFO_LEN_CNT", - C2H_DROP_QID_FIFO_LEN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_field_info[] = { - {"C2H_DROP_PLD_CNT_RSVD_1", - C2H_DROP_PLD_CNT_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_CNT", - C2H_DROP_PLD_CNT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_0_field_info[] = { - {"C2H_CMPT_FORMAT_0_DESC_ERR_LOC", - C2H_CMPT_FORMAT_0_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_0_COLOR_LOC", - C2H_CMPT_FORMAT_0_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_1_field_info[] = { - {"C2H_CMPT_FORMAT_1_DESC_ERR_LOC", - C2H_CMPT_FORMAT_1_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_1_COLOR_LOC", - C2H_CMPT_FORMAT_1_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_2_field_info[] = { - {"C2H_CMPT_FORMAT_2_DESC_ERR_LOC", - C2H_CMPT_FORMAT_2_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_2_COLOR_LOC", - C2H_CMPT_FORMAT_2_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_3_field_info[] = { - {"C2H_CMPT_FORMAT_3_DESC_ERR_LOC", - C2H_CMPT_FORMAT_3_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_3_COLOR_LOC", - C2H_CMPT_FORMAT_3_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_4_field_info[] = { - {"C2H_CMPT_FORMAT_4_DESC_ERR_LOC", - C2H_CMPT_FORMAT_4_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_4_COLOR_LOC", - C2H_CMPT_FORMAT_4_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_5_field_info[] = { - {"C2H_CMPT_FORMAT_5_DESC_ERR_LOC", - C2H_CMPT_FORMAT_5_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_5_COLOR_LOC", - C2H_CMPT_FORMAT_5_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_cmpt_format_6_field_info[] = { - {"C2H_CMPT_FORMAT_6_DESC_ERR_LOC", - C2H_CMPT_FORMAT_6_DESC_ERR_LOC_MASK}, - {"C2H_CMPT_FORMAT_6_COLOR_LOC", - C2H_CMPT_FORMAT_6_COLOR_LOC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cache_depth_field_info[] = { - {"C2H_PFCH_CACHE_DEPTH_MAX_STBUF", - C2H_PFCH_CACHE_DEPTH_MAX_STBUF_MASK}, - {"C2H_PFCH_CACHE_DEPTH", - C2H_PFCH_CACHE_DEPTH_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_buf_depth_field_info[] = { - {"C2H_WRB_COAL_BUF_DEPTH_RSVD_1", - C2H_WRB_COAL_BUF_DEPTH_RSVD_1_MASK}, - {"C2H_WRB_COAL_BUF_DEPTH_BUFFER", - C2H_WRB_COAL_BUF_DEPTH_BUFFER_MASK}, -}; - - -static struct regfield_info - c2h_pfch_crdt_field_info[] = { - {"C2H_PFCH_CRDT_RSVD_1", - C2H_PFCH_CRDT_RSVD_1_MASK}, - {"C2H_PFCH_CRDT_RSVD_2", - C2H_PFCH_CRDT_RSVD_2_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_cmpt_accepted_field_info[] = { - {"C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1", - C2H_STAT_HAS_CMPT_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_CMPT_ACCEPTED_CNT", - C2H_STAT_HAS_CMPT_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_has_pld_accepted_field_info[] = { - {"C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1", - C2H_STAT_HAS_PLD_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_HAS_PLD_ACCEPTED_CNT", - C2H_STAT_HAS_PLD_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_field_info[] = { - {"C2H_PLD_PKT_ID_CMPT_WAIT", - C2H_PLD_PKT_ID_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_DATA", - C2H_PLD_PKT_ID_DATA_MASK}, -}; - - -static struct regfield_info - c2h_pld_pkt_id_1_field_info[] = { - {"C2H_PLD_PKT_ID_1_CMPT_WAIT", - C2H_PLD_PKT_ID_1_CMPT_WAIT_MASK}, - {"C2H_PLD_PKT_ID_1_DATA", - C2H_PLD_PKT_ID_1_DATA_MASK}, -}; - - -static struct regfield_info - c2h_drop_pld_cnt_1_field_info[] = { - {"C2H_DROP_PLD_CNT_1_RSVD_1", - C2H_DROP_PLD_CNT_1_RSVD_1_MASK}, - {"C2H_DROP_PLD_CNT_1_CNT", - C2H_DROP_PLD_CNT_1_CNT_MASK}, -}; - - -static struct regfield_info - h2c_err_stat_field_info[] = { - {"H2C_ERR_STAT_RSVD_1", - H2C_ERR_STAT_RSVD_1_MASK}, - {"H2C_ERR_STAT_PAR_ERR", - H2C_ERR_STAT_PAR_ERR_MASK}, - {"H2C_ERR_STAT_SBE", - H2C_ERR_STAT_SBE_MASK}, - {"H2C_ERR_STAT_DBE", - H2C_ERR_STAT_DBE_MASK}, - {"H2C_ERR_STAT_NO_DMA_DS", - H2C_ERR_STAT_NO_DMA_DS_MASK}, - {"H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR", - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK}, - {"H2C_ERR_STAT_ZERO_LEN_DS", - H2C_ERR_STAT_ZERO_LEN_DS_MASK}, -}; - - -static struct regfield_info - h2c_err_mask_field_info[] = { - {"H2C_ERR_EN", - H2C_ERR_EN_MASK}, -}; - - -static struct regfield_info - h2c_first_err_qid_field_info[] = { - {"H2C_FIRST_ERR_QID_RSVD_1", - H2C_FIRST_ERR_QID_RSVD_1_MASK}, - {"H2C_FIRST_ERR_QID_ERR_TYPE", - H2C_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"H2C_FIRST_ERR_QID_RSVD_2", - H2C_FIRST_ERR_QID_RSVD_2_MASK}, - {"H2C_FIRST_ERR_QID_QID", - H2C_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg0_field_info[] = { - {"H2C_REG0_NUM_DSC_RCVD", - H2C_REG0_NUM_DSC_RCVD_MASK}, - {"H2C_REG0_NUM_WRB_SENT", - H2C_REG0_NUM_WRB_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg1_field_info[] = { - {"H2C_REG1_NUM_REQ_SENT", - H2C_REG1_NUM_REQ_SENT_MASK}, - {"H2C_REG1_NUM_CMP_SENT", - H2C_REG1_NUM_CMP_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg2_field_info[] = { - {"H2C_REG2_RSVD_1", - H2C_REG2_RSVD_1_MASK}, - {"H2C_REG2_NUM_ERR_DSC_RCVD", - H2C_REG2_NUM_ERR_DSC_RCVD_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg3_field_info[] = { - {"H2C_REG3_RSVD_1", - H2C_REG3_RSVD_1_MASK}, - {"H2C_REG3_DSCO_FIFO_EMPTY", - H2C_REG3_DSCO_FIFO_EMPTY_MASK}, - {"H2C_REG3_DSCO_FIFO_FULL", - H2C_REG3_DSCO_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RC_STATE", - H2C_REG3_CUR_RC_STATE_MASK}, - {"H2C_REG3_RDREQ_LINES", - H2C_REG3_RDREQ_LINES_MASK}, - {"H2C_REG3_RDATA_LINES_AVAIL", - H2C_REG3_RDATA_LINES_AVAIL_MASK}, - {"H2C_REG3_PEND_FIFO_EMPTY", - H2C_REG3_PEND_FIFO_EMPTY_MASK}, - {"H2C_REG3_PEND_FIFO_FULL", - H2C_REG3_PEND_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RQ_STATE", - H2C_REG3_CUR_RQ_STATE_MASK}, - {"H2C_REG3_DSCI_FIFO_FULL", - H2C_REG3_DSCI_FIFO_FULL_MASK}, - {"H2C_REG3_DSCI_FIFO_EMPTY", - H2C_REG3_DSCI_FIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg4_field_info[] = { - {"H2C_REG4_RDREQ_ADDR", - H2C_REG4_RDREQ_ADDR_MASK}, -}; - - -static struct regfield_info - h2c_fatal_err_en_field_info[] = { - {"H2C_FATAL_ERR_EN_RSVD_1", - H2C_FATAL_ERR_EN_RSVD_1_MASK}, - {"H2C_FATAL_ERR_EN_H2C", - H2C_FATAL_ERR_EN_H2C_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_pcie_field_info[] = { - {"H2C_REQ_THROT_PCIE_EN_REQ", - H2C_REQ_THROT_PCIE_EN_REQ_MASK}, - {"H2C_REQ_THROT_PCIE", - H2C_REQ_THROT_PCIE_MASK}, - {"H2C_REQ_THROT_PCIE_EN_DATA", - H2C_REQ_THROT_PCIE_EN_DATA_MASK}, - {"H2C_REQ_THROT_PCIE_DATA_THRESH", - H2C_REQ_THROT_PCIE_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - h2c_aln_dbg_reg0_field_info[] = { - {"H2C_ALN_REG0_NUM_PKT_SENT", - H2C_ALN_REG0_NUM_PKT_SENT_MASK}, -}; - - -static struct regfield_info - h2c_req_throt_aximm_field_info[] = { - {"H2C_REQ_THROT_AXIMM_EN_REQ", - H2C_REQ_THROT_AXIMM_EN_REQ_MASK}, - {"H2C_REQ_THROT_AXIMM", - H2C_REQ_THROT_AXIMM_MASK}, - {"H2C_REQ_THROT_AXIMM_EN_DATA", - H2C_REQ_THROT_AXIMM_EN_DATA_MASK}, - {"H2C_REQ_THROT_AXIMM_DATA_THRESH", - H2C_REQ_THROT_AXIMM_DATA_THRESH_MASK}, -}; - - -static struct regfield_info - c2h_mm_ctl_field_info[] = { - {"C2H_MM_CTL_RESERVED1", - C2H_MM_CTL_RESERVED1_MASK}, - {"C2H_MM_CTL_ERRC_EN", - C2H_MM_CTL_ERRC_EN_MASK}, - {"C2H_MM_CTL_RESERVED0", - C2H_MM_CTL_RESERVED0_MASK}, - {"C2H_MM_CTL_RUN", - C2H_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_status_field_info[] = { - {"C2H_MM_STATUS_RSVD_1", - C2H_MM_STATUS_RSVD_1_MASK}, - {"C2H_MM_STATUS_RUN", - C2H_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - c2h_mm_cmpl_desc_cnt_field_info[] = { - {"C2H_MM_CMPL_DESC_CNT_C2H_CO", - C2H_MM_CMPL_DESC_CNT_C2H_CO_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_enable_mask_field_info[] = { - {"C2H_MM_ERR_CODE_ENABLE_RESERVED1", - C2H_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM", - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UR", - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_FLR", - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RESERVED0", - C2H_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_field_info[] = { - {"C2H_MM_ERR_CODE_RESERVED1", - C2H_MM_ERR_CODE_RESERVED1_MASK}, - {"C2H_MM_ERR_CODE_CIDX", - C2H_MM_ERR_CODE_CIDX_MASK}, - {"C2H_MM_ERR_CODE_RESERVED0", - C2H_MM_ERR_CODE_RESERVED0_MASK}, - {"C2H_MM_ERR_CODE_SUB_TYPE", - C2H_MM_ERR_CODE_SUB_TYPE_MASK}, - {"C2H_MM_ERR_CODE", - C2H_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_info_field_info[] = { - {"C2H_MM_ERR_INFO_VALID", - C2H_MM_ERR_INFO_VALID_MASK}, - {"C2H_MM_ERR_INFO_SEL", - C2H_MM_ERR_INFO_SEL_MASK}, - {"C2H_MM_ERR_INFO_RSVD_1", - C2H_MM_ERR_INFO_RSVD_1_MASK}, - {"C2H_MM_ERR_INFO_QID", - C2H_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_ctl_field_info[] = { - {"C2H_MM_PERF_MON_CTL_RSVD_1", - C2H_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_START", - C2H_MM_PERF_MON_CTL_IMM_START_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_START", - C2H_MM_PERF_MON_CTL_RUN_START_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_CLEAR", - C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_CLEAR", - C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT0_DCNT", - C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT1_RSVD_1", - C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_DATA_CNT1_DCNT", - C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_dbg_field_info[] = { - {"C2H_MM_RSVD_1", - C2H_MM_RSVD_1_MASK}, - {"C2H_MM_RRQ_ENTRIES", - C2H_MM_RRQ_ENTRIES_MASK}, - {"C2H_MM_DAT_FIFO_SPC", - C2H_MM_DAT_FIFO_SPC_MASK}, - {"C2H_MM_RD_STALL", - C2H_MM_RD_STALL_MASK}, - {"C2H_MM_RRQ_FIFO_FI", - C2H_MM_RRQ_FIFO_FI_MASK}, - {"C2H_MM_WR_STALL", - C2H_MM_WR_STALL_MASK}, - {"C2H_MM_WRQ_FIFO_FI", - C2H_MM_WRQ_FIFO_FI_MASK}, - {"C2H_MM_WBK_STALL", - C2H_MM_WBK_STALL_MASK}, - {"C2H_MM_DSC_FIFO_EP", - C2H_MM_DSC_FIFO_EP_MASK}, - {"C2H_MM_DSC_FIFO_FL", - C2H_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_mm_ctl_field_info[] = { - {"H2C_MM_CTL_RESERVED1", - H2C_MM_CTL_RESERVED1_MASK}, - {"H2C_MM_CTL_ERRC_EN", - H2C_MM_CTL_ERRC_EN_MASK}, - {"H2C_MM_CTL_RESERVED0", - H2C_MM_CTL_RESERVED0_MASK}, - {"H2C_MM_CTL_RUN", - H2C_MM_CTL_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_status_field_info[] = { - {"H2C_MM_STATUS_RSVD_1", - H2C_MM_STATUS_RSVD_1_MASK}, - {"H2C_MM_STATUS_RUN", - H2C_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_cmpl_desc_cnt_field_info[] = { - {"H2C_MM_CMPL_DESC_CNT_H2C_CO", - H2C_MM_CMPL_DESC_CNT_H2C_CO_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_enable_mask_field_info[] = { - {"H2C_MM_ERR_CODE_ENABLE_RESERVED5", - H2C_MM_ERR_CODE_ENABLE_RESERVED5_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED4", - H2C_MM_ERR_CODE_ENABLE_RESERVED4_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED3", - H2C_MM_ERR_CODE_ENABLE_RESERVED3_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED2", - H2C_MM_ERR_CODE_ENABLE_RESERVED2_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED1", - H2C_MM_ERR_CODE_ENABLE_RESERVED1_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_UR_CA", - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RESERVED0", - H2C_MM_ERR_CODE_ENABLE_RESERVED0_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_field_info[] = { - {"H2C_MM_ERR_CODE_RSVD_1", - H2C_MM_ERR_CODE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_CIDX", - H2C_MM_ERR_CODE_CIDX_MASK}, - {"H2C_MM_ERR_CODE_RESERVED0", - H2C_MM_ERR_CODE_RESERVED0_MASK}, - {"H2C_MM_ERR_CODE_SUB_TYPE", - H2C_MM_ERR_CODE_SUB_TYPE_MASK}, - {"H2C_MM_ERR_CODE", - H2C_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_info_field_info[] = { - {"H2C_MM_ERR_INFO_VALID", - H2C_MM_ERR_INFO_VALID_MASK}, - {"H2C_MM_ERR_INFO_SEL", - H2C_MM_ERR_INFO_SEL_MASK}, - {"H2C_MM_ERR_INFO_RSVD_1", - H2C_MM_ERR_INFO_RSVD_1_MASK}, - {"H2C_MM_ERR_INFO_QID", - H2C_MM_ERR_INFO_QID_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_ctl_field_info[] = { - {"H2C_MM_PERF_MON_CTL_RSVD_1", - H2C_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_START", - H2C_MM_PERF_MON_CTL_IMM_START_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_START", - H2C_MM_PERF_MON_CTL_RUN_START_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_CLEAR", - H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_CLEAR", - H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT0_DCNT", - H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT1_RSVD_1", - H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_DATA_CNT1_DCNT", - H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_dbg_field_info[] = { - {"H2C_MM_RSVD_1", - H2C_MM_RSVD_1_MASK}, - {"H2C_MM_RRQ_ENTRIES", - H2C_MM_RRQ_ENTRIES_MASK}, - {"H2C_MM_DAT_FIFO_SPC", - H2C_MM_DAT_FIFO_SPC_MASK}, - {"H2C_MM_RD_STALL", - H2C_MM_RD_STALL_MASK}, - {"H2C_MM_RRQ_FIFO_FI", - H2C_MM_RRQ_FIFO_FI_MASK}, - {"H2C_MM_WR_STALL", - H2C_MM_WR_STALL_MASK}, - {"H2C_MM_WRQ_FIFO_FI", - H2C_MM_WRQ_FIFO_FI_MASK}, - {"H2C_MM_WBK_STALL", - H2C_MM_WBK_STALL_MASK}, - {"H2C_MM_DSC_FIFO_EP", - H2C_MM_DSC_FIFO_EP_MASK}, - {"H2C_MM_DSC_FIFO_FL", - H2C_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_1_field_info[] = { - {"C2H_CRDT_COAL_CFG_1_RSVD_1", - C2H_CRDT_COAL_CFG_1_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH", - C2H_CRDT_COAL_CFG_1_PLD_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_1_TIMER_TH", - C2H_CRDT_COAL_CFG_1_TIMER_TH_MASK}, -}; - - -static struct regfield_info - c2h_crdt_coal_cfg_2_field_info[] = { - {"C2H_CRDT_COAL_CFG_2_RSVD_1", - C2H_CRDT_COAL_CFG_2_RSVD_1_MASK}, - {"C2H_CRDT_COAL_CFG_2_FIFO_TH", - C2H_CRDT_COAL_CFG_2_FIFO_TH_MASK}, - {"C2H_CRDT_COAL_CFG_2_RESERVED1", - C2H_CRDT_COAL_CFG_2_RESERVED1_MASK}, - {"C2H_CRDT_COAL_CFG_2_NT_TH", - C2H_CRDT_COAL_CFG_2_NT_TH_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_qid_field_info[] = { - {"C2H_PFCH_BYP_QID_RSVD_1", - C2H_PFCH_BYP_QID_RSVD_1_MASK}, - {"C2H_PFCH_BYP_QID", - C2H_PFCH_BYP_QID_MASK}, -}; - - -static struct regfield_info - c2h_pfch_byp_tag_field_info[] = { - {"C2H_PFCH_BYP_TAG_RSVD_1", - C2H_PFCH_BYP_TAG_RSVD_1_MASK}, - {"C2H_PFCH_BYP_TAG_BYP_QID", - C2H_PFCH_BYP_TAG_BYP_QID_MASK}, - {"C2H_PFCH_BYP_TAG_RSVD_2", - C2H_PFCH_BYP_TAG_RSVD_2_MASK}, - {"C2H_PFCH_BYP_TAG", - C2H_PFCH_BYP_TAG_MASK}, -}; - - -static struct regfield_info - c2h_water_mark_field_info[] = { - {"C2H_WATER_MARK_HIGH_WM", - C2H_WATER_MARK_HIGH_WM_MASK}, - {"C2H_WATER_MARK_LOW_WM", - C2H_WATER_MARK_LOW_WM_MASK}, -}; - -static struct xreg_info eqdma_config_regs[] = { -{"CFG_BLK_IDENTIFIER", 0x00, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_identifier_field_info), - cfg_blk_identifier_field_info -}, -{"CFG_BLK_PCIE_MAX_PLD_SIZE", 0x08, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_pld_size_field_info), - cfg_blk_pcie_max_pld_size_field_info -}, -{"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", 0x0c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_read_req_size_field_info), - cfg_blk_pcie_max_read_req_size_field_info -}, -{"CFG_BLK_SYSTEM_ID", 0x10, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_system_id_field_info), - cfg_blk_system_id_field_info -}, -{"CFG_BLK_MSIX_ENABLE", 0x014, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msix_enable_field_info), - cfg_blk_msix_enable_field_info -}, -{"CFG_PCIE_DATA_WIDTH", 0x18, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_data_width_field_info), - cfg_pcie_data_width_field_info -}, -{"CFG_PCIE_CTL", 0x1c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_ctl_field_info), - cfg_pcie_ctl_field_info -}, -{"CFG_BLK_MSI_ENABLE", 0x20, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msi_enable_field_info), - cfg_blk_msi_enable_field_info -}, -{"CFG_AXI_USER_MAX_PLD_SIZE", 0x40, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_pld_size_field_info), - cfg_axi_user_max_pld_size_field_info -}, -{"CFG_AXI_USER_MAX_READ_REQ_SIZE", 0x44, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_read_req_size_field_info), - cfg_axi_user_max_read_req_size_field_info -}, -{"CFG_BLK_MISC_CTL", 0x4c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_misc_ctl_field_info), - cfg_blk_misc_ctl_field_info -}, -{"CFG_PL_CRED_CTL", 0x68, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pl_cred_ctl_field_info), - cfg_pl_cred_ctl_field_info -}, -{"CFG_BLK_SCRATCH", 0x80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_field_info), - cfg_blk_scratch_field_info -}, -{"CFG_GIC", 0xa0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_gic_field_info), - cfg_gic_field_info -}, -{"RAM_SBE_MSK_1_A", 0xe0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_1_a_field_info), - ram_sbe_msk_1_a_field_info -}, -{"RAM_SBE_STS_1_A", 0xe4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_1_a_field_info), - ram_sbe_sts_1_a_field_info -}, -{"RAM_DBE_MSK_1_A", 0xe8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_1_a_field_info), - ram_dbe_msk_1_a_field_info -}, -{"RAM_DBE_STS_1_A", 0xec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_1_a_field_info), - ram_dbe_sts_1_a_field_info -}, -{"RAM_SBE_MSK_A", 0xf0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_a_field_info), - ram_sbe_msk_a_field_info -}, -{"RAM_SBE_STS_A", 0xf4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_a_field_info), - ram_sbe_sts_a_field_info -}, -{"RAM_DBE_MSK_A", 0xf8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_a_field_info), - ram_dbe_msk_a_field_info -}, -{"RAM_DBE_STS_A", 0xfc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_a_field_info), - ram_dbe_sts_a_field_info -}, -{"GLBL2_IDENTIFIER", 0x100, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_identifier_field_info), - glbl2_identifier_field_info -}, -{"GLBL2_CHANNEL_INST", 0x114, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_inst_field_info), - glbl2_channel_inst_field_info -}, -{"GLBL2_CHANNEL_MDMA", 0x118, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_mdma_field_info), - glbl2_channel_mdma_field_info -}, -{"GLBL2_CHANNEL_STRM", 0x11c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_strm_field_info), - glbl2_channel_strm_field_info -}, -{"GLBL2_CHANNEL_CAP", 0x120, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_cap_field_info), - glbl2_channel_cap_field_info -}, -{"GLBL2_CHANNEL_PASID_CAP", 0x128, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_pasid_cap_field_info), - glbl2_channel_pasid_cap_field_info -}, -{"GLBL2_SYSTEM_ID", 0x130, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_system_id_field_info), - glbl2_system_id_field_info -}, -{"GLBL2_MISC_CAP", 0x134, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_misc_cap_field_info), - glbl2_misc_cap_field_info -}, -{"GLBL2_DBG_PCIE_RQ0", 0x1b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq0_field_info), - glbl2_dbg_pcie_rq0_field_info -}, -{"GLBL2_DBG_PCIE_RQ1", 0x1bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq1_field_info), - glbl2_dbg_pcie_rq1_field_info -}, -{"GLBL2_DBG_AXIMM_WR0", 0x1c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr0_field_info), - glbl2_dbg_aximm_wr0_field_info -}, -{"GLBL2_DBG_AXIMM_WR1", 0x1c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr1_field_info), - glbl2_dbg_aximm_wr1_field_info -}, -{"GLBL2_DBG_AXIMM_RD0", 0x1c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd0_field_info), - glbl2_dbg_aximm_rd0_field_info -}, -{"GLBL2_DBG_AXIMM_RD1", 0x1cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd1_field_info), - glbl2_dbg_aximm_rd1_field_info -}, -{"GLBL2_DBG_FAB0", 0x1d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab0_field_info), - glbl2_dbg_fab0_field_info -}, -{"GLBL2_DBG_FAB1", 0x1d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_fab1_field_info), - glbl2_dbg_fab1_field_info -}, -{"GLBL2_DBG_MATCH_SEL", 0x1f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_sel_field_info), - glbl2_dbg_match_sel_field_info -}, -{"GLBL2_DBG_MATCH_MSK", 0x1f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_msk_field_info), - glbl2_dbg_match_msk_field_info -}, -{"GLBL2_DBG_MATCH_PAT", 0x1fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_match_pat_field_info), - glbl2_dbg_match_pat_field_info -}, -{"GLBL_RNG_SZ_1", 0x204, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_1_field_info), - glbl_rng_sz_1_field_info -}, -{"GLBL_RNG_SZ_2", 0x208, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_2_field_info), - glbl_rng_sz_2_field_info -}, -{"GLBL_RNG_SZ_3", 0x20c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_3_field_info), - glbl_rng_sz_3_field_info -}, -{"GLBL_RNG_SZ_4", 0x210, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_4_field_info), - glbl_rng_sz_4_field_info -}, -{"GLBL_RNG_SZ_5", 0x214, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_5_field_info), - glbl_rng_sz_5_field_info -}, -{"GLBL_RNG_SZ_6", 0x218, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_6_field_info), - glbl_rng_sz_6_field_info -}, -{"GLBL_RNG_SZ_7", 0x21c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_7_field_info), - glbl_rng_sz_7_field_info -}, -{"GLBL_RNG_SZ_8", 0x220, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_8_field_info), - glbl_rng_sz_8_field_info -}, -{"GLBL_RNG_SZ_9", 0x224, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_9_field_info), - glbl_rng_sz_9_field_info -}, -{"GLBL_RNG_SZ_A", 0x228, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_a_field_info), - glbl_rng_sz_a_field_info -}, -{"GLBL_RNG_SZ_B", 0x22c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_b_field_info), - glbl_rng_sz_b_field_info -}, -{"GLBL_RNG_SZ_C", 0x230, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_c_field_info), - glbl_rng_sz_c_field_info -}, -{"GLBL_RNG_SZ_D", 0x234, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_d_field_info), - glbl_rng_sz_d_field_info -}, -{"GLBL_RNG_SZ_E", 0x238, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_e_field_info), - glbl_rng_sz_e_field_info -}, -{"GLBL_RNG_SZ_F", 0x23c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_f_field_info), - glbl_rng_sz_f_field_info -}, -{"GLBL_RNG_SZ_10", 0x240, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_10_field_info), - glbl_rng_sz_10_field_info -}, -{"GLBL_ERR_STAT", 0x248, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_stat_field_info), - glbl_err_stat_field_info -}, -{"GLBL_ERR_MASK", 0x24c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_mask_field_info), - glbl_err_mask_field_info -}, -{"GLBL_DSC_CFG", 0x250, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_cfg_field_info), - glbl_dsc_cfg_field_info -}, -{"GLBL_DSC_ERR_STS", 0x254, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_sts_field_info), - glbl_dsc_err_sts_field_info -}, -{"GLBL_DSC_ERR_MSK", 0x258, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_msk_field_info), - glbl_dsc_err_msk_field_info -}, -{"GLBL_DSC_ERR_LOG0", 0x25c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log0_field_info), - glbl_dsc_err_log0_field_info -}, -{"GLBL_DSC_ERR_LOG1", 0x260, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log1_field_info), - glbl_dsc_err_log1_field_info -}, -{"GLBL_TRQ_ERR_STS", 0x264, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_sts_field_info), - glbl_trq_err_sts_field_info -}, -{"GLBL_TRQ_ERR_MSK", 0x268, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_msk_field_info), - glbl_trq_err_msk_field_info -}, -{"GLBL_TRQ_ERR_LOG", 0x26c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_log_field_info), - glbl_trq_err_log_field_info -}, -{"GLBL_DSC_DBG_DAT0", 0x270, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat0_field_info), - glbl_dsc_dbg_dat0_field_info -}, -{"GLBL_DSC_DBG_DAT1", 0x274, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat1_field_info), - glbl_dsc_dbg_dat1_field_info -}, -{"GLBL_DSC_DBG_CTL", 0x278, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_ctl_field_info), - glbl_dsc_dbg_ctl_field_info -}, -{"GLBL_DSC_ERR_LOG2", 0x27c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log2_field_info), - glbl_dsc_err_log2_field_info -}, -{"GLBL_GLBL_INTERRUPT_CFG", 0x2c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_glbl_interrupt_cfg_field_info), - glbl_glbl_interrupt_cfg_field_info -}, -{"GLBL_VCH_HOST_PROFILE", 0x2c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_vch_host_profile_field_info), - glbl_vch_host_profile_field_info -}, -{"GLBL_BRIDGE_HOST_PROFILE", 0x308, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_bridge_host_profile_field_info), - glbl_bridge_host_profile_field_info -}, -{"AXIMM_IRQ_DEST_ADDR", 0x30c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(aximm_irq_dest_addr_field_info), - aximm_irq_dest_addr_field_info -}, -{"FAB_ERR_LOG", 0x314, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(fab_err_log_field_info), - fab_err_log_field_info -}, -{"GLBL_REQ_ERR_STS", 0x318, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_req_err_sts_field_info), - glbl_req_err_sts_field_info -}, -{"GLBL_REQ_ERR_MSK", 0x31c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl_req_err_msk_field_info), - glbl_req_err_msk_field_info -}, -{"IND_CTXT_DATA", 0x804, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_field_info), - ind_ctxt_data_field_info -}, -{"IND_CTXT_MASK", 0x824, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_mask_field_info), - ind_ctxt_mask_field_info -}, -{"IND_CTXT_CMD", 0x844, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_cmd_field_info), - ind_ctxt_cmd_field_info -}, -{"C2H_TIMER_CNT", 0xa00, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_field_info), - c2h_timer_cnt_field_info -}, -{"C2H_CNT_TH", 0xa40, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_field_info), - c2h_cnt_th_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xa88, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_field_info), - c2h_stat_s_axis_c2h_accepted_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED", 0xa8c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_field_info), - c2h_stat_s_axis_wrb_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xa90, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_field_info), - c2h_stat_desc_rsp_pkt_accepted_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP", 0xa94, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_field_info), - c2h_stat_axis_pkg_cmp_field_info -}, -{"C2H_STAT_DESC_RSP_ACCEPTED", 0xa98, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_accepted_field_info), - c2h_stat_desc_rsp_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_CMP", 0xa9c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_cmp_field_info), - c2h_stat_desc_rsp_cmp_field_info -}, -{"C2H_STAT_WRQ_OUT", 0xaa0, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wrq_out_field_info), - c2h_stat_wrq_out_field_info -}, -{"C2H_STAT_WPL_REN_ACCEPTED", 0xaa4, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wpl_ren_accepted_field_info), - c2h_stat_wpl_ren_accepted_field_info -}, -{"C2H_STAT_TOTAL_WRQ_LEN", 0xaa8, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wrq_len_field_info), - c2h_stat_total_wrq_len_field_info -}, -{"C2H_STAT_TOTAL_WPL_LEN", 0xaac, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wpl_len_field_info), - c2h_stat_total_wpl_len_field_info -}, -{"C2H_BUF_SZ", 0xab0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_field_info), - c2h_buf_sz_field_info -}, -{"C2H_ERR_STAT", 0xaf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_stat_field_info), - c2h_err_stat_field_info -}, -{"C2H_ERR_MASK", 0xaf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_mask_field_info), - c2h_err_mask_field_info -}, -{"C2H_FATAL_ERR_STAT", 0xaf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_stat_field_info), - c2h_fatal_err_stat_field_info -}, -{"C2H_FATAL_ERR_MASK", 0xafc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_mask_field_info), - c2h_fatal_err_mask_field_info -}, -{"C2H_FATAL_ERR_ENABLE", 0xb00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_enable_field_info), - c2h_fatal_err_enable_field_info -}, -{"GLBL_ERR_INT", 0xb04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_int_field_info), - glbl_err_int_field_info -}, -{"C2H_PFCH_CFG", 0xb08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_field_info), - c2h_pfch_cfg_field_info -}, -{"C2H_PFCH_CFG_1", 0xa80, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_1_field_info), - c2h_pfch_cfg_1_field_info -}, -{"C2H_PFCH_CFG_2", 0xa84, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_2_field_info), - c2h_pfch_cfg_2_field_info -}, -{"C2H_INT_TIMER_TICK", 0xb0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_timer_tick_field_info), - c2h_int_timer_tick_field_info -}, -{"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xb10, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_drop_accepted_field_info), - c2h_stat_desc_rsp_drop_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xb14, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_err_accepted_field_info), - c2h_stat_desc_rsp_err_accepted_field_info -}, -{"C2H_STAT_DESC_REQ", 0xb18, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_req_field_info), - c2h_stat_desc_req_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_0", 0xb1c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_0_field_info), - c2h_stat_dbg_dma_eng_0_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_1", 0xb20, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_1_field_info), - c2h_stat_dbg_dma_eng_1_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_2", 0xb24, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_2_field_info), - c2h_stat_dbg_dma_eng_2_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_3", 0xb28, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_3_field_info), - c2h_stat_dbg_dma_eng_3_field_info -}, -{"C2H_DBG_PFCH_ERR_CTXT", 0xb2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_err_ctxt_field_info), - c2h_dbg_pfch_err_ctxt_field_info -}, -{"C2H_FIRST_ERR_QID", 0xb30, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_first_err_qid_field_info), - c2h_first_err_qid_field_info -}, -{"STAT_NUM_WRB_IN", 0xb34, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_in_field_info), - stat_num_wrb_in_field_info -}, -{"STAT_NUM_WRB_OUT", 0xb38, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_out_field_info), - stat_num_wrb_out_field_info -}, -{"STAT_NUM_WRB_DRP", 0xb3c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_drp_field_info), - stat_num_wrb_drp_field_info -}, -{"STAT_NUM_STAT_DESC_OUT", 0xb40, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_stat_desc_out_field_info), - stat_num_stat_desc_out_field_info -}, -{"STAT_NUM_DSC_CRDT_SENT", 0xb44, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_dsc_crdt_sent_field_info), - stat_num_dsc_crdt_sent_field_info -}, -{"STAT_NUM_FCH_DSC_RCVD", 0xb48, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_fch_dsc_rcvd_field_info), - stat_num_fch_dsc_rcvd_field_info -}, -{"STAT_NUM_BYP_DSC_RCVD", 0xb4c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_byp_dsc_rcvd_field_info), - stat_num_byp_dsc_rcvd_field_info -}, -{"C2H_WRB_COAL_CFG", 0xb50, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_cfg_field_info), - c2h_wrb_coal_cfg_field_info -}, -{"C2H_INTR_H2C_REQ", 0xb54, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_h2c_req_field_info), - c2h_intr_h2c_req_field_info -}, -{"C2H_INTR_C2H_MM_REQ", 0xb58, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_mm_req_field_info), - c2h_intr_c2h_mm_req_field_info -}, -{"C2H_INTR_ERR_INT_REQ", 0xb5c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_err_int_req_field_info), - c2h_intr_err_int_req_field_info -}, -{"C2H_INTR_C2H_ST_REQ", 0xb60, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_req_field_info), - c2h_intr_c2h_st_req_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK", 0xb64, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_ack_field_info), - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL", 0xb68, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_fail_field_info), - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX", 0xb6c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info), - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL", 0xb70, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info), - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_ACK", 0xb74, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_ack_field_info), - c2h_intr_c2h_st_msix_ack_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_FAIL", 0xb78, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_fail_field_info), - c2h_intr_c2h_st_msix_fail_field_info -}, -{"C2H_INTR_C2H_ST_NO_MSIX", 0xb7c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_no_msix_field_info), - c2h_intr_c2h_st_no_msix_field_info -}, -{"C2H_INTR_C2H_ST_CTXT_INVAL", 0xb80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_ctxt_inval_field_info), - c2h_intr_c2h_st_ctxt_inval_field_info -}, -{"C2H_STAT_WR_CMP", 0xb84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wr_cmp_field_info), - c2h_stat_wr_cmp_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_4", 0xb88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_4_field_info), - c2h_stat_dbg_dma_eng_4_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_5", 0xb8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_5_field_info), - c2h_stat_dbg_dma_eng_5_field_info -}, -{"C2H_DBG_PFCH_QID", 0xb90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_qid_field_info), - c2h_dbg_pfch_qid_field_info -}, -{"C2H_DBG_PFCH", 0xb94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_field_info), - c2h_dbg_pfch_field_info -}, -{"C2H_INT_DBG", 0xb98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_dbg_field_info), - c2h_int_dbg_field_info -}, -{"C2H_STAT_IMM_ACCEPTED", 0xb9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_imm_accepted_field_info), - c2h_stat_imm_accepted_field_info -}, -{"C2H_STAT_MARKER_ACCEPTED", 0xba0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_marker_accepted_field_info), - c2h_stat_marker_accepted_field_info -}, -{"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xba4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_disable_cmp_accepted_field_info), - c2h_stat_disable_cmp_accepted_field_info -}, -{"C2H_PLD_FIFO_CRDT_CNT", 0xba8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_crdt_cnt_field_info), - c2h_pld_fifo_crdt_cnt_field_info -}, -{"C2H_INTR_DYN_REQ", 0xbac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_req_field_info), - c2h_intr_dyn_req_field_info -}, -{"C2H_INTR_DYN_MISC", 0xbb0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_dyn_misc_field_info), - c2h_intr_dyn_misc_field_info -}, -{"C2H_DROP_LEN_MISMATCH", 0xbb4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_len_mismatch_field_info), - c2h_drop_len_mismatch_field_info -}, -{"C2H_DROP_DESC_RSP_LEN", 0xbb8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_desc_rsp_len_field_info), - c2h_drop_desc_rsp_len_field_info -}, -{"C2H_DROP_QID_FIFO_LEN", 0xbbc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_qid_fifo_len_field_info), - c2h_drop_qid_fifo_len_field_info -}, -{"C2H_DROP_PLD_CNT", 0xbc0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_field_info), - c2h_drop_pld_cnt_field_info -}, -{"C2H_CMPT_FORMAT_0", 0xbc4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_0_field_info), - c2h_cmpt_format_0_field_info -}, -{"C2H_CMPT_FORMAT_1", 0xbc8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_1_field_info), - c2h_cmpt_format_1_field_info -}, -{"C2H_CMPT_FORMAT_2", 0xbcc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_2_field_info), - c2h_cmpt_format_2_field_info -}, -{"C2H_CMPT_FORMAT_3", 0xbd0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_3_field_info), - c2h_cmpt_format_3_field_info -}, -{"C2H_CMPT_FORMAT_4", 0xbd4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_4_field_info), - c2h_cmpt_format_4_field_info -}, -{"C2H_CMPT_FORMAT_5", 0xbd8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_5_field_info), - c2h_cmpt_format_5_field_info -}, -{"C2H_CMPT_FORMAT_6", 0xbdc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cmpt_format_6_field_info), - c2h_cmpt_format_6_field_info -}, -{"C2H_PFCH_CACHE_DEPTH", 0xbe0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cache_depth_field_info), - c2h_pfch_cache_depth_field_info -}, -{"C2H_WRB_COAL_BUF_DEPTH", 0xbe4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_buf_depth_field_info), - c2h_wrb_coal_buf_depth_field_info -}, -{"C2H_PFCH_CRDT", 0xbe8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_crdt_field_info), - c2h_pfch_crdt_field_info -}, -{"C2H_STAT_HAS_CMPT_ACCEPTED", 0xbec, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_cmpt_accepted_field_info), - c2h_stat_has_cmpt_accepted_field_info -}, -{"C2H_STAT_HAS_PLD_ACCEPTED", 0xbf0, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_has_pld_accepted_field_info), - c2h_stat_has_pld_accepted_field_info -}, -{"C2H_PLD_PKT_ID", 0xbf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_field_info), - c2h_pld_pkt_id_field_info -}, -{"C2H_PLD_PKT_ID_1", 0xbf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_pkt_id_1_field_info), - c2h_pld_pkt_id_1_field_info -}, -{"C2H_DROP_PLD_CNT_1", 0xbfc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_drop_pld_cnt_1_field_info), - c2h_drop_pld_cnt_1_field_info -}, -{"H2C_ERR_STAT", 0xe00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_stat_field_info), - h2c_err_stat_field_info -}, -{"H2C_ERR_MASK", 0xe04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_mask_field_info), - h2c_err_mask_field_info -}, -{"H2C_FIRST_ERR_QID", 0xe08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_first_err_qid_field_info), - h2c_first_err_qid_field_info -}, -{"H2C_DBG_REG0", 0xe0c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg0_field_info), - h2c_dbg_reg0_field_info -}, -{"H2C_DBG_REG1", 0xe10, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg1_field_info), - h2c_dbg_reg1_field_info -}, -{"H2C_DBG_REG2", 0xe14, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg2_field_info), - h2c_dbg_reg2_field_info -}, -{"H2C_DBG_REG3", 0xe18, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg3_field_info), - h2c_dbg_reg3_field_info -}, -{"H2C_DBG_REG4", 0xe1c, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg4_field_info), - h2c_dbg_reg4_field_info -}, -{"H2C_FATAL_ERR_EN", 0xe20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_fatal_err_en_field_info), - h2c_fatal_err_en_field_info -}, -{"H2C_REQ_THROT_PCIE", 0xe24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_pcie_field_info), - h2c_req_throt_pcie_field_info -}, -{"H2C_ALN_DBG_REG0", 0xe28, - 1, 0, 0, 0, - 1, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_aln_dbg_reg0_field_info), - h2c_aln_dbg_reg0_field_info -}, -{"H2C_REQ_THROT_AXIMM", 0xe2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_req_throt_aximm_field_info), - h2c_req_throt_aximm_field_info -}, -{"C2H_MM_CTL", 0x1004, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_ctl_field_info), - c2h_mm_ctl_field_info -}, -{"C2H_MM_STATUS", 0x1040, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_status_field_info), - c2h_mm_status_field_info -}, -{"C2H_MM_CMPL_DESC_CNT", 0x1048, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_cmpl_desc_cnt_field_info), - c2h_mm_cmpl_desc_cnt_field_info -}, -{"C2H_MM_ERR_CODE_ENABLE_MASK", 0x1054, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_enable_mask_field_info), - c2h_mm_err_code_enable_mask_field_info -}, -{"C2H_MM_ERR_CODE", 0x1058, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_field_info), - c2h_mm_err_code_field_info -}, -{"C2H_MM_ERR_INFO", 0x105c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_info_field_info), - c2h_mm_err_info_field_info -}, -{"C2H_MM_PERF_MON_CTL", 0x10c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_ctl_field_info), - c2h_mm_perf_mon_ctl_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT0", 0x10c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt0_field_info), - c2h_mm_perf_mon_cycle_cnt0_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT1", 0x10c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt1_field_info), - c2h_mm_perf_mon_cycle_cnt1_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT0", 0x10cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt0_field_info), - c2h_mm_perf_mon_data_cnt0_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT1", 0x10d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt1_field_info), - c2h_mm_perf_mon_data_cnt1_field_info -}, -{"C2H_MM_DBG", 0x10e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_dbg_field_info), - c2h_mm_dbg_field_info -}, -{"H2C_MM_CTL", 0x1204, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_ctl_field_info), - h2c_mm_ctl_field_info -}, -{"H2C_MM_STATUS", 0x1240, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_status_field_info), - h2c_mm_status_field_info -}, -{"H2C_MM_CMPL_DESC_CNT", 0x1248, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_cmpl_desc_cnt_field_info), - h2c_mm_cmpl_desc_cnt_field_info -}, -{"H2C_MM_ERR_CODE_ENABLE_MASK", 0x1254, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_enable_mask_field_info), - h2c_mm_err_code_enable_mask_field_info -}, -{"H2C_MM_ERR_CODE", 0x1258, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_field_info), - h2c_mm_err_code_field_info -}, -{"H2C_MM_ERR_INFO", 0x125c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_info_field_info), - h2c_mm_err_info_field_info -}, -{"H2C_MM_PERF_MON_CTL", 0x12c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_ctl_field_info), - h2c_mm_perf_mon_ctl_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT0", 0x12c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt0_field_info), - h2c_mm_perf_mon_cycle_cnt0_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT1", 0x12c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt1_field_info), - h2c_mm_perf_mon_cycle_cnt1_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT0", 0x12cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt0_field_info), - h2c_mm_perf_mon_data_cnt0_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT1", 0x12d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt1_field_info), - h2c_mm_perf_mon_data_cnt1_field_info -}, -{"H2C_MM_DBG", 0x12e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_dbg_field_info), - h2c_mm_dbg_field_info -}, -{"C2H_CRDT_COAL_CFG_1", 0x1400, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_1_field_info), - c2h_crdt_coal_cfg_1_field_info -}, -{"C2H_CRDT_COAL_CFG_2", 0x1404, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_crdt_coal_cfg_2_field_info), - c2h_crdt_coal_cfg_2_field_info -}, -{"C2H_PFCH_BYP_QID", 0x1408, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_qid_field_info), - c2h_pfch_byp_qid_field_info -}, -{"C2H_PFCH_BYP_TAG", 0x140c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_byp_tag_field_info), - c2h_pfch_byp_tag_field_info -}, -{"C2H_WATER_MARK", 0x1500, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_water_mark_field_info), - c2h_water_mark_field_info -}, - -}; - -uint32_t eqdma_config_num_regs_get(void) -{ - return (sizeof(eqdma_config_regs)/ - sizeof(eqdma_config_regs[0])); -} - -struct xreg_info *eqdma_config_regs_get(void) -{ - return eqdma_config_regs; -} - diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_common.c b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_common.c deleted file mode 100644 index 1419c63..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_common.c +++ /dev/null @@ -1,1284 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "qdma_access_common.h" -#include "qdma_platform.h" -#include "qdma_soft_reg.h" -#include "qdma_soft_access.h" -#include "qdma_s80_hard_access.h" -#include "eqdma_soft_access.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_access_common.tmh" -#endif - -/* qdma version info */ -#define RTL_BASE_VERSION 2 -#define RTL_PATCH_VERSION 3 - -/** - * enum qdma_ip - To hold ip type - */ -enum qdma_ip { - QDMA_OR_VERSAL_IP, - EQDMA_IP -}; - - -/* - * hw_monitor_reg() - polling a register repeatly until - * (the register value & mask) == val or time is up - * - * return -QDMA_BUSY_IIMEOUT_ERR if register value didn't match, 0 other wise - */ -int hw_monitor_reg(void *dev_hndl, uint32_t reg, uint32_t mask, - uint32_t val, uint32_t interval_us, uint32_t timeout_us) -{ - int count; - uint32_t v; - - if (!interval_us) - interval_us = QDMA_REG_POLL_DFLT_INTERVAL_US; - if (!timeout_us) - timeout_us = QDMA_REG_POLL_DFLT_TIMEOUT_US; - - count = timeout_us / interval_us; - - do { - v = qdma_reg_read(dev_hndl, reg); - if ((v & mask) == val) - return QDMA_SUCCESS; - qdma_udelay(interval_us); - } while (--count); - - v = qdma_reg_read(dev_hndl, reg); - if ((v & mask) == val) - return QDMA_SUCCESS; - - qdma_log_error("%s: Reg read=%u Expected=%u, err:%d\n", - __func__, v, val, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; -} - -/*****************************************************************************/ -/** - * qdma_get_rtl_version() - Function to get the rtl_version in - * string format - * - * @rtl_version: Vivado release ID - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_rtl_version(enum qdma_rtl_version rtl_version) -{ - switch (rtl_version) { - case QDMA_RTL_PATCH: - return "RTL Patch"; - case QDMA_RTL_BASE: - return "RTL Base"; - default: - qdma_log_error("%s: invalid rtl_version(%d), err:%d\n", - __func__, rtl_version, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_ip_type() - Function to get the ip type in string format - * - * @ip_type: IP Type - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_ip_type(enum qdma_ip_type ip_type) -{ - switch (ip_type) { - case QDMA_VERSAL_HARD_IP: - return "Versal Hard IP"; - case QDMA_VERSAL_SOFT_IP: - return "Versal Soft IP"; - case QDMA_SOFT_IP: - return "QDMA Soft IP"; - case EQDMA_SOFT_IP: - return "EQDMA Soft IP"; - default: - qdma_log_error("%s: invalid ip type(%d), err:%d\n", - __func__, ip_type, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_device_type() - Function to get the device type in - * string format - * - * @device_type: Device Type - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_device_type(enum qdma_device_type device_type) -{ - switch (device_type) { - case QDMA_DEVICE_SOFT: - return "Soft IP"; - case QDMA_DEVICE_VERSAL: - return "Versal S80 Hard IP"; - default: - qdma_log_error("%s: invalid device type(%d), err:%d\n", - __func__, device_type, -QDMA_ERR_INV_PARAM); - return NULL; - } -} - -/*****************************************************************************/ -/** - * qdma_get_vivado_release_id() - Function to get the vivado release id in - * string format - * - * @vivado_release_id: Vivado release ID - * - * Return: string - success and NULL on failure - *****************************************************************************/ -static const char *qdma_get_vivado_release_id( - enum qdma_vivado_release_id vivado_release_id) -{ - switch (vivado_release_id) { - case QDMA_VIVADO_2018_3: - return "vivado 2018.3"; - case QDMA_VIVADO_2019_1: - return "vivado 2019.1"; - case QDMA_VIVADO_2019_2: - return "vivado 2019.2"; - case QDMA_VIVADO_2020_1: - return "vivado 2020.1"; - case QDMA_VIVADO_2020_2: - return "vivado 2020.2"; - default: - qdma_log_error("%s: invalid vivado_release_id(%d), err:%d\n", - __func__, - vivado_release_id, - -QDMA_ERR_INV_PARAM); - return NULL; - } -} - - -void qdma_write_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, const uint32_t *values) -{ - uint32_t index, reg_addr; - - for (index = idx; index < (idx + cnt); index++) { - reg_addr = reg_offst + (index * sizeof(uint32_t)); - qdma_reg_write(dev_hndl, reg_addr, values[index - idx]); - } -} - -void qdma_read_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, uint32_t *values) -{ - uint32_t index, reg_addr; - - reg_addr = reg_offst + (idx * sizeof(uint32_t)); - for (index = 0; index < cnt; index++) { - values[index] = qdma_reg_read(dev_hndl, reg_addr + - (index * sizeof(uint32_t))); - } -} - -void qdma_fetch_version_details(uint8_t is_vf, uint32_t version_reg_val, - struct qdma_hw_version_info *version_info) -{ - uint32_t rtl_version, vivado_release_id, ip_type, device_type; - const char *version_str; - - if (!is_vf) { - rtl_version = FIELD_GET(QDMA_GLBL2_RTL_VERSION_MASK, - version_reg_val); - vivado_release_id = - FIELD_GET(QDMA_GLBL2_VIVADO_RELEASE_MASK, - version_reg_val); - device_type = FIELD_GET(QDMA_GLBL2_DEVICE_ID_MASK, - version_reg_val); - ip_type = FIELD_GET(QDMA_GLBL2_VERSAL_IP_MASK, - version_reg_val); - } else { - rtl_version = - FIELD_GET(QDMA_GLBL2_VF_RTL_VERSION_MASK, - version_reg_val); - vivado_release_id = - FIELD_GET(QDMA_GLBL2_VF_VIVADO_RELEASE_MASK, - version_reg_val); - device_type = FIELD_GET(QDMA_GLBL2_VF_DEVICE_ID_MASK, - version_reg_val); - ip_type = - FIELD_GET(QDMA_GLBL2_VF_VERSAL_IP_MASK, - version_reg_val); - } - - switch (rtl_version) { - case 0: - version_info->rtl_version = QDMA_RTL_BASE; - break; - case 1: - version_info->rtl_version = QDMA_RTL_PATCH; - break; - default: - version_info->rtl_version = QDMA_RTL_NONE; - break; - } - - version_str = qdma_get_rtl_version(version_info->rtl_version); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_rtl_version_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - switch (device_type) { - case 0: - version_info->device_type = QDMA_DEVICE_SOFT; - break; - case 1: - version_info->device_type = QDMA_DEVICE_VERSAL; - break; - default: - version_info->device_type = QDMA_DEVICE_NONE; - break; - } - - version_str = qdma_get_device_type(version_info->device_type); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_device_type_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - - if (version_info->device_type == QDMA_DEVICE_SOFT) { - switch (ip_type) { - case 0: - version_info->ip_type = QDMA_SOFT_IP; - break; - case 1: - version_info->ip_type = EQDMA_SOFT_IP; - break; - default: - version_info->ip_type = QDMA_NONE_IP; - } - } else { - switch (ip_type) { - case 0: - version_info->ip_type = QDMA_VERSAL_HARD_IP; - break; - case 1: - version_info->ip_type = QDMA_VERSAL_SOFT_IP; - break; - default: - version_info->ip_type = QDMA_NONE_IP; - } - } - - version_str = qdma_get_ip_type(version_info->ip_type); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_ip_type_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); - - if (version_info->ip_type == QDMA_SOFT_IP) { - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2018_3; - break; - case 1: - version_info->vivado_release = QDMA_VIVADO_2019_1; - break; - case 2: - version_info->vivado_release = QDMA_VIVADO_2019_2; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } else if (version_info->ip_type == EQDMA_SOFT_IP) { - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2020_1; - break; - case 1: - version_info->vivado_release = QDMA_VIVADO_2020_2; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } else { /* Versal case */ - switch (vivado_release_id) { - case 0: - version_info->vivado_release = QDMA_VIVADO_2019_2; - break; - default: - version_info->vivado_release = QDMA_VIVADO_NONE; - break; - } - } - - version_str = qdma_get_vivado_release_id( - version_info->vivado_release); - if (version_str != NULL) - qdma_strncpy(version_info->qdma_vivado_release_id_str, - version_str, - QDMA_HW_VERSION_STRING_LEN); -} - - -/* - * dump_reg() - Helper function to dump register value into string - * - * return len - length of the string copied into buffer - */ -int dump_reg(char *buf, int buf_sz, uint32_t raddr, - const char *rname, uint32_t rval) -{ - /* length of the line should be minimum 80 chars. - * If below print pattern is changed, check for - * new buffer size requirement - */ - if (buf_sz < DEBGFS_LINE_SZ) { - qdma_log_error("%s: buf_sz(%d) < expected(%d): err: %d\n", - __func__, - buf_sz, DEBGFS_LINE_SZ, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return QDMA_SNPRINTF_S(buf, buf_sz, DEBGFS_LINE_SZ, - "[%#7x] %-47s %#-10x %u\n", - raddr, rname, rval, rval); - -} - -void qdma_memset(void *to, uint8_t val, uint32_t size) -{ - uint32_t i; - uint8_t *_to = (uint8_t *)to; - - for (i = 0; i < size; i++) - _to[i] = val; -} - -/*****************************************************************************/ -/** - * qdma_queue_cmpt_cidx_read() - function to read the CMPT CIDX register - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: pointer to array to hold the values read - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_queue_cmpt_cidx_read(void *dev_hndl, uint8_t is_vf, - uint16_t qid, struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_OFFSET_DMAP_SEL_CMPT_CIDX; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - reg_addr += qid * QDMA_CMPT_CIDX_STEP; - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - reg_info->wrb_cidx = - FIELD_GET(QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK, reg_val); - reg_info->counter_idx = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_val)); - reg_info->wrb_en = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_val)); - reg_info->irq_en = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK, reg_val)); - reg_info->timer_idx = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK, reg_val)); - reg_info->trig_mode = - (uint8_t)(FIELD_GET(QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK, reg_val)); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_initiate_flr() - function to initiate Function Level Reset - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_initiate_flr(void *dev_hndl, uint8_t is_vf) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_REG_FLR_STATUS : - QDMA_OFFSET_PF_REG_FLR_STATUS; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_reg_write(dev_hndl, reg_addr, 1); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_is_flr_done() - function to check whether the FLR is done or not - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @done: if FLR process completed , done is 1 else 0. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_is_flr_done(void *dev_hndl, uint8_t is_vf, uint8_t *done) -{ - int rv; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_REG_FLR_STATUS : - QDMA_OFFSET_PF_REG_FLR_STATUS; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!done) { - qdma_log_error("%s: done is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* wait for it to become zero */ - rv = hw_monitor_reg(dev_hndl, reg_addr, QDMA_FLR_STATUS_MASK, - 0, 5 * QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US); - if (rv < 0) - *done = 0; - else - *done = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_is_config_bar() - function for the config bar verification - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_is_config_bar(void *dev_hndl, uint8_t is_vf, enum qdma_ip *ip) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_VERSION : - QDMA_OFFSET_CONFIG_BLOCK_ID; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - /** TODO: Version register for VFs is 0x5014 for EQDMA and - * 0x1014 for QDMA/Versal. First time reading 0x5014 for - * all the device and based on the upper 16 bits value - * (i.e. 0x1fd3), finding out whether its EQDMA or QDMA/Versal - * for EQDMA VFs. - * Need to modify this logic once the hardware team - * comes up with a common register for VFs - */ - if (is_vf) { - if (FIELD_GET(QDMA_GLBL2_VF_UNIQUE_ID_MASK, reg_val) - != QDMA_MAGIC_NUMBER) { - /* Its either QDMA or Versal */ - *ip = EQDMA_IP; - reg_addr = EQDMA_OFFSET_VF_VERSION; - reg_val = qdma_reg_read(dev_hndl, reg_addr); - } else { - *ip = QDMA_OR_VERSAL_IP; - return QDMA_SUCCESS; - } - } - - if (FIELD_GET(QDMA_CONFIG_BLOCK_ID_MASK, reg_val) - != QDMA_MAGIC_NUMBER) { - qdma_log_error("%s: Invalid config bar, err:%d\n", - __func__, - -QDMA_ERR_HWACC_INV_CONFIG_BAR); - return -QDMA_ERR_HWACC_INV_CONFIG_BAR; - } - - return QDMA_SUCCESS; -} - -int qdma_acc_reg_dump_buf_len(void *dev_hndl, - enum qdma_ip_type ip_type, int *buflen) -{ - uint32_t len = 0; - int rv = 0; - - *buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - len = qdma_soft_reg_dump_buf_len(); - break; - case QDMA_VERSAL_HARD_IP: - len = qdma_s80_hard_reg_dump_buf_len(); - break; - case EQDMA_SOFT_IP: - len = eqdma_reg_dump_buf_len(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *buflen = (int)len; - return rv; -} - -int qdma_acc_reg_info_len(void *dev_hndl, - enum qdma_ip_type ip_type, int *buflen, int *num_regs) -{ - uint32_t len = 0; - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buflen) { - qdma_log_error("%s: buflen is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!num_regs) { - qdma_log_error("%s: num_regs is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - *buflen = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - len = 0; - *num_regs = 0; - break; - case QDMA_VERSAL_HARD_IP: - len = qdma_s80_hard_reg_dump_buf_len(); - *num_regs = (int)((len / REG_DUMP_SIZE_PER_LINE) - 1); - break; - case EQDMA_SOFT_IP: - len = eqdma_reg_dump_buf_len(); - *num_regs = (int)((len / REG_DUMP_SIZE_PER_LINE) - 1); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *buflen = (int)len; - return rv; -} - -int qdma_acc_context_buf_len(void *dev_hndl, - enum qdma_ip_type ip_type, uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - int rv = 0; - - *buflen = 0; - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_context_buf_len(st, q_type, buflen); - break; - case QDMA_VERSAL_HARD_IP: - rv = qdma_s80_hard_context_buf_len(st, q_type, buflen); - break; - case EQDMA_SOFT_IP: - rv = eqdma_context_buf_len(st, q_type, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -int qdma_acc_get_num_config_regs(void *dev_hndl, - enum qdma_ip_type ip_type, uint32_t *num_regs) -{ - int rv = 0; - - *num_regs = 0; - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_get_config_num_regs(); - break; - case QDMA_VERSAL_HARD_IP: - rv = qdma_s80_hard_get_config_num_regs(); - break; - case EQDMA_SOFT_IP: - rv = eqdma_get_config_num_regs(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *num_regs = rv; - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_acc_get_config_regs() - Function to get qdma config registers. - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @reg_data: pointer to register data to be filled - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_get_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, - uint32_t *reg_data) -{ - struct xreg_info *reg_info; - uint32_t count = 0; - uint32_t num_regs; - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (is_vf) { - qdma_log_error("%s: Get Config regs not valid for VF, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (reg_data == NULL) { - qdma_log_error("%s: reg_data is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - num_regs = qdma_get_config_num_regs(); - reg_info = qdma_get_config_regs(); - break; - case QDMA_VERSAL_HARD_IP: - num_regs = qdma_s80_hard_get_config_num_regs(); - reg_info = qdma_s80_hard_get_config_regs(); - break; - case EQDMA_SOFT_IP: - num_regs = eqdma_get_config_num_regs(); - reg_info = eqdma_get_config_regs(); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (count = 0; count < num_regs - 1; count++) { - reg_data[count] = qdma_reg_read(dev_hndl, - reg_info[count].addr); - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - rv = qdma_s80_hard_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_config_regs(dev_hndl, is_vf, - buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_reg_info() - Function to dump fileds in - * a specified register. - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_reg_info(void *dev_hndl, - enum qdma_ip_type ip_type, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - int rv = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf || !buflen) { - qdma_log_error("%s: Invalid input buffer, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (ip_type) { - case QDMA_SOFT_IP: - QDMA_SNPRINTF_S(buf, buflen, DEBGFS_LINE_SZ, - "QDMA reg field info not supported for QDMA_SOFT_IP\n"); - break; - case QDMA_VERSAL_HARD_IP: - rv = qdma_s80_hard_dump_reg_info(dev_hndl, reg_addr, - num_regs, buf, buflen); - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_reg_info(dev_hndl, reg_addr, - num_regs, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_queue_context() - Function to get qdma queue context dump in a - * buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @st: Queue Mode (ST or MM) - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - rv = qdma_s80_hard_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_queue_context(dev_hndl, - st, q_type, ctxt_data, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_read_dump_queue_context() - Function to read and dump the queue - * context in the user-provided buffer. This API is valid only for PF and - * should not be used for VFs. For VF's use qdma_dump_queue_context() API - * after reading the context through mailbox. - * - * @dev_hndl: device handle - * @ip_type: QDMA IP type - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT)* - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_read_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_read_dump_queue_context(dev_hndl, - qid_hw, st, q_type, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - rv = qdma_s80_hard_read_dump_queue_context(dev_hndl, - qid_hw, st, q_type, buf, buflen); - break; - case EQDMA_SOFT_IP: - rv = eqdma_read_dump_queue_context(dev_hndl, - qid_hw, st, q_type, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @ip_type: QDMA ip type - * @num_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_acc_dump_config_reg_list(void *dev_hndl, - enum qdma_ip_type ip_type, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen) -{ - int rv = 0; - - switch (ip_type) { - case QDMA_SOFT_IP: - rv = qdma_soft_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - break; - case QDMA_VERSAL_HARD_IP: - rv = qdma_s80_hard_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - break; - case EQDMA_SOFT_IP: - rv = eqdma_dump_config_reg_list(dev_hndl, - num_regs, - reg_list, buf, buflen); - break; - default: - qdma_log_error("%s: Invalid version number, err = %d", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_get_function_number() - Function to get the function number - * - * @dev_hndl: device handle - * @func_id: pointer to hold the function id - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_get_function_number(void *dev_hndl, uint8_t *func_id) -{ - if (!dev_hndl || !func_id) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - *func_id = (uint8_t)qdma_reg_read(dev_hndl, - QDMA_OFFSET_GLBL2_CHANNEL_FUNC_RET); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_hw_error_intr_setup() - Function to set up the qdma error - * interrupt - * - * @dev_hndl: device handle - * @func_id: Function id - * @err_intr_index: Interrupt vector - * @rearm: rearm or not - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_error_intr_setup(void *dev_hndl, uint16_t func_id, - uint8_t err_intr_index) -{ - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = - FIELD_SET(QDMA_GLBL_ERR_FUNC_MASK, func_id) | - FIELD_SET(QDMA_GLBL_ERR_VEC_MASK, err_intr_index); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_intr_rearm() - Function to re-arm the error interrupt - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_error_intr_rearm(void *dev_hndl) -{ - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT); - reg_val |= FIELD_SET(QDMA_GLBL_ERR_ARM_MASK, 1); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_INT, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_error_code() - function to get the qdma access mapped - * error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_error_code(int acc_err_code) -{ - return qdma_get_err_code(acc_err_code); -} - -int qdma_hw_access_init(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_access *hw_access) -{ - int rv = QDMA_SUCCESS; - enum qdma_ip ip = EQDMA_IP; - - struct qdma_hw_version_info version_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!hw_access) { - qdma_log_error("%s: hw_access is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_is_config_bar(dev_hndl, is_vf, &ip); - if (rv != QDMA_SUCCESS) { - qdma_log_error("%s: config bar passed is INVALID, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return rv; - } - - qdma_memset(hw_access, 0, sizeof(struct qdma_hw_access)); - - if (ip == EQDMA_IP) - hw_access->qdma_get_version = &eqdma_get_version; - else - hw_access->qdma_get_version = &qdma_get_version; - hw_access->qdma_init_ctxt_memory = &qdma_init_ctxt_memory; - hw_access->qdma_fmap_conf = &qdma_fmap_conf; - hw_access->qdma_sw_ctx_conf = &qdma_sw_ctx_conf; - hw_access->qdma_pfetch_ctx_conf = &qdma_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &qdma_cmpt_ctx_conf; - hw_access->qdma_hw_ctx_conf = &qdma_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = &qdma_credit_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = &qdma_indirect_intr_ctx_conf; - hw_access->qdma_set_default_global_csr = &qdma_set_default_global_csr; - hw_access->qdma_global_csr_conf = &qdma_global_csr_conf; - hw_access->qdma_global_writeback_interval_conf = - &qdma_global_writeback_interval_conf; - hw_access->qdma_queue_pidx_update = &qdma_queue_pidx_update; - hw_access->qdma_queue_cmpt_cidx_read = &qdma_queue_cmpt_cidx_read; - hw_access->qdma_queue_cmpt_cidx_update = &qdma_queue_cmpt_cidx_update; - hw_access->qdma_queue_intr_cidx_update = &qdma_queue_intr_cidx_update; - hw_access->qdma_mm_channel_conf = &qdma_mm_channel_conf; - hw_access->qdma_get_user_bar = &qdma_get_user_bar; - hw_access->qdma_get_function_number = &qdma_get_function_number; - hw_access->qdma_get_device_attributes = &qdma_get_device_attributes; - hw_access->qdma_hw_error_intr_setup = &qdma_hw_error_intr_setup; - hw_access->qdma_hw_error_intr_rearm = &qdma_hw_error_intr_rearm; - hw_access->qdma_hw_error_enable = &qdma_hw_error_enable; - hw_access->qdma_hw_get_error_name = &qdma_hw_get_error_name; - hw_access->qdma_hw_error_process = &qdma_hw_error_process; - hw_access->qdma_dump_config_regs = &qdma_soft_dump_config_regs; - hw_access->qdma_dump_queue_context = &qdma_soft_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &qdma_soft_read_dump_queue_context; - hw_access->qdma_dump_intr_context = &qdma_dump_intr_context; - hw_access->qdma_is_legacy_intr_pend = &qdma_is_legacy_intr_pend; - hw_access->qdma_clear_pend_legacy_intr = &qdma_clear_pend_legacy_intr; - hw_access->qdma_legacy_intr_conf = &qdma_legacy_intr_conf; - hw_access->qdma_initiate_flr = &qdma_initiate_flr; - hw_access->qdma_is_flr_done = &qdma_is_flr_done; - hw_access->qdma_get_error_code = &qdma_get_error_code; - hw_access->qdma_read_reg_list = &qdma_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &qdma_soft_dump_config_reg_list; - hw_access->qdma_dump_reg_info = &qdma_dump_reg_info; - hw_access->mbox_base_pf = QDMA_OFFSET_MBOX_BASE_PF; - hw_access->mbox_base_vf = QDMA_OFFSET_MBOX_BASE_VF; - hw_access->qdma_max_errors = QDMA_ERRS_ALL; - - rv = hw_access->qdma_get_version(dev_hndl, is_vf, &version_info); - if (rv != QDMA_SUCCESS) - return rv; - - qdma_log_info("Device Type: %s\n", - qdma_get_device_type(version_info.device_type)); - - qdma_log_info("IP Type: %s\n", - qdma_get_ip_type(version_info.ip_type)); - - qdma_log_info("Vivado Release: %s\n", - qdma_get_vivado_release_id(version_info.vivado_release)); - - if (version_info.ip_type == QDMA_VERSAL_HARD_IP) { - hw_access->qdma_init_ctxt_memory = - &qdma_s80_hard_init_ctxt_memory; - hw_access->qdma_qid2vec_conf = &qdma_s80_hard_qid2vec_conf; - hw_access->qdma_fmap_conf = &qdma_s80_hard_fmap_conf; - hw_access->qdma_sw_ctx_conf = &qdma_s80_hard_sw_ctx_conf; - hw_access->qdma_pfetch_ctx_conf = - &qdma_s80_hard_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &qdma_s80_hard_cmpt_ctx_conf; - hw_access->qdma_hw_ctx_conf = &qdma_s80_hard_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = - &qdma_s80_hard_credit_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = - &qdma_s80_hard_indirect_intr_ctx_conf; - hw_access->qdma_set_default_global_csr = - &qdma_s80_hard_set_default_global_csr; - hw_access->qdma_queue_pidx_update = - &qdma_s80_hard_queue_pidx_update; - hw_access->qdma_queue_cmpt_cidx_update = - &qdma_s80_hard_queue_cmpt_cidx_update; - hw_access->qdma_queue_intr_cidx_update = - &qdma_s80_hard_queue_intr_cidx_update; - hw_access->qdma_get_user_bar = &qdma_cmp_get_user_bar; - hw_access->qdma_get_device_attributes = - &qdma_s80_hard_get_device_attributes; - hw_access->qdma_dump_config_regs = - &qdma_s80_hard_dump_config_regs; - hw_access->qdma_dump_intr_context = - &qdma_s80_hard_dump_intr_context; - hw_access->qdma_hw_error_enable = - &qdma_s80_hard_hw_error_enable; - hw_access->qdma_hw_error_process = - &qdma_s80_hard_hw_error_process; - hw_access->qdma_hw_get_error_name = - &qdma_s80_hard_hw_get_error_name; - hw_access->qdma_legacy_intr_conf = NULL; - hw_access->qdma_read_reg_list = &qdma_s80_hard_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &qdma_s80_hard_dump_config_reg_list; - hw_access->qdma_dump_queue_context = - &qdma_s80_hard_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &qdma_s80_hard_read_dump_queue_context; - hw_access->qdma_dump_reg_info = &qdma_s80_hard_dump_reg_info; - hw_access->qdma_max_errors = QDMA_S80_HARD_ERRS_ALL; - } - - if (version_info.ip_type == EQDMA_SOFT_IP) { - hw_access->qdma_init_ctxt_memory = &eqdma_init_ctxt_memory; - hw_access->qdma_sw_ctx_conf = &eqdma_sw_ctx_conf; - hw_access->qdma_pfetch_ctx_conf = &eqdma_pfetch_ctx_conf; - hw_access->qdma_cmpt_ctx_conf = &eqdma_cmpt_ctx_conf; - hw_access->qdma_indirect_intr_ctx_conf = - &eqdma_indirect_intr_ctx_conf; - hw_access->qdma_dump_config_regs = &eqdma_dump_config_regs; - hw_access->qdma_dump_intr_context = &eqdma_dump_intr_context; - hw_access->qdma_hw_error_enable = &eqdma_hw_error_enable; - hw_access->qdma_hw_error_process = &eqdma_hw_error_process; - hw_access->qdma_hw_get_error_name = &eqdma_hw_get_error_name; - hw_access->qdma_hw_ctx_conf = &eqdma_hw_ctx_conf; - hw_access->qdma_credit_ctx_conf = &eqdma_credit_ctx_conf; - hw_access->qdma_set_default_global_csr = - &eqdma_set_default_global_csr; - hw_access->qdma_get_device_attributes = - &eqdma_get_device_attributes; - hw_access->qdma_get_user_bar = &eqdma_get_user_bar; - hw_access->qdma_read_reg_list = &eqdma_read_reg_list; - hw_access->qdma_dump_config_reg_list = - &eqdma_dump_config_reg_list; - hw_access->qdma_dump_queue_context = - &eqdma_dump_queue_context; - hw_access->qdma_read_dump_queue_context = - &eqdma_read_dump_queue_context; - hw_access->qdma_dump_reg_info = &eqdma_dump_reg_info; - /* All CSR and Queue space register belongs to Window 0. - * Mailbox and MSIX register belongs to Window 1 - * Therefore, Mailbox offsets are different for EQDMA - * Mailbox offset for PF : 128K + original address - * Mailbox offset for VF : 16K + original address - */ - hw_access->mbox_base_pf = EQDMA_OFFSET_MBOX_BASE_PF; - hw_access->mbox_base_vf = EQDMA_OFFSET_MBOX_BASE_VF; - hw_access->qdma_max_errors = EQDMA_ERRS_ALL; - } - - return QDMA_SUCCESS; -} diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_common.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_common.h deleted file mode 100644 index d2dbf4a..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_common.h +++ /dev/null @@ -1,902 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_ACCESS_COMMON_H_ -#define __QDMA_ACCESS_COMMON_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_access_export.h" -#include "qdma_access_errors.h" - -/* QDMA HW version string array length */ -#define QDMA_HW_VERSION_STRING_LEN 32 - -#define ENABLE_INIT_CTXT_MEMORY 1 - -#ifdef GCC_COMPILER -static inline uint32_t get_trailing_zeros(uint64_t x) -{ - uint32_t rv = - __builtin_ffsll(x) - 1; - return rv; -} -#else -static inline uint32_t get_trailing_zeros(uint64_t value) -{ - uint32_t pos = 0; - - if ((value & 0xffffffff) == 0) { - pos += 32; - value >>= 32; - } - if ((value & 0xffff) == 0) { - pos += 16; - value >>= 16; - } - if ((value & 0xff) == 0) { - pos += 8; - value >>= 8; - } - if ((value & 0xf) == 0) { - pos += 4; - value >>= 4; - } - if ((value & 0x3) == 0) { - pos += 2; - value >>= 2; - } - if ((value & 0x1) == 0) - pos += 1; - - return pos; -} -#endif - -#define FIELD_SHIFT(mask) get_trailing_zeros(mask) -#define FIELD_SET(mask, val) ((val << FIELD_SHIFT(mask)) & mask) -#define FIELD_GET(mask, reg) ((reg & mask) >> FIELD_SHIFT(mask)) - - -/* CSR Default values */ -#define DEFAULT_MAX_DSC_FETCH 6 -#define DEFAULT_WRB_INT QDMA_WRB_INTERVAL_128 -#define DEFAULT_PFCH_STOP_THRESH 256 -#define DEFAULT_PFCH_NUM_ENTRIES_PER_Q 8 -#define DEFAULT_PFCH_MAX_Q_CNT 16 -#define DEFAULT_C2H_INTR_TIMER_TICK 25 -#define DEFAULT_CMPT_COAL_TIMER_CNT 5 -#define DEFAULT_CMPT_COAL_TIMER_TICK 25 -#define DEFAULT_CMPT_COAL_MAX_BUF_SZ 32 - -#define QDMA_BAR_NUM 6 - -/** Maximum data vectors to be used for each function - * TODO: Please note that for 2018.2 only one vector would be used - * per pf and only one ring would be created for this vector - * It is also assumed that all functions have the same number of data vectors - * and currently different number of vectors per PF is not supported - */ -#define QDMA_NUM_DATA_VEC_FOR_INTR_CXT 1 - -enum ind_ctxt_cmd_op { - QDMA_CTXT_CMD_CLR, - QDMA_CTXT_CMD_WR, - QDMA_CTXT_CMD_RD, - QDMA_CTXT_CMD_INV -}; - -enum ind_ctxt_cmd_sel { - QDMA_CTXT_SEL_SW_C2H, - QDMA_CTXT_SEL_SW_H2C, - QDMA_CTXT_SEL_HW_C2H, - QDMA_CTXT_SEL_HW_H2C, - QDMA_CTXT_SEL_CR_C2H, - QDMA_CTXT_SEL_CR_H2C, - QDMA_CTXT_SEL_CMPT, - QDMA_CTXT_SEL_PFTCH, - QDMA_CTXT_SEL_INT_COAL, - QDMA_CTXT_SEL_PASID_RAM_LOW, - QDMA_CTXT_SEL_PASID_RAM_HIGH, - QDMA_CTXT_SEL_TIMER, - QDMA_CTXT_SEL_FMAP, -}; - -/* polling a register */ -#define QDMA_REG_POLL_DFLT_INTERVAL_US 10 /* 10us per poll */ -#define QDMA_REG_POLL_DFLT_TIMEOUT_US (500*1000) /* 500ms */ - -/** Constants */ -#define QDMA_NUM_RING_SIZES 16 -#define QDMA_NUM_C2H_TIMERS 16 -#define QDMA_NUM_C2H_BUFFER_SIZES 16 -#define QDMA_NUM_C2H_COUNTERS 16 -#define QDMA_MM_CONTROL_RUN 0x1 -#define QDMA_MM_CONTROL_STEP 0x100 -#define QDMA_MAGIC_NUMBER 0x1fd3 -#define QDMA_PIDX_STEP 0x10 -#define QDMA_CMPT_CIDX_STEP 0x10 -#define QDMA_INT_CIDX_STEP 0x10 - - -/** QDMA_IND_REG_SEL_PFTCH */ -#define QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK GENMASK(15, 3) -#define QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK GENMASK(2, 0) - -/** QDMA_IND_REG_SEL_CMPT */ -#define QDMA_COMPL_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 38) -#define QDMA_COMPL_CTXT_BADDR_GET_L_MASK GENMASK_ULL(37, 12) -#define QDMA_COMPL_CTXT_PIDX_GET_H_MASK GENMASK(15, 4) -#define QDMA_COMPL_CTXT_PIDX_GET_L_MASK GENMASK(3, 0) - -#define QDMA_INTR_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 61) -#define QDMA_INTR_CTXT_BADDR_GET_M_MASK GENMASK_ULL(60, 29) -#define QDMA_INTR_CTXT_BADDR_GET_L_MASK GENMASK_ULL(28, 12) - -#define QDMA_GLBL2_MM_CMPT_EN_MASK BIT(2) -#define QDMA_GLBL2_FLR_PRESENT_MASK BIT(1) -#define QDMA_GLBL2_MAILBOX_EN_MASK BIT(0) - -#define QDMA_REG_IND_CTXT_REG_COUNT 8 - -/* ------------------------ indirect register context fields -----------*/ -union qdma_ind_ctxt_cmd { - uint32_t word; - struct { - uint32_t busy:1; - uint32_t sel:4; - uint32_t op:2; - uint32_t qid:11; - uint32_t rsvd:14; - } bits; -}; - -#define QDMA_IND_CTXT_DATA_NUM_REGS 8 - -/** - * struct qdma_indirect_ctxt_regs - Inirect Context programming registers - */ -struct qdma_indirect_ctxt_regs { - uint32_t qdma_ind_ctxt_data[QDMA_IND_CTXT_DATA_NUM_REGS]; - uint32_t qdma_ind_ctxt_mask[QDMA_IND_CTXT_DATA_NUM_REGS]; - union qdma_ind_ctxt_cmd cmd; -}; - -/** - * struct qdma_fmap_cfg - fmap config data structure - */ -struct qdma_fmap_cfg { - - /** @qbase - queue base for the function */ - uint16_t qbase; - /** @qmax - maximum queues in the function */ - uint16_t qmax; -}; - -/** - * struct qdma_qid2vec - qid to vector mapping data structure - */ -struct qdma_qid2vec { - - /** @c2h_vector - For direct interrupt, it is the interrupt - * vector index of msix table; - * for indirect interrupt, it is the ring index - */ - uint8_t c2h_vector; - /** @c2h_en_coal - C2H Interrupt aggregation enable */ - uint8_t c2h_en_coal; - /** @h2c_vector - For direct interrupt, it is the interrupt - * vector index of msix table; - * for indirect interrupt, it is the ring index - */ - uint8_t h2c_vector; - /** @h2c_en_coal - H2C Interrupt aggregation enable */ - uint8_t h2c_en_coal; -}; - -/** - * struct qdma_descq_sw_ctxt - descq SW context config data structure - */ -struct qdma_descq_sw_ctxt { - - /** @ring_bs_addr - ring base address */ - uint64_t ring_bs_addr; - /** @vec - vector number */ - uint16_t vec; - /** @pidx - initial producer index */ - uint16_t pidx; - /** @irq_arm - Interrupt Arm */ - uint8_t irq_arm; - /** @fnc_id - Function ID */ - uint8_t fnc_id; - /** @qen - Indicates that the queue is enabled */ - uint8_t qen; - /** @frcd_en -Enable fetch credit */ - uint8_t frcd_en; - /** @wbi_chk -Writeback/Interrupt after pending check */ - uint8_t wbi_chk; - /** @wbi_intvl_en -Write back/Interrupt interval */ - uint8_t wbi_intvl_en; - /** @at - Address tanslation */ - uint8_t at; - /** @fetch_max - Maximum number of descriptor fetches outstanding */ - uint8_t fetch_max; - /** @rngsz_idx - Descriptor ring size index */ - uint8_t rngsz_idx; - /** @desc_sz -Descriptor fetch size */ - uint8_t desc_sz; - /** @bypass - bypass enable */ - uint8_t bypass; - /** @mm_chn - MM channel */ - uint8_t mm_chn; - /** @wbk_en -Writeback enable */ - uint8_t wbk_en; - /** @irq_en -Interrupt enable */ - uint8_t irq_en; - /** @port_id -Port_id */ - uint8_t port_id; - /** @irq_no_last - No interrupt was sent */ - uint8_t irq_no_last; - /** @err - Error status */ - uint8_t err; - /** @err_wb_sent -writeback/interrupt was sent for an error */ - uint8_t err_wb_sent; - /** @irq_req - Interrupt due to error waiting to be sent */ - uint8_t irq_req; - /** @mrkr_dis - Marker disable */ - uint8_t mrkr_dis; - /** @is_mm - MM mode */ - uint8_t is_mm; - /** @intr_aggr - interrupt aggregation enable */ - uint8_t intr_aggr; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @dis_intr_on_vf - Disbale interrupt with VF */ - uint8_t dis_intr_on_vf; - /** @virtio_en - Queue is in Virtio Mode */ - uint8_t virtio_en; - /** @pack_byp_out - descs on desc output interface can be packed */ - uint8_t pack_byp_out; - /** @irq_byp - IRQ Bypass mode */ - uint8_t irq_byp; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @virtio_dsc_base - Virtio Desc Base Address */ - uint64_t virtio_dsc_base; -}; - -/** - * struct qdma_descq_hw_ctxt - descq hw context config data structure - */ -struct qdma_descq_hw_ctxt { - /** @cidx - consumer index */ - uint16_t cidx; - /** @crd_use - credits consumed */ - uint16_t crd_use; - /** @dsc_pend - descriptors pending */ - uint8_t dsc_pend; - /** @idl_stp_b -Queue invalid and no descriptors pending */ - uint8_t idl_stp_b; - /** @evt_pnd - Event pending */ - uint8_t evt_pnd; - /** @fetch_pnd -Descriptor fetch pending */ - uint8_t fetch_pnd; -}; - -/** - * struct qdma_descq_credit_ctxt - descq credit context config data structure - */ -struct qdma_descq_credit_ctxt { - - /** @credit -Fetch credits received. */ - uint32_t credit; -}; - -/** - * struct qdma_descq_prefetch_ctxt - descq pfetch context config data structure - */ -struct qdma_descq_prefetch_ctxt { - /** @sw_crdt -Software credit */ - uint16_t sw_crdt; - /** @bypass - bypass enable */ - uint8_t bypass; - /** @bufsz_idx - c2h buffer size index */ - uint8_t bufsz_idx; - /** @port_id - port ID */ - uint8_t port_id; - /** @var_desc - Variable Descriptor */ - uint8_t var_desc; - /** @num_pftch - Number of descs prefetched */ - uint16_t num_pftch; - /** @err -Error detected on this queue */ - uint8_t err; - /** @pfch_en - Enable prefetch */ - uint8_t pfch_en; - /** @pfch - Queue is in prefetch */ - uint8_t pfch; - /** @valid - context is valid */ - uint8_t valid; -}; - -/** - * struct qdma_descq_cmpt_ctxt - descq completion context config data structure - */ -struct qdma_descq_cmpt_ctxt { - /** @bs_addr - completion ring base address */ - uint64_t bs_addr; - /** @vec - Interrupt Vector */ - uint16_t vec; - /** @pidx_l - producer index low */ - uint16_t pidx; - /** @cidx - consumer index */ - uint16_t cidx; - /** @en_stat_desc - Enable Completion Status writes */ - uint8_t en_stat_desc; - /** @en_int - Enable Completion interrupts */ - uint8_t en_int; - /** @trig_mode - Interrupt and Completion Status Write Trigger Mode */ - uint8_t trig_mode; - /** @fnc_id - Function ID */ - uint8_t fnc_id; - /** @counter_idx - Index to counter register */ - uint8_t counter_idx; - /** @timer_idx - Index to timer register */ - uint8_t timer_idx; - /** @in_st - Interrupt State */ - uint8_t in_st; - /** @color - initial color bit to be used on Completion */ - uint8_t color; - /** @ringsz_idx - Completion ring size index to ring size registers */ - uint8_t ringsz_idx; - /** @desc_sz -descriptor size */ - uint8_t desc_sz; - /** @valid - context valid */ - uint8_t valid; - /** @err - error status */ - uint8_t err; - /** - * @user_trig_pend - user logic initiated interrupt is - * pending to be generate - */ - uint8_t user_trig_pend; - /** @timer_running - timer is running on this queue */ - uint8_t timer_running; - /** @full_upd - Full update */ - uint8_t full_upd; - /** @ovf_chk_dis - Completion Ring Overflow Check Disable */ - uint8_t ovf_chk_dis; - /** @at -Address Translation */ - uint8_t at; - /** @int_aggr -Interrupt Aggregation */ - uint8_t int_aggr; - /** @dis_intr_on_vf - Disbale interrupt with VF */ - uint8_t dis_intr_on_vf; - /** @vio - queue is in VirtIO mode */ - uint8_t vio; - /** @dir_c2h - DMA direction is C2H */ - uint8_t dir_c2h; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @vio_eop - Virtio End-of-packet */ - uint8_t vio_eop; - /** @sh_cmpt - Shared Completion Queue */ - uint8_t sh_cmpt; -}; - -/** - * struct qdma_indirect_intr_ctxt - indirect interrupt context config data - * structure - */ -struct qdma_indirect_intr_ctxt { - /** @baddr_4k -Base address of Interrupt Aggregation Ring */ - uint64_t baddr_4k; - /** @vec - Interrupt vector index in msix table */ - uint16_t vec; - /** @pidx - Producer Index */ - uint16_t pidx; - /** @valid - context valid */ - uint8_t valid; - /** @int_st -Interrupt State */ - uint8_t int_st; - /** @color - Color bit */ - uint8_t color; - /** @page_size - Interrupt Aggregation Ring size */ - uint8_t page_size; - /** @at - Address translation */ - uint8_t at; - /** @host_id - Host ID */ - uint8_t host_id; - /** @pasid - PASID */ - uint32_t pasid; - /** @pasid_en - PASID Enable */ - uint8_t pasid_en; - /** @func_id - Function ID */ - uint16_t func_id; -}; - -struct qdma_hw_version_info { - /** @rtl_version - RTL Version */ - enum qdma_rtl_version rtl_version; - /** @vivado_release - Vivado Release id */ - enum qdma_vivado_release_id vivado_release; - /** @versal_ip_state - Versal IP state */ - enum qdma_ip_type ip_type; - /** @device_type - Device Type */ - enum qdma_device_type device_type; - /** @qdma_rtl_version_str - RTL Version string*/ - char qdma_rtl_version_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_vivado_release_id_str - Vivado Release id string*/ - char qdma_vivado_release_id_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_device_type_str - Qdma device type string*/ - char qdma_device_type_str[QDMA_HW_VERSION_STRING_LEN]; - /** @qdma_versal_ip_state_str - Versal IP state string*/ - char qdma_ip_type_str[QDMA_HW_VERSION_STRING_LEN]; -}; - -#define CTXT_ENTRY_NAME_SZ 64 -struct qctx_entry { - char name[CTXT_ENTRY_NAME_SZ]; - uint32_t value; -}; - -/** - * @struct - qdma_descq_context - * @brief queue context information - */ -struct qdma_descq_context { - struct qdma_qid2vec qid2vec; - struct qdma_fmap_cfg fmap; - struct qdma_descq_sw_ctxt sw_ctxt; - struct qdma_descq_hw_ctxt hw_ctxt; - struct qdma_descq_credit_ctxt cr_ctxt; - struct qdma_descq_prefetch_ctxt pfetch_ctxt; - struct qdma_descq_cmpt_ctxt cmpt_ctxt; -}; - -/** - * struct qdma_q_pidx_reg_info - Software PIDX register fields - */ -struct qdma_q_pidx_reg_info { - /** @pidx - Producer Index */ - uint16_t pidx; - /** @irq_en - Interrupt enable */ - uint8_t irq_en; -}; - -/** - * struct qdma_q_intr_cidx_reg_info - Interrupt Ring CIDX register fields - */ -struct qdma_intr_cidx_reg_info { - /** @sw_cidx - Software Consumer Index */ - uint16_t sw_cidx; - /** @rng_idx - Ring Index of the Interrupt Aggregation ring */ - uint8_t rng_idx; -}; - -/** - * struct qdma_q_cmpt_cidx_reg_info - CMPT CIDX register fields - */ -struct qdma_q_cmpt_cidx_reg_info { - /** @wrb_cidx - CMPT Consumer Index */ - uint16_t wrb_cidx; - /** @counter_idx - Counter Threshold Index */ - uint8_t counter_idx; - /** @timer_idx - Timer Count Index */ - uint8_t timer_idx; - /** @trig_mode - Trigger mode */ - uint8_t trig_mode; - /** @wrb_en - Enable status descriptor for CMPT */ - uint8_t wrb_en; - /** @irq_en - Enable Interrupt for CMPT */ - uint8_t irq_en; -}; - - -/** - * struct qdma_csr_info - Global CSR info data structure - */ -struct qdma_csr_info { - /** @ringsz: ring size values */ - uint16_t ringsz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @bufsz: buffer size values */ - uint16_t bufsz[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @timer_cnt: timer threshold values */ - uint8_t timer_cnt[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @cnt_thres: counter threshold values */ - uint8_t cnt_thres[QDMA_GLOBAL_CSR_ARRAY_SZ]; - /** @wb_intvl: writeback interval */ - uint8_t wb_intvl; -}; - -#define QDMA_MAX_REGISTER_DUMP 14 - -/** - * struct qdma_reg_data - Structure to - * hold address value and pair - */ -struct qdma_reg_data { - /** @reg_addr: register address */ - uint32_t reg_addr; - /** @reg_val: register value */ - uint32_t reg_val; -}; - -/** - * enum qdma_hw_access_type - To hold hw access type - */ -enum qdma_hw_access_type { - QDMA_HW_ACCESS_READ, - QDMA_HW_ACCESS_WRITE, - QDMA_HW_ACCESS_CLEAR, - QDMA_HW_ACCESS_INVALIDATE, - QDMA_HW_ACCESS_MAX -}; - -/** - * enum qdma_global_csr_type - To hold global csr type - */ -enum qdma_global_csr_type { - QDMA_CSR_RING_SZ, - QDMA_CSR_TIMER_CNT, - QDMA_CSR_CNT_TH, - QDMA_CSR_BUF_SZ, - QDMA_CSR_MAX -}; - -/** - * enum status_type - To hold enable/disable status type - */ -enum status_type { - DISABLE = 0, - ENABLE = 1, -}; - -/** - * enum qdma_reg_read_type - Indicates reg read type - */ -enum qdma_reg_read_type { - /** @QDMA_REG_READ_PF_ONLY: Read the register for PFs only */ - QDMA_REG_READ_PF_ONLY, - /** @QDMA_REG_READ_VF_ONLY: Read the register for VFs only */ - QDMA_REG_READ_VF_ONLY, - /** @QDMA_REG_READ_PF_VF: Read the register for both PF and VF */ - QDMA_REG_READ_PF_VF, - /** @QDMA_REG_READ_MAX: Reg read enum max */ - QDMA_REG_READ_MAX -}; - -/** - * enum qdma_reg_read_groups - Indicates reg read groups - */ -enum qdma_reg_read_groups { - /** @QDMA_REG_READ_GROUP_1: Read the register from 0x000 to 0x288 */ - QDMA_REG_READ_GROUP_1, - /** @QDMA_REG_READ_GROUP_2: Read the register from 0x400 to 0xAFC */ - QDMA_REG_READ_GROUP_2, - /** @QDMA_REG_READ_GROUP_3: Read the register from 0xB00 to 0xE28 */ - QDMA_REG_READ_GROUP_3, - /** @QDMA_REG_READ_GROUP_4: Read the register Mailbox Registers */ - QDMA_REG_READ_GROUP_4, - /** @QDMA_REG_READ_GROUP_MAX: Reg read max groups */ - QDMA_REG_READ_GROUP_MAX -}; - -void qdma_write_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, const uint32_t *values); - -void qdma_read_csr_values(void *dev_hndl, uint32_t reg_offst, - uint32_t idx, uint32_t cnt, uint32_t *values); - -int dump_reg(char *buf, int buf_sz, uint32_t raddr, - const char *rname, uint32_t rval); - -int hw_monitor_reg(void *dev_hndl, uint32_t reg, uint32_t mask, - uint32_t val, uint32_t interval_us, - uint32_t timeout_us); - -void qdma_memset(void *to, uint8_t val, uint32_t size); - -int qdma_acc_reg_dump_buf_len(void *dev_hndl, - enum qdma_ip_type ip_type, int *buflen); - -int qdma_acc_reg_info_len(void *dev_hndl, - enum qdma_ip_type ip_type, int *buflen, int *num_regs); - -int qdma_acc_context_buf_len(void *dev_hndl, - enum qdma_ip_type ip_type, uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int qdma_acc_get_num_config_regs(void *dev_hndl, - enum qdma_ip_type ip_type, uint32_t *num_regs); - -/* - * struct qdma_hw_access - Structure to hold HW access function pointers - */ -struct qdma_hw_access { - int (*qdma_set_default_global_csr)(void *dev_hndl); - int (*qdma_global_csr_conf)(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - int (*qdma_global_writeback_interval_conf)(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - int (*qdma_init_ctxt_memory)(void *dev_hndl); - int (*qdma_qid2vec_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_fmap_conf)(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - int (*qdma_sw_ctx_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_pfetch_ctx_conf)(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_cmpt_ctx_conf)(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_hw_ctx_conf)(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_credit_ctx_conf)(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_indirect_intr_ctx_conf)(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - int (*qdma_queue_pidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - uint8_t is_c2h, - const struct qdma_q_pidx_reg_info *reg_info); - int (*qdma_queue_cmpt_cidx_read)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - struct qdma_q_cmpt_cidx_reg_info *reg_info); - int (*qdma_queue_cmpt_cidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - const struct qdma_q_cmpt_cidx_reg_info *reg_info); - int (*qdma_queue_intr_cidx_update)(void *dev_hndl, uint8_t is_vf, - uint16_t qid, - const struct qdma_intr_cidx_reg_info *reg_info); - int (*qdma_mm_channel_conf)(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, uint8_t enable); - int (*qdma_get_user_bar)(void *dev_hndl, uint8_t is_vf, - uint8_t func_id, uint8_t *user_bar); - int (*qdma_get_function_number)(void *dev_hndl, uint8_t *func_id); - int (*qdma_get_version)(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - int (*qdma_get_device_attributes)(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - int (*qdma_hw_error_intr_setup)(void *dev_hndl, uint16_t func_id, - uint8_t err_intr_index); - int (*qdma_hw_error_intr_rearm)(void *dev_hndl); - int (*qdma_hw_error_enable)(void *dev_hndl, - uint32_t err_idx); - const char *(*qdma_hw_get_error_name)(uint32_t err_idx); - int (*qdma_hw_error_process)(void *dev_hndl); - int (*qdma_dump_config_regs)(void *dev_hndl, uint8_t is_vf, char *buf, - uint32_t buflen); - int (*qdma_dump_reg_info)(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, - char *buf, - uint32_t buflen); - int (*qdma_dump_queue_context)(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - int (*qdma_read_dump_queue_context)(void *dev_hndl, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - int (*qdma_dump_intr_context)(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - int (*qdma_is_legacy_intr_pend)(void *dev_hndl); - int (*qdma_clear_pend_legacy_intr)(void *dev_hndl); - int (*qdma_legacy_intr_conf)(void *dev_hndl, enum status_type enable); - int (*qdma_initiate_flr)(void *dev_hndl, uint8_t is_vf); - int (*qdma_is_flr_done)(void *dev_hndl, uint8_t is_vf, uint8_t *done); - int (*qdma_get_error_code)(int acc_err_code); - int (*qdma_read_reg_list)(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - int (*qdma_dump_config_reg_list)(void *dev_hndl, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - uint32_t mbox_base_pf; - uint32_t mbox_base_vf; - uint32_t qdma_max_errors; -}; - -/*****************************************************************************/ -/** - * qdma_hw_access_init() - Function to get the QDMA hardware - * access function pointers - * This function should be called once per device from - * device_open()/probe(). Caller shall allocate memory for - * qdma_hw_access structure and store pointer to it in their - * per device structure. Config BAR validation will be done - * inside this function - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @hw_access: qdma_hw_access structure pointer. - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_access_init(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_access *hw_access); - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_regs() - Function to get qdma config registers - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @reg_data: pointer to register data to be filled - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_get_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, - uint32_t *reg_data); - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @ip_type: QDMA IP Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_config_regs(void *dev_hndl, uint8_t is_vf, - enum qdma_ip_type ip_type, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_dump_reg_info() - Function to get qdma reg info in a buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @reg_addr: Register Address - * @num_regs: Number of Registers - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_reg_info(void *dev_hndl, - enum qdma_ip_type ip_type, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_dump_queue_context() - Function to dump qdma queue context data in a - * buffer where context information is already available in 'ctxt_data' - * structure pointer buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @st: ST or MM - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_acc_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @qid_hw: queue id - * @st: ST or MM - * @q_type: Queue Type - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_acc_read_dump_queue_context(void *dev_hndl, - enum qdma_ip_type ip_type, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - - -/*****************************************************************************/ -/** - * qdma_acc_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @ip_type: QDMA IP Type - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_acc_dump_config_reg_list(void *dev_hndl, - enum qdma_ip_type ip_type, - uint32_t num_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -/*****************************************************************************/ -/** - * qdma_get_error_code() - function to get the qdma access mapped - * error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_error_code(int acc_err_code); - -/*****************************************************************************/ -/** - * qdma_fetch_version_details() - Function to fetch the version details from the - * version register value - * - * @is_vf : Whether PF or VF - * @version_reg_val : Value of the version register - * @version_info : Pointer to store the version details. - * - * Return: Nothing - *****************************************************************************/ -void qdma_fetch_version_details(uint8_t is_vf, uint32_t version_reg_val, - struct qdma_hw_version_info *version_info); - - -#ifdef __cplusplus -} -#endif - -#endif /* QDMA_ACCESS_COMMON_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_errors.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_errors.h deleted file mode 100644 index f260bdb..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_errors.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_ACCESS_ERRORS_H_ -#define __QDMA_ACCESS_ERRORS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library error codes definitions - * - * Header file *qdma_access_errors.h* defines error codes for common library - */ - -struct err_code_map { - int acc_err_code; - int err_code; -}; - -#define QDMA_HW_ERR_NOT_DETECTED 1 - -enum qdma_access_error_codes { - QDMA_SUCCESS = 0, - QDMA_ERR_INV_PARAM, - QDMA_ERR_NO_MEM, - QDMA_ERR_HWACC_BUSY_TIMEOUT, - QDMA_ERR_HWACC_INV_CONFIG_BAR, - QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR, - QDMA_ERR_HWACC_BAR_NOT_FOUND, - QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED, /* 7 */ - - QDMA_ERR_RM_RES_EXISTS, /* 8 */ - QDMA_ERR_RM_RES_NOT_EXISTS, - QDMA_ERR_RM_DEV_EXISTS, - QDMA_ERR_RM_DEV_NOT_EXISTS, - QDMA_ERR_RM_NO_QUEUES_LEFT, - QDMA_ERR_RM_QMAX_CONF_REJECTED, /* 13 */ - - QDMA_ERR_MBOX_FMAP_WR_FAILED, /* 14 */ - QDMA_ERR_MBOX_NUM_QUEUES, - QDMA_ERR_MBOX_INV_QID, - QDMA_ERR_MBOX_INV_RINGSZ, - QDMA_ERR_MBOX_INV_BUFSZ, - QDMA_ERR_MBOX_INV_CNTR_TH, - QDMA_ERR_MBOX_INV_TMR_TH, - QDMA_ERR_MBOX_INV_MSG, - QDMA_ERR_MBOX_SEND_BUSY, - QDMA_ERR_MBOX_NO_MSG_IN, - QDMA_ERR_MBOX_REG_READ_FAILED, - QDMA_ERR_MBOX_ALL_ZERO_MSG, /* 25 */ -}; - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_ACCESS_ERRORS_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_export.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_export.h deleted file mode 100644 index 736af87..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_export.h +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_ACCESS_EXPORT_H_ -#define __QDMA_ACCESS_EXPORT_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform_env.h" - -/** QDMA Global CSR array size */ -#define QDMA_GLOBAL_CSR_ARRAY_SZ 16 - -/** - * struct qdma_dev_attributes - QDMA device attributes - */ -struct qdma_dev_attributes { - /** @num_pfs - Num of PFs*/ - uint8_t num_pfs; - /** @num_qs - Num of Queues */ - uint16_t num_qs; - /** @flr_present - FLR resent or not? */ - uint8_t flr_present:1; - /** @st_en - ST mode supported or not? */ - uint8_t st_en:1; - /** @mm_en - MM mode supported or not? */ - uint8_t mm_en:1; - /** @mm_cmpt_en - MM with Completions supported or not? */ - uint8_t mm_cmpt_en:1; - /** @mailbox_en - Mailbox supported or not? */ - uint8_t mailbox_en:1; - /** @debug_mode - Debug mode is enabled/disabled for IP */ - uint8_t debug_mode:1; - /** @desc_eng_mode - Descriptor Engine mode: - * Internal only/Bypass only/Internal & Bypass - */ - uint8_t desc_eng_mode:2; - /** @mm_channel_max - Num of MM channels */ - uint8_t mm_channel_max; - - /** Below are the list of HW features which are populated by qdma_access - * based on RTL version - */ - /** @qid2vec_ctx - To indicate support of qid2vec context */ - uint8_t qid2vec_ctx:1; - /** @cmpt_ovf_chk_dis - To indicate support of overflow check - * disable in CMPT ring - */ - uint8_t cmpt_ovf_chk_dis:1; - /** @mailbox_intr - To indicate support of mailbox interrupt */ - uint8_t mailbox_intr:1; - /** @sw_desc_64b - To indicate support of 64 bytes C2H/H2C - * descriptor format - */ - uint8_t sw_desc_64b:1; - /** @cmpt_desc_64b - To indicate support of 64 bytes CMPT - * descriptor format - */ - uint8_t cmpt_desc_64b:1; - /** @dynamic_bar - To indicate support of dynamic bar detection */ - uint8_t dynamic_bar:1; - /** @legacy_intr - To indicate support of legacy interrupt */ - uint8_t legacy_intr:1; - /** @cmpt_trig_count_timer - To indicate support of counter + timer - * trigger mode - */ - uint8_t cmpt_trig_count_timer:1; -}; - -/** qdma_dev_attributes structure size */ -#define QDMA_DEV_ATTR_STRUCT_SIZE (sizeof(struct qdma_dev_attributes)) - -/** global_csr_conf structure size */ -#define QDMA_DEV_GLOBAL_CSR_STRUCT_SIZE (sizeof(struct global_csr_conf)) - -/** - * enum qdma_dev_type - To hold qdma device type - */ -enum qdma_dev_type { - QDMA_DEV_PF, - QDMA_DEV_VF -}; - -/** - * enum qdma_dev_q_type: Q type - */ -enum qdma_dev_q_type { - /** @QDMA_DEV_Q_TYPE_H2C: H2C Q */ - QDMA_DEV_Q_TYPE_H2C, - /** @QDMA_DEV_Q_TYPE_C2H: C2H Q */ - QDMA_DEV_Q_TYPE_C2H, - /** @QDMA_DEV_Q_TYPE_CMPT: CMPT Q */ - QDMA_DEV_Q_TYPE_CMPT, - /** @QDMA_DEV_Q_TYPE_MAX: Total Q types */ - QDMA_DEV_Q_TYPE_MAX -}; - -/** - * @enum qdma_desc_size - QDMA queue descriptor size - */ -enum qdma_desc_size { - /** @QDMA_DESC_SIZE_8B - 8 byte descriptor */ - QDMA_DESC_SIZE_8B, - /** @QDMA_DESC_SIZE_16B - 16 byte descriptor */ - QDMA_DESC_SIZE_16B, - /** @QDMA_DESC_SIZE_32B - 32 byte descriptor */ - QDMA_DESC_SIZE_32B, - /** @QDMA_DESC_SIZE_64B - 64 byte descriptor */ - QDMA_DESC_SIZE_64B -}; - -/** - * @enum qdma_cmpt_update_trig_mode - Interrupt and Completion status write - * trigger mode - */ -enum qdma_cmpt_update_trig_mode { - /** @QDMA_CMPT_UPDATE_TRIG_MODE_DIS - disabled */ - QDMA_CMPT_UPDATE_TRIG_MODE_DIS, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_EVERY - every */ - QDMA_CMPT_UPDATE_TRIG_MODE_EVERY, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR_CNT - user counter */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR_CNT, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR - user */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_USR_TMR - user timer */ - QDMA_CMPT_UPDATE_TRIG_MODE_USR_TMR, - /** @QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR - timer + counter combo */ - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR -}; - - -/** - * @enum qdma_indirect_intr_ring_size - Indirect interrupt ring size - */ -enum qdma_indirect_intr_ring_size { - /** @QDMA_INDIRECT_INTR_RING_SIZE_4KB - Accommodates 512 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_4KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_8KB - Accommodates 1024 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_8KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_12KB - Accommodates 1536 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_12KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_16KB - Accommodates 2048 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_16KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_20KB - Accommodates 2560 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_20KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_24KB - Accommodates 3072 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_24KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_28KB - Accommodates 3584 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_28KB, - /** @QDMA_INDIRECT_INTR_RING_SIZE_32KB - Accommodates 4096 entries */ - QDMA_INDIRECT_INTR_RING_SIZE_32KB -}; - -/** - * @enum qdma_wrb_interval - writeback update interval - */ -enum qdma_wrb_interval { - /** @QDMA_WRB_INTERVAL_4 - writeback update interval of 4 */ - QDMA_WRB_INTERVAL_4, - /** @QDMA_WRB_INTERVAL_8 - writeback update interval of 8 */ - QDMA_WRB_INTERVAL_8, - /** @QDMA_WRB_INTERVAL_16 - writeback update interval of 16 */ - QDMA_WRB_INTERVAL_16, - /** @QDMA_WRB_INTERVAL_32 - writeback update interval of 32 */ - QDMA_WRB_INTERVAL_32, - /** @QDMA_WRB_INTERVAL_64 - writeback update interval of 64 */ - QDMA_WRB_INTERVAL_64, - /** @QDMA_WRB_INTERVAL_128 - writeback update interval of 128 */ - QDMA_WRB_INTERVAL_128, - /** @QDMA_WRB_INTERVAL_256 - writeback update interval of 256 */ - QDMA_WRB_INTERVAL_256, - /** @QDMA_WRB_INTERVAL_512 - writeback update interval of 512 */ - QDMA_WRB_INTERVAL_512, - /** @QDMA_NUM_WRB_INTERVALS - total number of writeback intervals */ - QDMA_NUM_WRB_INTERVALS -}; - -enum qdma_rtl_version { - /** @QDMA_RTL_BASE - RTL Base */ - QDMA_RTL_BASE, - /** @QDMA_RTL_PATCH - RTL Patch */ - QDMA_RTL_PATCH, - /** @QDMA_RTL_NONE - Not a valid RTL version */ - QDMA_RTL_NONE, -}; - -enum qdma_vivado_release_id { - /** @QDMA_VIVADO_2018_3 - Vivado version 2018.3 */ - QDMA_VIVADO_2018_3, - /** @QDMA_VIVADO_2019_1 - Vivado version 2019.1 */ - QDMA_VIVADO_2019_1, - /** @QDMA_VIVADO_2019_2 - Vivado version 2019.2 */ - QDMA_VIVADO_2019_2, - /** @QDMA_VIVADO_2020_1 - Vivado version 2020.1 */ - QDMA_VIVADO_2020_1, - /** @QDMA_VIVADO_2020_2 - Vivado version 2020.2 */ - QDMA_VIVADO_2020_2, - /** @QDMA_VIVADO_NONE - Not a valid Vivado version*/ - QDMA_VIVADO_NONE -}; - -enum qdma_ip_type { - /** @QDMA_VERSAL_HARD_IP - Hard IP */ - QDMA_VERSAL_HARD_IP, - /** @QDMA_VERSAL_SOFT_IP - Soft IP */ - QDMA_VERSAL_SOFT_IP, - /** @QDMA_SOFT_IP - Hard IP */ - QDMA_SOFT_IP, - /** @EQDMA_SOFT_IP - Soft IP */ - EQDMA_SOFT_IP, - /** @QDMA_VERSAL_NONE - Not versal device */ - QDMA_NONE_IP -}; - - -enum qdma_device_type { - /** @QDMA_DEVICE_SOFT - UltraScale+ IP's */ - QDMA_DEVICE_SOFT, - /** @QDMA_DEVICE_VERSAL -VERSAL IP */ - QDMA_DEVICE_VERSAL, - /** @QDMA_DEVICE_NONE - Not a valid device */ - QDMA_DEVICE_NONE -}; - -enum qdma_desc_eng_mode { - /** @QDMA_DESC_ENG_INTERNAL_BYPASS - Internal and Bypass mode */ - QDMA_DESC_ENG_INTERNAL_BYPASS, - /** @QDMA_DESC_ENG_BYPASS_ONLY - Only Bypass mode */ - QDMA_DESC_ENG_BYPASS_ONLY, - /** @QDMA_DESC_ENG_INTERNAL_ONLY - Only Internal mode */ - QDMA_DESC_ENG_INTERNAL_ONLY, - /** @QDMA_DESC_ENG_MODE_MAX - Max of desc engine modes */ - QDMA_DESC_ENG_MODE_MAX -}; - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_ACCESS_EXPORT_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_version.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_version.h deleted file mode 100644 index 9b6d442..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_access_version.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_ACCESS_VERSION_H_ -#define __QDMA_ACCESS_VERSION_H_ - - -#define QDMA_VERSION_MAJOR 2020 -#define QDMA_VERSION_MINOR 2 -#define QDMA_VERSION_PATCH 0 - -#define QDMA_VERSION_STR \ - __stringify(QDMA_VERSION_MAJOR) "." \ - __stringify(QDMA_VERSION_MINOR) "." \ - __stringify(QDMA_VERSION_PATCH) - -#define QDMA_VERSION \ - ((QDMA_VERSION_MAJOR)*1000 + \ - (QDMA_VERSION_MINOR)*100 + \ - QDMA_VERSION_PATCH) - - -#endif /* __QDMA_ACCESS_VERSION_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_list.c b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_list.c deleted file mode 100644 index 46691a8..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_list.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "qdma_list.h" - -void qdma_list_init_head(struct qdma_list_head *head) -{ - if (head) - head->prev = head->next = head; -} - -void qdma_list_add_tail(struct qdma_list_head *node, - struct qdma_list_head *head) -{ - head->prev->next = node; - node->next = head; - node->prev = head->prev; - head->prev = node; -} - -void qdma_list_insert_before(struct qdma_list_head *new_node, - struct qdma_list_head *node) -{ - node->prev->next = new_node; - new_node->prev = node->prev; - new_node->next = node; - node->prev = new_node; -} - -void qdma_list_insert_after(struct qdma_list_head *new_node, - struct qdma_list_head *node) -{ - new_node->prev = node; - new_node->next = node->next; - node->next->prev = new_node; - node->next = new_node; -} - - -void qdma_list_del(struct qdma_list_head *node) -{ - if (node) { - if (node->prev) - node->prev->next = node->next; - if (node->next) - node->next->prev = node->prev; - } -} diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_list.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_list.h deleted file mode 100644 index f6a59c8..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_list.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_LIST_H_ -#define __QDMA_LIST_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library provided list implementation definitions - * - * Header file *qdma_list.h* defines APIs for creating and managing list. - */ - -/** - * struct qdma_list_head - data type for creating a list node - */ -struct qdma_list_head { - struct qdma_list_head *prev; - struct qdma_list_head *next; - void *priv; -}; - -#define QDMA_LIST_HEAD_INIT(name) { &(name), &(name), NULL } - -#define QDMA_LIST_HEAD(name) \ - struct qdma_list_head name = QDMA_LIST_HEAD_INIT(name) - -#define QDMA_LIST_GET_DATA(node) (node->priv) -#define QDMA_LIST_SET_DATA(node, data) ((node)->priv = data) - - -#define qdma_list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - - -#define qdma_list_is_last_entry(entry, head) ((entry)->next == (head)) - -#define qdma_list_is_empty(head) ((head)->next == (head)) - -/*****************************************************************************/ -/** - * qdma_list_init_head(): Init the list head - * - * @head: head of the list - * - * Return: None - *****************************************************************************/ -void qdma_list_init_head(struct qdma_list_head *head); - -/*****************************************************************************/ -/** - * qdma_list_add_tail(): add the given @node at the end of the list with @head - * - * @node: new entry which has to be added at the end of the list with @head - * @head: head of the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_add_tail(struct qdma_list_head *node, - struct qdma_list_head *head); - -/*****************************************************************************/ -/** - * qdma_list_insert_before(): add the given @node at the before a @node - * - * @new_node: new entry which has to be added before @node - * @node: reference node in the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_insert_before(struct qdma_list_head *new_node, - struct qdma_list_head *node); - -/*****************************************************************************/ -/** - * qdma_list_insert_after(): add the given @node at the after a @node - * - * @new_node: new entry which has to be added after @node - * @node: reference node in the list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_insert_after(struct qdma_list_head *new_node, - struct qdma_list_head *node); - -/*****************************************************************************/ -/** - * qdma_list_del(): delete an node from the list - * - * @node: node in a list - * - * This API needs to be called with holding the lock to the list - * - * Return: None - *****************************************************************************/ -void qdma_list_del(struct qdma_list_head *node); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_LIST_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_platform.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_platform.h deleted file mode 100644 index cd7d64d..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_platform.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_PLATFORM_H_ -#define __QDMA_PLATFORM_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA platform specific interface definitions - * - * Header file *qdma_platform_env.h* defines function signatures that are - * required to be implemented by platform specific drivers. - */ - -#include "qdma_access_common.h" - -/*****************************************************************************/ -/** - * qdma_calloc(): allocate memory and initialize with 0 - * - * @num_blocks: number of blocks of contiguous memory of @size - * @size: size of each chunk of memory - * - * Return: pointer to the memory block created on success and NULL on failure - *****************************************************************************/ -void *qdma_calloc(uint32_t num_blocks, uint32_t size); - -/*****************************************************************************/ -/** - * qdma_memfree(): free the memory - * - * @memptr: pointer to the memory block - * - * Return: None - *****************************************************************************/ -void qdma_memfree(void *memptr); - -/*****************************************************************************/ -/** - * qdma_resource_lock_init() - Init lock to access resource management APIs - * - * @return None - *****************************************************************************/ -int qdma_resource_lock_init(void); - -/*****************************************************************************/ -/** - * qdma_resource_lock_take() - take lock to access resource management APIs - * - * @return None - *****************************************************************************/ -void qdma_resource_lock_take(void); - -/*****************************************************************************/ -/** - * qdma_resource_lock_give() - release lock after accessing resource management - * APIs - * - * @return None - *****************************************************************************/ -void qdma_resource_lock_give(void); - -/*****************************************************************************/ -/** - * qdma_reg_write() - Register write API. - * - * @dev_hndl: device handle - * @reg_offst: QDMA Config bar register offset to write - * @val: value to be written - * - * Return: Nothing - *****************************************************************************/ -void qdma_reg_write(void *dev_hndl, uint32_t reg_offst, uint32_t val); - -/*****************************************************************************/ -/** - * qdma_reg_read() - Register read API. - * - * @dev_hndl: device handle - * @reg_offst: QDMA Config bar register offset to be read - * - * Return: Value read - *****************************************************************************/ -uint32_t qdma_reg_read(void *dev_hndl, uint32_t reg_offst); - -/*****************************************************************************/ -/** - * qdma_reg_access_lock() - Lock function for Register access - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_reg_access_lock(void *dev_hndl); - -/*****************************************************************************/ -/** - * qdma_reg_access_release() - Release function for Register access - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_reg_access_release(void *dev_hndl); - -/*****************************************************************************/ -/** - * qdma_udelay() - delay function to be used in the common library - * - * @delay_usec: delay in microseconds - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_udelay(uint32_t delay_usec); - -/*****************************************************************************/ -/** - * qdma_get_hw_access() - function to get the qdma_hw_access - * - * @dev_hndl: device handle - * @dev_cap: pointer to hold qdma_hw_access structure - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -void qdma_get_hw_access(void *dev_hndl, struct qdma_hw_access **hw); - -/*****************************************************************************/ -/** - * qdma_strncpy(): copy n size string from source to destination buffer - * - * @memptr: pointer to the memory block - * - * Return: None - *****************************************************************************/ -void qdma_strncpy(char *dest, const char *src, size_t n); - - -/*****************************************************************************/ -/** - * qdma_get_err_code() - function to get the qdma access mapped error code - * - * @acc_err_code: qdma access error code - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_get_err_code(int acc_err_code); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_PLATFORM_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_reg_dump.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_reg_dump.h deleted file mode 100644 index 6ad7f70..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_reg_dump.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_REG_DUMP_H__ -#define __QDMA_REG_DUMP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform_env.h" -#include "qdma_access_common.h" - -#define DEBUGFS_DEV_INFO_SZ (300) - -#define QDMA_REG_NAME_LENGTH 64 -#define DEBUGFS_INTR_CNTX_SZ (2048 * 2) -#define DBGFS_ERR_BUFLEN (64) -#define DEBGFS_LINE_SZ (81) -#define DEBGFS_GEN_NAME_SZ (40) -#define REG_DUMP_SIZE_PER_LINE (256) - -#define MAX_QDMA_CFG_REGS (200) - -#define QDMA_MM_EN_SHIFT 0 -#define QDMA_CMPT_EN_SHIFT 1 -#define QDMA_ST_EN_SHIFT 2 -#define QDMA_MAILBOX_EN_SHIFT 3 - -#define QDMA_MM_MODE (1 << QDMA_MM_EN_SHIFT) -#define QDMA_COMPLETION_MODE (1 << QDMA_CMPT_EN_SHIFT) -#define QDMA_ST_MODE (1 << QDMA_ST_EN_SHIFT) -#define QDMA_MAILBOX (1 << QDMA_MAILBOX_EN_SHIFT) - - -#define QDMA_MM_ST_MODE \ - (QDMA_MM_MODE | QDMA_COMPLETION_MODE | QDMA_ST_MODE) - -#define GET_CAPABILITY_MASK(mm_en, st_en, mm_cmpt_en, mailbox_en) \ - ((mm_en << QDMA_MM_EN_SHIFT) | \ - ((mm_cmpt_en | st_en) << QDMA_CMPT_EN_SHIFT) | \ - (st_en << QDMA_ST_EN_SHIFT) | \ - (mailbox_en << QDMA_MAILBOX_EN_SHIFT)) - - -struct regfield_info { - const char *field_name; - uint32_t field_mask; -}; - -struct xreg_info { - const char *name; - uint32_t addr; - uint32_t repeat; - uint32_t step; - uint8_t shift; - uint8_t len; - uint8_t is_debug_reg; - uint8_t mode; - uint8_t read_type; - uint8_t num_bitfields; - struct regfield_info *bitfields; -}; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_resource_mgmt.c b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_resource_mgmt.c deleted file mode 100644 index 3cb7967..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_resource_mgmt.c +++ /dev/null @@ -1,794 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "qdma_resource_mgmt.h" -#include "qdma_platform.h" -#include "qdma_list.h" -#include "qdma_access_errors.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_resource_mgmt.tmh" -#endif - -struct qdma_resource_entry { - int qbase; - uint32_t total_q; - struct qdma_list_head node; -}; - -/** per function entry */ -struct qdma_dev_entry { - uint16_t func_id; - uint32_t active_h2c_qcnt; - uint32_t active_c2h_qcnt; - uint32_t active_cmpt_qcnt; - struct qdma_resource_entry entry; -}; - -/** for hodling the qconf_entry structure */ -struct qdma_resource_master { - /** DMA device index this resource belongs to */ - uint32_t dma_device_index; - /** starting pci bus number this resource belongs to */ - uint32_t pci_bus_start; - /** ending pci bus number this resource belongs to */ - uint32_t pci_bus_end; - /** total queue this resource manager handles */ - uint32_t total_q; - /** queue base from which this resource manger handles */ - int qbase; - /** for attaching to master resource list */ - struct qdma_list_head node; - /** for holding device entries */ - struct qdma_list_head dev_list; - /** for holding free resource list */ - struct qdma_list_head free_list; - /** active queue count per resource*/ - uint32_t active_qcnt; -}; - -static QDMA_LIST_HEAD(master_resource_list); - -static struct qdma_resource_master *qdma_find_master_resource_entry( - uint32_t bus_start, uint32_t bus_end) -{ - struct qdma_list_head *entry, *tmp; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &master_resource_list) { - struct qdma_resource_master *q_resource = - (struct qdma_resource_master *) - QDMA_LIST_GET_DATA(entry); - - if (q_resource->pci_bus_start == bus_start && - q_resource->pci_bus_end == bus_end) { - qdma_resource_lock_give(); - return q_resource; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_resource_master *qdma_get_master_resource_entry( - uint32_t dma_device_index) -{ - struct qdma_list_head *entry, *tmp; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &master_resource_list) { - struct qdma_resource_master *q_resource = - (struct qdma_resource_master *) - QDMA_LIST_GET_DATA(entry); - - if (q_resource->dma_device_index == dma_device_index) { - qdma_resource_lock_give(); - return q_resource; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_dev_entry *qdma_get_dev_entry(uint32_t dma_device_index, - uint16_t func_id) -{ - struct qdma_list_head *entry, *tmp; - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - - if (!q_resource) - return NULL; - - qdma_resource_lock_take(); - qdma_list_for_each_safe(entry, tmp, &q_resource->dev_list) { - struct qdma_dev_entry *dev_entry = (struct qdma_dev_entry *) - QDMA_LIST_GET_DATA(entry); - - if (dev_entry->func_id == func_id) { - qdma_resource_lock_give(); - return dev_entry; - } - } - qdma_resource_lock_give(); - - return NULL; -} - -static struct qdma_resource_entry *qdma_free_entry_create(int q_base, - uint32_t total_q) -{ - struct qdma_resource_entry *entry = (struct qdma_resource_entry *) - qdma_calloc(1, sizeof(struct qdma_resource_master)); - if (entry == NULL) - return NULL; - - entry->total_q = total_q; - entry->qbase = q_base; - - return entry; -} - -static void qdma_submit_to_free_list(struct qdma_dev_entry *dev_entry, - struct qdma_list_head *head) -{ - struct qdma_resource_entry *streach_node = NULL; - struct qdma_list_head *entry, *tmp; - /* create a new node to be added to empty free list */ - struct qdma_resource_entry *new_node = NULL; - - if (!dev_entry->entry.total_q) - return; - - if (qdma_list_is_empty(head)) { - new_node = qdma_free_entry_create(dev_entry->entry.qbase, - dev_entry->entry.total_q); - if (new_node == NULL) - return; - QDMA_LIST_SET_DATA(&new_node->node, new_node); - qdma_list_add_tail(&new_node->node, head); - /* reset device entry q resource params */ - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - } else { - qdma_list_for_each_safe(entry, tmp, head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *) - QDMA_LIST_GET_DATA(entry); - - /* insert the free slot at appropriate place */ - if ((node->qbase > dev_entry->entry.qbase) || - qdma_list_is_last_entry(entry, head)) { - new_node = qdma_free_entry_create( - dev_entry->entry.qbase, - dev_entry->entry.total_q); - if (new_node == NULL) - return; - QDMA_LIST_SET_DATA(&new_node->node, new_node); - if (node->qbase > dev_entry->entry.qbase) - qdma_list_insert_before(&new_node->node, - &node->node); - else - qdma_list_add_tail(&new_node->node, - head); - /* reset device entry q resource params */ - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - break; - } - } - } - - /* de-fragment (merge contiguous resource chunks) if possible */ - qdma_list_for_each_safe(entry, tmp, head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if (!streach_node) - streach_node = node; - else { - if ((streach_node->qbase + streach_node->total_q) == - (uint32_t)node->qbase) { - streach_node->total_q += node->total_q; - qdma_list_del(&node->node); - qdma_memfree(node); - } else - streach_node = node; - } - } -} - -/** - * qdma_resource_entry() - return the best free list entry node that can - * accommodate the new request - */ -static struct qdma_resource_entry *qdma_get_resource_node(uint32_t qmax, - int qbase, - struct qdma_list_head *free_list_head) -{ - struct qdma_list_head *entry, *tmp; - struct qdma_resource_entry *best_fit_node = NULL; - - /* try to honor requested qbase */ - if (qbase >= 0) { - qdma_list_for_each_safe(entry, tmp, free_list_head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if ((qbase >= node->qbase) && - (node->qbase + node->total_q) >= - (qbase + qmax)) { - best_fit_node = node; - goto fragment_free_list; - } - } - } - best_fit_node = NULL; - - /* find a best node to accommodate q resource request */ - qdma_list_for_each_safe(entry, tmp, free_list_head) { - struct qdma_resource_entry *node = - (struct qdma_resource_entry *)QDMA_LIST_GET_DATA(entry); - - if (node->total_q >= qmax) { - if (!best_fit_node || (best_fit_node->total_q >= - node->total_q)) { - best_fit_node = node; - qbase = best_fit_node->qbase; - } - } - } - -fragment_free_list: - if (!best_fit_node) - return NULL; - - if ((qbase == best_fit_node->qbase) && - (qmax == best_fit_node->total_q)) - return best_fit_node; - - /* split free resource node accordingly */ - if ((qbase == best_fit_node->qbase) && - (qmax != best_fit_node->total_q)) { - /* - * create an extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase + qmax; - uint32_t lqmax = best_fit_node->total_q - qmax; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_after(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q -= lqmax; - } else if ((qbase > best_fit_node->qbase) && - ((qbase + qmax) == (best_fit_node->qbase + - best_fit_node->total_q))) { - /* - * create an extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase; - uint32_t lqmax = qbase - best_fit_node->qbase; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_before(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q = qmax; - best_fit_node->qbase = qbase; - } else { - /* - * create two extra node to hold the extra queues from this node - */ - struct qdma_resource_entry *new_entry = NULL; - int lqbase = best_fit_node->qbase; - uint32_t lqmax = qbase - best_fit_node->qbase; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_before(&new_entry->node, - &best_fit_node->node); - - best_fit_node->qbase = qbase; - best_fit_node->total_q -= lqmax; - - lqbase = best_fit_node->qbase + qmax; - lqmax = best_fit_node->total_q - qmax; - - new_entry = qdma_free_entry_create(lqbase, lqmax); - if (new_entry == NULL) - return NULL; - QDMA_LIST_SET_DATA(&new_entry->node, new_entry); - qdma_list_insert_after(&new_entry->node, - &best_fit_node->node); - best_fit_node->total_q = qmax; - } - - return best_fit_node; -} - -static int qdma_request_q_resource(struct qdma_dev_entry *dev_entry, - uint32_t new_qmax, int new_qbase, - struct qdma_list_head *free_list_head) -{ - uint32_t qmax = dev_entry->entry.total_q; - int qbase = dev_entry->entry.qbase; - struct qdma_resource_entry *free_entry_node = NULL; - int rv = QDMA_SUCCESS; - - /* submit already allocated queues back to free list before requesting - * new resource - */ - qdma_submit_to_free_list(dev_entry, free_list_head); - - if (!new_qmax) - return 0; - /* check if the request can be accomodated */ - free_entry_node = qdma_get_resource_node(new_qmax, new_qbase, - free_list_head); - if (free_entry_node == NULL) { - /* request cannot be accommodated. Restore the dev_entry */ - free_entry_node = qdma_get_resource_node(qmax, qbase, - free_list_head); - rv = -QDMA_ERR_RM_NO_QUEUES_LEFT; - qdma_log_error("%s: Not enough queues, err:%d\n", __func__, - -QDMA_ERR_RM_NO_QUEUES_LEFT); - if (free_entry_node == NULL) { - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - - return rv; - } - } - - dev_entry->entry.qbase = free_entry_node->qbase; - dev_entry->entry.total_q = free_entry_node->total_q; - - qdma_list_del(&free_entry_node->node); - qdma_memfree(free_entry_node); - - return rv; -} - -int qdma_master_resource_create(uint32_t bus_start, uint32_t bus_end, - int q_base, uint32_t total_q, uint32_t *dma_device_index) -{ - struct qdma_resource_master *q_resource; - struct qdma_resource_entry *free_entry; - static int index; - - q_resource = qdma_find_master_resource_entry(bus_start, bus_end); - if (q_resource) { - *dma_device_index = q_resource->dma_device_index; - qdma_log_debug("%s: Resource already created", __func__); - qdma_log_debug("for this device(%d)\n", - q_resource->dma_device_index); - return -QDMA_ERR_RM_RES_EXISTS; - } - - *dma_device_index = index; - - q_resource = (struct qdma_resource_master *)qdma_calloc(1, - sizeof(struct qdma_resource_master)); - if (!q_resource) { - qdma_log_error("%s: no memory for q_resource, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - free_entry = (struct qdma_resource_entry *) - qdma_calloc(1, sizeof(struct qdma_resource_entry)); - if (!free_entry) { - qdma_memfree(q_resource); - qdma_log_error("%s: no memory for free_entry, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_resource_lock_take(); - q_resource->dma_device_index = index; - q_resource->pci_bus_start = bus_start; - q_resource->pci_bus_end = bus_end; - q_resource->total_q = total_q; - q_resource->qbase = q_base; - qdma_list_init_head(&q_resource->dev_list); - qdma_list_init_head(&q_resource->free_list); - QDMA_LIST_SET_DATA(&q_resource->node, q_resource); - QDMA_LIST_SET_DATA(&q_resource->free_list, q_resource); - qdma_list_add_tail(&q_resource->node, &master_resource_list); - - - free_entry->total_q = total_q; - free_entry->qbase = q_base; - QDMA_LIST_SET_DATA(&free_entry->node, free_entry); - qdma_list_add_tail(&free_entry->node, &q_resource->free_list); - qdma_resource_lock_give(); - - qdma_log_debug("%s: New master resource created at %d", - __func__, index); - ++index; - - return QDMA_SUCCESS; -} - -void qdma_master_resource_destroy(uint32_t dma_device_index) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_list_head *entry, *tmp; - - if (!q_resource) - return; - qdma_resource_lock_take(); - if (!qdma_list_is_empty(&q_resource->dev_list)) { - qdma_resource_lock_give(); - return; - } - qdma_list_for_each_safe(entry, tmp, &q_resource->free_list) { - struct qdma_resource_entry *free_entry = - (struct qdma_resource_entry *) - QDMA_LIST_GET_DATA(entry); - - qdma_list_del(&free_entry->node); - qdma_memfree(free_entry); - } - qdma_list_del(&q_resource->node); - qdma_memfree(q_resource); - qdma_resource_lock_give(); -} - - -int qdma_dev_entry_create(uint32_t dma_device_index, uint16_t func_id) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, - -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - if (!dev_entry) { - qdma_resource_lock_take(); - dev_entry = (struct qdma_dev_entry *) - qdma_calloc(1, sizeof(struct qdma_dev_entry)); - if (dev_entry == NULL) { - qdma_resource_lock_give(); - qdma_log_error("%s: Insufficient memory, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - dev_entry->func_id = func_id; - dev_entry->entry.qbase = -1; - dev_entry->entry.total_q = 0; - QDMA_LIST_SET_DATA(&dev_entry->entry.node, dev_entry); - qdma_list_add_tail(&dev_entry->entry.node, - &q_resource->dev_list); - qdma_resource_lock_give(); - qdma_log_info("%s: Created the dev entry successfully\n", - __func__); - } else { - qdma_log_error("%s: Dev entry already created, err = %d\n", - __func__, - -QDMA_ERR_RM_DEV_EXISTS); - return -QDMA_ERR_RM_DEV_EXISTS; - } - - return QDMA_SUCCESS; -} - -void qdma_dev_entry_destroy(uint32_t dma_device_index, uint16_t func_id) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found.\n", __func__); - return; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found\n", __func__); - return; - } - qdma_resource_lock_take(); - qdma_submit_to_free_list(dev_entry, &q_resource->free_list); - - qdma_list_del(&dev_entry->entry.node); - qdma_memfree(dev_entry); - qdma_resource_lock_give(); -} - -int qdma_dev_update(uint32_t dma_device_index, uint16_t func_id, - uint32_t qmax, int *qbase) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev Entry not found, err: %d\n", - __func__, - -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - - /* if any active queue on device, no more new qmax - * configuration allowed - */ - if (dev_entry->active_h2c_qcnt || - dev_entry->active_c2h_qcnt || - dev_entry->active_cmpt_qcnt) { - qdma_resource_lock_give(); - qdma_log_error("%s: Qs active. Config blocked, err: %d\n", - __func__, -QDMA_ERR_RM_QMAX_CONF_REJECTED); - return -QDMA_ERR_RM_QMAX_CONF_REJECTED; - } - - rv = qdma_request_q_resource(dev_entry, qmax, *qbase, - &q_resource->free_list); - - *qbase = dev_entry->entry.qbase; - qdma_resource_lock_give(); - - - return rv; -} - -int qdma_dev_qinfo_get(uint32_t dma_device_index, uint16_t func_id, - int *qbase, uint32_t *qmax) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_debug("%s: Dev Entry not created yet\n", __func__); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - *qbase = dev_entry->entry.qbase; - *qmax = dev_entry->entry.total_q; - qdma_resource_lock_give(); - - return QDMA_SUCCESS; -} - -enum qdma_dev_q_range qdma_dev_is_queue_in_range(uint32_t dma_device_index, - uint16_t func_id, - uint32_t qid_hw) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - uint32_t qmax; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return QDMA_DEV_Q_OUT_OF_RANGE; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found, err: %d\n", - __func__, -QDMA_ERR_RM_DEV_NOT_EXISTS); - return QDMA_DEV_Q_OUT_OF_RANGE; - } - - qdma_resource_lock_take(); - qmax = dev_entry->entry.qbase + dev_entry->entry.total_q; - if (dev_entry->entry.total_q && (qid_hw < qmax) && - ((int)qid_hw >= dev_entry->entry.qbase)) { - qdma_resource_lock_give(); - return QDMA_DEV_Q_IN_RANGE; - } - qdma_resource_lock_give(); - - return QDMA_DEV_Q_OUT_OF_RANGE; -} - -int qdma_dev_increment_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv = QDMA_SUCCESS; - uint32_t *active_qcnt = NULL; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev Entry not found, err: %d\n", - __func__, - -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - active_qcnt = &dev_entry->active_h2c_qcnt; - break; - case QDMA_DEV_Q_TYPE_C2H: - active_qcnt = &dev_entry->active_c2h_qcnt; - break; - case QDMA_DEV_Q_TYPE_CMPT: - active_qcnt = &dev_entry->active_cmpt_qcnt; - break; - default: - rv = -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - if (active_qcnt && (dev_entry->entry.total_q < ((*active_qcnt) + 1))) { - qdma_resource_lock_give(); - return -QDMA_ERR_RM_NO_QUEUES_LEFT; - } - - if (active_qcnt) { - *active_qcnt = (*active_qcnt) + 1; - q_resource->active_qcnt++; - } - qdma_resource_lock_give(); - - return rv; -} - - -int qdma_dev_decrement_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - int rv = QDMA_SUCCESS; - - if (!q_resource) { - qdma_log_error("%s: Queue resource not found, err: %d\n", - __func__, - -QDMA_ERR_RM_RES_NOT_EXISTS); - return -QDMA_ERR_RM_RES_NOT_EXISTS; - } - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) { - qdma_log_error("%s: Dev entry not found, err: %d\n", - __func__, -QDMA_ERR_RM_DEV_NOT_EXISTS); - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - if (dev_entry->active_h2c_qcnt) - dev_entry->active_h2c_qcnt--; - break; - case QDMA_DEV_Q_TYPE_C2H: - if (dev_entry->active_c2h_qcnt) - dev_entry->active_c2h_qcnt--; - break; - case QDMA_DEV_Q_TYPE_CMPT: - if (dev_entry->active_cmpt_qcnt) - dev_entry->active_cmpt_qcnt--; - break; - default: - rv = -QDMA_ERR_RM_DEV_NOT_EXISTS; - } - q_resource->active_qcnt--; - qdma_resource_lock_give(); - - return rv; -} - -uint32_t qdma_get_active_queue_count(uint32_t dma_device_index) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - uint32_t q_cnt; - - if (!q_resource) - return QDMA_SUCCESS; - - qdma_resource_lock_take(); - q_cnt = q_resource->active_qcnt; - qdma_resource_lock_give(); - - return q_cnt; -} - -int qdma_get_device_active_queue_count(uint32_t dma_device_index, - uint16_t func_id, - enum qdma_dev_q_type q_type) -{ - struct qdma_resource_master *q_resource = - qdma_get_master_resource_entry(dma_device_index); - struct qdma_dev_entry *dev_entry; - uint32_t dev_active_qcnt = 0; - - if (!q_resource) - return -QDMA_ERR_RM_RES_NOT_EXISTS; - - dev_entry = qdma_get_dev_entry(dma_device_index, func_id); - - if (!dev_entry) - return -QDMA_ERR_RM_DEV_NOT_EXISTS; - - qdma_resource_lock_take(); - switch (q_type) { - case QDMA_DEV_Q_TYPE_H2C: - dev_active_qcnt = dev_entry->active_h2c_qcnt; - break; - case QDMA_DEV_Q_TYPE_C2H: - dev_active_qcnt = dev_entry->active_c2h_qcnt; - break; - case QDMA_DEV_Q_TYPE_CMPT: - dev_active_qcnt = dev_entry->active_cmpt_qcnt; - break; - default: - dev_active_qcnt = 0; - } - qdma_resource_lock_give(); - - return dev_active_qcnt; -} diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_resource_mgmt.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_resource_mgmt.h deleted file mode 100644 index 436a77f..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_resource_mgmt.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_RESOURCE_MGMT_H_ -#define __QDMA_RESOURCE_MGMT_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA resource management interface definitions - * - * Header file *qdma_resource_mgmt.h* defines data structures and function - * signatures exported for QDMA queue management. - */ - -#include "qdma_platform_env.h" -#include "qdma_access_export.h" - -/** - * enum qdma_dev_q_range: Q ranage check - */ -enum qdma_dev_q_range { - /** @QDMA_DEV_Q_IN_RANGE: Q belongs to dev */ - QDMA_DEV_Q_IN_RANGE, - /** @QDMA_DEV_Q_OUT_OF_RANGE: Q does not belong to dev */ - QDMA_DEV_Q_OUT_OF_RANGE, - /** @QDMA_DEV_Q_RANGE_MAX: total Q validity states */ - QDMA_DEV_Q_RANGE_MAX -}; - -/*****************************************************************************/ -/** - * qdma_master_resource_create(): create the master q resource - * - * @bus_start: Bus number of the device i.e. pdev->bus->number - * @bus_end: Ending bus number i.e. the subordinate bus number of the - * parent bridge - * @q_base: base from which this master resource needs to be created - * @total_q: total queues in this master resource - * @dma_device_index: DMA device identifier assigned by resource manager to - * track the number of devices - * - * A master resource per driver per board is created to manage the queues - * allocated to this driver. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_master_resource_create(uint32_t bus_start, uint32_t bus_end, - int q_base, uint32_t total_q, uint32_t *dma_device_index); - -/*****************************************************************************/ -/** - * qdma_master_resource_destroy(): destroy the master q resource - * - * @dma_device_index: DMA device identifier this master resource belongs to - * - * Return: None - *****************************************************************************/ -void qdma_master_resource_destroy(uint32_t dma_device_index); - -/*****************************************************************************/ -/** - * qdma_dev_entry_create(): create a device entry for @func_id - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * - * A device entry is to be created on every function probe. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_entry_create(uint32_t dma_device_index, uint16_t func_id); - -/*****************************************************************************/ -/** - * qdma_dev_entry_destroy(): destroy device entry for @func_id - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * - * Return: None - *****************************************************************************/ -void qdma_dev_entry_destroy(uint32_t dma_device_index, uint16_t func_id); - -/*****************************************************************************/ -/** - * qdma_dev_update(): update qmax for the device - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @dev_type: device type - * @qmax: qmax for this device - * @qbase: output qbase for this device - * - * This API is to be called for update request of qmax of any function. - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_update(uint32_t dma_device_index, uint16_t func_id, - uint32_t qmax, int *qbase); - -/*****************************************************************************/ -/** - * qdma_dev_qinfo_get(): get device info - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @dev_type: device type - * @qmax: output qmax for this device - * @qbase: output qbase for this device - * - * This API can be used get the qbase and qmax for any function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_qinfo_get(uint32_t dma_device_index, uint16_t func_id, - int *qbase, uint32_t *qmax); - -/*****************************************************************************/ -/** - * qdma_dev_is_queue_in_range(): check if queue belongs to this device - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @qid_hw: hardware queue id - * - * This API checks if the queue ID is in valid range for function specified - * - * Return: @QDMA_DEV_Q_IN_RANGE : valid and - * @QDMA_DEV_Q_OUT_OF_RANGE: invalid - *****************************************************************************/ -enum qdma_dev_q_range qdma_dev_is_queue_in_range(uint32_t dma_device_index, - uint16_t func_id, - uint32_t qid_hw); - -/*****************************************************************************/ -/** - * qdma_dev_increment_active_queue(): increment active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to increment the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_increment_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type); - -/*****************************************************************************/ -/** - * qdma_dev_decrement_active_queue(): increment active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to increment the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_dev_decrement_active_queue(uint32_t dma_device_index, uint16_t func_id, - enum qdma_dev_q_type q_type); - -/*****************************************************************************/ -/** - * qdma_is_active_queue(): check if any queue is active - * - * @dma_device_index: DMA device identifier that this resource belongs to - * - * This API is used to check if any active queue is present. - * - * Return: active queue count - *****************************************************************************/ -uint32_t qdma_get_active_queue_count(uint32_t dma_device_index); - -/*****************************************************************************/ -/** - * qdma_get_device_active_queue_count(): get device active queue count - * - * @dma_device_index: DMA device identifier that this device belongs to - * @func_id: device identification id - * @q_type: Queue type i.e. C2H or H2C or CMPT - * - * This API is used to get the active queue count of this function - * - * Return: 0 : success and < 0: failure - *****************************************************************************/ -int qdma_get_device_active_queue_count(uint32_t dma_device_index, - uint16_t func_id, - enum qdma_dev_q_type q_type); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_RESOURCE_MGMT_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_access.c b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_access.c deleted file mode 100644 index 65dd310..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_access.c +++ /dev/null @@ -1,5894 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "qdma_s80_hard_access.h" -#include "qdma_s80_hard_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_s80_hard_access.tmh" -#endif - -/** QDMA S80 Hard Context array size */ -#define QDMA_S80_HARD_SW_CONTEXT_NUM_WORDS 4 -#define QDMA_S80_HARD_CMPT_CONTEXT_NUM_WORDS 4 -#define QDMA_S80_HARD_QID2VEC_CONTEXT_NUM_WORDS 1 -#define QDMA_S80_HARD_HW_CONTEXT_NUM_WORDS 2 -#define QDMA_S80_HARD_CR_CONTEXT_NUM_WORDS 1 -#define QDMA_S80_HARD_IND_INTR_CONTEXT_NUM_WORDS 3 -#define QDMA_S80_HARD_PFETCH_CONTEXT_NUM_WORDS 2 - -#define QDMA_S80_HARD_VF_USER_BAR_ID 2 - -#define QDMA_S80_REG_GROUP_1_START_ADDR 0x000 -#define QDMA_S80_REG_GROUP_2_START_ADDR 0x400 -#define QDMA_S80_REG_GROUP_3_START_ADDR 0xB00 -#define QDMA_S80_REG_GROUP_4_START_ADDR 0x1014 - -#define QDMA_S80_HARD_REG_TRQ_SEL_FMAP_STEP 4 - -#define QDMA_S80_HARD_IND_CTXT_DATA_NUM_REGS 4 - -#define QDMA_S80_HARD_TOTAL_LEAF_ERROR_AGGREGATORS 7 -#define QDMA_S80_HARD_GLBL_TRQ_ERR_ALL_MASK 0XB3 -#define QDMA_S80_HARD_GLBL_DSC_ERR_ALL_MASK 0X1F9037E -#define QDMA_S80_HARD_C2H_ERR_ALL_MASK 0X3F6DF -#define QDMA_S80_HARD_C2H_FATAL_ERR_ALL_MASK 0X1FDF1B -#define QDMA_S80_HARD_H2C_ERR_ALL_MASK 0X3F -#define QDMA_S80_HARD_SBE_ERR_ALL_MASK 0XFFFFFFFF -#define QDMA_S80_HARD_DBE_ERR_ALL_MASK 0XFFFFFFFF - -#define QDMA_S80_HARD_OFFSET_DMAP_SEL_INT_CIDX 0x6400 -#define QDMA_S80_HARD_OFFSET_DMAP_SEL_H2C_DSC_PIDX 0x6404 -#define QDMA_S80_HARD_OFFSET_DMAP_SEL_C2H_DSC_PIDX 0x6408 -#define QDMA_S80_HARD_OFFSET_DMAP_SEL_CMPT_CIDX 0x640C - -#define QDMA_S80_HARD_OFFSET_VF_DMAP_SEL_INT_CIDX 0x3000 -#define QDMA_S80_HARD_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX 0x3004 -#define QDMA_S80_HARD_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX 0x3008 -#define QDMA_S80_HARD_OFFSET_VF_DMAP_SEL_CMPT_CIDX 0x300C - -#define QDMA_S80_HARD_DMA_SEL_INT_SW_CIDX_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_DMA_SEL_INT_RING_IDX_MASK GENMASK(23, 16) -#define QDMA_S80_HARD_DMA_SEL_DESC_PIDX_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_DMA_SEL_IRQ_EN_MASK BIT(16) -#define QDMA_S80_HARD_DMAP_SEL_CMPT_IRQ_EN_MASK BIT(28) -#define QDMA_S80_HARD_DMAP_SEL_CMPT_STS_DESC_EN_MASK BIT(27) -#define QDMA_S80_HARD_DMAP_SEL_CMPT_TRG_MODE_MASK GENMASK(26, 24) -#define QDMA_S80_HARD_DMAP_SEL_CMPT_TMR_CNT_MASK GENMASK(23, 20) -#define QDMA_S80_HARD_DMAP_SEL_CMPT_CNT_THRESH_MASK GENMASK(19, 16) -#define QDMA_S80_HARD_DMAP_SEL_CMPT_WRB_CIDX_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_INTR_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 35) -#define QDMA_S80_HARD_INTR_CTXT_BADDR_GET_L_MASK GENMASK_ULL(34, 12) -#define QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_H_MASK GENMASK_ULL(63, 42) -#define QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_M_MASK GENMASK_ULL(41, 10) -#define QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_L_MASK GENMASK_ULL(9, 6) -#define QDMA_S80_HARD_COMPL_CTXT_PIDX_GET_H_MASK GENMASK(15, 8) -#define QDMA_S80_HARD_COMPL_CTXT_PIDX_GET_L_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_QID2VEC_H2C_VECTOR GENMASK(16, 9) -#define QDMA_S80_HARD_QID2VEC_H2C_COAL_EN BIT(17) - -static void qdma_s80_hard_hw_st_h2c_err_process(void *dev_hndl); -static void qdma_s80_hard_hw_st_c2h_err_process(void *dev_hndl); -static void qdma_s80_hard_hw_desc_err_process(void *dev_hndl); -static void qdma_s80_hard_hw_trq_err_process(void *dev_hndl); -static void qdma_s80_hard_hw_ram_sbe_err_process(void *dev_hndl); -static void qdma_s80_hard_hw_ram_dbe_err_process(void *dev_hndl); - -static struct qdma_s80_hard_hw_err_info - qdma_s80_hard_err_info[QDMA_S80_HARD_ERRS_ALL] = { - /* Descriptor errors */ - { - QDMA_S80_HARD_DSC_ERR_POISON, - "Poison error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_UR_CA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_PARAM, - "Parameter mismatch error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_PARAM_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_ADDR, - "Address mismatch error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_ADDR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_TAG, - "Unexpected tag error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TAG_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_FLR, - "FLR error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_TIMEOUT, - "Timed out error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_DAT_POISON, - "Poison data error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DAT_POISON_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_DMA, - "DMA engine error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DMA_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_DSC, - "Invalid PIDX update error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DSC_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_DBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - GLBL_DSC_ERR_STS_SBE_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - { - QDMA_S80_HARD_DSC_ERR_ALL, - "All Descriptor errors", - QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - QDMA_S80_HARD_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_DSC_MASK, - &qdma_s80_hard_hw_desc_err_process - }, - - /* TRQ errors */ - { - QDMA_S80_HARD_TRQ_ERR_UNMAPPED, - "Access targeted unmapped register space via CSR pathway error", - QDMA_S80_HARD_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_UNMAPPED_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_s80_hard_hw_trq_err_process - }, - { - QDMA_S80_HARD_TRQ_ERR_QID_RANGE, - "Qid range error", - QDMA_S80_HARD_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_QID_RANGE_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_s80_hard_hw_trq_err_process - }, - { - QDMA_S80_HARD_TRQ_ERR_VF_ACCESS_ERR, - "VF attempted to access Global register space or Function map", - QDMA_S80_HARD_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_s80_hard_hw_trq_err_process - }, - { - QDMA_S80_HARD_TRQ_ERR_TCP_TIMEOUT, - "Timeout on request to dma internal csr register", - QDMA_S80_HARD_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_TRQ_ERR_STS_ADDR, - GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_s80_hard_hw_trq_err_process - }, - { - QDMA_S80_HARD_TRQ_ERR_ALL, - "All TRQ errors", - QDMA_S80_HARD_GLBL_TRQ_ERR_MSK_ADDR, - QDMA_S80_HARD_GLBL_TRQ_ERR_STS_ADDR, - QDMA_S80_HARD_GLBL_TRQ_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_TRQ_MASK, - &qdma_s80_hard_hw_trq_err_process - }, - - /* C2H Errors*/ - { - QDMA_S80_HARD_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_DESC_RSP_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_MSI_INT_FAIL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_ERR_DESC_CNT_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - "Port id in packet and bypass in mismatch error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_WRB_INV_Q_ERR, - "Writeback on invalid queue error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_WRB_QFULL_ERR, - "Completion queue gets full error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_QFULL_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_WRB_CIDX_ERR, - "Bad CIDX update by the software error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_CIDX_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_WRB_PRTY_ERR, - "C2H completion Parity error", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - C2H_ERR_STAT_WRB_PRTY_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_C2H_ERR_ALL, - "All C2h errors", - QDMA_S80_HARD_C2H_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - QDMA_S80_HARD_C2H_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - QDMA_S80_HARD_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_WRB_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_INT_QID2VEC_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_WRB_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_WPL_DATA_PAR_ERR, - "RAM double bit fatal error", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - { - QDMA_S80_HARD_ST_FATAL_ERR_ALL, - "All fatal errors", - QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_C2H_ST_MASK, - &qdma_s80_hard_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - QDMA_S80_HARD_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - "Zero length descriptor error", - QDMA_S80_HARD_H2C_ERR_MASK_ADDR, - QDMA_S80_HARD_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_ZERO_LEN_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_s80_hard_hw_st_h2c_err_process - }, - { - QDMA_S80_HARD_ST_H2C_ERR_SDI_MRKR_REQ_MOP_ERR, - "A non-EOP descriptor received", - QDMA_S80_HARD_H2C_ERR_MASK_ADDR, - QDMA_S80_HARD_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_s80_hard_hw_st_h2c_err_process - }, - { - QDMA_S80_HARD_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - QDMA_S80_HARD_H2C_ERR_MASK_ADDR, - QDMA_S80_HARD_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_NO_DMA_DS_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_s80_hard_hw_st_h2c_err_process - }, - { - QDMA_S80_HARD_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - QDMA_S80_HARD_H2C_ERR_MASK_ADDR, - QDMA_S80_HARD_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_DBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_s80_hard_hw_st_h2c_err_process - }, - { - QDMA_S80_HARD_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - QDMA_S80_HARD_H2C_ERR_MASK_ADDR, - QDMA_S80_HARD_H2C_ERR_STAT_ADDR, - H2C_ERR_STAT_SBE_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_s80_hard_hw_st_h2c_err_process - }, - { - QDMA_S80_HARD_ST_H2C_ERR_ALL, - "All H2C errors", - QDMA_S80_HARD_H2C_ERR_MASK_ADDR, - QDMA_S80_HARD_H2C_ERR_STAT_ADDR, - QDMA_S80_HARD_H2C_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_H2C_ST_MASK, - &qdma_s80_hard_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - QDMA_S80_HARD_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_PASID_CTXT_RAM, - "Pasid ctxt FIFO RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PASID_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload FIFO RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PLD_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER FIFO RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - RAM_SBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - { - QDMA_S80_HARD_SBE_ERR_ALL, - "All SBE errors", - QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - QDMA_S80_HARD_SBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_SBE_MASK, - &qdma_s80_hard_hw_ram_sbe_err_process - }, - - - /* DBE errors */ - { - QDMA_S80_HARD_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_H2C0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_MI_C2H0_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_FUNC_MAP_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_HW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CRD_RCV_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_SW_CTXT_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLI_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DSC_CPLD_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_PASID_CTXT_RAM, - "PASID CTXT RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PASID_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_PAYLOAD_FIFO_RAM, - "Payload fifo RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PLD_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_QID_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_WRB_COAL_DATA_RAM, - "Writeback Coalescing RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_INT_QID2VEC_RAM, - "QID2VEC RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_INT_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - RAM_DBE_STS_A_PFCH_LL_RAM_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - }, - { - QDMA_S80_HARD_DBE_ERR_ALL, - "All DBE errors", - QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR, - QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - QDMA_S80_HARD_DBE_ERR_ALL_MASK, - GLBL_ERR_STAT_ERR_RAM_DBE_MASK, - &qdma_s80_hard_hw_ram_dbe_err_process - } -}; - -static int32_t all_qdma_s80_hard_hw_errs[ - QDMA_S80_HARD_TOTAL_LEAF_ERROR_AGGREGATORS] = { - - QDMA_S80_HARD_DSC_ERR_ALL, - QDMA_S80_HARD_TRQ_ERR_ALL, - QDMA_S80_HARD_ST_C2H_ERR_ALL, - QDMA_S80_HARD_ST_FATAL_ERR_ALL, - QDMA_S80_HARD_ST_H2C_ERR_ALL, - QDMA_S80_HARD_SBE_ERR_ALL, - QDMA_S80_HARD_DBE_ERR_ALL -}; - - - -union qdma_s80_hard_ind_ctxt_cmd { - uint32_t word; - struct { - uint32_t busy:1; - uint32_t sel:4; - uint32_t op:2; - uint32_t qid:11; - uint32_t rsvd:14; - } bits; -}; - -struct qdma_s80_hard_indirect_ctxt_regs { - uint32_t qdma_ind_ctxt_data[QDMA_S80_HARD_IND_CTXT_DATA_NUM_REGS]; - uint32_t qdma_ind_ctxt_mask[QDMA_S80_HARD_IND_CTXT_DATA_NUM_REGS]; - union qdma_s80_hard_ind_ctxt_cmd cmd; -}; - -static struct qctx_entry qdma_s80_hard_sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Function Id", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, -}; - -static struct qctx_entry qdma_s80_hard_hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry qdma_s80_hard_credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry qdma_s80_hard_cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Address (Low)", 0}, - {"Base Address (High)", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, -}; - -static struct qctx_entry qdma_s80_hard_c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry qdma_s80_hard_qid2vec_ctxt_entries[] = { - {"c2h_vector", 0}, - {"c2h_en_coal", 0}, - {"h2c_vector", 0}, - {"h2c_en_coal", 0}, -}; - -static struct qctx_entry qdma_s80_hard_ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, -}; - -static int qdma_s80_hard_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_s80_hard_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_s80_hard_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int qdma_s80_hard_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - -uint32_t qdma_s80_hard_get_config_num_regs(void) -{ - return qdma_s80_hard_config_num_regs_get(); -} - -struct xreg_info *qdma_s80_hard_get_config_regs(void) -{ - return qdma_s80_hard_config_regs_get(); -} - -uint32_t qdma_s80_hard_reg_dump_buf_len(void) -{ - uint32_t length = (qdma_s80_hard_config_num_regs_get() + 1) - * REG_DUMP_SIZE_PER_LINE; - return length; -} - -int qdma_s80_hard_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *req_buflen) -{ - uint32_t len = 0; - int rv = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(qdma_s80_hard_cmpt_ctxt_entries) / - sizeof(qdma_s80_hard_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(qdma_s80_hard_sw_ctxt_entries) / - sizeof(qdma_s80_hard_sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_s80_hard_hw_ctxt_entries) / - sizeof(qdma_s80_hard_hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_s80_hard_credit_ctxt_entries) / - sizeof(qdma_s80_hard_credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(qdma_s80_hard_cmpt_ctxt_entries) / - sizeof(qdma_s80_hard_cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(qdma_s80_hard_c2h_pftch_ctxt_entries) / - sizeof(qdma_s80_hard_c2h_pftch_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } - } - - *req_buflen = len; - return rv; -} - -static uint32_t qdma_s80_hard_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(qdma_s80_hard_ind_intr_ctxt_entries) / - sizeof(qdma_s80_hard_ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * qdma_acc_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void qdma_s80_hard_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - qdma_s80_hard_sw_ctxt_entries[0].value = sw_ctxt->pidx; - qdma_s80_hard_sw_ctxt_entries[1].value = sw_ctxt->irq_arm; - qdma_s80_hard_sw_ctxt_entries[2].value = sw_ctxt->qen; - qdma_s80_hard_sw_ctxt_entries[3].value = sw_ctxt->frcd_en; - qdma_s80_hard_sw_ctxt_entries[4].value = sw_ctxt->wbi_chk; - qdma_s80_hard_sw_ctxt_entries[5].value = sw_ctxt->wbi_intvl_en; - qdma_s80_hard_sw_ctxt_entries[6].value = sw_ctxt->fnc_id; - qdma_s80_hard_sw_ctxt_entries[7].value = sw_ctxt->rngsz_idx; - qdma_s80_hard_sw_ctxt_entries[8].value = sw_ctxt->desc_sz; - qdma_s80_hard_sw_ctxt_entries[9].value = sw_ctxt->bypass; - qdma_s80_hard_sw_ctxt_entries[10].value = sw_ctxt->mm_chn; - qdma_s80_hard_sw_ctxt_entries[11].value = sw_ctxt->wbk_en; - qdma_s80_hard_sw_ctxt_entries[12].value = sw_ctxt->irq_en; - qdma_s80_hard_sw_ctxt_entries[13].value = sw_ctxt->port_id; - qdma_s80_hard_sw_ctxt_entries[14].value = sw_ctxt->irq_no_last; - qdma_s80_hard_sw_ctxt_entries[15].value = sw_ctxt->err; - qdma_s80_hard_sw_ctxt_entries[16].value = sw_ctxt->err_wb_sent; - qdma_s80_hard_sw_ctxt_entries[17].value = sw_ctxt->irq_req; - qdma_s80_hard_sw_ctxt_entries[18].value = sw_ctxt->mrkr_dis; - qdma_s80_hard_sw_ctxt_entries[19].value = sw_ctxt->is_mm; - qdma_s80_hard_sw_ctxt_entries[20].value = - sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - qdma_s80_hard_sw_ctxt_entries[21].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; -} - -/* - * qdma_acc_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void qdma_s80_hard_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - qdma_s80_hard_cmpt_ctxt_entries[0].value = cmpt_ctxt->en_stat_desc; - qdma_s80_hard_cmpt_ctxt_entries[1].value = cmpt_ctxt->en_int; - qdma_s80_hard_cmpt_ctxt_entries[2].value = cmpt_ctxt->trig_mode; - qdma_s80_hard_cmpt_ctxt_entries[3].value = cmpt_ctxt->fnc_id; - qdma_s80_hard_cmpt_ctxt_entries[4].value = cmpt_ctxt->counter_idx; - qdma_s80_hard_cmpt_ctxt_entries[5].value = cmpt_ctxt->timer_idx; - qdma_s80_hard_cmpt_ctxt_entries[6].value = cmpt_ctxt->in_st; - qdma_s80_hard_cmpt_ctxt_entries[7].value = cmpt_ctxt->color; - qdma_s80_hard_cmpt_ctxt_entries[8].value = cmpt_ctxt->ringsz_idx; - qdma_s80_hard_cmpt_ctxt_entries[9].value = - cmpt_ctxt->bs_addr & 0xFFFFFFFF; - qdma_s80_hard_cmpt_ctxt_entries[10].value = - (cmpt_ctxt->bs_addr >> 32) & 0xFFFFFFFF; - qdma_s80_hard_cmpt_ctxt_entries[11].value = cmpt_ctxt->desc_sz; - qdma_s80_hard_cmpt_ctxt_entries[12].value = cmpt_ctxt->pidx; - qdma_s80_hard_cmpt_ctxt_entries[13].value = cmpt_ctxt->cidx; - qdma_s80_hard_cmpt_ctxt_entries[14].value = cmpt_ctxt->valid; - qdma_s80_hard_cmpt_ctxt_entries[15].value = cmpt_ctxt->err; - qdma_s80_hard_cmpt_ctxt_entries[16].value = cmpt_ctxt->user_trig_pend; - qdma_s80_hard_cmpt_ctxt_entries[17].value = cmpt_ctxt->timer_running; - qdma_s80_hard_cmpt_ctxt_entries[18].value = cmpt_ctxt->full_upd; - -} - -/* - * qdma_acc_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void qdma_s80_hard_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - qdma_s80_hard_hw_ctxt_entries[0].value = hw_ctxt->cidx; - qdma_s80_hard_hw_ctxt_entries[1].value = hw_ctxt->crd_use; - qdma_s80_hard_hw_ctxt_entries[2].value = hw_ctxt->dsc_pend; - qdma_s80_hard_hw_ctxt_entries[3].value = hw_ctxt->idl_stp_b; - qdma_s80_hard_hw_ctxt_entries[4].value = hw_ctxt->evt_pnd; - qdma_s80_hard_hw_ctxt_entries[5].value = hw_ctxt->fetch_pnd; -} - -/* - * qdma_acc_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void qdma_s80_hard_fill_credit_ctxt( - struct qdma_descq_credit_ctxt *cr_ctxt) -{ - qdma_s80_hard_credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * qdma_acc_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void qdma_s80_hard_fill_pfetch_ctxt( - struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - qdma_s80_hard_c2h_pftch_ctxt_entries[0].value = pfetch_ctxt->bypass; - qdma_s80_hard_c2h_pftch_ctxt_entries[1].value = pfetch_ctxt->bufsz_idx; - qdma_s80_hard_c2h_pftch_ctxt_entries[2].value = pfetch_ctxt->port_id; - qdma_s80_hard_c2h_pftch_ctxt_entries[3].value = pfetch_ctxt->err; - qdma_s80_hard_c2h_pftch_ctxt_entries[4].value = pfetch_ctxt->pfch_en; - qdma_s80_hard_c2h_pftch_ctxt_entries[5].value = pfetch_ctxt->pfch; - qdma_s80_hard_c2h_pftch_ctxt_entries[6].value = pfetch_ctxt->sw_crdt; - qdma_s80_hard_c2h_pftch_ctxt_entries[7].value = pfetch_ctxt->valid; -} - -static void qdma_s80_hard_fill_qid2vec_ctxt(struct qdma_qid2vec *qid2vec_ctxt) -{ - qdma_s80_hard_qid2vec_ctxt_entries[0].value = qid2vec_ctxt->c2h_vector; - qdma_s80_hard_qid2vec_ctxt_entries[1].value = qid2vec_ctxt->c2h_en_coal; - qdma_s80_hard_qid2vec_ctxt_entries[2].value = qid2vec_ctxt->h2c_vector; - qdma_s80_hard_qid2vec_ctxt_entries[3].value = qid2vec_ctxt->h2c_en_coal; -} - -static void qdma_s80_hard_fill_intr_ctxt( - struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - qdma_s80_hard_ind_intr_ctxt_entries[0].value = intr_ctxt->valid; - qdma_s80_hard_ind_intr_ctxt_entries[1].value = intr_ctxt->vec; - qdma_s80_hard_ind_intr_ctxt_entries[2].value = intr_ctxt->int_st; - qdma_s80_hard_ind_intr_ctxt_entries[3].value = intr_ctxt->color; - qdma_s80_hard_ind_intr_ctxt_entries[4].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - qdma_s80_hard_ind_intr_ctxt_entries[5].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - qdma_s80_hard_ind_intr_ctxt_entries[6].value = intr_ctxt->page_size; - qdma_s80_hard_ind_intr_ctxt_entries[7].value = intr_ctxt->pidx; -} - -/* - * dump_s80_hard_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_s80_hard_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_CMPT) { - qdma_log_error("%s: Invalid queue type(%d), err:%d\n", - __func__, - q_type, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_s80_hard_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_s80_hard_fill_credit_ctxt(&queue_context->cr_ctxt); - qdma_s80_hard_fill_qid2vec_ctxt(&queue_context->qid2vec); - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - qdma_s80_hard_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - qdma_s80_hard_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* SW context dump */ - n = sizeof(qdma_s80_hard_sw_ctxt_entries) / - sizeof((qdma_s80_hard_sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_s80_hard_sw_ctxt_entries[i].name, - qdma_s80_hard_sw_ctxt_entries[i].value, - qdma_s80_hard_sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(qdma_s80_hard_hw_ctxt_entries) / - sizeof((qdma_s80_hard_hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_s80_hard_hw_ctxt_entries[i].name, - qdma_s80_hard_hw_ctxt_entries[i].value, - qdma_s80_hard_hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(qdma_s80_hard_credit_ctxt_entries) / - sizeof((qdma_s80_hard_credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_s80_hard_credit_ctxt_entries[i].name, - qdma_s80_hard_credit_ctxt_entries[i].value, - qdma_s80_hard_credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - /* SW context dump */ - n = sizeof(qdma_s80_hard_qid2vec_ctxt_entries) / - sizeof((qdma_s80_hard_qid2vec_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "QID2VEC Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_s80_hard_qid2vec_ctxt_entries[i].name, - qdma_s80_hard_qid2vec_ctxt_entries[i].value, - qdma_s80_hard_qid2vec_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(qdma_s80_hard_cmpt_ctxt_entries) / - sizeof((qdma_s80_hard_cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_s80_hard_cmpt_ctxt_entries[i].name, - qdma_s80_hard_cmpt_ctxt_entries[i].value, - qdma_s80_hard_cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(qdma_s80_hard_c2h_pftch_ctxt_entries) / - sizeof(qdma_s80_hard_c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_s80_hard_c2h_pftch_ctxt_entries[i].name, - qdma_s80_hard_c2h_pftch_ctxt_entries[i].value, - qdma_s80_hard_c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -static int dump_s80_hard_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - qdma_s80_hard_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(qdma_s80_hard_ind_intr_ctxt_entries) / - sizeof((qdma_s80_hard_ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - qdma_s80_hard_ind_intr_ctxt_entries[i].name, - qdma_s80_hard_ind_intr_ctxt_entries[i].value, - qdma_s80_hard_ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial intr context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * qdma_s80_hard_indirect_reg_invalidate() - helper function to invalidate - * indirect context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_s80_hard_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_s80_hard_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_S80_HARD_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_S80_HARD_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_s80_hard_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_s80_hard_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_s80_hard_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - - qdma_reg_write(dev_hndl, QDMA_S80_HARD_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_S80_HARD_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_s80_hard_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_s80_hard_indirect_reg_read(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = QDMA_S80_HARD_IND_CTXT_DATA_3_ADDR; - union qdma_s80_hard_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_S80_HARD_IND_CTXT_CMD_ADDR, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_S80_HARD_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_s80_hard_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_s80_hard_indirect_reg_write(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_s80_hard_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_S80_HARD_IND_CTXT_DATA_NUM_REGS; - index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = QDMA_S80_HARD_IND_CTXT_DATA_3_ADDR; - - for (index = 0; - index < ((2 * QDMA_S80_HARD_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_S80_HARD_IND_CTXT_CMD_ADDR, - IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_qid2vec_write() - create qid2vec context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_qid2vec_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_qid2vec *ctxt) -{ - uint32_t qid2vec = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - int rv = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p qid2vec=%p, err:%d\n", - __func__, dev_hndl, ctxt, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_indirect_reg_read(dev_hndl, sel, hw_qid, - 1, &qid2vec); - if (rv < 0) - return rv; - if (c2h) { - qid2vec = qid2vec & (QDMA_S80_HARD_QID2VEC_H2C_VECTOR | - QDMA_S80_HARD_QID2VEC_H2C_COAL_EN); - qid2vec |= FIELD_SET(C2H_QID2VEC_MAP_C2H_VECTOR_MASK, - ctxt->c2h_vector) | - FIELD_SET(C2H_QID2VEC_MAP_C2H_EN_COAL_MASK, - ctxt->c2h_en_coal); - } else { - qid2vec = qid2vec & (C2H_QID2VEC_MAP_C2H_VECTOR_MASK | - C2H_QID2VEC_MAP_C2H_EN_COAL_MASK); - qid2vec |= - FIELD_SET(QDMA_S80_HARD_QID2VEC_H2C_VECTOR, - ctxt->h2c_vector) | - FIELD_SET(QDMA_S80_HARD_QID2VEC_H2C_COAL_EN, - ctxt->h2c_en_coal); - } - - return qdma_s80_hard_indirect_reg_write(dev_hndl, sel, hw_qid, - &qid2vec, QDMA_S80_HARD_QID2VEC_CONTEXT_NUM_WORDS); - -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_qid2vec_read() - read qid2vec context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_qid2vec_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_qid2vec *ctxt) -{ - int rv = 0; - uint32_t qid2vec[QDMA_S80_HARD_QID2VEC_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p qid2vec=%p, err:%d\n", - __func__, dev_hndl, ctxt, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_S80_HARD_QID2VEC_CONTEXT_NUM_WORDS, qid2vec); - if (rv < 0) - return rv; - - if (c2h) { - ctxt->c2h_vector = FIELD_GET(C2H_QID2VEC_MAP_C2H_VECTOR_MASK, - qid2vec[0]); - ctxt->c2h_en_coal = - (uint8_t)(FIELD_GET(C2H_QID2VEC_MAP_C2H_EN_COAL_MASK, - qid2vec[0])); - } else { - ctxt->h2c_vector = - (uint8_t)(FIELD_GET(QDMA_S80_HARD_QID2VEC_H2C_VECTOR, - qid2vec[0])); - ctxt->h2c_en_coal = - (uint8_t)(FIELD_GET(QDMA_S80_HARD_QID2VEC_H2C_COAL_EN, - qid2vec[0])); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_qid2vec_clear() - clear qid2vec context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_qid2vec_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_qid2vec_invalidate() - invalidate qid2vec context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_qid2vec_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_qid2vec_conf() - configure qid2vector context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_qid2vec_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_s80_hard_qid2vec_read(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_s80_hard_qid2vec_write(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_s80_hard_qid2vec_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_s80_hard_qid2vec_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_fmap_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_fmap_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap = 0; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle or config is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - fmap = FIELD_SET(TRQ_SEL_FMAP_0_QID_BASE_MASK, config->qbase) | - FIELD_SET(TRQ_SEL_FMAP_0_QID_MAX_MASK, - config->qmax); - - qdma_reg_write(dev_hndl, QDMA_S80_HARD_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_S80_HARD_REG_TRQ_SEL_FMAP_STEP, - fmap); - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_fmap_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_fmap_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - uint32_t fmap = 0; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - fmap = qdma_reg_read(dev_hndl, QDMA_S80_HARD_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_S80_HARD_REG_TRQ_SEL_FMAP_STEP); - - config->qbase = FIELD_GET(TRQ_SEL_FMAP_0_QID_BASE_MASK, fmap); - config->qmax = - (uint16_t)(FIELD_GET(TRQ_SEL_FMAP_0_QID_MAX_MASK, - fmap)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_fmap_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_fmap_clear(void *dev_hndl, uint16_t func_id) -{ - uint32_t fmap = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_reg_write(dev_hndl, QDMA_S80_HARD_TRQ_SEL_FMAP_0_ADDR + - func_id * QDMA_S80_HARD_REG_TRQ_SEL_FMAP_STEP, - fmap); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE unsupported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_s80_hard_fmap_read(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_s80_hard_fmap_write(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_s80_hard_fmap_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[QDMA_S80_HARD_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl or ctxt is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((ctxt->desc_sz > QDMA_DESC_SIZE_64B) || - (ctxt->rngsz_idx >= QDMA_NUM_RING_SIZES)) { - qdma_log_error("%s: Invalid desc_sz(%d)/rngidx(%d), err:%d\n", - __func__, - ctxt->desc_sz, - ctxt->rngsz_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W0_PIDX_MASK, ctxt->pidx) | - FIELD_SET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, ctxt->irq_arm); - - sw_ctxt[num_words_count++] = - FIELD_SET(SW_IND_CTXT_DATA_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - ctxt->wbi_intvl_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - ctxt->irq_no_last) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_MASK, ctxt->err) | - FIELD_SET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - ctxt->err_wb_sent) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - return qdma_s80_hard_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = 0; - uint32_t sw_ctxt[QDMA_S80_HARD_SW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - struct qdma_qid2vec qid2vec_ctxt = {0}; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p sw_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_S80_HARD_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(SW_IND_CTXT_DATA_W0_PIDX_MASK, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK, - sw_ctxt[0])); - - ctxt->qen = FIELD_GET(SW_IND_CTXT_DATA_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(SW_IND_CTXT_DATA_W1_FCRD_EN_MASK, - sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_CHK_MASK, - sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK, - sw_ctxt[1]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_FNC_ID_MASK, - sw_ctxt[1])); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_RNG_SZ_MASK, - sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_DSC_SZ_MASK, - sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_BYPASS_MASK, - sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MM_CHN_MASK, - sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_WBK_EN_MASK, - sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_EN_MASK, - sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_PORT_ID_MASK, - sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK, - sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK, - sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(SW_IND_CTXT_DATA_W1_IS_MM_MASK, - sw_ctxt[1])); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - /** Read the QID2VEC Context Data */ - rv = qdma_s80_hard_qid2vec_read(dev_hndl, c2h, hw_qid, &qid2vec_ctxt); - if (rv < 0) - return rv; - - if (c2h) { - ctxt->vec = qid2vec_ctxt.c2h_vector; - ctxt->intr_aggr = qid2vec_ctxt.c2h_en_coal; - } else { - ctxt->vec = qid2vec_ctxt.h2c_vector; - ctxt->intr_aggr = qid2vec_ctxt.h2c_en_coal; - } - - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_s80_hard_sw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_s80_hard_sw_context_write(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_s80_hard_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_s80_hard_sw_context_invalidate(dev_hndl, - c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[QDMA_S80_HARD_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p pfetch_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_ERR_MASK, ctxt->err) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, ctxt->pfch) | - FIELD_SET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, sw_crdt_l); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(PREFETCH_CTXT_DATA_W1_VALID_MASK, ctxt->valid); - - return qdma_s80_hard_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = 0; - uint32_t pfetch_ctxt[QDMA_S80_HARD_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p pfetch_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_S80_HARD_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_BYPASS_MASK, - pfetch_ctxt[0])); - ctxt->bufsz_idx = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK, - pfetch_ctxt[0])); - ctxt->port_id = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PORT_ID_MASK, - pfetch_ctxt[0])); - ctxt->err = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W0_PFCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - (uint32_t)FIELD_GET(PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK, - pfetch_ctxt[0]); - - sw_crdt_h = - (uint32_t)FIELD_GET(PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK, - pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(PREFETCH_CTXT_DATA_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - (uint16_t)(FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, - sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_pfetch_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_s80_hard_pfetch_context_read(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_s80_hard_pfetch_context_write(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_s80_hard_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_s80_hard_pfetch_context_invalidate(dev_hndl, - hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[QDMA_S80_HARD_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h, baddr_m, pidx_l, pidx_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p cmpt_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((ctxt->desc_sz > QDMA_DESC_SIZE_32B) || - (ctxt->ringsz_idx >= QDMA_NUM_RING_SIZES) || - (ctxt->counter_idx >= QDMA_NUM_C2H_COUNTERS) || - (ctxt->timer_idx >= QDMA_NUM_C2H_TIMERS) || - (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR)) { - qdma_log_error - ("%s Inv dsz(%d)/ridx(%d)/cntr(%d)/tmr(%d)/tm(%d), err:%d\n", - __func__, - ctxt->desc_sz, - ctxt->ringsz_idx, - ctxt->counter_idx, - ctxt->timer_idx, - ctxt->trig_mode, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = - (uint32_t)FIELD_GET(QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_L_MASK, - ctxt->bs_addr); - baddr_m = - (uint32_t)FIELD_GET(QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_M_MASK, - ctxt->bs_addr); - baddr_h = - (uint32_t)FIELD_GET(QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_H_MASK, - ctxt->bs_addr); - - pidx_l = FIELD_GET(QDMA_S80_HARD_COMPL_CTXT_PIDX_GET_L_MASK, - ctxt->pidx); - pidx_h = FIELD_GET(QDMA_S80_HARD_COMPL_CTXT_PIDX_GET_H_MASK, - ctxt->pidx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(CMPL_CTXT_DATA_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(CMPL_CTXT_DATA_W0_CNTER_IDX_MASK, - ctxt->counter_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_TIMER_IDX_MASK, - ctxt->timer_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - ctxt->in_st) | - FIELD_SET(CMPL_CTXT_DATA_W0_COLOR_MASK, - ctxt->color) | - FIELD_SET(CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK, - ctxt->ringsz_idx) | - FIELD_SET(CMPL_CTXT_DATA_W0_BADDR_64_L_MASK, - baddr_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W1_BADDR_64_M_MASK, - baddr_m); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W2_BADDR_64_H_MASK, - baddr_h) | - FIELD_SET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - ctxt->desc_sz) | - FIELD_SET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, - pidx_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, - pidx_h) | - FIELD_SET(CMPL_CTXT_DATA_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(CMPL_CTXT_DATA_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(CMPL_CTXT_DATA_W3_ERR_MASK, ctxt->err) | - FIELD_SET(CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, - ctxt->user_trig_pend) | - FIELD_SET(CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK, - ctxt->timer_running) | - FIELD_SET(CMPL_CTXT_DATA_W3_FULL_UPD_MASK, - ctxt->full_upd); - - return qdma_s80_hard_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); - -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = 0; - uint32_t cmpt_ctxt[QDMA_S80_HARD_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr_l, baddr_h, baddr_m, - pidx_l, pidx_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p cmpt_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_S80_HARD_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(CMPL_CTXT_DATA_W0_EN_INT_MASK, - cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(CMPL_CTXT_DATA_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET( - CMPL_CTXT_DATA_W0_CNTER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_TIMER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK, - cmpt_ctxt[0])); - - baddr_l = - FIELD_GET(CMPL_CTXT_DATA_W0_BADDR_64_L_MASK, - cmpt_ctxt[0]); - baddr_m = - FIELD_GET(CMPL_CTXT_DATA_W1_BADDR_64_M_MASK, - cmpt_ctxt[1]); - baddr_h = - FIELD_GET(CMPL_CTXT_DATA_W2_BADDR_64_H_MASK, - cmpt_ctxt[2]); - - ctxt->desc_sz = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(CMPL_CTXT_DATA_W2_PIDX_L_MASK, - cmpt_ctxt[2]); - - pidx_h = FIELD_GET(CMPL_CTXT_DATA_W3_PIDX_H_MASK, - cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(CMPL_CTXT_DATA_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_ERR_MASK, - cmpt_ctxt[3])); - ctxt->user_trig_pend = - (uint8_t)(FIELD_GET( - CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK, cmpt_ctxt[3])); - - ctxt->timer_running = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK, - cmpt_ctxt[3])); - ctxt->full_upd = - (uint8_t)(FIELD_GET(CMPL_CTXT_DATA_W3_FULL_UPD_MASK, - cmpt_ctxt[3])); - - ctxt->bs_addr = - FIELD_SET(QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_L_MASK, - (uint64_t)baddr_l) | - FIELD_SET(QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_M_MASK, - (uint64_t)baddr_m) | - FIELD_SET(QDMA_S80_HARD_COMPL_CTXT_BADDR_GET_H_MASK, - (uint64_t)baddr_h); - - ctxt->pidx = - (uint16_t)(FIELD_SET(QDMA_S80_HARD_COMPL_CTXT_PIDX_GET_L_MASK, - pidx_l) | - FIELD_SET(QDMA_S80_HARD_COMPL_CTXT_PIDX_GET_H_MASK, - pidx_h)); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_cmpt_context_invalidate(void *dev_hndl, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_s80_hard_cmpt_context_read(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_s80_hard_cmpt_context_write(dev_hndl, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_s80_hard_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_s80_hard_cmpt_context_invalidate(dev_hndl, - hw_qid); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = 0; - uint32_t hw_ctxt[QDMA_S80_HARD_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p hw_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_S80_HARD_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(HW_IND_CTXT_DATA_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(HW_IND_CTXT_DATA_W0_CRD_USE_MASK, - hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_DSC_PND_MASK, - hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = - (uint8_t)(FIELD_GET(HW_IND_CTXT_DATA_W1_FETCH_PND_MASK, - hw_ctxt[1])); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE unsupported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_s80_hard_hw_context_read(dev_hndl, c2h, hw_qid, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_s80_hard_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_s80_hard_hw_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_indirect_intr_context_write() - create indirect - * interrupt context and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_indirect_intr_context_write(void *dev_hndl, - uint16_t ring_index, const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[QDMA_S80_HARD_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->page_size > QDMA_INDIRECT_INTR_RING_SIZE_32KB) { - qdma_log_error("%s: ctxt->page_size=%u is too big, err:%d\n", - __func__, ctxt->page_size, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = - (uint32_t)FIELD_GET(QDMA_S80_HARD_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_h = - (uint32_t)FIELD_GET(QDMA_S80_HARD_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(INTR_CTXT_DATA_W0_VEC_MASK, ctxt->vec) | - FIELD_SET(INTR_CTXT_DATA_W0_INT_ST_MASK, - ctxt->int_st) | - FIELD_SET(INTR_CTXT_DATA_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W1_BADDR_4K_H_MASK, baddr_h) | - FIELD_SET(INTR_CTXT_DATA_W1_PAGE_SIZE_MASK, - ctxt->page_size); - - intr_ctxt[num_words_count++] = - FIELD_SET(INTR_CTXT_DATA_W2_PIDX_MASK, ctxt->pidx); - - return qdma_s80_hard_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_indirect_intr_context_read(void *dev_hndl, - uint16_t ring_index, struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = 0; - uint32_t intr_ctxt[QDMA_S80_HARD_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_indirect_reg_read(dev_hndl, sel, ring_index, - QDMA_S80_HARD_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(INTR_CTXT_DATA_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(INTR_CTXT_DATA_W0_VEC_MASK, - intr_ctxt[0]); - ctxt->int_st = FIELD_GET(INTR_CTXT_DATA_W0_INT_ST_MASK, - intr_ctxt[0]); - ctxt->color = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W0_COLOR_MASK, - intr_ctxt[0])); - baddr_l = FIELD_GET(INTR_CTXT_DATA_W0_BADDR_4K_L_MASK, - intr_ctxt[0]); - - baddr_h = FIELD_GET(INTR_CTXT_DATA_W1_BADDR_4K_H_MASK, - intr_ctxt[1]); - ctxt->page_size = - (uint8_t)(FIELD_GET(INTR_CTXT_DATA_W1_PAGE_SIZE_MASK, - intr_ctxt[1])); - ctxt->pidx = FIELD_GET(INTR_CTXT_DATA_W2_PIDX_MASK, - intr_ctxt[2]); - - ctxt->baddr_4k = - FIELD_SET(QDMA_S80_HARD_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_S80_HARD_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_indirect_intr_context_clear() - clear indirect - * interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_indirect_intr_context_clear(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_indirect_intr_context_invalidate() - invalidate - * indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int ret_val = 0; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - ret_val = qdma_s80_hard_indirect_intr_context_read(dev_hndl, - ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - ret_val = qdma_s80_hard_indirect_intr_context_write(dev_hndl, - ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - ret_val = qdma_s80_hard_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - ret_val = qdma_s80_hard_indirect_intr_context_invalidate( - dev_hndl, ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - ret_val = -QDMA_ERR_INV_PARAM; - break; - } - - return ret_val; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_set_default_global_csr() - function to set the global - * CSR register to default values. The value can be modified later by using - * the set/get csr functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, - 385, 513, 769, 1025, 1537, 3073, 4097, 6145, - 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, - 32, 48, 64, 80, 96, 112, 128, 144, - 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, - 4096, 8192, 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, QDMA_S80_HARD_GLBL_RNG_SZ_1_ADDR, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_CNT_TH_1_ADDR, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_TIMER_CNT_1_ADDR, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(GLBL_DSC_CFG_MAXFETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, - QDMA_S80_HARD_GLBL_DSC_CFG_ADDR, reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_BUF_SZ_0_ADDR, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - reg_val = - FIELD_SET(C2H_PFCH_CFG_FL_TH_MASK, - DEFAULT_PFCH_STOP_THRESH) | - FIELD_SET(C2H_PFCH_CFG_NUM_MASK, - DEFAULT_PFCH_NUM_ENTRIES_PER_Q) | - FIELD_SET(C2H_PFCH_CFG_QCNT_MASK, - DEFAULT_PFCH_MAX_Q_CNT) | - FIELD_SET(C2H_PFCH_CFG_EVT_QCNT_TH_MASK, - DEFAULT_C2H_INTR_TIMER_TICK); - qdma_reg_write(dev_hndl, - QDMA_S80_HARD_C2H_PFCH_CFG_ADDR, reg_val); - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, QDMA_S80_HARD_C2H_INT_TIMER_TICK_ADDR, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - reg_val = - FIELD_SET(C2H_WRB_COAL_CFG_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(C2H_WRB_COAL_CFG_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK, - DEFAULT_CMPT_COAL_MAX_BUF_SZ); - qdma_reg_write(dev_hndl, - QDMA_S80_HARD_C2H_WRB_COAL_CFG_ADDR, reg_val); - -#if 0 - /* H2C throttle Configuration*/ - reg_val = - FIELD_SET(QDMA_H2C_DATA_THRESH_MASK, - DEFAULT_H2C_THROT_DATA_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_DATA_MASK, - DEFAULT_THROT_EN_DATA); - qdma_reg_write(dev_hndl, QDMA_OFFSET_H2C_REQ_THROT, reg_val); -#endif - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_queue_pidx_update() - function to update the desc PIDX - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @reg_info: data needed for the PIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info) -{ - uint32_t reg_addr = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!is_vf) { - reg_addr = (is_c2h) ? - QDMA_S80_HARD_OFFSET_DMAP_SEL_C2H_DSC_PIDX : - QDMA_S80_HARD_OFFSET_DMAP_SEL_H2C_DSC_PIDX; - } else { - reg_addr = (is_c2h) ? - QDMA_S80_HARD_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX : - QDMA_S80_HARD_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX; - } - - reg_addr += (qid * QDMA_PIDX_STEP); - - reg_val = FIELD_SET(QDMA_S80_HARD_DMA_SEL_DESC_PIDX_MASK, - reg_info->pidx) | - FIELD_SET(QDMA_S80_HARD_DMA_SEL_IRQ_EN_MASK, - reg_info->irq_en); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_queue_cmpt_cidx_update() - function to update the CMPT - * CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? - QDMA_S80_HARD_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_S80_HARD_OFFSET_DMAP_SEL_CMPT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += (qid * QDMA_CMPT_CIDX_STEP); - - reg_val = - FIELD_SET(QDMA_S80_HARD_DMAP_SEL_CMPT_WRB_CIDX_MASK, - reg_info->wrb_cidx) | - FIELD_SET(QDMA_S80_HARD_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_info->counter_idx) | - FIELD_SET(QDMA_S80_HARD_DMAP_SEL_CMPT_TMR_CNT_MASK, - reg_info->timer_idx) | - FIELD_SET(QDMA_S80_HARD_DMAP_SEL_CMPT_TRG_MODE_MASK, - reg_info->trig_mode) | - FIELD_SET(QDMA_S80_HARD_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_info->wrb_en) | - FIELD_SET(QDMA_S80_HARD_DMAP_SEL_CMPT_IRQ_EN_MASK, - reg_info->irq_en); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_queue_intr_cidx_update() - function to update the - * CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? - QDMA_S80_HARD_OFFSET_VF_DMAP_SEL_INT_CIDX : - QDMA_S80_HARD_OFFSET_DMAP_SEL_INT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += qid * QDMA_INT_CIDX_STEP; - - reg_val = - FIELD_SET(QDMA_S80_HARD_DMA_SEL_INT_SW_CIDX_MASK, - reg_info->sw_cidx) | - FIELD_SET(QDMA_S80_HARD_DMA_SEL_INT_RING_IDX_MASK, - reg_info->rng_idx); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cmp_get_user_bar() - Function to get the - * AXI Master Lite(user bar) number - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite(user bar) number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cmp_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint8_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: user_bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr = (is_vf) ? QDMA_S80_HARD_GLBL2_PF_VF_BARLITE_EXT_ADDR : - QDMA_S80_HARD_GLBL2_PF_BARLITE_EXT_ADDR; - - if (!is_vf) { - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - } else { - *user_bar = QDMA_S80_HARD_VF_USER_BAR_ID; - return QDMA_SUCCESS; - } - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, err:%d\n", - __func__, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_ram_sbe_err_process() -Function to dump SBE err debug info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_s80_hard_hw_ram_sbe_err_process(void *dev_hndl) -{ - qdma_s80_hard_dump_reg_info(dev_hndl, QDMA_S80_HARD_RAM_SBE_STS_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_ram_dbe_err_process() -Function to dump DBE err debug info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_s80_hard_hw_ram_dbe_err_process(void *dev_hndl) -{ - qdma_s80_hard_dump_reg_info(dev_hndl, QDMA_S80_HARD_RAM_DBE_STS_A_ADDR, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_desc_err_process() -Function to dump Descriptor Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_s80_hard_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_LOG0_ADDR, - QDMA_S80_HARD_GLBL_DSC_ERR_LOG1_ADDR, - QDMA_S80_HARD_GLBL_DSC_DBG_DAT0_ADDR, - QDMA_S80_HARD_GLBL_DSC_DBG_DAT1_ADDR - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - qdma_s80_hard_dump_reg_info(dev_hndl, - desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_trq_err_process() -Function to dump Target Access Err info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_s80_hard_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - QDMA_S80_HARD_GLBL_TRQ_ERR_STS_ADDR, - QDMA_S80_HARD_GLBL_TRQ_ERR_LOG_ADDR - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - qdma_s80_hard_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } - - -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_st_h2c_err_process() - Function to dump MM H2C Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_s80_hard_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - QDMA_S80_HARD_H2C_ERR_STAT_ADDR, - QDMA_S80_HARD_H2C_FIRST_ERR_QID_ADDR, - QDMA_S80_HARD_H2C_DBG_REG0_ADDR, - QDMA_S80_HARD_H2C_DBG_REG1_ADDR, - QDMA_S80_HARD_H2C_DBG_REG2_ADDR, - QDMA_S80_HARD_H2C_DBG_REG3_ADDR, - QDMA_S80_HARD_H2C_DBG_REG4_ADDR - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - qdma_s80_hard_dump_reg_info(dev_hndl, - st_h2c_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_st_c2h_err_process() - Function to dump MM H2C Error info - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_s80_hard_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - QDMA_S80_HARD_C2H_ERR_STAT_ADDR, - QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR, - QDMA_S80_HARD_C2H_FIRST_ERR_QID_ADDR, - QDMA_S80_HARD_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR, - QDMA_S80_HARD_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR, - QDMA_S80_HARD_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR, - QDMA_S80_HARD_C2H_STAT_AXIS_PKG_CMP_ADDR, - QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_0_ADDR, - QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_1_ADDR, - QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_2_ADDR, - QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_3_ADDR, - QDMA_S80_HARD_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR, - QDMA_S80_HARD_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - qdma_s80_hard_dump_reg_info(dev_hndl, - st_c2h_err_reg_list[i], - 1, NULL, 0); - } -} - - - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_get_error_name() - Function to get the error in str format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *qdma_s80_hard_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= QDMA_S80_HARD_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, - (enum qdma_s80_hard_error_idx)err_idx); - return NULL; - } - - return qdma_s80_hard_err_info[ - (enum qdma_s80_hard_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t i = 0, j = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[QDMA_S80_HARD_TOTAL_LEAF_ERROR_AGGREGATORS] = { - QDMA_S80_HARD_DSC_ERR_POISON, - QDMA_S80_HARD_TRQ_ERR_UNMAPPED, - QDMA_S80_HARD_ST_C2H_ERR_MTY_MISMATCH, - QDMA_S80_HARD_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_S80_HARD_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - QDMA_S80_HARD_SBE_ERR_MI_H2C0_DAT, - QDMA_S80_HARD_DBE_ERR_MI_H2C0_DAT - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, - QDMA_S80_HARD_GLBL_ERR_STAT_ADDR); - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - qdma_log_info("%s: Global Err Reg(0x%x) = 0x%x\n", - __func__, QDMA_S80_HARD_GLBL_ERR_STAT_ADDR, - glbl_err_stat); - - for (i = 0; i < QDMA_S80_HARD_TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - j = hw_err_position[i]; - - if ((!dev_cap.st_en) && - (j == QDMA_S80_HARD_ST_C2H_ERR_MTY_MISMATCH || - j == QDMA_S80_HARD_ST_FATAL_ERR_MTY_MISMATCH || - j == QDMA_S80_HARD_ST_H2C_ERR_ZERO_LEN_DESC_ERR)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - qdma_s80_hard_err_info[j].stat_reg_addr); - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - qdma_s80_hard_err_info[j].stat_reg_addr, - err_stat); - - qdma_s80_hard_err_info[j].qdma_s80_hard_hw_err_process( - dev_hndl); - for (idx = j; - idx < all_qdma_s80_hard_hw_errs[i]; - idx++) { - /* call the platform specific handler */ - if (err_stat & - qdma_s80_hard_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s\n", - __func__, - qdma_s80_hard_hw_get_error_name( - idx)); - } - qdma_reg_write(dev_hndl, - qdma_s80_hard_err_info[j].stat_reg_addr, - err_stat); - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, - QDMA_S80_HARD_GLBL_ERR_STAT_ADDR, glbl_err_stat); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > QDMA_S80_HARD_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, (enum qdma_s80_hard_error_idx)err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == QDMA_S80_HARD_ERRS_ALL) { - for (i = 0; - i < QDMA_S80_HARD_TOTAL_LEAF_ERROR_AGGREGATORS; - i++) { - - idx = all_qdma_s80_hard_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == QDMA_S80_HARD_ST_C2H_ERR_ALL || - idx == QDMA_S80_HARD_ST_FATAL_ERR_ALL || - idx == QDMA_S80_HARD_ST_H2C_ERR_ALL) - continue; - } - - reg_val = qdma_s80_hard_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - qdma_s80_hard_err_info[idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_S80_HARD_GLBL_ERR_MASK_ADDR); - reg_val |= FIELD_SET( - qdma_s80_hard_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, - QDMA_S80_HARD_GLBL_ERR_MASK_ADDR, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= QDMA_S80_HARD_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= QDMA_S80_HARD_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - qdma_s80_hard_err_info[err_idx].mask_reg_addr); - reg_val |= - FIELD_SET(qdma_s80_hard_err_info[err_idx].leaf_err_mask, - 1); - qdma_reg_write(dev_hndl, - qdma_s80_hard_err_info[err_idx].mask_reg_addr, - reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_S80_HARD_GLBL_ERR_MASK_ADDR); - reg_val |= - FIELD_SET( - qdma_s80_hard_err_info[err_idx].global_err_mask, - 1); - qdma_reg_write(dev_hndl, - QDMA_S80_HARD_GLBL_ERR_MASK_ADDR, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_get_device_attributes() - Function to get the qdma - * device attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, - QDMA_S80_HARD_GLBL2_PF_BARLITE_INT_ADDR); - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_S80_HARD_GLBL2_CHANNEL_CAP_ADDR); - dev_info->num_qs = (FIELD_GET(GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK, - reg_val)); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, QDMA_S80_HARD_GLBL2_MISC_CAP_ADDR); - dev_info->mailbox_en = FIELD_GET(QDMA_GLBL2_MAILBOX_EN_MASK, reg_val); - dev_info->flr_present = FIELD_GET(QDMA_GLBL2_FLR_PRESENT_MASK, reg_val); - dev_info->mm_cmpt_en = 0; - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, - QDMA_S80_HARD_GLBL2_CHANNEL_MDMA_ADDR); - dev_info->mm_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ENG_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ENG_MASK, reg_val)) ? 1 : 0; - dev_info->st_en = (FIELD_GET(GLBL2_CHANNEL_MDMA_C2H_ST_MASK, reg_val) - && FIELD_GET(GLBL2_CHANNEL_MDMA_H2C_ST_MASK, - reg_val)) ? 1 : 0; - - /* num of mm channels for Versal Hard is 2 */ - dev_info->mm_channel_max = 2; - - dev_info->debug_mode = 0; - dev_info->desc_eng_mode = 0; - dev_info->qid2vec_ctx = 1; - dev_info->cmpt_ovf_chk_dis = 0; - dev_info->mailbox_intr = 0; - dev_info->sw_desc_64b = 0; - dev_info->cmpt_desc_64b = 0; - dev_info->dynamic_bar = 0; - dev_info->legacy_intr = 0; - dev_info->cmpt_trig_count_timer = 0; - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_s80_hard_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * @ctxt : pointer to the context data - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[QDMA_S80_HARD_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_S80_HARD_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(CRED_CTXT_DATA_W0_CREDT_MASK, - cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_s80_hard_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_credit_ctx_conf() - configure credit context - * - * @dev_hndl : device handle - * @c2h : is c2h queue - * @hw_qid : hardware qid of the queue - * @ctxt : pointer to the context data - * @access_type : HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_s80_hard_credit_context_read(dev_hndl, c2h, - hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_s80_hard_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_s80_hard_credit_context_invalidate(dev_hndl, c2h, - hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_s80_hard_dump_config_regs() - Function to get qdma config register - * dump in a buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = qdma_s80_hard_config_num_regs_get(); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < qdma_s80_hard_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = qdma_s80_hard_config_regs_get(); - - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", reg_info[i].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/*****************************************************************************/ -/** - * qdma_dump_s80_hard_queue_context() - Function to get qdma queue context dump - * in a buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_s80_hard_context(ctxt_data, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_dump_s80_hard_intr_context() - Function to get qdma interrupt - * context dump in a buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - req_buflen = qdma_s80_hard_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_s80_hard_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_read_dump_queue_context() - Function to read and dump the queue - * context in a buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT) - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_read_dump_queue_context(void *dev_hndl, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_CMPT) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_s80_hard_context_buf_len(st, q_type, &req_buflen); - - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = qdma_s80_hard_sw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.sw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read sw context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_s80_hard_hw_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.hw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read hw context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_s80_hard_qid2vec_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.qid2vec), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read qid2vec context, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_s80_hard_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read credit context, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = qdma_s80_hard_pfetch_ctx_conf(dev_hndl, - qid_hw, - &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read pftech context, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = qdma_s80_hard_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s: Failed to read cmpt context, err = %d", - __func__, rv); - return rv; - } - } - - - - rv = dump_s80_hard_context(&context, st, q_type, - buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_init_ctxt_memory() - Initialize the context for all queues - * - * @dev_hndl : device handle - * - * Return : 0 - success and < 0 - failure - *****************************************************************************/ - -int qdma_s80_hard_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_info); - qdma_log_info("%s: clearing the context for all qs", - __func__); - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - (sel == QDMA_CTXT_SEL_PFTCH || - sel == QDMA_CTXT_SEL_CMPT)) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug(" sel = %d", sel); - continue; - } - - rv = qdma_s80_hard_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - qdma_s80_hard_fmap_clear(dev_hndl, i); -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return 0; -} - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = qdma_s80_hard_config_num_regs_get(); - - reg_info = qdma_s80_hard_config_regs_get(); - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_s80_hard_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = qdma_s80_hard_config_regs_get(); - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (reg_count = 0; - (reg_count < total_regs);) { - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; - -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_s80_hard_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_slot, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - uint32_t num_regs = qdma_s80_hard_config_num_regs_get(); - struct xreg_info *reg_info = qdma_s80_hard_config_regs_get(); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_slot) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = QDMA_S80_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = QDMA_S80_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = QDMA_S80_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = QDMA_S80_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid slot received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_write_global_ring_sizes() - set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, - QDMA_S80_HARD_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_read_global_ring_sizes() - function to get the - * global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, - QDMA_S80_HARD_GLBL_RNG_SZ_1_ADDR, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_TIMER_CNT_1_ADDR, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_TIMER_CNT_1_ADDR, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_write_global_counter_threshold(void *dev_hndl, - uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_CNT_TH_1_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_read_global_counter_threshold() - get the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_read_global_counter_threshold(void *dev_hndl, - uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_CNT_TH_1_ADDR, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_write_global_buffer_sizes(void *dev_hndl, - uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_BUF_SZ_0_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, - QDMA_S80_HARD_C2H_BUF_SZ_0_ADDR, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_s80_hard_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_s80_hard_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_s80_hard_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_s80_hard_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_s80_hard_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_s80_hard_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_s80_hard_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_s80_hard_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_global_writeback_interval_write() - function to set the - * writeback interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - QDMA_S80_HARD_GLBL_DSC_CFG_ADDR); - reg_val |= FIELD_SET(GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - - qdma_reg_write(dev_hndl, - QDMA_S80_HARD_GLBL_DSC_CFG_ADDR, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_global_writeback_interval_read() - function to get the - * writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_s80_hard_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, - QDMA_S80_HARD_GLBL_DSC_CFG_ADDR); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_s80_hard_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_s80_hard_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_s80_hard_global_writeback_interval_write(dev_hndl, - *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_s80_hard_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_s80_hard_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? QDMA_S80_HARD_C2H_CHANNEL_CTL_ADDR : - QDMA_S80_HARD_H2C_CHANNEL_CTL_ADDR; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_s80_hard_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) { - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - } - - return QDMA_SUCCESS; -} - -int qdma_s80_hard_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = qdma_s80_hard_config_num_regs_get(); - struct xreg_info *config_regs = qdma_s80_hard_config_regs_get(); - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; - -} diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_access.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_access.h deleted file mode 100644 index 8ae6d60..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_access.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_S80_HARD_ACCESS_H_ -#define __QDMA_S80_HARD_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum qdma_s80_hard_error_idx { - /* Descriptor errors */ - QDMA_S80_HARD_DSC_ERR_POISON, - QDMA_S80_HARD_DSC_ERR_UR_CA, - QDMA_S80_HARD_DSC_ERR_PARAM, - QDMA_S80_HARD_DSC_ERR_ADDR, - QDMA_S80_HARD_DSC_ERR_TAG, - QDMA_S80_HARD_DSC_ERR_FLR, - QDMA_S80_HARD_DSC_ERR_TIMEOUT, - QDMA_S80_HARD_DSC_ERR_DAT_POISON, - QDMA_S80_HARD_DSC_ERR_FLR_CANCEL, - QDMA_S80_HARD_DSC_ERR_DMA, - QDMA_S80_HARD_DSC_ERR_DSC, - QDMA_S80_HARD_DSC_ERR_RQ_CANCEL, - QDMA_S80_HARD_DSC_ERR_DBE, - QDMA_S80_HARD_DSC_ERR_SBE, - QDMA_S80_HARD_DSC_ERR_ALL, - - /* TRQ Errors */ - QDMA_S80_HARD_TRQ_ERR_UNMAPPED, - QDMA_S80_HARD_TRQ_ERR_QID_RANGE, - QDMA_S80_HARD_TRQ_ERR_VF_ACCESS_ERR, - QDMA_S80_HARD_TRQ_ERR_TCP_TIMEOUT, - QDMA_S80_HARD_TRQ_ERR_ALL, - - /* C2H Errors */ - QDMA_S80_HARD_ST_C2H_ERR_MTY_MISMATCH, - QDMA_S80_HARD_ST_C2H_ERR_LEN_MISMATCH, - QDMA_S80_HARD_ST_C2H_ERR_QID_MISMATCH, - QDMA_S80_HARD_ST_C2H_ERR_DESC_RSP_ERR, - QDMA_S80_HARD_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - QDMA_S80_HARD_ST_C2H_ERR_MSI_INT_FAIL, - QDMA_S80_HARD_ST_C2H_ERR_ERR_DESC_CNT, - QDMA_S80_HARD_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - QDMA_S80_HARD_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - QDMA_S80_HARD_ST_C2H_ERR_WRB_INV_Q_ERR, - QDMA_S80_HARD_ST_C2H_ERR_WRB_QFULL_ERR, - QDMA_S80_HARD_ST_C2H_ERR_WRB_CIDX_ERR, - QDMA_S80_HARD_ST_C2H_ERR_WRB_PRTY_ERR, - QDMA_S80_HARD_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - QDMA_S80_HARD_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_S80_HARD_ST_FATAL_ERR_LEN_MISMATCH, - QDMA_S80_HARD_ST_FATAL_ERR_QID_MISMATCH, - QDMA_S80_HARD_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_WRB_CTXT_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_INT_QID2VEC_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_WRB_COAL_DATA_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - QDMA_S80_HARD_ST_FATAL_ERR_WPL_DATA_PAR_ERR, - QDMA_S80_HARD_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - QDMA_S80_HARD_ST_H2C_ERR_ZERO_LEN_DESC_ERR, - QDMA_S80_HARD_ST_H2C_ERR_SDI_MRKR_REQ_MOP_ERR, - QDMA_S80_HARD_ST_H2C_ERR_NO_DMA_DSC, - QDMA_S80_HARD_ST_H2C_ERR_DBE, - QDMA_S80_HARD_ST_H2C_ERR_SBE, - QDMA_S80_HARD_ST_H2C_ERR_ALL, - - /* Single bit errors */ - QDMA_S80_HARD_SBE_ERR_MI_H2C0_DAT, - QDMA_S80_HARD_SBE_ERR_MI_C2H0_DAT, - QDMA_S80_HARD_SBE_ERR_H2C_RD_BRG_DAT, - QDMA_S80_HARD_SBE_ERR_H2C_WR_BRG_DAT, - QDMA_S80_HARD_SBE_ERR_C2H_RD_BRG_DAT, - QDMA_S80_HARD_SBE_ERR_C2H_WR_BRG_DAT, - QDMA_S80_HARD_SBE_ERR_FUNC_MAP, - QDMA_S80_HARD_SBE_ERR_DSC_HW_CTXT, - QDMA_S80_HARD_SBE_ERR_DSC_CRD_RCV, - QDMA_S80_HARD_SBE_ERR_DSC_SW_CTXT, - QDMA_S80_HARD_SBE_ERR_DSC_CPLI, - QDMA_S80_HARD_SBE_ERR_DSC_CPLD, - QDMA_S80_HARD_SBE_ERR_PASID_CTXT_RAM, - QDMA_S80_HARD_SBE_ERR_TIMER_FIFO_RAM, - QDMA_S80_HARD_SBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_S80_HARD_SBE_ERR_QID_FIFO_RAM, - QDMA_S80_HARD_SBE_ERR_TUSER_FIFO_RAM, - QDMA_S80_HARD_SBE_ERR_WRB_COAL_DATA_RAM, - QDMA_S80_HARD_SBE_ERR_INT_QID2VEC_RAM, - QDMA_S80_HARD_SBE_ERR_INT_CTXT_RAM, - QDMA_S80_HARD_SBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_S80_HARD_SBE_ERR_PFCH_CTXT_RAM, - QDMA_S80_HARD_SBE_ERR_WRB_CTXT_RAM, - QDMA_S80_HARD_SBE_ERR_PFCH_LL_RAM, - QDMA_S80_HARD_SBE_ERR_ALL, - - /* Double bit Errors */ - QDMA_S80_HARD_DBE_ERR_MI_H2C0_DAT, - QDMA_S80_HARD_DBE_ERR_MI_C2H0_DAT, - QDMA_S80_HARD_DBE_ERR_H2C_RD_BRG_DAT, - QDMA_S80_HARD_DBE_ERR_H2C_WR_BRG_DAT, - QDMA_S80_HARD_DBE_ERR_C2H_RD_BRG_DAT, - QDMA_S80_HARD_DBE_ERR_C2H_WR_BRG_DAT, - QDMA_S80_HARD_DBE_ERR_FUNC_MAP, - QDMA_S80_HARD_DBE_ERR_DSC_HW_CTXT, - QDMA_S80_HARD_DBE_ERR_DSC_CRD_RCV, - QDMA_S80_HARD_DBE_ERR_DSC_SW_CTXT, - QDMA_S80_HARD_DBE_ERR_DSC_CPLI, - QDMA_S80_HARD_DBE_ERR_DSC_CPLD, - QDMA_S80_HARD_DBE_ERR_PASID_CTXT_RAM, - QDMA_S80_HARD_DBE_ERR_TIMER_FIFO_RAM, - QDMA_S80_HARD_DBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_S80_HARD_DBE_ERR_QID_FIFO_RAM, - QDMA_S80_HARD_DBE_ERR_WRB_COAL_DATA_RAM, - QDMA_S80_HARD_DBE_ERR_INT_QID2VEC_RAM, - QDMA_S80_HARD_DBE_ERR_INT_CTXT_RAM, - QDMA_S80_HARD_DBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_S80_HARD_DBE_ERR_PFCH_CTXT_RAM, - QDMA_S80_HARD_DBE_ERR_WRB_CTXT_RAM, - QDMA_S80_HARD_DBE_ERR_PFCH_LL_RAM, - QDMA_S80_HARD_DBE_ERR_ALL, - - QDMA_S80_HARD_ERRS_ALL -}; - -struct qdma_s80_hard_hw_err_info { - enum qdma_s80_hard_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*qdma_s80_hard_hw_err_process)(void *dev_hndl); -}; - - -int qdma_s80_hard_init_ctxt_memory(void *dev_hndl); - -int qdma_s80_hard_qid2vec_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_qid2vec *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_set_default_global_csr(void *dev_hndl); - -int qdma_s80_hard_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info); - -int qdma_s80_hard_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info); - -int qdma_s80_hard_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info); - -int qdma_cmp_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint8_t func_id, uint8_t *user_bar); - -int qdma_s80_hard_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -uint32_t qdma_s80_hard_reg_dump_buf_len(void); - -int qdma_s80_hard_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *req_buflen); - -int qdma_s80_hard_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int qdma_s80_hard_hw_error_process(void *dev_hndl); -const char *qdma_s80_hard_hw_get_error_name(uint32_t err_idx); -int qdma_s80_hard_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int qdma_s80_hard_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -int qdma_s80_hard_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -int qdma_s80_hard_read_dump_queue_context(void *dev_hndl, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int qdma_s80_hard_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int qdma_s80_hard_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_slot, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int qdma_s80_hard_global_csr_conf(void *dev_hndl, uint8_t index, - uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int qdma_s80_hard_mm_channel_conf(void *dev_hndl, uint8_t channel, - uint8_t is_c2h, - uint8_t enable); - -int qdma_s80_hard_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -uint32_t qdma_s80_hard_get_config_num_regs(void); - -struct xreg_info *qdma_s80_hard_get_config_regs(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_S80_HARD_ACCESS_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_reg.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_reg.h deleted file mode 100644 index 3e2a535..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_reg.h +++ /dev/null @@ -1,2045 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_S80_HARD_REG_H -#define __QDMA_S80_HARD_REG_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "qdma_platform.h" - -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - -#define DEBGFS_LINE_SZ (81) - -#ifdef ARRAY_SIZE -#undef ARRAY_SIZE -#endif -#define ARRAY_SIZE(arr) (sizeof(arr) / \ - sizeof(arr[0])) - - -uint32_t qdma_s80_hard_config_num_regs_get(void); -struct xreg_info *qdma_s80_hard_config_regs_get(void); -#define QDMA_S80_HARD_CFG_BLK_IDENTIFIER_ADDR 0x00 -#define CFG_BLK_IDENTIFIER_MASK GENMASK(31, 20) -#define CFG_BLK_IDENTIFIER_1_MASK GENMASK(19, 16) -#define CFG_BLK_IDENTIFIER_RSVD_1_MASK GENMASK(15, 8) -#define CFG_BLK_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_CFG_BLK_BUSDEV_ADDR 0x04 -#define CFG_BLK_BUSDEV_BDF_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_CFG_BLK_PCIE_MAX_PLD_SIZE_ADDR 0x08 -#define CFG_BLK_PCIE_MAX_PLD_SIZE_MASK GENMASK(2, 0) -#define QDMA_S80_HARD_CFG_BLK_PCIE_MAX_READ_REQ_SIZE_ADDR 0x0C -#define CFG_BLK_PCIE_MAX_READ_REQ_SIZE_MASK GENMASK(2, 0) -#define QDMA_S80_HARD_CFG_BLK_SYSTEM_ID_ADDR 0x10 -#define CFG_BLK_SYSTEM_ID_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_CFG_BLK_MSI_ENABLE_ADDR 0x014 -#define CFG_BLK_MSI_ENABLE_3_MASK BIT(17) -#define CFG_BLK_MSI_ENABLE_MSIX3_MASK BIT(16) -#define CFG_BLK_MSI_ENABLE_2_MASK BIT(13) -#define CFG_BLK_MSI_ENABLE_MSIX2_MASK BIT(12) -#define CFG_BLK_MSI_ENABLE_1_MASK BIT(9) -#define CFG_BLK_MSI_ENABLE_MSIX1_MASK BIT(8) -#define CFG_BLK_MSI_ENABLE_0_MASK BIT(1) -#define CFG_BLK_MSI_ENABLE_MSIX0_MASK BIT(0) -#define QDMA_S80_HARD_CFG_PCIE_DATA_WIDTH_ADDR 0x18 -#define CFG_PCIE_DATA_WIDTH_DATAPATH_MASK GENMASK(2, 0) -#define QDMA_S80_HARD_CFG_PCIE_CTL_ADDR 0x1C -#define CFG_PCIE_CTL_RRQ_DISABLE_MASK BIT(1) -#define CFG_PCIE_CTL_RELAXED_ORDERING_MASK BIT(0) -#define QDMA_S80_HARD_CFG_AXI_USER_MAX_PLD_SIZE_ADDR 0x40 -#define CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK GENMASK(2, 0) -#define QDMA_S80_HARD_CFG_AXI_USER_MAX_READ_REQ_SIZE_ADDR 0x44 -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK GENMASK(6, 4) -#define CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK GENMASK(2, 0) -#define QDMA_S80_HARD_CFG_BLK_MISC_CTL_ADDR 0x4C -#define CFG_BLK_MISC_CTL_NUM_TAG_MASK GENMASK(19, 8) -#define CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK GENMASK(4, 0) -#define QDMA_S80_HARD_CFG_BLK_SCRATCH_0_ADDR 0x80 -#define CFG_BLK_SCRATCH_0_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_CFG_BLK_SCRATCH_1_ADDR 0x84 -#define CFG_BLK_SCRATCH_1_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_CFG_BLK_SCRATCH_2_ADDR 0x88 -#define CFG_BLK_SCRATCH_2_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_CFG_BLK_SCRATCH_3_ADDR 0x8C -#define CFG_BLK_SCRATCH_3_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_CFG_BLK_SCRATCH_4_ADDR 0x90 -#define CFG_BLK_SCRATCH_4_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_CFG_BLK_SCRATCH_5_ADDR 0x94 -#define CFG_BLK_SCRATCH_5_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_CFG_BLK_SCRATCH_6_ADDR 0x98 -#define CFG_BLK_SCRATCH_6_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_CFG_BLK_SCRATCH_7_ADDR 0x9C -#define CFG_BLK_SCRATCH_7_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_RAM_SBE_MSK_A_ADDR 0xF0 -#define RAM_SBE_MSK_A_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_RAM_SBE_STS_A_ADDR 0xF4 -#define RAM_SBE_STS_A_RSVD_1_MASK BIT(31) -#define RAM_SBE_STS_A_PFCH_LL_RAM_MASK BIT(30) -#define RAM_SBE_STS_A_WRB_CTXT_RAM_MASK BIT(29) -#define RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK BIT(28) -#define RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define RAM_SBE_STS_A_INT_CTXT_RAM_MASK BIT(26) -#define RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK BIT(25) -#define RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK BIT(23) -#define RAM_SBE_STS_A_QID_FIFO_RAM_MASK BIT(22) -#define RAM_SBE_STS_A_PLD_FIFO_RAM_MASK BIT(21) -#define RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK BIT(20) -#define RAM_SBE_STS_A_PASID_CTXT_RAM_MASK BIT(19) -#define RAM_SBE_STS_A_DSC_CPLD_MASK BIT(18) -#define RAM_SBE_STS_A_DSC_CPLI_MASK BIT(17) -#define RAM_SBE_STS_A_DSC_SW_CTXT_MASK BIT(16) -#define RAM_SBE_STS_A_DSC_CRD_RCV_MASK BIT(15) -#define RAM_SBE_STS_A_DSC_HW_CTXT_MASK BIT(14) -#define RAM_SBE_STS_A_FUNC_MAP_MASK BIT(13) -#define RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(12) -#define RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(11) -#define RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(10) -#define RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(9) -#define RAM_SBE_STS_A_RSVD_2_MASK GENMASK(8, 5) -#define RAM_SBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_SBE_STS_A_RSVD_3_MASK GENMASK(3, 1) -#define RAM_SBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_S80_HARD_RAM_DBE_MSK_A_ADDR 0xF8 -#define RAM_DBE_MSK_A_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_RAM_DBE_STS_A_ADDR 0xFC -#define RAM_DBE_STS_A_RSVD_1_MASK BIT(31) -#define RAM_DBE_STS_A_PFCH_LL_RAM_MASK BIT(30) -#define RAM_DBE_STS_A_WRB_CTXT_RAM_MASK BIT(29) -#define RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK BIT(28) -#define RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define RAM_DBE_STS_A_INT_CTXT_RAM_MASK BIT(26) -#define RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK BIT(25) -#define RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK BIT(24) -#define RAM_DBE_STS_A_TUSER_FIFO_RAM_MASK BIT(23) -#define RAM_DBE_STS_A_QID_FIFO_RAM_MASK BIT(22) -#define RAM_DBE_STS_A_PLD_FIFO_RAM_MASK BIT(21) -#define RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK BIT(20) -#define RAM_DBE_STS_A_PASID_CTXT_RAM_MASK BIT(19) -#define RAM_DBE_STS_A_DSC_CPLD_MASK BIT(18) -#define RAM_DBE_STS_A_DSC_CPLI_MASK BIT(17) -#define RAM_DBE_STS_A_DSC_SW_CTXT_MASK BIT(16) -#define RAM_DBE_STS_A_DSC_CRD_RCV_MASK BIT(15) -#define RAM_DBE_STS_A_DSC_HW_CTXT_MASK BIT(14) -#define RAM_DBE_STS_A_FUNC_MAP_MASK BIT(13) -#define RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK BIT(12) -#define RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK BIT(11) -#define RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK BIT(10) -#define RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK BIT(9) -#define RAM_DBE_STS_A_RSVD_2_MASK GENMASK(8, 5) -#define RAM_DBE_STS_A_MI_C2H0_DAT_MASK BIT(4) -#define RAM_DBE_STS_A_RSVD_3_MASK GENMASK(3, 1) -#define RAM_DBE_STS_A_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_S80_HARD_GLBL2_IDENTIFIER_ADDR 0x100 -#define GLBL2_IDENTIFIER_MASK GENMASK(31, 8) -#define GLBL2_IDENTIFIER_VERSION_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_GLBL2_PF_BARLITE_INT_ADDR 0x104 -#define GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_S80_HARD_GLBL2_PF_VF_BARLITE_INT_ADDR 0x108 -#define GLBL2_PF_VF_BARLITE_INT_PF3_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_VF_BARLITE_INT_PF2_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_VF_BARLITE_INT_PF1_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_VF_BARLITE_INT_PF0_MAP_MASK GENMASK(5, 0) -#define QDMA_S80_HARD_GLBL2_PF_BARLITE_EXT_ADDR 0x10C -#define GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_S80_HARD_GLBL2_PF_VF_BARLITE_EXT_ADDR 0x110 -#define GLBL2_PF_VF_BARLITE_EXT_PF3_MAP_MASK GENMASK(23, 18) -#define GLBL2_PF_VF_BARLITE_EXT_PF2_MAP_MASK GENMASK(17, 12) -#define GLBL2_PF_VF_BARLITE_EXT_PF1_MAP_MASK GENMASK(11, 6) -#define GLBL2_PF_VF_BARLITE_EXT_PF0_MAP_MASK GENMASK(5, 0) -#define QDMA_S80_HARD_GLBL2_CHANNEL_INST_ADDR 0x114 -#define GLBL2_CHANNEL_INST_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_INST_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_INST_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_INST_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_INST_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_INST_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_INST_H2C_ENG_MASK BIT(0) -#define QDMA_S80_HARD_GLBL2_CHANNEL_MDMA_ADDR 0x118 -#define GLBL2_CHANNEL_MDMA_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_MDMA_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_MDMA_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_MDMA_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_MDMA_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_MDMA_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_MDMA_H2C_ENG_MASK BIT(0) -#define QDMA_S80_HARD_GLBL2_CHANNEL_STRM_ADDR 0x11C -#define GLBL2_CHANNEL_STRM_RSVD_1_MASK GENMASK(31, 18) -#define GLBL2_CHANNEL_STRM_C2H_ST_MASK BIT(17) -#define GLBL2_CHANNEL_STRM_H2C_ST_MASK BIT(16) -#define GLBL2_CHANNEL_STRM_RSVD_2_MASK GENMASK(15, 9) -#define GLBL2_CHANNEL_STRM_C2H_ENG_MASK BIT(8) -#define GLBL2_CHANNEL_STRM_RSVD_3_MASK GENMASK(7, 1) -#define GLBL2_CHANNEL_STRM_H2C_ENG_MASK BIT(0) -#define QDMA_S80_HARD_GLBL2_CHANNEL_CAP_ADDR 0x120 -#define GLBL2_CHANNEL_CAP_RSVD_1_MASK GENMASK(31, 12) -#define GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK GENMASK(11, 0) -#define QDMA_S80_HARD_GLBL2_CHANNEL_PASID_CAP_ADDR 0x128 -#define GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET_MASK GENMASK(15, 4) -#define GLBL2_CHANNEL_PASID_CAP_RSVD_2_MASK GENMASK(3, 2) -#define GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK BIT(1) -#define GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK BIT(0) -#define QDMA_S80_HARD_GLBL2_CHANNEL_FUNC_RET_ADDR 0x12C -#define GLBL2_CHANNEL_FUNC_RET_RSVD_1_MASK GENMASK(31, 8) -#define GLBL2_CHANNEL_FUNC_RET_FUNC_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_GLBL2_SYSTEM_ID_ADDR 0x130 -#define GLBL2_SYSTEM_ID_RSVD_1_MASK GENMASK(31, 16) -#define GLBL2_SYSTEM_ID_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL2_MISC_CAP_ADDR 0x134 -#define GLBL2_MISC_CAP_RSVD_1_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_GLBL2_DBG_PCIE_RQ0_ADDR 0x1B8 -#define GLBL2_PCIE_RQ0_NPH_AVL_MASK GENMASK(31, 20) -#define GLBL2_PCIE_RQ0_RCB_AVL_MASK GENMASK(19, 10) -#define GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK GENMASK(9, 4) -#define GLBL2_PCIE_RQ0_TAG_EP_MASK GENMASK(3, 2) -#define GLBL2_PCIE_RQ0_TAG_FL_MASK GENMASK(1, 0) -#define QDMA_S80_HARD_GLBL2_DBG_PCIE_RQ1_ADDR 0x1BC -#define GLBL2_PCIE_RQ1_RSVD_1_MASK GENMASK(31, 17) -#define GLBL2_PCIE_RQ1_WTLP_REQ_MASK BIT(16) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK BIT(15) -#define GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK BIT(14) -#define GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK BIT(13) -#define GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK BIT(12) -#define GLBL2_PCIE_RQ1_TLPSM_MASK GENMASK(11, 9) -#define GLBL2_PCIE_RQ1_TLPSM512_MASK GENMASK(8, 6) -#define GLBL2_PCIE_RQ1_RREQ0_RCB_OK_MASK BIT(5) -#define GLBL2_PCIE_RQ1_RREQ0_SLV_MASK BIT(4) -#define GLBL2_PCIE_RQ1_RREQ0_VLD_MASK BIT(3) -#define GLBL2_PCIE_RQ1_RREQ1_RCB_OK_MASK BIT(2) -#define GLBL2_PCIE_RQ1_RREQ1_SLV_MASK BIT(1) -#define GLBL2_PCIE_RQ1_RREQ1_VLD_MASK BIT(0) -#define QDMA_S80_HARD_GLBL2_DBG_AXIMM_WR0_ADDR 0x1C0 -#define GLBL2_AXIMM_WR0_RSVD_1_MASK GENMASK(31, 27) -#define GLBL2_AXIMM_WR0_WR_REQ_MASK BIT(26) -#define GLBL2_AXIMM_WR0_WR_CHN_MASK GENMASK(25, 23) -#define GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK BIT(22) -#define GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK BIT(21) -#define GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK GENMASK(20, 18) -#define GLBL2_AXIMM_WR0_WRREQ_CNT_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR0_BID_MASK GENMASK(11, 9) -#define GLBL2_AXIMM_WR0_BVALID_MASK BIT(8) -#define GLBL2_AXIMM_WR0_BREADY_MASK BIT(7) -#define GLBL2_AXIMM_WR0_WVALID_MASK BIT(6) -#define GLBL2_AXIMM_WR0_WREADY_MASK BIT(5) -#define GLBL2_AXIMM_WR0_AWID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_WR0_AWVALID_MASK BIT(1) -#define GLBL2_AXIMM_WR0_AWREADY_MASK BIT(0) -#define QDMA_S80_HARD_GLBL2_DBG_AXIMM_WR1_ADDR 0x1C4 -#define GLBL2_AXIMM_WR1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_WR1_BRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_WR1_BRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_WR1_BRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_WR1_BRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_WR1_BRSP_CNT0_MASK GENMASK(5, 0) -#define QDMA_S80_HARD_GLBL2_DBG_AXIMM_RD0_ADDR 0x1C8 -#define GLBL2_AXIMM_RD0_RSVD_1_MASK GENMASK(31, 23) -#define GLBL2_AXIMM_RD0_PND_CNT_MASK GENMASK(22, 17) -#define GLBL2_AXIMM_RD0_RD_CHNL_MASK GENMASK(16, 14) -#define GLBL2_AXIMM_RD0_RD_REQ_MASK BIT(13) -#define GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK GENMASK(12, 10) -#define GLBL2_AXIMM_RD0_RID_MASK GENMASK(9, 7) -#define GLBL2_AXIMM_RD0_RVALID_MASK BIT(6) -#define GLBL2_AXIMM_RD0_RREADY_MASK BIT(5) -#define GLBL2_AXIMM_RD0_ARID_MASK GENMASK(4, 2) -#define GLBL2_AXIMM_RD0_ARVALID_MASK BIT(1) -#define GLBL2_AXIMM_RD0_ARREADY_MASK BIT(0) -#define QDMA_S80_HARD_GLBL2_DBG_AXIMM_RD1_ADDR 0x1CC -#define GLBL2_AXIMM_RD1_RSVD_1_MASK GENMASK(31, 30) -#define GLBL2_AXIMM_RD1_RRSP_CNT4_MASK GENMASK(29, 24) -#define GLBL2_AXIMM_RD1_RRSP_CNT3_MASK GENMASK(23, 18) -#define GLBL2_AXIMM_RD1_RRSP_CNT2_MASK GENMASK(17, 12) -#define GLBL2_AXIMM_RD1_RRSP_CNT1_MASK GENMASK(11, 6) -#define GLBL2_AXIMM_RD1_RRSP_CNT0_MASK GENMASK(5, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_1_ADDR 0x204 -#define GLBL_RNG_SZ_1_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_1_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_2_ADDR 0x208 -#define GLBL_RNG_SZ_2_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_2_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_3_ADDR 0x20C -#define GLBL_RNG_SZ_3_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_3_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_4_ADDR 0x210 -#define GLBL_RNG_SZ_4_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_4_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_5_ADDR 0x214 -#define GLBL_RNG_SZ_5_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_5_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_6_ADDR 0x218 -#define GLBL_RNG_SZ_6_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_6_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_7_ADDR 0x21C -#define GLBL_RNG_SZ_7_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_7_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_8_ADDR 0x220 -#define GLBL_RNG_SZ_8_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_8_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_9_ADDR 0x224 -#define GLBL_RNG_SZ_9_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_9_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_A_ADDR 0x228 -#define GLBL_RNG_SZ_A_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_A_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_B_ADDR 0x22C -#define GLBL_RNG_SZ_B_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_B_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_C_ADDR 0x230 -#define GLBL_RNG_SZ_C_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_C_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_D_ADDR 0x234 -#define GLBL_RNG_SZ_D_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_D_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_E_ADDR 0x238 -#define GLBL_RNG_SZ_E_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_E_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_F_ADDR 0x23C -#define GLBL_RNG_SZ_F_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_F_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_RNG_SZ_10_ADDR 0x240 -#define GLBL_RNG_SZ_10_RSVD_1_MASK GENMASK(31, 16) -#define GLBL_RNG_SZ_10_RING_SIZE_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_ERR_STAT_ADDR 0x248 -#define GLBL_ERR_STAT_RSVD_1_MASK GENMASK(31, 12) -#define GLBL_ERR_STAT_ERR_H2C_ST_MASK BIT(11) -#define GLBL_ERR_STAT_ERR_BDG_MASK BIT(10) -#define GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK BIT(9) -#define GLBL_ERR_STAT_ERR_C2H_ST_MASK BIT(8) -#define GLBL_ERR_STAT_ERR_C2H_MM_1_MASK BIT(7) -#define GLBL_ERR_STAT_ERR_C2H_MM_0_MASK BIT(6) -#define GLBL_ERR_STAT_ERR_H2C_MM_1_MASK BIT(5) -#define GLBL_ERR_STAT_ERR_H2C_MM_0_MASK BIT(4) -#define GLBL_ERR_STAT_ERR_TRQ_MASK BIT(3) -#define GLBL_ERR_STAT_ERR_DSC_MASK BIT(2) -#define GLBL_ERR_STAT_ERR_RAM_DBE_MASK BIT(1) -#define GLBL_ERR_STAT_ERR_RAM_SBE_MASK BIT(0) -#define QDMA_S80_HARD_GLBL_ERR_MASK_ADDR 0x24C -#define GLBL_ERR_RSVD_1_MASK GENMASK(31, 9) -#define GLBL_ERR_MASK GENMASK(8, 0) -#define QDMA_S80_HARD_GLBL_DSC_CFG_ADDR 0x250 -#define GLBL_DSC_CFG_RSVD_1_MASK GENMASK(31, 10) -#define GLBL_DSC_CFG_UNC_OVR_COR_MASK BIT(9) -#define GLBL_DSC_CFG_CTXT_FER_DIS_MASK BIT(8) -#define GLBL_DSC_CFG_RSVD_2_MASK GENMASK(7, 6) -#define GLBL_DSC_CFG_MAXFETCH_MASK GENMASK(5, 3) -#define GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define QDMA_S80_HARD_GLBL_DSC_ERR_STS_ADDR 0x254 -#define GLBL_DSC_ERR_STS_RSVD_1_MASK GENMASK(31, 25) -#define GLBL_DSC_ERR_STS_SBE_MASK BIT(24) -#define GLBL_DSC_ERR_STS_DBE_MASK BIT(23) -#define GLBL_DSC_ERR_STS_RQ_CANCEL_MASK BIT(22) -#define GLBL_DSC_ERR_STS_DSC_MASK BIT(21) -#define GLBL_DSC_ERR_STS_DMA_MASK BIT(20) -#define GLBL_DSC_ERR_STS_FLR_CANCEL_MASK BIT(19) -#define GLBL_DSC_ERR_STS_RSVD_2_MASK GENMASK(18, 17) -#define GLBL_DSC_ERR_STS_DAT_POISON_MASK BIT(16) -#define GLBL_DSC_ERR_STS_TIMEOUT_MASK BIT(9) -#define GLBL_DSC_ERR_STS_FLR_MASK BIT(5) -#define GLBL_DSC_ERR_STS_TAG_MASK BIT(4) -#define GLBL_DSC_ERR_STS_ADDR_MASK BIT(3) -#define GLBL_DSC_ERR_STS_PARAM_MASK BIT(2) -#define GLBL_DSC_ERR_STS_UR_CA_MASK BIT(1) -#define GLBL_DSC_ERR_STS_POISON_MASK BIT(0) -#define QDMA_S80_HARD_GLBL_DSC_ERR_MSK_ADDR 0x258 -#define GLBL_DSC_ERR_MSK_MASK GENMASK(8, 0) -#define QDMA_S80_HARD_GLBL_DSC_ERR_LOG0_ADDR 0x25C -#define GLBL_DSC_ERR_LOG0_VALID_MASK BIT(31) -#define GLBL_DSC_ERR_LOG0_RSVD_1_MASK GENMASK(30, 29) -#define GLBL_DSC_ERR_LOG0_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_ERR_LOG0_SEL_MASK BIT(16) -#define GLBL_DSC_ERR_LOG0_CIDX_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_DSC_ERR_LOG1_ADDR 0x260 -#define GLBL_DSC_ERR_LOG1_RSVD_1_MASK GENMASK(31, 9) -#define GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK GENMASK(8, 5) -#define GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK GENMASK(4, 0) -#define QDMA_S80_HARD_GLBL_TRQ_ERR_STS_ADDR 0x264 -#define GLBL_TRQ_ERR_STS_RSVD_1_MASK GENMASK(31, 4) -#define GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK BIT(3) -#define GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK BIT(2) -#define GLBL_TRQ_ERR_STS_QID_RANGE_MASK BIT(1) -#define GLBL_TRQ_ERR_STS_UNMAPPED_MASK BIT(0) -#define QDMA_S80_HARD_GLBL_TRQ_ERR_MSK_ADDR 0x268 -#define GLBL_TRQ_ERR_MSK_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_GLBL_TRQ_ERR_LOG_ADDR 0x26C -#define GLBL_TRQ_ERR_LOG_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_TRQ_ERR_LOG_TARGET_MASK GENMASK(27, 24) -#define GLBL_TRQ_ERR_LOG_FUNC_MASK GENMASK(23, 16) -#define GLBL_TRQ_ERR_LOG_ADDRESS_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_GLBL_DSC_DBG_DAT0_ADDR 0x270 -#define GLBL_DSC_DAT0_RSVD_1_MASK GENMASK(31, 30) -#define GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK BIT(29) -#define GLBL_DSC_DAT0_CTXT_ARB_QID_MASK GENMASK(28, 17) -#define GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK GENMASK(16, 12) -#define GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK BIT(11) -#define GLBL_DSC_DAT0_TMSTALL_MASK BIT(10) -#define GLBL_DSC_DAT0_RRQ_STALL_MASK GENMASK(9, 8) -#define GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK GENMASK(7, 6) -#define GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK GENMASK(5, 4) -#define GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK GENMASK(3, 2) -#define GLBL_DSC_DAT0_DSC_OUT_STALL_MASK GENMASK(1, 0) -#define QDMA_S80_HARD_GLBL_DSC_DBG_DAT1_ADDR 0x274 -#define GLBL_DSC_DAT1_RSVD_1_MASK GENMASK(31, 28) -#define GLBL_DSC_DAT1_EVT_SPC_C2H_MASK GENMASK(27, 22) -#define GLBL_DSC_DAT1_EVT_SP_H2C_MASK GENMASK(21, 16) -#define GLBL_DSC_DAT1_DSC_SPC_C2H_MASK GENMASK(15, 8) -#define GLBL_DSC_DAT1_DSC_SPC_H2C_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_0_ADDR 0x400 -#define TRQ_SEL_FMAP_0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_1_ADDR 0x404 -#define TRQ_SEL_FMAP_1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_2_ADDR 0x408 -#define TRQ_SEL_FMAP_2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_3_ADDR 0x40C -#define TRQ_SEL_FMAP_3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_4_ADDR 0x410 -#define TRQ_SEL_FMAP_4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_5_ADDR 0x414 -#define TRQ_SEL_FMAP_5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_6_ADDR 0x418 -#define TRQ_SEL_FMAP_6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_7_ADDR 0x41C -#define TRQ_SEL_FMAP_7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_8_ADDR 0x420 -#define TRQ_SEL_FMAP_8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_9_ADDR 0x424 -#define TRQ_SEL_FMAP_9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A_ADDR 0x428 -#define TRQ_SEL_FMAP_A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B_ADDR 0x42C -#define TRQ_SEL_FMAP_B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D_ADDR 0x430 -#define TRQ_SEL_FMAP_D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E_ADDR 0x434 -#define TRQ_SEL_FMAP_E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_F_ADDR 0x438 -#define TRQ_SEL_FMAP_F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_10_ADDR 0x43C -#define TRQ_SEL_FMAP_10_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_10_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_10_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_11_ADDR 0x440 -#define TRQ_SEL_FMAP_11_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_11_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_11_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_12_ADDR 0x444 -#define TRQ_SEL_FMAP_12_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_12_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_12_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_13_ADDR 0x448 -#define TRQ_SEL_FMAP_13_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_13_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_13_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_14_ADDR 0x44C -#define TRQ_SEL_FMAP_14_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_14_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_14_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_15_ADDR 0x450 -#define TRQ_SEL_FMAP_15_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_15_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_15_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_16_ADDR 0x454 -#define TRQ_SEL_FMAP_16_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_16_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_16_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_17_ADDR 0x458 -#define TRQ_SEL_FMAP_17_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_17_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_17_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_18_ADDR 0x45C -#define TRQ_SEL_FMAP_18_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_18_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_18_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_19_ADDR 0x460 -#define TRQ_SEL_FMAP_19_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_19_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_19_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_1A_ADDR 0x464 -#define TRQ_SEL_FMAP_1A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_1B_ADDR 0x468 -#define TRQ_SEL_FMAP_1B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_1C_ADDR 0x46C -#define TRQ_SEL_FMAP_1C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_1D_ADDR 0x470 -#define TRQ_SEL_FMAP_1D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_1E_ADDR 0x474 -#define TRQ_SEL_FMAP_1E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_1F_ADDR 0x478 -#define TRQ_SEL_FMAP_1F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_1F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_1F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_20_ADDR 0x47C -#define TRQ_SEL_FMAP_20_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_20_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_20_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_21_ADDR 0x480 -#define TRQ_SEL_FMAP_21_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_21_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_21_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_22_ADDR 0x484 -#define TRQ_SEL_FMAP_22_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_22_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_22_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_23_ADDR 0x488 -#define TRQ_SEL_FMAP_23_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_23_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_23_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_24_ADDR 0x48C -#define TRQ_SEL_FMAP_24_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_24_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_24_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_25_ADDR 0x490 -#define TRQ_SEL_FMAP_25_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_25_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_25_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_26_ADDR 0x494 -#define TRQ_SEL_FMAP_26_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_26_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_26_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_27_ADDR 0x498 -#define TRQ_SEL_FMAP_27_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_27_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_27_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_28_ADDR 0x49C -#define TRQ_SEL_FMAP_28_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_28_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_28_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_29_ADDR 0x4A0 -#define TRQ_SEL_FMAP_29_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_29_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_29_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_2A_ADDR 0x4A4 -#define TRQ_SEL_FMAP_2A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_2B_ADDR 0x4A8 -#define TRQ_SEL_FMAP_2B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_2C_ADDR 0x4AC -#define TRQ_SEL_FMAP_2C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_2D_ADDR 0x4B0 -#define TRQ_SEL_FMAP_2D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_2E_ADDR 0x4B4 -#define TRQ_SEL_FMAP_2E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_2F_ADDR 0x4B8 -#define TRQ_SEL_FMAP_2F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_2F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_2F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_30_ADDR 0x4BC -#define TRQ_SEL_FMAP_30_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_30_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_30_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_31_ADDR 0x4D0 -#define TRQ_SEL_FMAP_31_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_31_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_31_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_32_ADDR 0x4D4 -#define TRQ_SEL_FMAP_32_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_32_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_32_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_33_ADDR 0x4D8 -#define TRQ_SEL_FMAP_33_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_33_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_33_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_34_ADDR 0x4DC -#define TRQ_SEL_FMAP_34_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_34_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_34_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_35_ADDR 0x4E0 -#define TRQ_SEL_FMAP_35_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_35_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_35_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_36_ADDR 0x4E4 -#define TRQ_SEL_FMAP_36_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_36_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_36_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_37_ADDR 0x4E8 -#define TRQ_SEL_FMAP_37_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_37_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_37_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_38_ADDR 0x4EC -#define TRQ_SEL_FMAP_38_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_38_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_38_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_39_ADDR 0x4F0 -#define TRQ_SEL_FMAP_39_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_39_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_39_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_3A_ADDR 0x4F4 -#define TRQ_SEL_FMAP_3A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_3B_ADDR 0x4F8 -#define TRQ_SEL_FMAP_3B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_3C_ADDR 0x4FC -#define TRQ_SEL_FMAP_3C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_3D_ADDR 0x500 -#define TRQ_SEL_FMAP_3D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_3E_ADDR 0x504 -#define TRQ_SEL_FMAP_3E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_3F_ADDR 0x508 -#define TRQ_SEL_FMAP_3F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_3F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_3F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_40_ADDR 0x50C -#define TRQ_SEL_FMAP_40_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_40_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_40_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_41_ADDR 0x510 -#define TRQ_SEL_FMAP_41_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_41_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_41_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_42_ADDR 0x514 -#define TRQ_SEL_FMAP_42_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_42_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_42_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_43_ADDR 0x518 -#define TRQ_SEL_FMAP_43_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_43_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_43_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_44_ADDR 0x51C -#define TRQ_SEL_FMAP_44_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_44_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_44_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_45_ADDR 0x520 -#define TRQ_SEL_FMAP_45_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_45_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_45_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_46_ADDR 0x524 -#define TRQ_SEL_FMAP_46_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_46_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_46_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_47_ADDR 0x528 -#define TRQ_SEL_FMAP_47_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_47_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_47_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_48_ADDR 0x52C -#define TRQ_SEL_FMAP_48_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_48_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_48_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_49_ADDR 0x530 -#define TRQ_SEL_FMAP_49_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_49_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_49_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_4A_ADDR 0x534 -#define TRQ_SEL_FMAP_4A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_4B_ADDR 0x538 -#define TRQ_SEL_FMAP_4B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_4C_ADDR 0x53C -#define TRQ_SEL_FMAP_4C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_4D_ADDR 0x540 -#define TRQ_SEL_FMAP_4D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_4E_ADDR 0x544 -#define TRQ_SEL_FMAP_4E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_4F_ADDR 0x548 -#define TRQ_SEL_FMAP_4F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_4F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_4F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_50_ADDR 0x54C -#define TRQ_SEL_FMAP_50_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_50_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_50_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_51_ADDR 0x550 -#define TRQ_SEL_FMAP_51_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_51_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_51_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_52_ADDR 0x554 -#define TRQ_SEL_FMAP_52_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_52_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_52_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_53_ADDR 0x558 -#define TRQ_SEL_FMAP_53_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_53_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_53_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_54_ADDR 0x55C -#define TRQ_SEL_FMAP_54_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_54_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_54_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_55_ADDR 0x560 -#define TRQ_SEL_FMAP_55_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_55_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_55_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_56_ADDR 0x564 -#define TRQ_SEL_FMAP_56_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_56_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_56_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_57_ADDR 0x568 -#define TRQ_SEL_FMAP_57_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_57_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_57_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_58_ADDR 0x56C -#define TRQ_SEL_FMAP_58_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_58_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_58_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_59_ADDR 0x570 -#define TRQ_SEL_FMAP_59_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_59_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_59_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_5A_ADDR 0x574 -#define TRQ_SEL_FMAP_5A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_5B_ADDR 0x578 -#define TRQ_SEL_FMAP_5B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_5C_ADDR 0x57C -#define TRQ_SEL_FMAP_5C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_5D_ADDR 0x580 -#define TRQ_SEL_FMAP_5D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_5E_ADDR 0x584 -#define TRQ_SEL_FMAP_5E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_5F_ADDR 0x588 -#define TRQ_SEL_FMAP_5F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_5F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_5F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_60_ADDR 0x58C -#define TRQ_SEL_FMAP_60_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_60_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_60_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_61_ADDR 0x590 -#define TRQ_SEL_FMAP_61_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_61_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_61_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_62_ADDR 0x594 -#define TRQ_SEL_FMAP_62_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_62_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_62_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_63_ADDR 0x598 -#define TRQ_SEL_FMAP_63_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_63_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_63_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_64_ADDR 0x59C -#define TRQ_SEL_FMAP_64_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_64_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_64_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_65_ADDR 0x5A0 -#define TRQ_SEL_FMAP_65_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_65_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_65_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_66_ADDR 0x5A4 -#define TRQ_SEL_FMAP_66_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_66_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_66_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_67_ADDR 0x5A8 -#define TRQ_SEL_FMAP_67_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_67_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_67_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_68_ADDR 0x5AC -#define TRQ_SEL_FMAP_68_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_68_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_68_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_69_ADDR 0x5B0 -#define TRQ_SEL_FMAP_69_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_69_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_69_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_6A_ADDR 0x5B4 -#define TRQ_SEL_FMAP_6A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_6B_ADDR 0x5B8 -#define TRQ_SEL_FMAP_6B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_6C_ADDR 0x5BC -#define TRQ_SEL_FMAP_6C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_6D_ADDR 0x5C0 -#define TRQ_SEL_FMAP_6D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_6E_ADDR 0x5C4 -#define TRQ_SEL_FMAP_6E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_6F_ADDR 0x5C8 -#define TRQ_SEL_FMAP_6F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_6F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_6F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_70_ADDR 0x5CC -#define TRQ_SEL_FMAP_70_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_70_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_70_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_71_ADDR 0x5D0 -#define TRQ_SEL_FMAP_71_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_71_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_71_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_72_ADDR 0x5D4 -#define TRQ_SEL_FMAP_72_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_72_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_72_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_73_ADDR 0x5D8 -#define TRQ_SEL_FMAP_73_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_73_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_73_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_74_ADDR 0x5DC -#define TRQ_SEL_FMAP_74_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_74_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_74_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_75_ADDR 0x5E0 -#define TRQ_SEL_FMAP_75_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_75_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_75_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_76_ADDR 0x5E4 -#define TRQ_SEL_FMAP_76_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_76_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_76_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_77_ADDR 0x5E8 -#define TRQ_SEL_FMAP_77_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_77_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_77_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_78_ADDR 0x5EC -#define TRQ_SEL_FMAP_78_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_78_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_78_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_79_ADDR 0x5F0 -#define TRQ_SEL_FMAP_79_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_79_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_79_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_7A_ADDR 0x5F4 -#define TRQ_SEL_FMAP_7A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_7B_ADDR 0x5F8 -#define TRQ_SEL_FMAP_7B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_7C_ADDR 0x5FC -#define TRQ_SEL_FMAP_7C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_7D_ADDR 0x600 -#define TRQ_SEL_FMAP_7D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_7E_ADDR 0x604 -#define TRQ_SEL_FMAP_7E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_7F_ADDR 0x608 -#define TRQ_SEL_FMAP_7F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_7F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_7F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_80_ADDR 0x60C -#define TRQ_SEL_FMAP_80_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_80_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_80_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_81_ADDR 0x610 -#define TRQ_SEL_FMAP_81_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_81_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_81_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_82_ADDR 0x614 -#define TRQ_SEL_FMAP_82_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_82_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_82_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_83_ADDR 0x618 -#define TRQ_SEL_FMAP_83_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_83_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_83_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_84_ADDR 0x61C -#define TRQ_SEL_FMAP_84_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_84_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_84_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_85_ADDR 0x620 -#define TRQ_SEL_FMAP_85_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_85_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_85_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_86_ADDR 0x624 -#define TRQ_SEL_FMAP_86_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_86_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_86_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_87_ADDR 0x628 -#define TRQ_SEL_FMAP_87_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_87_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_87_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_88_ADDR 0x62C -#define TRQ_SEL_FMAP_88_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_88_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_88_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_89_ADDR 0x630 -#define TRQ_SEL_FMAP_89_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_89_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_89_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_8A_ADDR 0x634 -#define TRQ_SEL_FMAP_8A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_8B_ADDR 0x638 -#define TRQ_SEL_FMAP_8B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_8C_ADDR 0x63C -#define TRQ_SEL_FMAP_8C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_8D_ADDR 0x640 -#define TRQ_SEL_FMAP_8D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_8E_ADDR 0x644 -#define TRQ_SEL_FMAP_8E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_8F_ADDR 0x648 -#define TRQ_SEL_FMAP_8F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_8F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_8F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_90_ADDR 0x64C -#define TRQ_SEL_FMAP_90_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_90_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_90_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_91_ADDR 0x650 -#define TRQ_SEL_FMAP_91_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_91_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_91_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_92_ADDR 0x654 -#define TRQ_SEL_FMAP_92_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_92_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_92_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_93_ADDR 0x658 -#define TRQ_SEL_FMAP_93_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_93_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_93_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_94_ADDR 0x65C -#define TRQ_SEL_FMAP_94_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_94_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_94_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_95_ADDR 0x660 -#define TRQ_SEL_FMAP_95_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_95_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_95_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_96_ADDR 0x664 -#define TRQ_SEL_FMAP_96_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_96_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_96_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_97_ADDR 0x668 -#define TRQ_SEL_FMAP_97_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_97_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_97_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_98_ADDR 0x66C -#define TRQ_SEL_FMAP_98_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_98_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_98_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_99_ADDR 0x670 -#define TRQ_SEL_FMAP_99_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_99_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_99_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_9A_ADDR 0x674 -#define TRQ_SEL_FMAP_9A_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9A_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9A_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_9B_ADDR 0x678 -#define TRQ_SEL_FMAP_9B_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9B_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9B_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_9C_ADDR 0x67C -#define TRQ_SEL_FMAP_9C_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9C_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9C_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_9D_ADDR 0x680 -#define TRQ_SEL_FMAP_9D_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9D_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9D_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_9E_ADDR 0x684 -#define TRQ_SEL_FMAP_9E_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9E_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9E_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_9F_ADDR 0x688 -#define TRQ_SEL_FMAP_9F_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_9F_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_9F_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A0_ADDR 0x68C -#define TRQ_SEL_FMAP_A0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A1_ADDR 0x690 -#define TRQ_SEL_FMAP_A1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A2_ADDR 0x694 -#define TRQ_SEL_FMAP_A2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A3_ADDR 0x698 -#define TRQ_SEL_FMAP_A3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A4_ADDR 0x69C -#define TRQ_SEL_FMAP_A4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A5_ADDR 0x6A0 -#define TRQ_SEL_FMAP_A5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A6_ADDR 0x6A4 -#define TRQ_SEL_FMAP_A6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A7_ADDR 0x6A8 -#define TRQ_SEL_FMAP_A7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A8_ADDR 0x6AC -#define TRQ_SEL_FMAP_A8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_A9_ADDR 0x6B0 -#define TRQ_SEL_FMAP_A9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_A9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_A9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_AA_ADDR 0x6B4 -#define TRQ_SEL_FMAP_AA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_AB_ADDR 0x6B8 -#define TRQ_SEL_FMAP_AB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_AC_ADDR 0x6BC -#define TRQ_SEL_FMAP_AC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_AD_ADDR 0x6D0 -#define TRQ_SEL_FMAP_AD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_AE_ADDR 0x6D4 -#define TRQ_SEL_FMAP_AE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_AF_ADDR 0x6D8 -#define TRQ_SEL_FMAP_AF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_AF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_AF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B0_ADDR 0x6DC -#define TRQ_SEL_FMAP_B0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B1_ADDR 0x6E0 -#define TRQ_SEL_FMAP_B1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B2_ADDR 0x6E4 -#define TRQ_SEL_FMAP_B2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B3_ADDR 0x6E8 -#define TRQ_SEL_FMAP_B3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B4_ADDR 0x6EC -#define TRQ_SEL_FMAP_B4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B5_ADDR 0x6F0 -#define TRQ_SEL_FMAP_B5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B6_ADDR 0x6F4 -#define TRQ_SEL_FMAP_B6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B7_ADDR 0x6F8 -#define TRQ_SEL_FMAP_B7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B8_ADDR 0x6FC -#define TRQ_SEL_FMAP_B8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_B9_ADDR 0x700 -#define TRQ_SEL_FMAP_B9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_B9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_B9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_BA_ADDR 0x704 -#define TRQ_SEL_FMAP_BA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_BB_ADDR 0x708 -#define TRQ_SEL_FMAP_BB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_BC_ADDR 0x70C -#define TRQ_SEL_FMAP_BC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_BD_ADDR 0x710 -#define TRQ_SEL_FMAP_BD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_BE_ADDR 0x714 -#define TRQ_SEL_FMAP_BE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_BF_ADDR 0x718 -#define TRQ_SEL_FMAP_BF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_BF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_BF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C0_ADDR 0x71C -#define TRQ_SEL_FMAP_C0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C1_ADDR 0x720 -#define TRQ_SEL_FMAP_C1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C2_ADDR 0x734 -#define TRQ_SEL_FMAP_C2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C3_ADDR 0x748 -#define TRQ_SEL_FMAP_C3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C4_ADDR 0x74C -#define TRQ_SEL_FMAP_C4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C5_ADDR 0x750 -#define TRQ_SEL_FMAP_C5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C6_ADDR 0x754 -#define TRQ_SEL_FMAP_C6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C7_ADDR 0x758 -#define TRQ_SEL_FMAP_C7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C8_ADDR 0x75C -#define TRQ_SEL_FMAP_C8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_C9_ADDR 0x760 -#define TRQ_SEL_FMAP_C9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_C9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_C9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_CA_ADDR 0x764 -#define TRQ_SEL_FMAP_CA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_CB_ADDR 0x768 -#define TRQ_SEL_FMAP_CB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_CC_ADDR 0x76C -#define TRQ_SEL_FMAP_CC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_CD_ADDR 0x770 -#define TRQ_SEL_FMAP_CD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_CE_ADDR 0x774 -#define TRQ_SEL_FMAP_CE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_CF_ADDR 0x778 -#define TRQ_SEL_FMAP_CF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_CF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_CF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D0_ADDR 0x77C -#define TRQ_SEL_FMAP_D0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D1_ADDR 0x780 -#define TRQ_SEL_FMAP_D1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D2_ADDR 0x784 -#define TRQ_SEL_FMAP_D2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D3_ADDR 0x788 -#define TRQ_SEL_FMAP_D3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D4_ADDR 0x78C -#define TRQ_SEL_FMAP_D4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D5_ADDR 0x790 -#define TRQ_SEL_FMAP_D5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D6_ADDR 0x794 -#define TRQ_SEL_FMAP_D6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D7_ADDR 0x798 -#define TRQ_SEL_FMAP_D7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D8_ADDR 0x79C -#define TRQ_SEL_FMAP_D8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_D9_ADDR 0x7A0 -#define TRQ_SEL_FMAP_D9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_D9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_D9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_DA_ADDR 0x7A4 -#define TRQ_SEL_FMAP_DA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_DB_ADDR 0x7A8 -#define TRQ_SEL_FMAP_DB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_DC_ADDR 0x7AC -#define TRQ_SEL_FMAP_DC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_DD_ADDR 0x7B0 -#define TRQ_SEL_FMAP_DD_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DD_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DD_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_DE_ADDR 0x7B4 -#define TRQ_SEL_FMAP_DE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_DF_ADDR 0x7B8 -#define TRQ_SEL_FMAP_DF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_DF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_DF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E0_ADDR 0x7BC -#define TRQ_SEL_FMAP_E0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E1_ADDR 0x7C0 -#define TRQ_SEL_FMAP_E1_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E1_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E1_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E2_ADDR 0x7C4 -#define TRQ_SEL_FMAP_E2_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E2_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E2_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E3_ADDR 0x7C8 -#define TRQ_SEL_FMAP_E3_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E3_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E3_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E4_ADDR 0x7CC -#define TRQ_SEL_FMAP_E4_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E4_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E4_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E5_ADDR 0x7D0 -#define TRQ_SEL_FMAP_E5_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E5_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E5_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E6_ADDR 0x7D4 -#define TRQ_SEL_FMAP_E6_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E6_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E6_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E7_ADDR 0x7D8 -#define TRQ_SEL_FMAP_E7_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E7_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E7_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E8_ADDR 0x7DC -#define TRQ_SEL_FMAP_E8_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E8_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E8_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_E9_ADDR 0x7E0 -#define TRQ_SEL_FMAP_E9_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_E9_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_E9_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_EA_ADDR 0x7E4 -#define TRQ_SEL_FMAP_EA_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EA_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EA_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_EB_ADDR 0x7E8 -#define TRQ_SEL_FMAP_EB_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EB_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EB_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_EC_ADDR 0x7EC -#define TRQ_SEL_FMAP_EC_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EC_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EC_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_ED_ADDR 0x7F0 -#define TRQ_SEL_FMAP_ED_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_ED_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_ED_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_EE_ADDR 0x7F4 -#define TRQ_SEL_FMAP_EE_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EE_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EE_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_EF_ADDR 0x7F8 -#define TRQ_SEL_FMAP_EF_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_EF_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_EF_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_TRQ_SEL_FMAP_F0_ADDR 0x7FC -#define TRQ_SEL_FMAP_F0_RSVD_1_MASK GENMASK(31, 23) -#define TRQ_SEL_FMAP_F0_QID_MAX_MASK GENMASK(22, 11) -#define TRQ_SEL_FMAP_F0_QID_BASE_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_IND_CTXT_DATA_3_ADDR 0x804 -#define IND_CTXT_DATA_3_DATA_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_IND_CTXT_DATA_2_ADDR 0x808 -#define IND_CTXT_DATA_2_DATA_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_IND_CTXT_DATA_1_ADDR 0x80C -#define IND_CTXT_DATA_1_DATA_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_IND_CTXT_DATA_0_ADDR 0x810 -#define IND_CTXT_DATA_0_DATA_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_IND_CTXT3_ADDR 0x814 -#define IND_CTXT3_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_IND_CTXT2_ADDR 0x818 -#define IND_CTXT2_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_IND_CTXT1_ADDR 0x81C -#define IND_CTXT1_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_IND_CTXT0_ADDR 0x820 -#define IND_CTXT0_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_IND_CTXT_CMD_ADDR 0x824 -#define IND_CTXT_CMD_RSVD_1_MASK GENMASK(31, 18) -#define IND_CTXT_CMD_QID_MASK GENMASK(17, 7) -#define IND_CTXT_CMD_OP_MASK GENMASK(6, 5) -#define IND_CTXT_CMD_SET_MASK GENMASK(4, 1) -#define IND_CTXT_CMD_BUSY_MASK BIT(0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_1_ADDR 0xA00 -#define C2H_TIMER_CNT_1_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_1_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_2_ADDR 0xA04 -#define C2H_TIMER_CNT_2_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_2_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_3_ADDR 0xA08 -#define C2H_TIMER_CNT_3_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_3_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_4_ADDR 0xA0C -#define C2H_TIMER_CNT_4_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_4_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_5_ADDR 0xA10 -#define C2H_TIMER_CNT_5_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_5_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_6_ADDR 0xA14 -#define C2H_TIMER_CNT_6_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_6_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_7_ADDR 0xA18 -#define C2H_TIMER_CNT_7_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_7_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_8_ADDR 0xA1C -#define C2H_TIMER_CNT_8_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_8_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_9_ADDR 0xA20 -#define C2H_TIMER_CNT_9_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_9_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_A_ADDR 0xA24 -#define C2H_TIMER_CNT_A_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_A_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_B_ADDR 0xA28 -#define C2H_TIMER_CNT_B_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_B_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_C_ADDR 0xA2C -#define C2H_TIMER_CNT_C_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_C_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_D_ADDR 0xA30 -#define C2H_TIMER_CNT_D_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_D_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_E_ADDR 0xA34 -#define C2H_TIMER_CNT_E_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_E_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_F_ADDR 0xA38 -#define C2H_TIMER_CNT_F_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_F_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_TIMER_CNT_10_ADDR 0xA3C -#define C2H_TIMER_CNT_10_RSVD_1_MASK GENMASK(31, 8) -#define C2H_TIMER_CNT_10_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_1_ADDR 0xA40 -#define C2H_CNT_TH_1_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_1_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_2_ADDR 0xA44 -#define C2H_CNT_TH_2_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_2_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_3_ADDR 0xA48 -#define C2H_CNT_TH_3_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_3_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_4_ADDR 0xA4C -#define C2H_CNT_TH_4_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_4_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_5_ADDR 0xA50 -#define C2H_CNT_TH_5_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_5_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_6_ADDR 0xA54 -#define C2H_CNT_TH_6_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_6_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_7_ADDR 0xA58 -#define C2H_CNT_TH_7_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_7_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_8_ADDR 0xA5C -#define C2H_CNT_TH_8_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_8_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_9_ADDR 0xA60 -#define C2H_CNT_TH_9_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_9_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_A_ADDR 0xA64 -#define C2H_CNT_TH_A_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_A_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_B_ADDR 0xA68 -#define C2H_CNT_TH_B_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_B_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_C_ADDR 0xA6C -#define C2H_CNT_TH_C_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_C_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_D_ADDR 0xA70 -#define C2H_CNT_TH_D_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_D_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_E_ADDR 0xA74 -#define C2H_CNT_TH_E_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_E_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_F_ADDR 0xA78 -#define C2H_CNT_TH_F_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_F_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_CNT_TH_10_ADDR 0xA7C -#define C2H_CNT_TH_10_RSVD_1_MASK GENMASK(31, 8) -#define C2H_CNT_TH_10_THESHOLD_CNT_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_QID2VEC_MAP_QID_ADDR 0xA80 -#define C2H_QID2VEC_MAP_QID_RSVD_1_MASK GENMASK(31, 11) -#define C2H_QID2VEC_MAP_QID_QID_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_C2H_QID2VEC_MAP_ADDR 0xA84 -#define C2H_QID2VEC_MAP_RSVD_1_MASK GENMASK(31, 19) -#define C2H_QID2VEC_MAP_H2C_EN_COAL_MASK BIT(18) -#define C2H_QID2VEC_MAP_H2C_VECTOR_MASK GENMASK(17, 9) -#define C2H_QID2VEC_MAP_C2H_EN_COAL_MASK BIT(8) -#define C2H_QID2VEC_MAP_C2H_VECTOR_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_STAT_S_AXIS_C2H_ACCEPTED_ADDR 0xA88 -#define C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_S_AXIS_WRB_ACCEPTED_ADDR 0xA8C -#define C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_DESC_RSP_PKT_ACCEPTED_ADDR 0xA90 -#define C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_AXIS_PKG_CMP_ADDR 0xA94 -#define C2H_STAT_AXIS_PKG_CMP_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_DESC_RSP_ACCEPTED_ADDR 0xA98 -#define C2H_STAT_DESC_RSP_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_DESC_RSP_CMP_ADDR 0xA9C -#define C2H_STAT_DESC_RSP_CMP_D_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_WRQ_OUT_ADDR 0xAA0 -#define C2H_STAT_WRQ_OUT_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_WPL_REN_ACCEPTED_ADDR 0xAA4 -#define C2H_STAT_WPL_REN_ACCEPTED_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_TOTAL_WRQ_LEN_ADDR 0xAA8 -#define C2H_STAT_TOTAL_WRQ_LEN_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_TOTAL_WPL_LEN_ADDR 0xAAC -#define C2H_STAT_TOTAL_WPL_LEN_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_0_ADDR 0xAB0 -#define C2H_BUF_SZ_0_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_1_ADDR 0xAB4 -#define C2H_BUF_SZ_1_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_2_ADDR 0xAB8 -#define C2H_BUF_SZ_2_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_3_ADDR 0xABC -#define C2H_BUF_SZ_3_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_4_ADDR 0xAC0 -#define C2H_BUF_SZ_4_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_5_ADDR 0xAC4 -#define C2H_BUF_SZ_5_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_7_ADDR 0XAC8 -#define C2H_BUF_SZ_7_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_8_ADDR 0XACC -#define C2H_BUF_SZ_8_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_9_ADDR 0xAD0 -#define C2H_BUF_SZ_9_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_10_ADDR 0xAD4 -#define C2H_BUF_SZ_10_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_11_ADDR 0xAD8 -#define C2H_BUF_SZ_11_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_12_ADDR 0xAE0 -#define C2H_BUF_SZ_12_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_13_ADDR 0xAE4 -#define C2H_BUF_SZ_13_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_14_ADDR 0xAE8 -#define C2H_BUF_SZ_14_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_BUF_SZ_15_ADDR 0XAEC -#define C2H_BUF_SZ_15_SIZE_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_ERR_STAT_ADDR 0xAF0 -#define C2H_ERR_STAT_RSVD_1_MASK GENMASK(31, 16) -#define C2H_ERR_STAT_WRB_PRTY_ERR_MASK BIT(15) -#define C2H_ERR_STAT_WRB_CIDX_ERR_MASK BIT(14) -#define C2H_ERR_STAT_WRB_QFULL_ERR_MASK BIT(13) -#define C2H_ERR_STAT_WRB_INV_Q_ERR_MASK BIT(12) -#define C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH_MASK BIT(11) -#define C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK BIT(10) -#define C2H_ERR_STAT_ERR_DESC_CNT_MASK BIT(9) -#define C2H_ERR_STAT_RSVD_2_MASK BIT(8) -#define C2H_ERR_STAT_MSI_INT_FAIL_MASK BIT(7) -#define C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define C2H_ERR_STAT_RSVD_3_MASK BIT(5) -#define C2H_ERR_STAT_DESC_RSP_ERR_MASK BIT(4) -#define C2H_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_ERR_STAT_RSVD_4_MASK BIT(2) -#define C2H_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define QDMA_S80_HARD_C2H_ERR_MASK_ADDR 0xAF4 -#define C2H_ERR_EN_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_FATAL_ERR_STAT_ADDR 0xAF8 -#define C2H_FATAL_ERR_STAT_RSVD_1_MASK GENMASK(31, 19) -#define C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK BIT(18) -#define C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK BIT(17) -#define C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK BIT(15) -#define C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK BIT(13) -#define C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK BIT(9) -#define C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK BIT(8) -#define C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK GENMASK(7, 4) -#define C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK BIT(3) -#define C2H_FATAL_ERR_STAT_RSVD_2_MASK BIT(2) -#define C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK BIT(1) -#define C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK BIT(0) -#define QDMA_S80_HARD_C2H_FATAL_ERR_MASK_ADDR 0xAFC -#define C2H_FATAL_ERR_C2HEN_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_FATAL_ERR_ENABLE_ADDR 0xB00 -#define C2H_FATAL_ERR_ENABLE_RSVD_1_MASK GENMASK(31, 2) -#define C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK BIT(1) -#define C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK BIT(0) -#define QDMA_S80_HARD_GLBL_ERR_INT_ADDR 0xB04 -#define GLBL_ERR_INT_RSVD_1_MASK GENMASK(31, 18) -#define GLBL_ERR_INT_ARM_MASK BIT(17) -#define GLBL_ERR_INT_EN_COAL_MASK BIT(16) -#define GLBL_ERR_INT_VEC_MASK GENMASK(15, 8) -#define GLBL_ERR_INT_FUNC_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_PFCH_CFG_ADDR 0xB08 -#define C2H_PFCH_CFG_EVT_QCNT_TH_MASK GENMASK(31, 25) -#define C2H_PFCH_CFG_QCNT_MASK GENMASK(24, 16) -#define C2H_PFCH_CFG_NUM_MASK GENMASK(15, 8) -#define C2H_PFCH_CFG_FL_TH_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_C2H_INT_TIMER_TICK_ADDR 0xB0C -#define C2H_INT_TIMER_TICK_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_DESC_RSP_DROP_ACCEPTED_ADDR 0xB10 -#define C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_DESC_RSP_ERR_ACCEPTED_ADDR 0xB14 -#define C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_DESC_REQ_ADDR 0xB18 -#define C2H_STAT_DESC_REQ_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_0_ADDR 0xB1C -#define C2H_STAT_DMA_ENG_0_RSVD_1_MASK BIT(31) -#define C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK GENMASK(30, 28) -#define C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT_MASK GENMASK(27, 18) -#define C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT_MASK GENMASK(17, 8) -#define C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT_MASK GENMASK(7, 5) -#define C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK BIT(4) -#define C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK GENMASK(3, 0) -#define QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_1_ADDR 0xB20 -#define C2H_STAT_DMA_ENG_1_RSVD_1_MASK BIT(31) -#define C2H_STAT_DMA_ENG_1_DESC_RSP_LAST_MASK BIT(30) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT_MASK GENMASK(9, 0) -#define QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_2_ADDR 0xB24 -#define C2H_STAT_DMA_ENG_2_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT_MASK GENMASK(9, 0) -#define QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_3_ADDR 0xB28 -#define C2H_STAT_DMA_ENG_3_RSVD_1_MASK GENMASK(31, 30) -#define C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT_MASK GENMASK(9, 0) -#define QDMA_S80_HARD_C2H_DBG_PFCH_ERR_CTXT_ADDR 0xB2C -#define C2H_PFCH_ERR_CTXT_RSVD_1_MASK GENMASK(31, 14) -#define C2H_PFCH_ERR_CTXT_ERR_STAT_MASK BIT(13) -#define C2H_PFCH_ERR_CTXT_CMD_WR_MASK BIT(12) -#define C2H_PFCH_ERR_CTXT_QID_MASK GENMASK(11, 1) -#define C2H_PFCH_ERR_CTXT_DONE_MASK BIT(0) -#define QDMA_S80_HARD_C2H_FIRST_ERR_QID_ADDR 0xB30 -#define C2H_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 21) -#define C2H_FIRST_ERR_QID_ERR_STAT_MASK GENMASK(20, 16) -#define C2H_FIRST_ERR_QID_CMD_WR_MASK GENMASK(15, 12) -#define C2H_FIRST_ERR_QID_QID_MASK GENMASK(11, 0) -#define QDMA_S80_HARD_STAT_NUM_WRB_IN_ADDR 0xB34 -#define STAT_NUM_WRB_IN_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_IN_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_STAT_NUM_WRB_OUT_ADDR 0xB38 -#define STAT_NUM_WRB_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_OUT_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_STAT_NUM_WRB_DRP_ADDR 0xB3C -#define STAT_NUM_WRB_DRP_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_WRB_DRP_WRB_CNT_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_STAT_NUM_STAT_DESC_OUT_ADDR 0xB40 -#define STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_STAT_DESC_OUT_CNT_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_STAT_NUM_DSC_CRDT_SENT_ADDR 0xB44 -#define STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_DSC_CRDT_SENT_CNT_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_STAT_NUM_FCH_DSC_RCVD_ADDR 0xB48 -#define STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK GENMASK(31, 16) -#define STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_STAT_NUM_BYP_DSC_RCVD_ADDR 0xB4C -#define STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK GENMASK(31, 11) -#define STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_C2H_WRB_COAL_CFG_ADDR 0xB50 -#define C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define C2H_WRB_COAL_CFG_TICK_VAL_MASK GENMASK(25, 14) -#define C2H_WRB_COAL_CFG_TICK_CNT_MASK GENMASK(13, 2) -#define C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK BIT(1) -#define C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK BIT(0) -#define QDMA_S80_HARD_C2H_INTR_H2C_REQ_ADDR 0xB54 -#define C2H_INTR_H2C_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_C2H_MM_REQ_ADDR 0xB58 -#define C2H_INTR_C2H_MM_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_MM_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_ERR_INT_REQ_ADDR 0xB5C -#define C2H_INTR_ERR_INT_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_ERR_INT_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_C2H_ST_REQ_ADDR 0xB60 -#define C2H_INTR_C2H_ST_REQ_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_REQ_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_ADDR 0xB64 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_ADDR 0xB68 -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_ADDR 0xB6C -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_ADDR 0xB70 -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_C2H_ST_MSIX_ACK_ADDR 0xB74 -#define C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_C2H_ST_MSIX_FAIL_ADDR 0xB78 -#define C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_C2H_ST_NO_MSIX_ADDR 0xB7C -#define C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_INTR_C2H_ST_CTXT_INVAL_ADDR 0xB80 -#define C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK GENMASK(31, 18) -#define C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_STAT_WR_CMP_ADDR 0xB84 -#define C2H_STAT_WR_CMP_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_WR_CMP_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_4_ADDR 0xB88 -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD_MASK BIT(31) -#define C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY_MASK BIT(30) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT_MASK GENMASK(29, 20) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT_MASK GENMASK(19, 10) -#define C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT_MASK GENMASK(9, 0) -#define QDMA_S80_HARD_C2H_STAT_DBG_DMA_ENG_5_ADDR 0xB8C -#define C2H_STAT_DMA_ENG_5_RSVD_1_MASK GENMASK(31, 25) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD_MASK BIT(24) -#define C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY_MASK BIT(23) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT_MASK GENMASK(22, 13) -#define C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT_MASK GENMASK(12, 3) -#define C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT_MASK GENMASK(2, 0) -#define QDMA_S80_HARD_C2H_DBG_PFCH_QID_ADDR 0xB90 -#define C2H_PFCH_QID_RSVD_1_MASK GENMASK(31, 15) -#define C2H_PFCH_QID_ERR_CTXT_MASK BIT(14) -#define C2H_PFCH_QID_TARGET_MASK GENMASK(13, 11) -#define C2H_PFCH_QID_QID_OR_TAG_MASK GENMASK(10, 0) -#define QDMA_S80_HARD_C2H_DBG_PFCH_ADDR 0xB94 -#define C2H_PFCH_DATA_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_INT_DBG_ADDR 0xB98 -#define C2H_INT_RSVD_1_MASK GENMASK(31, 8) -#define C2H_INT_INT_COAL_SM_MASK GENMASK(7, 4) -#define C2H_INT_INT_SM_MASK GENMASK(3, 0) -#define QDMA_S80_HARD_C2H_STAT_IMM_ACCEPTED_ADDR 0xB9C -#define C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_IMM_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_STAT_MARKER_ACCEPTED_ADDR 0xBA0 -#define C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_MARKER_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_STAT_DISABLE_CMP_ACCEPTED_ADDR 0xBA4 -#define C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK GENMASK(31, 18) -#define C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_C2H_PLD_FIFO_CRDT_CNT_ADDR 0xBA8 -#define C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK GENMASK(31, 18) -#define C2H_PLD_FIFO_CRDT_CNT_CNT_MASK GENMASK(17, 0) -#define QDMA_S80_HARD_H2C_ERR_STAT_ADDR 0xE00 -#define H2C_ERR_STAT_RSVD_1_MASK GENMASK(31, 5) -#define H2C_ERR_STAT_SBE_MASK BIT(4) -#define H2C_ERR_STAT_DBE_MASK BIT(3) -#define H2C_ERR_STAT_NO_DMA_DS_MASK BIT(2) -#define H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK BIT(1) -#define H2C_ERR_STAT_ZERO_LEN_DS_MASK BIT(0) -#define QDMA_S80_HARD_H2C_ERR_MASK_ADDR 0xE04 -#define H2C_ERR_EN_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_H2C_FIRST_ERR_QID_ADDR 0xE08 -#define H2C_FIRST_ERR_QID_RSVD_1_MASK GENMASK(31, 20) -#define H2C_FIRST_ERR_QID_ERR_TYPE_MASK GENMASK(19, 16) -#define H2C_FIRST_ERR_QID_RSVD_2_MASK GENMASK(15, 12) -#define H2C_FIRST_ERR_QID_QID_MASK GENMASK(11, 0) -#define QDMA_S80_HARD_H2C_DBG_REG0_ADDR 0xE0C -#define H2C_REG0_NUM_DSC_RCVD_MASK GENMASK(31, 16) -#define H2C_REG0_NUM_WRB_SENT_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_H2C_DBG_REG1_ADDR 0xE10 -#define H2C_REG1_NUM_REQ_SENT_MASK GENMASK(31, 16) -#define H2C_REG1_NUM_CMP_SENT_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_H2C_DBG_REG2_ADDR 0xE14 -#define H2C_REG2_RSVD_1_MASK GENMASK(31, 16) -#define H2C_REG2_NUM_ERR_DSC_RCVD_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_H2C_DBG_REG3_ADDR 0xE18 -#define H2C_REG3_MASK BIT(31) -#define H2C_REG3_DSCO_FIFO_EMPTY_MASK BIT(30) -#define H2C_REG3_DSCO_FIFO_FULL_MASK BIT(29) -#define H2C_REG3_CUR_RC_STATE_MASK GENMASK(28, 26) -#define H2C_REG3_RDREQ_LINES_MASK GENMASK(25, 16) -#define H2C_REG3_RDATA_LINES_AVAIL_MASK GENMASK(15, 6) -#define H2C_REG3_PEND_FIFO_EMPTY_MASK BIT(5) -#define H2C_REG3_PEND_FIFO_FULL_MASK BIT(4) -#define H2C_REG3_CUR_RQ_STATE_MASK GENMASK(3, 2) -#define H2C_REG3_DSCI_FIFO_FULL_MASK BIT(1) -#define H2C_REG3_DSCI_FIFO_EMPTY_MASK BIT(0) -#define QDMA_S80_HARD_H2C_DBG_REG4_ADDR 0xE1C -#define H2C_REG4_RDREQ_ADDR_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_H2C_FATAL_ERR_EN_ADDR 0xE20 -#define H2C_FATAL_ERR_EN_RSVD_1_MASK GENMASK(31, 1) -#define H2C_FATAL_ERR_EN_H2C_MASK BIT(0) -#define QDMA_S80_HARD_C2H_CHANNEL_CTL_ADDR 0x1004 -#define C2H_CHANNEL_CTL_RSVD_1_MASK GENMASK(31, 1) -#define C2H_CHANNEL_CTL_RUN_MASK BIT(0) -#define QDMA_S80_HARD_C2H_CHANNEL_CTL_1_ADDR 0x1008 -#define C2H_CHANNEL_CTL_1_RUN_MASK GENMASK(31, 1) -#define C2H_CHANNEL_CTL_1_RUN_1_MASK BIT(0) -#define QDMA_S80_HARD_C2H_MM_STATUS_ADDR 0x1040 -#define C2H_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define C2H_MM_STATUS_RUN_MASK BIT(0) -#define QDMA_S80_HARD_C2H_CHANNEL_CMPL_DESC_CNT_ADDR 0x1048 -#define C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1054 -#define C2H_MM_ERR_CODE_ENABLE_RSVD_1_MASK BIT(31) -#define C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK BIT(30) -#define C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK BIT(29) -#define C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK BIT(28) -#define C2H_MM_ERR_CODE_ENABLE_RSVD_2_MASK GENMASK(27, 2) -#define C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK BIT(1) -#define C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(0) -#define QDMA_S80_HARD_C2H_MM_ERR_CODE_ADDR 0x1058 -#define C2H_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 18) -#define C2H_MM_ERR_CODE_VALID_MASK BIT(17) -#define C2H_MM_ERR_CODE_RDWR_MASK BIT(16) -#define C2H_MM_ERR_CODE_MASK GENMASK(4, 0) -#define QDMA_S80_HARD_C2H_MM_ERR_INFO_ADDR 0x105C -#define C2H_MM_ERR_INFO_RSVD_1_MASK GENMASK(31, 29) -#define C2H_MM_ERR_INFO_QID_MASK GENMASK(28, 17) -#define C2H_MM_ERR_INFO_DIR_MASK BIT(16) -#define C2H_MM_ERR_INFO_CIDX_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_C2H_MM_PERF_MON_CTL_ADDR 0x10C0 -#define C2H_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define C2H_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define C2H_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define QDMA_S80_HARD_C2H_MM_PERF_MON_CYCLE_CNT0_ADDR 0x10C4 -#define C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_MM_PERF_MON_CYCLE_CNT1_ADDR 0x10C8 -#define C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define QDMA_S80_HARD_C2H_MM_PERF_MON_DATA_CNT0_ADDR 0x10CC -#define C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_C2H_MM_PERF_MON_DATA_CNT1_ADDR 0x10D0 -#define C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define QDMA_S80_HARD_C2H_MM_DBG_ADDR 0x10E8 -#define C2H_MM_RSVD_1_MASK GENMASK(31, 24) -#define C2H_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define C2H_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define C2H_MM_RD_STALL_MASK BIT(6) -#define C2H_MM_RRQ_FIFO_FI_MASK BIT(5) -#define C2H_MM_WR_STALL_MASK BIT(4) -#define C2H_MM_WRQ_FIFO_FI_MASK BIT(3) -#define C2H_MM_WBK_STALL_MASK BIT(2) -#define C2H_MM_DSC_FIFO_EP_MASK BIT(1) -#define C2H_MM_DSC_FIFO_FL_MASK BIT(0) -#define QDMA_S80_HARD_H2C_CHANNEL_CTL_ADDR 0x1204 -#define H2C_CHANNEL_CTL_RSVD_1_MASK GENMASK(31, 1) -#define H2C_CHANNEL_CTL_RUN_MASK BIT(0) -#define QDMA_S80_HARD_H2C_CHANNEL_CTL_1_ADDR 0x1208 -#define H2C_CHANNEL_CTL_1_RUN_MASK BIT(0) -#define QDMA_S80_HARD_H2C_CHANNEL_CTL_2_ADDR 0x120C -#define H2C_CHANNEL_CTL_2_RUN_MASK BIT(0) -#define QDMA_S80_HARD_H2C_MM_STATUS_ADDR 0x1240 -#define H2C_MM_STATUS_RSVD_1_MASK GENMASK(31, 1) -#define H2C_MM_STATUS_RUN_MASK BIT(0) -#define QDMA_S80_HARD_H2C_CHANNEL_CMPL_DESC_CNT_ADDR 0x1248 -#define H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_H2C_MM_ERR_CODE_ENABLE_MASK_ADDR 0x1254 -#define H2C_MM_ERR_CODE_ENABLE_RSVD_1_MASK GENMASK(31, 30) -#define H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK BIT(29) -#define H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK BIT(28) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_2_MASK GENMASK(27, 23) -#define H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK BIT(22) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_3_MASK GENMASK(21, 17) -#define H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK BIT(16) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_4_MASK GENMASK(15, 9) -#define H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK BIT(8) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_5_MASK GENMASK(7, 6) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK BIT(5) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK BIT(4) -#define H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK BIT(3) -#define H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK BIT(2) -#define H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK BIT(1) -#define H2C_MM_ERR_CODE_ENABLE_RSVD_6_MASK BIT(0) -#define QDMA_S80_HARD_H2C_MM_ERR_CODE_ADDR 0x1258 -#define H2C_MM_ERR_CODE_RSVD_1_MASK GENMASK(31, 18) -#define H2C_MM_ERR_CODE_VALID_MASK BIT(17) -#define H2C_MM_ERR_CODE_RDWR_MASK BIT(16) -#define H2C_MM_ERR_CODE_MASK GENMASK(4, 0) -#define QDMA_S80_HARD_H2C_MM_ERR_INFO_ADDR 0x125C -#define H2C_MM_ERR_INFO_RSVD_1_MASK GENMASK(31, 29) -#define H2C_MM_ERR_INFO_QID_MASK GENMASK(28, 17) -#define H2C_MM_ERR_INFO_DIR_MASK BIT(16) -#define H2C_MM_ERR_INFO_CIDX_MASK GENMASK(15, 0) -#define QDMA_S80_HARD_H2C_MM_PERF_MON_CTL_ADDR 0x12C0 -#define H2C_MM_PERF_MON_CTL_RSVD_1_MASK GENMASK(31, 4) -#define H2C_MM_PERF_MON_CTL_IMM_START_MASK BIT(3) -#define H2C_MM_PERF_MON_CTL_RUN_START_MASK BIT(2) -#define H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK BIT(1) -#define H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK BIT(0) -#define QDMA_S80_HARD_H2C_MM_PERF_MON_CYCLE_CNT0_ADDR 0x12C4 -#define H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_H2C_MM_PERF_MON_CYCLE_CNT1_ADDR 0x12C8 -#define H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK GENMASK(9, 0) -#define QDMA_S80_HARD_H2C_MM_PERF_MON_DATA_CNT0_ADDR 0x12CC -#define H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK GENMASK(31, 0) -#define QDMA_S80_HARD_H2C_MM_PERF_MON_DATA_CNT1_ADDR 0x12D0 -#define H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK GENMASK(31, 10) -#define H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK GENMASK(9, 0) -#define QDMA_S80_HARD_H2C_MM_DBG_ADDR 0x12E8 -#define H2C_MM_RSVD_1_MASK GENMASK(31, 24) -#define H2C_MM_RRQ_ENTRIES_MASK GENMASK(23, 17) -#define H2C_MM_DAT_FIFO_SPC_MASK GENMASK(16, 7) -#define H2C_MM_RD_STALL_MASK BIT(6) -#define H2C_MM_RRQ_FIFO_FI_MASK BIT(5) -#define H2C_MM_WR_STALL_MASK BIT(4) -#define H2C_MM_WRQ_FIFO_FI_MASK BIT(3) -#define H2C_MM_WBK_STALL_MASK BIT(2) -#define H2C_MM_DSC_FIFO_EP_MASK BIT(1) -#define H2C_MM_DSC_FIFO_FL_MASK BIT(0) -#define QDMA_S80_HARD_FUNC_STATUS_REG_ADDR 0x2400 -#define FUNC_STATUS_REG_RSVD_1_MASK GENMASK(31, 12) -#define FUNC_STATUS_REG_CUR_SRC_FN_MASK GENMASK(11, 4) -#define FUNC_STATUS_REG_ACK_MASK BIT(2) -#define FUNC_STATUS_REG_O_MSG_MASK BIT(1) -#define FUNC_STATUS_REG_I_MSG_MASK BIT(0) -#define QDMA_S80_HARD_FUNC_CMD_REG_ADDR 0x2404 -#define FUNC_CMD_REG_RSVD_1_MASK GENMASK(31, 3) -#define FUNC_CMD_REG_RSVD_2_MASK BIT(2) -#define FUNC_CMD_REG_MSG_RCV_MASK BIT(1) -#define FUNC_CMD_REG_MSG_SENT_MASK BIT(0) -#define QDMA_S80_HARD_FUNC_INTERRUPT_VECTOR_REG_ADDR 0x2408 -#define FUNC_INTERRUPT_VECTOR_REG_RSVD_1_MASK GENMASK(31, 5) -#define FUNC_INTERRUPT_VECTOR_REG_IN_MASK GENMASK(4, 0) -#define QDMA_S80_HARD_TARGET_FUNC_REG_ADDR 0x240C -#define TARGET_FUNC_REG_RSVD_1_MASK GENMASK(31, 8) -#define TARGET_FUNC_REG_N_ID_MASK GENMASK(7, 0) -#define QDMA_S80_HARD_FUNC_INTERRUPT_CTL_REG_ADDR 0x2410 -#define FUNC_INTERRUPT_CTL_REG_RSVD_1_MASK GENMASK(31, 1) -#define FUNC_INTERRUPT_CTL_REG_INT_EN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W3_DSC_BASE_H_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W2_DSC_BASE_L_MASK GENMASK(31, 0) -#define SW_IND_CTXT_DATA_W1_IS_MM_MASK BIT(31) -#define SW_IND_CTXT_DATA_W1_MRKR_DIS_MASK BIT(30) -#define SW_IND_CTXT_DATA_W1_IRQ_REQ_MASK BIT(29) -#define SW_IND_CTXT_DATA_W1_ERR_WB_SENT_MASK BIT(28) -#define SW_IND_CTXT_DATA_W1_ERR_MASK GENMASK(27, 26) -#define SW_IND_CTXT_DATA_W1_IRQ_NO_LAST_MASK BIT(25) -#define SW_IND_CTXT_DATA_W1_PORT_ID_MASK GENMASK(24, 22) -#define SW_IND_CTXT_DATA_W1_IRQ_EN_MASK BIT(21) -#define SW_IND_CTXT_DATA_W1_WBK_EN_MASK BIT(20) -#define SW_IND_CTXT_DATA_W1_MM_CHN_MASK BIT(19) -#define SW_IND_CTXT_DATA_W1_BYPASS_MASK BIT(18) -#define SW_IND_CTXT_DATA_W1_DSC_SZ_MASK GENMASK(17, 16) -#define SW_IND_CTXT_DATA_W1_RNG_SZ_MASK GENMASK(15, 12) -#define SW_IND_CTXT_DATA_W1_FNC_ID_MASK GENMASK(11, 4) -#define SW_IND_CTXT_DATA_W1_WBI_INTVL_EN_MASK BIT(3) -#define SW_IND_CTXT_DATA_W1_WBI_CHK_MASK BIT(2) -#define SW_IND_CTXT_DATA_W1_FCRD_EN_MASK BIT(1) -#define SW_IND_CTXT_DATA_W1_QEN_MASK BIT(0) -#define SW_IND_CTXT_DATA_W0_RSV_MASK GENMASK(31, 17) -#define SW_IND_CTXT_DATA_W0_IRQ_ARM_MASK BIT(16) -#define SW_IND_CTXT_DATA_W0_PIDX_MASK GENMASK(15, 0) -#define HW_IND_CTXT_DATA_W1_RSVD_MASK GENMASK(15, 11) -#define HW_IND_CTXT_DATA_W1_FETCH_PND_MASK BIT(10) -#define HW_IND_CTXT_DATA_W1_IDL_STP_B_MASK BIT(9) -#define HW_IND_CTXT_DATA_W1_DSC_PND_MASK BIT(8) -#define HW_IND_CTXT_DATA_W1_RSVD_1_MASK GENMASK(7, 0) -#define HW_IND_CTXT_DATA_W0_CRD_USE_MASK GENMASK(31, 16) -#define HW_IND_CTXT_DATA_W0_CIDX_MASK GENMASK(15, 0) -#define CRED_CTXT_DATA_W0_RSVD_1_MASK GENMASK(31, 16) -#define CRED_CTXT_DATA_W0_CREDT_MASK GENMASK(15, 0) -#define PREFETCH_CTXT_DATA_W1_VALID_MASK BIT(13) -#define PREFETCH_CTXT_DATA_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define PREFETCH_CTXT_DATA_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define PREFETCH_CTXT_DATA_W0_PFCH_MASK BIT(28) -#define PREFETCH_CTXT_DATA_W0_PFCH_EN_MASK BIT(27) -#define PREFETCH_CTXT_DATA_W0_ERR_MASK BIT(26) -#define PREFETCH_CTXT_DATA_W0_RSVD_MASK GENMASK(25, 8) -#define PREFETCH_CTXT_DATA_W0_PORT_ID_MASK GENMASK(7, 5) -#define PREFETCH_CTXT_DATA_W0_BUF_SIZE_IDX_MASK GENMASK(4, 1) -#define PREFETCH_CTXT_DATA_W0_BYPASS_MASK BIT(0) -#define CMPL_CTXT_DATA_W3_RSVD_MASK GENMASK(31, 30) -#define CMPL_CTXT_DATA_W3_FULL_UPD_MASK BIT(29) -#define CMPL_CTXT_DATA_W3_TIMER_RUNNING_MASK BIT(28) -#define CMPL_CTXT_DATA_W3_USER_TRIG_PEND_MASK BIT(27) -#define CMPL_CTXT_DATA_W3_ERR_MASK GENMASK(26, 25) -#define CMPL_CTXT_DATA_W3_VALID_MASK BIT(24) -#define CMPL_CTXT_DATA_W3_CIDX_MASK GENMASK(23, 8) -#define CMPL_CTXT_DATA_W3_PIDX_H_MASK GENMASK(7, 0) -#define CMPL_CTXT_DATA_W2_PIDX_L_MASK GENMASK(31, 24) -#define CMPL_CTXT_DATA_W2_DESC_SIZE_MASK GENMASK(23, 22) -#define CMPL_CTXT_DATA_W2_BADDR_64_H_MASK GENMASK(21, 0) -#define CMPL_CTXT_DATA_W1_BADDR_64_M_MASK GENMASK(31, 0) -#define CMPL_CTXT_DATA_W0_BADDR_64_L_MASK GENMASK(31, 28) -#define CMPL_CTXT_DATA_W0_QSIZE_IDX_MASK GENMASK(27, 24) -#define CMPL_CTXT_DATA_W0_COLOR_MASK BIT(23) -#define CMPL_CTXT_DATA_W0_INT_ST_MASK GENMASK(22, 21) -#define CMPL_CTXT_DATA_W0_TIMER_IDX_MASK GENMASK(20, 17) -#define CMPL_CTXT_DATA_W0_CNTER_IDX_MASK GENMASK(16, 13) -#define CMPL_CTXT_DATA_W0_FNC_ID_MASK GENMASK(12, 5) -#define CMPL_CTXT_DATA_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define CMPL_CTXT_DATA_W0_EN_INT_MASK BIT(1) -#define CMPL_CTXT_DATA_W0_EN_STAT_DESC_MASK BIT(0) -#define INTR_CTXT_DATA_W2_PIDX_MASK GENMASK(11, 0) -#define INTR_CTXT_DATA_W1_PAGE_SIZE_MASK GENMASK(31, 29) -#define INTR_CTXT_DATA_W1_BADDR_4K_H_MASK GENMASK(28, 0) -#define INTR_CTXT_DATA_W0_BADDR_4K_L_MASK GENMASK(31, 9) -#define INTR_CTXT_DATA_W0_COLOR_MASK BIT(8) -#define INTR_CTXT_DATA_W0_INT_ST_MASK BIT(7) -#define INTR_CTXT_DATA_W0_RSVD_MASK BIT(6) -#define INTR_CTXT_DATA_W0_VEC_MASK GENMASK(5, 1) -#define INTR_CTXT_DATA_W0_VALID_MASK BIT(0) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_reg_dump.c b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_reg_dump.c deleted file mode 100644 index 1f36732..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_s80_hard_access/qdma_s80_hard_reg_dump.c +++ /dev/null @@ -1,8013 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - - -#include "qdma_s80_hard_reg.h" -#include "qdma_reg_dump.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_s80_hard_reg_dump.tmh" -#endif - - -static struct regfield_info - cfg_blk_identifier_field_info[] = { - {"CFG_BLK_IDENTIFIER", - CFG_BLK_IDENTIFIER_MASK}, - {"CFG_BLK_IDENTIFIER_1", - CFG_BLK_IDENTIFIER_1_MASK}, - {"CFG_BLK_IDENTIFIER_RSVD_1", - CFG_BLK_IDENTIFIER_RSVD_1_MASK}, - {"CFG_BLK_IDENTIFIER_VERSION", - CFG_BLK_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - cfg_blk_busdev_field_info[] = { - {"CFG_BLK_BUSDEV_BDF", - CFG_BLK_BUSDEV_BDF_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_pld_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_PLD_SIZE", - CFG_BLK_PCIE_MAX_PLD_SIZE_MASK}, -}; - - -static struct regfield_info - cfg_blk_pcie_max_read_req_size_field_info[] = { - {"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", - CFG_BLK_PCIE_MAX_READ_REQ_SIZE_MASK}, -}; - - -static struct regfield_info - cfg_blk_system_id_field_info[] = { - {"CFG_BLK_SYSTEM_ID", - CFG_BLK_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - cfg_blk_msi_enable_field_info[] = { - {"CFG_BLK_MSI_ENABLE_3", - CFG_BLK_MSI_ENABLE_3_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX3", - CFG_BLK_MSI_ENABLE_MSIX3_MASK}, - {"CFG_BLK_MSI_ENABLE_2", - CFG_BLK_MSI_ENABLE_2_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX2", - CFG_BLK_MSI_ENABLE_MSIX2_MASK}, - {"CFG_BLK_MSI_ENABLE_1", - CFG_BLK_MSI_ENABLE_1_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX1", - CFG_BLK_MSI_ENABLE_MSIX1_MASK}, - {"CFG_BLK_MSI_ENABLE_0", - CFG_BLK_MSI_ENABLE_0_MASK}, - {"CFG_BLK_MSI_ENABLE_MSIX0", - CFG_BLK_MSI_ENABLE_MSIX0_MASK}, -}; - - -static struct regfield_info - cfg_pcie_data_width_field_info[] = { - {"CFG_PCIE_DATA_WIDTH_DATAPATH", - CFG_PCIE_DATA_WIDTH_DATAPATH_MASK}, -}; - - -static struct regfield_info - cfg_pcie_ctl_field_info[] = { - {"CFG_PCIE_CTL_RRQ_DISABLE", - CFG_PCIE_CTL_RRQ_DISABLE_MASK}, - {"CFG_PCIE_CTL_RELAXED_ORDERING", - CFG_PCIE_CTL_RELAXED_ORDERING_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_pld_size_field_info[] = { - {"CFG_AXI_USER_MAX_PLD_SIZE_ISSUED", - CFG_AXI_USER_MAX_PLD_SIZE_ISSUED_MASK}, - {"CFG_AXI_USER_MAX_PLD_SIZE_PROG", - CFG_AXI_USER_MAX_PLD_SIZE_PROG_MASK}, -}; - - -static struct regfield_info - cfg_axi_user_max_read_req_size_field_info[] = { - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USISSUED_MASK}, - {"CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG", - CFG_AXI_USER_MAX_READ_REQ_SIZE_USPROG_MASK}, -}; - - -static struct regfield_info - cfg_blk_misc_ctl_field_info[] = { - {"CFG_BLK_MISC_CTL_NUM_TAG", - CFG_BLK_MISC_CTL_NUM_TAG_MASK}, - {"CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER", - CFG_BLK_MISC_CTL_RQ_METERING_MULTIPLIER_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_0_field_info[] = { - {"CFG_BLK_SCRATCH_0", - CFG_BLK_SCRATCH_0_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_1_field_info[] = { - {"CFG_BLK_SCRATCH_1", - CFG_BLK_SCRATCH_1_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_2_field_info[] = { - {"CFG_BLK_SCRATCH_2", - CFG_BLK_SCRATCH_2_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_3_field_info[] = { - {"CFG_BLK_SCRATCH_3", - CFG_BLK_SCRATCH_3_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_4_field_info[] = { - {"CFG_BLK_SCRATCH_4", - CFG_BLK_SCRATCH_4_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_5_field_info[] = { - {"CFG_BLK_SCRATCH_5", - CFG_BLK_SCRATCH_5_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_6_field_info[] = { - {"CFG_BLK_SCRATCH_6", - CFG_BLK_SCRATCH_6_MASK}, -}; - - -static struct regfield_info - cfg_blk_scratch_7_field_info[] = { - {"CFG_BLK_SCRATCH_7", - CFG_BLK_SCRATCH_7_MASK}, -}; - - -static struct regfield_info - ram_sbe_msk_a_field_info[] = { - {"RAM_SBE_MSK_A", - RAM_SBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_sbe_sts_a_field_info[] = { - {"RAM_SBE_STS_A_RSVD_1", - RAM_SBE_STS_A_RSVD_1_MASK}, - {"RAM_SBE_STS_A_PFCH_LL_RAM", - RAM_SBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_CTXT_RAM", - RAM_SBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_PFCH_CTXT_RAM", - RAM_SBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_SBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_INT_CTXT_RAM", - RAM_SBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_INT_QID2VEC_RAM", - RAM_SBE_STS_A_INT_QID2VEC_RAM_MASK}, - {"RAM_SBE_STS_A_WRB_COAL_DATA_RAM", - RAM_SBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_SBE_STS_A_TUSER_FIFO_RAM", - RAM_SBE_STS_A_TUSER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_QID_FIFO_RAM", - RAM_SBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PLD_FIFO_RAM", - RAM_SBE_STS_A_PLD_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_TIMER_FIFO_RAM", - RAM_SBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_SBE_STS_A_PASID_CTXT_RAM", - RAM_SBE_STS_A_PASID_CTXT_RAM_MASK}, - {"RAM_SBE_STS_A_DSC_CPLD", - RAM_SBE_STS_A_DSC_CPLD_MASK}, - {"RAM_SBE_STS_A_DSC_CPLI", - RAM_SBE_STS_A_DSC_CPLI_MASK}, - {"RAM_SBE_STS_A_DSC_SW_CTXT", - RAM_SBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_SBE_STS_A_DSC_CRD_RCV", - RAM_SBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_SBE_STS_A_DSC_HW_CTXT", - RAM_SBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_SBE_STS_A_FUNC_MAP", - RAM_SBE_STS_A_FUNC_MAP_MASK}, - {"RAM_SBE_STS_A_C2H_WR_BRG_DAT", - RAM_SBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_C2H_RD_BRG_DAT", - RAM_SBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_WR_BRG_DAT", - RAM_SBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_H2C_RD_BRG_DAT", - RAM_SBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_SBE_STS_A_RSVD_2", - RAM_SBE_STS_A_RSVD_2_MASK}, - {"RAM_SBE_STS_A_MI_C2H0_DAT", - RAM_SBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_SBE_STS_A_RSVD_3", - RAM_SBE_STS_A_RSVD_3_MASK}, - {"RAM_SBE_STS_A_MI_H2C0_DAT", - RAM_SBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - ram_dbe_msk_a_field_info[] = { - {"RAM_DBE_MSK_A", - RAM_DBE_MSK_A_MASK}, -}; - - -static struct regfield_info - ram_dbe_sts_a_field_info[] = { - {"RAM_DBE_STS_A_RSVD_1", - RAM_DBE_STS_A_RSVD_1_MASK}, - {"RAM_DBE_STS_A_PFCH_LL_RAM", - RAM_DBE_STS_A_PFCH_LL_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_CTXT_RAM", - RAM_DBE_STS_A_WRB_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_PFCH_CTXT_RAM", - RAM_DBE_STS_A_PFCH_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DESC_REQ_FIFO_RAM", - RAM_DBE_STS_A_DESC_REQ_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_INT_CTXT_RAM", - RAM_DBE_STS_A_INT_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_INT_QID2VEC_RAM", - RAM_DBE_STS_A_INT_QID2VEC_RAM_MASK}, - {"RAM_DBE_STS_A_WRB_COAL_DATA_RAM", - RAM_DBE_STS_A_WRB_COAL_DATA_RAM_MASK}, - {"RAM_DBE_STS_A_TUSER_FIFO_RAM", - RAM_DBE_STS_A_TUSER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_QID_FIFO_RAM", - RAM_DBE_STS_A_QID_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PLD_FIFO_RAM", - RAM_DBE_STS_A_PLD_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_TIMER_FIFO_RAM", - RAM_DBE_STS_A_TIMER_FIFO_RAM_MASK}, - {"RAM_DBE_STS_A_PASID_CTXT_RAM", - RAM_DBE_STS_A_PASID_CTXT_RAM_MASK}, - {"RAM_DBE_STS_A_DSC_CPLD", - RAM_DBE_STS_A_DSC_CPLD_MASK}, - {"RAM_DBE_STS_A_DSC_CPLI", - RAM_DBE_STS_A_DSC_CPLI_MASK}, - {"RAM_DBE_STS_A_DSC_SW_CTXT", - RAM_DBE_STS_A_DSC_SW_CTXT_MASK}, - {"RAM_DBE_STS_A_DSC_CRD_RCV", - RAM_DBE_STS_A_DSC_CRD_RCV_MASK}, - {"RAM_DBE_STS_A_DSC_HW_CTXT", - RAM_DBE_STS_A_DSC_HW_CTXT_MASK}, - {"RAM_DBE_STS_A_FUNC_MAP", - RAM_DBE_STS_A_FUNC_MAP_MASK}, - {"RAM_DBE_STS_A_C2H_WR_BRG_DAT", - RAM_DBE_STS_A_C2H_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_C2H_RD_BRG_DAT", - RAM_DBE_STS_A_C2H_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_WR_BRG_DAT", - RAM_DBE_STS_A_H2C_WR_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_H2C_RD_BRG_DAT", - RAM_DBE_STS_A_H2C_RD_BRG_DAT_MASK}, - {"RAM_DBE_STS_A_RSVD_2", - RAM_DBE_STS_A_RSVD_2_MASK}, - {"RAM_DBE_STS_A_MI_C2H0_DAT", - RAM_DBE_STS_A_MI_C2H0_DAT_MASK}, - {"RAM_DBE_STS_A_RSVD_3", - RAM_DBE_STS_A_RSVD_3_MASK}, - {"RAM_DBE_STS_A_MI_H2C0_DAT", - RAM_DBE_STS_A_MI_H2C0_DAT_MASK}, -}; - - -static struct regfield_info - glbl2_identifier_field_info[] = { - {"GLBL2_IDENTIFIER", - GLBL2_IDENTIFIER_MASK}, - {"GLBL2_IDENTIFIER_VERSION", - GLBL2_IDENTIFIER_VERSION_MASK}, -}; - - -static struct regfield_info - glbl2_pf_barlite_int_field_info[] = { - {"GLBL2_PF_BARLITE_INT_PF3_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF3_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF2_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF2_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF1_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF1_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_INT_PF0_BAR_MAP", - GLBL2_PF_BARLITE_INT_PF0_BAR_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_vf_barlite_int_field_info[] = { - {"GLBL2_PF_VF_BARLITE_INT_PF3_MAP", - GLBL2_PF_VF_BARLITE_INT_PF3_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF2_MAP", - GLBL2_PF_VF_BARLITE_INT_PF2_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF1_MAP", - GLBL2_PF_VF_BARLITE_INT_PF1_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_INT_PF0_MAP", - GLBL2_PF_VF_BARLITE_INT_PF0_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_barlite_ext_field_info[] = { - {"GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF3_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF2_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF1_BAR_MAP_MASK}, - {"GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP", - GLBL2_PF_BARLITE_EXT_PF0_BAR_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_pf_vf_barlite_ext_field_info[] = { - {"GLBL2_PF_VF_BARLITE_EXT_PF3_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF3_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF2_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF2_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF1_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF1_MAP_MASK}, - {"GLBL2_PF_VF_BARLITE_EXT_PF0_MAP", - GLBL2_PF_VF_BARLITE_EXT_PF0_MAP_MASK}, -}; - - -static struct regfield_info - glbl2_channel_inst_field_info[] = { - {"GLBL2_CHANNEL_INST_RSVD_1", - GLBL2_CHANNEL_INST_RSVD_1_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ST", - GLBL2_CHANNEL_INST_C2H_ST_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ST", - GLBL2_CHANNEL_INST_H2C_ST_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_2", - GLBL2_CHANNEL_INST_RSVD_2_MASK}, - {"GLBL2_CHANNEL_INST_C2H_ENG", - GLBL2_CHANNEL_INST_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_INST_RSVD_3", - GLBL2_CHANNEL_INST_RSVD_3_MASK}, - {"GLBL2_CHANNEL_INST_H2C_ENG", - GLBL2_CHANNEL_INST_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_mdma_field_info[] = { - {"GLBL2_CHANNEL_MDMA_RSVD_1", - GLBL2_CHANNEL_MDMA_RSVD_1_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ST", - GLBL2_CHANNEL_MDMA_C2H_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ST", - GLBL2_CHANNEL_MDMA_H2C_ST_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_2", - GLBL2_CHANNEL_MDMA_RSVD_2_MASK}, - {"GLBL2_CHANNEL_MDMA_C2H_ENG", - GLBL2_CHANNEL_MDMA_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_MDMA_RSVD_3", - GLBL2_CHANNEL_MDMA_RSVD_3_MASK}, - {"GLBL2_CHANNEL_MDMA_H2C_ENG", - GLBL2_CHANNEL_MDMA_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_strm_field_info[] = { - {"GLBL2_CHANNEL_STRM_RSVD_1", - GLBL2_CHANNEL_STRM_RSVD_1_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ST", - GLBL2_CHANNEL_STRM_C2H_ST_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ST", - GLBL2_CHANNEL_STRM_H2C_ST_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_2", - GLBL2_CHANNEL_STRM_RSVD_2_MASK}, - {"GLBL2_CHANNEL_STRM_C2H_ENG", - GLBL2_CHANNEL_STRM_C2H_ENG_MASK}, - {"GLBL2_CHANNEL_STRM_RSVD_3", - GLBL2_CHANNEL_STRM_RSVD_3_MASK}, - {"GLBL2_CHANNEL_STRM_H2C_ENG", - GLBL2_CHANNEL_STRM_H2C_ENG_MASK}, -}; - - -static struct regfield_info - glbl2_channel_cap_field_info[] = { - {"GLBL2_CHANNEL_CAP_RSVD_1", - GLBL2_CHANNEL_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_CAP_MULTIQ_MAX", - GLBL2_CHANNEL_CAP_MULTIQ_MAX_MASK}, -}; - - -static struct regfield_info - glbl2_channel_pasid_cap_field_info[] = { - {"GLBL2_CHANNEL_PASID_CAP_RSVD_1", - GLBL2_CHANNEL_PASID_CAP_RSVD_1_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET", - GLBL2_CHANNEL_PASID_CAP_BRIDGEOFFSET_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_RSVD_2", - GLBL2_CHANNEL_PASID_CAP_RSVD_2_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_BRIDGEEN", - GLBL2_CHANNEL_PASID_CAP_BRIDGEEN_MASK}, - {"GLBL2_CHANNEL_PASID_CAP_DMAEN", - GLBL2_CHANNEL_PASID_CAP_DMAEN_MASK}, -}; - - -static struct regfield_info - glbl2_channel_func_ret_field_info[] = { - {"GLBL2_CHANNEL_FUNC_RET_RSVD_1", - GLBL2_CHANNEL_FUNC_RET_RSVD_1_MASK}, - {"GLBL2_CHANNEL_FUNC_RET_FUNC", - GLBL2_CHANNEL_FUNC_RET_FUNC_MASK}, -}; - - -static struct regfield_info - glbl2_system_id_field_info[] = { - {"GLBL2_SYSTEM_ID_RSVD_1", - GLBL2_SYSTEM_ID_RSVD_1_MASK}, - {"GLBL2_SYSTEM_ID", - GLBL2_SYSTEM_ID_MASK}, -}; - - -static struct regfield_info - glbl2_misc_cap_field_info[] = { - {"GLBL2_MISC_CAP_RSVD_1", - GLBL2_MISC_CAP_RSVD_1_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq0_field_info[] = { - {"GLBL2_PCIE_RQ0_NPH_AVL", - GLBL2_PCIE_RQ0_NPH_AVL_MASK}, - {"GLBL2_PCIE_RQ0_RCB_AVL", - GLBL2_PCIE_RQ0_RCB_AVL_MASK}, - {"GLBL2_PCIE_RQ0_SLV_RD_CREDS", - GLBL2_PCIE_RQ0_SLV_RD_CREDS_MASK}, - {"GLBL2_PCIE_RQ0_TAG_EP", - GLBL2_PCIE_RQ0_TAG_EP_MASK}, - {"GLBL2_PCIE_RQ0_TAG_FL", - GLBL2_PCIE_RQ0_TAG_FL_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_pcie_rq1_field_info[] = { - {"GLBL2_PCIE_RQ1_RSVD_1", - GLBL2_PCIE_RQ1_RSVD_1_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_REQ", - GLBL2_PCIE_RQ1_WTLP_REQ_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP", - GLBL2_PCIE_RQ1_WTLP_HEADER_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_EP", - GLBL2_PCIE_RQ1_RQ_FIFO_EP_MASK}, - {"GLBL2_PCIE_RQ1_RQ_FIFO_FL", - GLBL2_PCIE_RQ1_RQ_FIFO_FL_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM", - GLBL2_PCIE_RQ1_TLPSM_MASK}, - {"GLBL2_PCIE_RQ1_TLPSM512", - GLBL2_PCIE_RQ1_TLPSM512_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_RCB_OK", - GLBL2_PCIE_RQ1_RREQ0_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_SLV", - GLBL2_PCIE_RQ1_RREQ0_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ0_VLD", - GLBL2_PCIE_RQ1_RREQ0_VLD_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_RCB_OK", - GLBL2_PCIE_RQ1_RREQ1_RCB_OK_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_SLV", - GLBL2_PCIE_RQ1_RREQ1_SLV_MASK}, - {"GLBL2_PCIE_RQ1_RREQ1_VLD", - GLBL2_PCIE_RQ1_RREQ1_VLD_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr0_field_info[] = { - {"GLBL2_AXIMM_WR0_RSVD_1", - GLBL2_AXIMM_WR0_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR0_WR_REQ", - GLBL2_AXIMM_WR0_WR_REQ_MASK}, - {"GLBL2_AXIMM_WR0_WR_CHN", - GLBL2_AXIMM_WR0_WR_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP", - GLBL2_AXIMM_WR0_WTLP_DATA_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_WPL_FIFO_EP", - GLBL2_AXIMM_WR0_WPL_FIFO_EP_MASK}, - {"GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN", - GLBL2_AXIMM_WR0_BRSP_CLAIM_CHN_MASK}, - {"GLBL2_AXIMM_WR0_WRREQ_CNT", - GLBL2_AXIMM_WR0_WRREQ_CNT_MASK}, - {"GLBL2_AXIMM_WR0_BID", - GLBL2_AXIMM_WR0_BID_MASK}, - {"GLBL2_AXIMM_WR0_BVALID", - GLBL2_AXIMM_WR0_BVALID_MASK}, - {"GLBL2_AXIMM_WR0_BREADY", - GLBL2_AXIMM_WR0_BREADY_MASK}, - {"GLBL2_AXIMM_WR0_WVALID", - GLBL2_AXIMM_WR0_WVALID_MASK}, - {"GLBL2_AXIMM_WR0_WREADY", - GLBL2_AXIMM_WR0_WREADY_MASK}, - {"GLBL2_AXIMM_WR0_AWID", - GLBL2_AXIMM_WR0_AWID_MASK}, - {"GLBL2_AXIMM_WR0_AWVALID", - GLBL2_AXIMM_WR0_AWVALID_MASK}, - {"GLBL2_AXIMM_WR0_AWREADY", - GLBL2_AXIMM_WR0_AWREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_wr1_field_info[] = { - {"GLBL2_AXIMM_WR1_RSVD_1", - GLBL2_AXIMM_WR1_RSVD_1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT4", - GLBL2_AXIMM_WR1_BRSP_CNT4_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT3", - GLBL2_AXIMM_WR1_BRSP_CNT3_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT2", - GLBL2_AXIMM_WR1_BRSP_CNT2_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT1", - GLBL2_AXIMM_WR1_BRSP_CNT1_MASK}, - {"GLBL2_AXIMM_WR1_BRSP_CNT0", - GLBL2_AXIMM_WR1_BRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd0_field_info[] = { - {"GLBL2_AXIMM_RD0_RSVD_1", - GLBL2_AXIMM_RD0_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD0_PND_CNT", - GLBL2_AXIMM_RD0_PND_CNT_MASK}, - {"GLBL2_AXIMM_RD0_RD_CHNL", - GLBL2_AXIMM_RD0_RD_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RD_REQ", - GLBL2_AXIMM_RD0_RD_REQ_MASK}, - {"GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL", - GLBL2_AXIMM_RD0_RRSP_CLAIM_CHNL_MASK}, - {"GLBL2_AXIMM_RD0_RID", - GLBL2_AXIMM_RD0_RID_MASK}, - {"GLBL2_AXIMM_RD0_RVALID", - GLBL2_AXIMM_RD0_RVALID_MASK}, - {"GLBL2_AXIMM_RD0_RREADY", - GLBL2_AXIMM_RD0_RREADY_MASK}, - {"GLBL2_AXIMM_RD0_ARID", - GLBL2_AXIMM_RD0_ARID_MASK}, - {"GLBL2_AXIMM_RD0_ARVALID", - GLBL2_AXIMM_RD0_ARVALID_MASK}, - {"GLBL2_AXIMM_RD0_ARREADY", - GLBL2_AXIMM_RD0_ARREADY_MASK}, -}; - - -static struct regfield_info - glbl2_dbg_aximm_rd1_field_info[] = { - {"GLBL2_AXIMM_RD1_RSVD_1", - GLBL2_AXIMM_RD1_RSVD_1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT4", - GLBL2_AXIMM_RD1_RRSP_CNT4_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT3", - GLBL2_AXIMM_RD1_RRSP_CNT3_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT2", - GLBL2_AXIMM_RD1_RRSP_CNT2_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT1", - GLBL2_AXIMM_RD1_RRSP_CNT1_MASK}, - {"GLBL2_AXIMM_RD1_RRSP_CNT0", - GLBL2_AXIMM_RD1_RRSP_CNT0_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_1_field_info[] = { - {"GLBL_RNG_SZ_1_RSVD_1", - GLBL_RNG_SZ_1_RSVD_1_MASK}, - {"GLBL_RNG_SZ_1_RING_SIZE", - GLBL_RNG_SZ_1_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_2_field_info[] = { - {"GLBL_RNG_SZ_2_RSVD_1", - GLBL_RNG_SZ_2_RSVD_1_MASK}, - {"GLBL_RNG_SZ_2_RING_SIZE", - GLBL_RNG_SZ_2_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_3_field_info[] = { - {"GLBL_RNG_SZ_3_RSVD_1", - GLBL_RNG_SZ_3_RSVD_1_MASK}, - {"GLBL_RNG_SZ_3_RING_SIZE", - GLBL_RNG_SZ_3_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_4_field_info[] = { - {"GLBL_RNG_SZ_4_RSVD_1", - GLBL_RNG_SZ_4_RSVD_1_MASK}, - {"GLBL_RNG_SZ_4_RING_SIZE", - GLBL_RNG_SZ_4_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_5_field_info[] = { - {"GLBL_RNG_SZ_5_RSVD_1", - GLBL_RNG_SZ_5_RSVD_1_MASK}, - {"GLBL_RNG_SZ_5_RING_SIZE", - GLBL_RNG_SZ_5_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_6_field_info[] = { - {"GLBL_RNG_SZ_6_RSVD_1", - GLBL_RNG_SZ_6_RSVD_1_MASK}, - {"GLBL_RNG_SZ_6_RING_SIZE", - GLBL_RNG_SZ_6_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_7_field_info[] = { - {"GLBL_RNG_SZ_7_RSVD_1", - GLBL_RNG_SZ_7_RSVD_1_MASK}, - {"GLBL_RNG_SZ_7_RING_SIZE", - GLBL_RNG_SZ_7_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_8_field_info[] = { - {"GLBL_RNG_SZ_8_RSVD_1", - GLBL_RNG_SZ_8_RSVD_1_MASK}, - {"GLBL_RNG_SZ_8_RING_SIZE", - GLBL_RNG_SZ_8_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_9_field_info[] = { - {"GLBL_RNG_SZ_9_RSVD_1", - GLBL_RNG_SZ_9_RSVD_1_MASK}, - {"GLBL_RNG_SZ_9_RING_SIZE", - GLBL_RNG_SZ_9_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_a_field_info[] = { - {"GLBL_RNG_SZ_A_RSVD_1", - GLBL_RNG_SZ_A_RSVD_1_MASK}, - {"GLBL_RNG_SZ_A_RING_SIZE", - GLBL_RNG_SZ_A_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_b_field_info[] = { - {"GLBL_RNG_SZ_B_RSVD_1", - GLBL_RNG_SZ_B_RSVD_1_MASK}, - {"GLBL_RNG_SZ_B_RING_SIZE", - GLBL_RNG_SZ_B_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_c_field_info[] = { - {"GLBL_RNG_SZ_C_RSVD_1", - GLBL_RNG_SZ_C_RSVD_1_MASK}, - {"GLBL_RNG_SZ_C_RING_SIZE", - GLBL_RNG_SZ_C_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_d_field_info[] = { - {"GLBL_RNG_SZ_D_RSVD_1", - GLBL_RNG_SZ_D_RSVD_1_MASK}, - {"GLBL_RNG_SZ_D_RING_SIZE", - GLBL_RNG_SZ_D_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_e_field_info[] = { - {"GLBL_RNG_SZ_E_RSVD_1", - GLBL_RNG_SZ_E_RSVD_1_MASK}, - {"GLBL_RNG_SZ_E_RING_SIZE", - GLBL_RNG_SZ_E_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_f_field_info[] = { - {"GLBL_RNG_SZ_F_RSVD_1", - GLBL_RNG_SZ_F_RSVD_1_MASK}, - {"GLBL_RNG_SZ_F_RING_SIZE", - GLBL_RNG_SZ_F_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_rng_sz_10_field_info[] = { - {"GLBL_RNG_SZ_10_RSVD_1", - GLBL_RNG_SZ_10_RSVD_1_MASK}, - {"GLBL_RNG_SZ_10_RING_SIZE", - GLBL_RNG_SZ_10_RING_SIZE_MASK}, -}; - - -static struct regfield_info - glbl_err_stat_field_info[] = { - {"GLBL_ERR_STAT_RSVD_1", - GLBL_ERR_STAT_RSVD_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_ST", - GLBL_ERR_STAT_ERR_H2C_ST_MASK}, - {"GLBL_ERR_STAT_ERR_BDG", - GLBL_ERR_STAT_ERR_BDG_MASK}, - {"GLBL_ERR_STAT_IND_CTXT_CMD_ERR", - GLBL_ERR_STAT_IND_CTXT_CMD_ERR_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_ST", - GLBL_ERR_STAT_ERR_C2H_ST_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_1", - GLBL_ERR_STAT_ERR_C2H_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_C2H_MM_0", - GLBL_ERR_STAT_ERR_C2H_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_1", - GLBL_ERR_STAT_ERR_H2C_MM_1_MASK}, - {"GLBL_ERR_STAT_ERR_H2C_MM_0", - GLBL_ERR_STAT_ERR_H2C_MM_0_MASK}, - {"GLBL_ERR_STAT_ERR_TRQ", - GLBL_ERR_STAT_ERR_TRQ_MASK}, - {"GLBL_ERR_STAT_ERR_DSC", - GLBL_ERR_STAT_ERR_DSC_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_DBE", - GLBL_ERR_STAT_ERR_RAM_DBE_MASK}, - {"GLBL_ERR_STAT_ERR_RAM_SBE", - GLBL_ERR_STAT_ERR_RAM_SBE_MASK}, -}; - - -static struct regfield_info - glbl_err_mask_field_info[] = { - {"GLBL_ERR_RSVD_1", - GLBL_ERR_RSVD_1_MASK}, - {"GLBL_ERR", - GLBL_ERR_MASK}, -}; - - -static struct regfield_info - glbl_dsc_cfg_field_info[] = { - {"GLBL_DSC_CFG_RSVD_1", - GLBL_DSC_CFG_RSVD_1_MASK}, - {"GLBL_DSC_CFG_UNC_OVR_COR", - GLBL_DSC_CFG_UNC_OVR_COR_MASK}, - {"GLBL_DSC_CFG_CTXT_FER_DIS", - GLBL_DSC_CFG_CTXT_FER_DIS_MASK}, - {"GLBL_DSC_CFG_RSVD_2", - GLBL_DSC_CFG_RSVD_2_MASK}, - {"GLBL_DSC_CFG_MAXFETCH", - GLBL_DSC_CFG_MAXFETCH_MASK}, - {"GLBL_DSC_CFG_WB_ACC_INT", - GLBL_DSC_CFG_WB_ACC_INT_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_sts_field_info[] = { - {"GLBL_DSC_ERR_STS_RSVD_1", - GLBL_DSC_ERR_STS_RSVD_1_MASK}, - {"GLBL_DSC_ERR_STS_SBE", - GLBL_DSC_ERR_STS_SBE_MASK}, - {"GLBL_DSC_ERR_STS_DBE", - GLBL_DSC_ERR_STS_DBE_MASK}, - {"GLBL_DSC_ERR_STS_RQ_CANCEL", - GLBL_DSC_ERR_STS_RQ_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_DSC", - GLBL_DSC_ERR_STS_DSC_MASK}, - {"GLBL_DSC_ERR_STS_DMA", - GLBL_DSC_ERR_STS_DMA_MASK}, - {"GLBL_DSC_ERR_STS_FLR_CANCEL", - GLBL_DSC_ERR_STS_FLR_CANCEL_MASK}, - {"GLBL_DSC_ERR_STS_RSVD_2", - GLBL_DSC_ERR_STS_RSVD_2_MASK}, - {"GLBL_DSC_ERR_STS_DAT_POISON", - GLBL_DSC_ERR_STS_DAT_POISON_MASK}, - {"GLBL_DSC_ERR_STS_TIMEOUT", - GLBL_DSC_ERR_STS_TIMEOUT_MASK}, - {"GLBL_DSC_ERR_STS_FLR", - GLBL_DSC_ERR_STS_FLR_MASK}, - {"GLBL_DSC_ERR_STS_TAG", - GLBL_DSC_ERR_STS_TAG_MASK}, - {"GLBL_DSC_ERR_STS_ADDR", - GLBL_DSC_ERR_STS_ADDR_MASK}, - {"GLBL_DSC_ERR_STS_PARAM", - GLBL_DSC_ERR_STS_PARAM_MASK}, - {"GLBL_DSC_ERR_STS_UR_CA", - GLBL_DSC_ERR_STS_UR_CA_MASK}, - {"GLBL_DSC_ERR_STS_POISON", - GLBL_DSC_ERR_STS_POISON_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_msk_field_info[] = { - {"GLBL_DSC_ERR_MSK", - GLBL_DSC_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log0_field_info[] = { - {"GLBL_DSC_ERR_LOG0_VALID", - GLBL_DSC_ERR_LOG0_VALID_MASK}, - {"GLBL_DSC_ERR_LOG0_RSVD_1", - GLBL_DSC_ERR_LOG0_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG0_QID", - GLBL_DSC_ERR_LOG0_QID_MASK}, - {"GLBL_DSC_ERR_LOG0_SEL", - GLBL_DSC_ERR_LOG0_SEL_MASK}, - {"GLBL_DSC_ERR_LOG0_CIDX", - GLBL_DSC_ERR_LOG0_CIDX_MASK}, -}; - - -static struct regfield_info - glbl_dsc_err_log1_field_info[] = { - {"GLBL_DSC_ERR_LOG1_RSVD_1", - GLBL_DSC_ERR_LOG1_RSVD_1_MASK}, - {"GLBL_DSC_ERR_LOG1_SUB_TYPE", - GLBL_DSC_ERR_LOG1_SUB_TYPE_MASK}, - {"GLBL_DSC_ERR_LOG1_ERR_TYPE", - GLBL_DSC_ERR_LOG1_ERR_TYPE_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_sts_field_info[] = { - {"GLBL_TRQ_ERR_STS_RSVD_1", - GLBL_TRQ_ERR_STS_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_STS_TCP_TIMEOUT", - GLBL_TRQ_ERR_STS_TCP_TIMEOUT_MASK}, - {"GLBL_TRQ_ERR_STS_VF_ACCESS_ERR", - GLBL_TRQ_ERR_STS_VF_ACCESS_ERR_MASK}, - {"GLBL_TRQ_ERR_STS_QID_RANGE", - GLBL_TRQ_ERR_STS_QID_RANGE_MASK}, - {"GLBL_TRQ_ERR_STS_UNMAPPED", - GLBL_TRQ_ERR_STS_UNMAPPED_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_msk_field_info[] = { - {"GLBL_TRQ_ERR_MSK", - GLBL_TRQ_ERR_MSK_MASK}, -}; - - -static struct regfield_info - glbl_trq_err_log_field_info[] = { - {"GLBL_TRQ_ERR_LOG_RSVD_1", - GLBL_TRQ_ERR_LOG_RSVD_1_MASK}, - {"GLBL_TRQ_ERR_LOG_TARGET", - GLBL_TRQ_ERR_LOG_TARGET_MASK}, - {"GLBL_TRQ_ERR_LOG_FUNC", - GLBL_TRQ_ERR_LOG_FUNC_MASK}, - {"GLBL_TRQ_ERR_LOG_ADDRESS", - GLBL_TRQ_ERR_LOG_ADDRESS_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat0_field_info[] = { - {"GLBL_DSC_DAT0_RSVD_1", - GLBL_DSC_DAT0_RSVD_1_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_DIR", - GLBL_DSC_DAT0_CTXT_ARB_DIR_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_QID", - GLBL_DSC_DAT0_CTXT_ARB_QID_MASK}, - {"GLBL_DSC_DAT0_CTXT_ARB_REQ", - GLBL_DSC_DAT0_CTXT_ARB_REQ_MASK}, - {"GLBL_DSC_DAT0_IRQ_FIFO_FL", - GLBL_DSC_DAT0_IRQ_FIFO_FL_MASK}, - {"GLBL_DSC_DAT0_TMSTALL", - GLBL_DSC_DAT0_TMSTALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_STALL", - GLBL_DSC_DAT0_RRQ_STALL_MASK}, - {"GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RCP_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL", - GLBL_DSC_DAT0_RRQ_FIFO_SPC_STALL_MASK}, - {"GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL", - GLBL_DSC_DAT0_FAB_MRKR_RSP_STALL_MASK}, - {"GLBL_DSC_DAT0_DSC_OUT_STALL", - GLBL_DSC_DAT0_DSC_OUT_STALL_MASK}, -}; - - -static struct regfield_info - glbl_dsc_dbg_dat1_field_info[] = { - {"GLBL_DSC_DAT1_RSVD_1", - GLBL_DSC_DAT1_RSVD_1_MASK}, - {"GLBL_DSC_DAT1_EVT_SPC_C2H", - GLBL_DSC_DAT1_EVT_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_EVT_SP_H2C", - GLBL_DSC_DAT1_EVT_SP_H2C_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_C2H", - GLBL_DSC_DAT1_DSC_SPC_C2H_MASK}, - {"GLBL_DSC_DAT1_DSC_SPC_H2C", - GLBL_DSC_DAT1_DSC_SPC_H2C_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_0_field_info[] = { - {"TRQ_SEL_FMAP_0_RSVD_1", - TRQ_SEL_FMAP_0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_0_QID_MAX", - TRQ_SEL_FMAP_0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_0_QID_BASE", - TRQ_SEL_FMAP_0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1_field_info[] = { - {"TRQ_SEL_FMAP_1_RSVD_1", - TRQ_SEL_FMAP_1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1_QID_MAX", - TRQ_SEL_FMAP_1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1_QID_BASE", - TRQ_SEL_FMAP_1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2_field_info[] = { - {"TRQ_SEL_FMAP_2_RSVD_1", - TRQ_SEL_FMAP_2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2_QID_MAX", - TRQ_SEL_FMAP_2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2_QID_BASE", - TRQ_SEL_FMAP_2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3_field_info[] = { - {"TRQ_SEL_FMAP_3_RSVD_1", - TRQ_SEL_FMAP_3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3_QID_MAX", - TRQ_SEL_FMAP_3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3_QID_BASE", - TRQ_SEL_FMAP_3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4_field_info[] = { - {"TRQ_SEL_FMAP_4_RSVD_1", - TRQ_SEL_FMAP_4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4_QID_MAX", - TRQ_SEL_FMAP_4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4_QID_BASE", - TRQ_SEL_FMAP_4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5_field_info[] = { - {"TRQ_SEL_FMAP_5_RSVD_1", - TRQ_SEL_FMAP_5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5_QID_MAX", - TRQ_SEL_FMAP_5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5_QID_BASE", - TRQ_SEL_FMAP_5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6_field_info[] = { - {"TRQ_SEL_FMAP_6_RSVD_1", - TRQ_SEL_FMAP_6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6_QID_MAX", - TRQ_SEL_FMAP_6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6_QID_BASE", - TRQ_SEL_FMAP_6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7_field_info[] = { - {"TRQ_SEL_FMAP_7_RSVD_1", - TRQ_SEL_FMAP_7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7_QID_MAX", - TRQ_SEL_FMAP_7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7_QID_BASE", - TRQ_SEL_FMAP_7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8_field_info[] = { - {"TRQ_SEL_FMAP_8_RSVD_1", - TRQ_SEL_FMAP_8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8_QID_MAX", - TRQ_SEL_FMAP_8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8_QID_BASE", - TRQ_SEL_FMAP_8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9_field_info[] = { - {"TRQ_SEL_FMAP_9_RSVD_1", - TRQ_SEL_FMAP_9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9_QID_MAX", - TRQ_SEL_FMAP_9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9_QID_BASE", - TRQ_SEL_FMAP_9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a_field_info[] = { - {"TRQ_SEL_FMAP_A_RSVD_1", - TRQ_SEL_FMAP_A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A_QID_MAX", - TRQ_SEL_FMAP_A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A_QID_BASE", - TRQ_SEL_FMAP_A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b_field_info[] = { - {"TRQ_SEL_FMAP_B_RSVD_1", - TRQ_SEL_FMAP_B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B_QID_MAX", - TRQ_SEL_FMAP_B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B_QID_BASE", - TRQ_SEL_FMAP_B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d_field_info[] = { - {"TRQ_SEL_FMAP_D_RSVD_1", - TRQ_SEL_FMAP_D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D_QID_MAX", - TRQ_SEL_FMAP_D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D_QID_BASE", - TRQ_SEL_FMAP_D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e_field_info[] = { - {"TRQ_SEL_FMAP_E_RSVD_1", - TRQ_SEL_FMAP_E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E_QID_MAX", - TRQ_SEL_FMAP_E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E_QID_BASE", - TRQ_SEL_FMAP_E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_f_field_info[] = { - {"TRQ_SEL_FMAP_F_RSVD_1", - TRQ_SEL_FMAP_F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_F_QID_MAX", - TRQ_SEL_FMAP_F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_F_QID_BASE", - TRQ_SEL_FMAP_F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_10_field_info[] = { - {"TRQ_SEL_FMAP_10_RSVD_1", - TRQ_SEL_FMAP_10_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_10_QID_MAX", - TRQ_SEL_FMAP_10_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_10_QID_BASE", - TRQ_SEL_FMAP_10_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_11_field_info[] = { - {"TRQ_SEL_FMAP_11_RSVD_1", - TRQ_SEL_FMAP_11_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_11_QID_MAX", - TRQ_SEL_FMAP_11_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_11_QID_BASE", - TRQ_SEL_FMAP_11_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_12_field_info[] = { - {"TRQ_SEL_FMAP_12_RSVD_1", - TRQ_SEL_FMAP_12_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_12_QID_MAX", - TRQ_SEL_FMAP_12_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_12_QID_BASE", - TRQ_SEL_FMAP_12_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_13_field_info[] = { - {"TRQ_SEL_FMAP_13_RSVD_1", - TRQ_SEL_FMAP_13_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_13_QID_MAX", - TRQ_SEL_FMAP_13_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_13_QID_BASE", - TRQ_SEL_FMAP_13_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_14_field_info[] = { - {"TRQ_SEL_FMAP_14_RSVD_1", - TRQ_SEL_FMAP_14_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_14_QID_MAX", - TRQ_SEL_FMAP_14_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_14_QID_BASE", - TRQ_SEL_FMAP_14_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_15_field_info[] = { - {"TRQ_SEL_FMAP_15_RSVD_1", - TRQ_SEL_FMAP_15_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_15_QID_MAX", - TRQ_SEL_FMAP_15_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_15_QID_BASE", - TRQ_SEL_FMAP_15_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_16_field_info[] = { - {"TRQ_SEL_FMAP_16_RSVD_1", - TRQ_SEL_FMAP_16_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_16_QID_MAX", - TRQ_SEL_FMAP_16_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_16_QID_BASE", - TRQ_SEL_FMAP_16_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_17_field_info[] = { - {"TRQ_SEL_FMAP_17_RSVD_1", - TRQ_SEL_FMAP_17_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_17_QID_MAX", - TRQ_SEL_FMAP_17_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_17_QID_BASE", - TRQ_SEL_FMAP_17_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_18_field_info[] = { - {"TRQ_SEL_FMAP_18_RSVD_1", - TRQ_SEL_FMAP_18_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_18_QID_MAX", - TRQ_SEL_FMAP_18_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_18_QID_BASE", - TRQ_SEL_FMAP_18_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_19_field_info[] = { - {"TRQ_SEL_FMAP_19_RSVD_1", - TRQ_SEL_FMAP_19_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_19_QID_MAX", - TRQ_SEL_FMAP_19_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_19_QID_BASE", - TRQ_SEL_FMAP_19_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1a_field_info[] = { - {"TRQ_SEL_FMAP_1A_RSVD_1", - TRQ_SEL_FMAP_1A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1A_QID_MAX", - TRQ_SEL_FMAP_1A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1A_QID_BASE", - TRQ_SEL_FMAP_1A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1b_field_info[] = { - {"TRQ_SEL_FMAP_1B_RSVD_1", - TRQ_SEL_FMAP_1B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1B_QID_MAX", - TRQ_SEL_FMAP_1B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1B_QID_BASE", - TRQ_SEL_FMAP_1B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1c_field_info[] = { - {"TRQ_SEL_FMAP_1C_RSVD_1", - TRQ_SEL_FMAP_1C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1C_QID_MAX", - TRQ_SEL_FMAP_1C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1C_QID_BASE", - TRQ_SEL_FMAP_1C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1d_field_info[] = { - {"TRQ_SEL_FMAP_1D_RSVD_1", - TRQ_SEL_FMAP_1D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1D_QID_MAX", - TRQ_SEL_FMAP_1D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1D_QID_BASE", - TRQ_SEL_FMAP_1D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1e_field_info[] = { - {"TRQ_SEL_FMAP_1E_RSVD_1", - TRQ_SEL_FMAP_1E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1E_QID_MAX", - TRQ_SEL_FMAP_1E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1E_QID_BASE", - TRQ_SEL_FMAP_1E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_1f_field_info[] = { - {"TRQ_SEL_FMAP_1F_RSVD_1", - TRQ_SEL_FMAP_1F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_1F_QID_MAX", - TRQ_SEL_FMAP_1F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_1F_QID_BASE", - TRQ_SEL_FMAP_1F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_20_field_info[] = { - {"TRQ_SEL_FMAP_20_RSVD_1", - TRQ_SEL_FMAP_20_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_20_QID_MAX", - TRQ_SEL_FMAP_20_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_20_QID_BASE", - TRQ_SEL_FMAP_20_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_21_field_info[] = { - {"TRQ_SEL_FMAP_21_RSVD_1", - TRQ_SEL_FMAP_21_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_21_QID_MAX", - TRQ_SEL_FMAP_21_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_21_QID_BASE", - TRQ_SEL_FMAP_21_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_22_field_info[] = { - {"TRQ_SEL_FMAP_22_RSVD_1", - TRQ_SEL_FMAP_22_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_22_QID_MAX", - TRQ_SEL_FMAP_22_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_22_QID_BASE", - TRQ_SEL_FMAP_22_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_23_field_info[] = { - {"TRQ_SEL_FMAP_23_RSVD_1", - TRQ_SEL_FMAP_23_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_23_QID_MAX", - TRQ_SEL_FMAP_23_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_23_QID_BASE", - TRQ_SEL_FMAP_23_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_24_field_info[] = { - {"TRQ_SEL_FMAP_24_RSVD_1", - TRQ_SEL_FMAP_24_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_24_QID_MAX", - TRQ_SEL_FMAP_24_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_24_QID_BASE", - TRQ_SEL_FMAP_24_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_25_field_info[] = { - {"TRQ_SEL_FMAP_25_RSVD_1", - TRQ_SEL_FMAP_25_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_25_QID_MAX", - TRQ_SEL_FMAP_25_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_25_QID_BASE", - TRQ_SEL_FMAP_25_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_26_field_info[] = { - {"TRQ_SEL_FMAP_26_RSVD_1", - TRQ_SEL_FMAP_26_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_26_QID_MAX", - TRQ_SEL_FMAP_26_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_26_QID_BASE", - TRQ_SEL_FMAP_26_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_27_field_info[] = { - {"TRQ_SEL_FMAP_27_RSVD_1", - TRQ_SEL_FMAP_27_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_27_QID_MAX", - TRQ_SEL_FMAP_27_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_27_QID_BASE", - TRQ_SEL_FMAP_27_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_28_field_info[] = { - {"TRQ_SEL_FMAP_28_RSVD_1", - TRQ_SEL_FMAP_28_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_28_QID_MAX", - TRQ_SEL_FMAP_28_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_28_QID_BASE", - TRQ_SEL_FMAP_28_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_29_field_info[] = { - {"TRQ_SEL_FMAP_29_RSVD_1", - TRQ_SEL_FMAP_29_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_29_QID_MAX", - TRQ_SEL_FMAP_29_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_29_QID_BASE", - TRQ_SEL_FMAP_29_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2a_field_info[] = { - {"TRQ_SEL_FMAP_2A_RSVD_1", - TRQ_SEL_FMAP_2A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2A_QID_MAX", - TRQ_SEL_FMAP_2A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2A_QID_BASE", - TRQ_SEL_FMAP_2A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2b_field_info[] = { - {"TRQ_SEL_FMAP_2B_RSVD_1", - TRQ_SEL_FMAP_2B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2B_QID_MAX", - TRQ_SEL_FMAP_2B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2B_QID_BASE", - TRQ_SEL_FMAP_2B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2c_field_info[] = { - {"TRQ_SEL_FMAP_2C_RSVD_1", - TRQ_SEL_FMAP_2C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2C_QID_MAX", - TRQ_SEL_FMAP_2C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2C_QID_BASE", - TRQ_SEL_FMAP_2C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2d_field_info[] = { - {"TRQ_SEL_FMAP_2D_RSVD_1", - TRQ_SEL_FMAP_2D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2D_QID_MAX", - TRQ_SEL_FMAP_2D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2D_QID_BASE", - TRQ_SEL_FMAP_2D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2e_field_info[] = { - {"TRQ_SEL_FMAP_2E_RSVD_1", - TRQ_SEL_FMAP_2E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2E_QID_MAX", - TRQ_SEL_FMAP_2E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2E_QID_BASE", - TRQ_SEL_FMAP_2E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_2f_field_info[] = { - {"TRQ_SEL_FMAP_2F_RSVD_1", - TRQ_SEL_FMAP_2F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_2F_QID_MAX", - TRQ_SEL_FMAP_2F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_2F_QID_BASE", - TRQ_SEL_FMAP_2F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_30_field_info[] = { - {"TRQ_SEL_FMAP_30_RSVD_1", - TRQ_SEL_FMAP_30_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_30_QID_MAX", - TRQ_SEL_FMAP_30_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_30_QID_BASE", - TRQ_SEL_FMAP_30_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_31_field_info[] = { - {"TRQ_SEL_FMAP_31_RSVD_1", - TRQ_SEL_FMAP_31_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_31_QID_MAX", - TRQ_SEL_FMAP_31_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_31_QID_BASE", - TRQ_SEL_FMAP_31_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_32_field_info[] = { - {"TRQ_SEL_FMAP_32_RSVD_1", - TRQ_SEL_FMAP_32_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_32_QID_MAX", - TRQ_SEL_FMAP_32_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_32_QID_BASE", - TRQ_SEL_FMAP_32_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_33_field_info[] = { - {"TRQ_SEL_FMAP_33_RSVD_1", - TRQ_SEL_FMAP_33_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_33_QID_MAX", - TRQ_SEL_FMAP_33_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_33_QID_BASE", - TRQ_SEL_FMAP_33_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_34_field_info[] = { - {"TRQ_SEL_FMAP_34_RSVD_1", - TRQ_SEL_FMAP_34_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_34_QID_MAX", - TRQ_SEL_FMAP_34_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_34_QID_BASE", - TRQ_SEL_FMAP_34_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_35_field_info[] = { - {"TRQ_SEL_FMAP_35_RSVD_1", - TRQ_SEL_FMAP_35_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_35_QID_MAX", - TRQ_SEL_FMAP_35_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_35_QID_BASE", - TRQ_SEL_FMAP_35_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_36_field_info[] = { - {"TRQ_SEL_FMAP_36_RSVD_1", - TRQ_SEL_FMAP_36_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_36_QID_MAX", - TRQ_SEL_FMAP_36_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_36_QID_BASE", - TRQ_SEL_FMAP_36_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_37_field_info[] = { - {"TRQ_SEL_FMAP_37_RSVD_1", - TRQ_SEL_FMAP_37_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_37_QID_MAX", - TRQ_SEL_FMAP_37_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_37_QID_BASE", - TRQ_SEL_FMAP_37_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_38_field_info[] = { - {"TRQ_SEL_FMAP_38_RSVD_1", - TRQ_SEL_FMAP_38_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_38_QID_MAX", - TRQ_SEL_FMAP_38_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_38_QID_BASE", - TRQ_SEL_FMAP_38_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_39_field_info[] = { - {"TRQ_SEL_FMAP_39_RSVD_1", - TRQ_SEL_FMAP_39_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_39_QID_MAX", - TRQ_SEL_FMAP_39_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_39_QID_BASE", - TRQ_SEL_FMAP_39_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3a_field_info[] = { - {"TRQ_SEL_FMAP_3A_RSVD_1", - TRQ_SEL_FMAP_3A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3A_QID_MAX", - TRQ_SEL_FMAP_3A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3A_QID_BASE", - TRQ_SEL_FMAP_3A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3b_field_info[] = { - {"TRQ_SEL_FMAP_3B_RSVD_1", - TRQ_SEL_FMAP_3B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3B_QID_MAX", - TRQ_SEL_FMAP_3B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3B_QID_BASE", - TRQ_SEL_FMAP_3B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3c_field_info[] = { - {"TRQ_SEL_FMAP_3C_RSVD_1", - TRQ_SEL_FMAP_3C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3C_QID_MAX", - TRQ_SEL_FMAP_3C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3C_QID_BASE", - TRQ_SEL_FMAP_3C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3d_field_info[] = { - {"TRQ_SEL_FMAP_3D_RSVD_1", - TRQ_SEL_FMAP_3D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3D_QID_MAX", - TRQ_SEL_FMAP_3D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3D_QID_BASE", - TRQ_SEL_FMAP_3D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3e_field_info[] = { - {"TRQ_SEL_FMAP_3E_RSVD_1", - TRQ_SEL_FMAP_3E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3E_QID_MAX", - TRQ_SEL_FMAP_3E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3E_QID_BASE", - TRQ_SEL_FMAP_3E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_3f_field_info[] = { - {"TRQ_SEL_FMAP_3F_RSVD_1", - TRQ_SEL_FMAP_3F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_3F_QID_MAX", - TRQ_SEL_FMAP_3F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_3F_QID_BASE", - TRQ_SEL_FMAP_3F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_40_field_info[] = { - {"TRQ_SEL_FMAP_40_RSVD_1", - TRQ_SEL_FMAP_40_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_40_QID_MAX", - TRQ_SEL_FMAP_40_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_40_QID_BASE", - TRQ_SEL_FMAP_40_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_41_field_info[] = { - {"TRQ_SEL_FMAP_41_RSVD_1", - TRQ_SEL_FMAP_41_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_41_QID_MAX", - TRQ_SEL_FMAP_41_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_41_QID_BASE", - TRQ_SEL_FMAP_41_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_42_field_info[] = { - {"TRQ_SEL_FMAP_42_RSVD_1", - TRQ_SEL_FMAP_42_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_42_QID_MAX", - TRQ_SEL_FMAP_42_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_42_QID_BASE", - TRQ_SEL_FMAP_42_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_43_field_info[] = { - {"TRQ_SEL_FMAP_43_RSVD_1", - TRQ_SEL_FMAP_43_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_43_QID_MAX", - TRQ_SEL_FMAP_43_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_43_QID_BASE", - TRQ_SEL_FMAP_43_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_44_field_info[] = { - {"TRQ_SEL_FMAP_44_RSVD_1", - TRQ_SEL_FMAP_44_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_44_QID_MAX", - TRQ_SEL_FMAP_44_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_44_QID_BASE", - TRQ_SEL_FMAP_44_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_45_field_info[] = { - {"TRQ_SEL_FMAP_45_RSVD_1", - TRQ_SEL_FMAP_45_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_45_QID_MAX", - TRQ_SEL_FMAP_45_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_45_QID_BASE", - TRQ_SEL_FMAP_45_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_46_field_info[] = { - {"TRQ_SEL_FMAP_46_RSVD_1", - TRQ_SEL_FMAP_46_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_46_QID_MAX", - TRQ_SEL_FMAP_46_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_46_QID_BASE", - TRQ_SEL_FMAP_46_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_47_field_info[] = { - {"TRQ_SEL_FMAP_47_RSVD_1", - TRQ_SEL_FMAP_47_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_47_QID_MAX", - TRQ_SEL_FMAP_47_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_47_QID_BASE", - TRQ_SEL_FMAP_47_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_48_field_info[] = { - {"TRQ_SEL_FMAP_48_RSVD_1", - TRQ_SEL_FMAP_48_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_48_QID_MAX", - TRQ_SEL_FMAP_48_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_48_QID_BASE", - TRQ_SEL_FMAP_48_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_49_field_info[] = { - {"TRQ_SEL_FMAP_49_RSVD_1", - TRQ_SEL_FMAP_49_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_49_QID_MAX", - TRQ_SEL_FMAP_49_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_49_QID_BASE", - TRQ_SEL_FMAP_49_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4a_field_info[] = { - {"TRQ_SEL_FMAP_4A_RSVD_1", - TRQ_SEL_FMAP_4A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4A_QID_MAX", - TRQ_SEL_FMAP_4A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4A_QID_BASE", - TRQ_SEL_FMAP_4A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4b_field_info[] = { - {"TRQ_SEL_FMAP_4B_RSVD_1", - TRQ_SEL_FMAP_4B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4B_QID_MAX", - TRQ_SEL_FMAP_4B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4B_QID_BASE", - TRQ_SEL_FMAP_4B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4c_field_info[] = { - {"TRQ_SEL_FMAP_4C_RSVD_1", - TRQ_SEL_FMAP_4C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4C_QID_MAX", - TRQ_SEL_FMAP_4C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4C_QID_BASE", - TRQ_SEL_FMAP_4C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4d_field_info[] = { - {"TRQ_SEL_FMAP_4D_RSVD_1", - TRQ_SEL_FMAP_4D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4D_QID_MAX", - TRQ_SEL_FMAP_4D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4D_QID_BASE", - TRQ_SEL_FMAP_4D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4e_field_info[] = { - {"TRQ_SEL_FMAP_4E_RSVD_1", - TRQ_SEL_FMAP_4E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4E_QID_MAX", - TRQ_SEL_FMAP_4E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4E_QID_BASE", - TRQ_SEL_FMAP_4E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_4f_field_info[] = { - {"TRQ_SEL_FMAP_4F_RSVD_1", - TRQ_SEL_FMAP_4F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_4F_QID_MAX", - TRQ_SEL_FMAP_4F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_4F_QID_BASE", - TRQ_SEL_FMAP_4F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_50_field_info[] = { - {"TRQ_SEL_FMAP_50_RSVD_1", - TRQ_SEL_FMAP_50_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_50_QID_MAX", - TRQ_SEL_FMAP_50_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_50_QID_BASE", - TRQ_SEL_FMAP_50_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_51_field_info[] = { - {"TRQ_SEL_FMAP_51_RSVD_1", - TRQ_SEL_FMAP_51_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_51_QID_MAX", - TRQ_SEL_FMAP_51_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_51_QID_BASE", - TRQ_SEL_FMAP_51_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_52_field_info[] = { - {"TRQ_SEL_FMAP_52_RSVD_1", - TRQ_SEL_FMAP_52_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_52_QID_MAX", - TRQ_SEL_FMAP_52_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_52_QID_BASE", - TRQ_SEL_FMAP_52_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_53_field_info[] = { - {"TRQ_SEL_FMAP_53_RSVD_1", - TRQ_SEL_FMAP_53_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_53_QID_MAX", - TRQ_SEL_FMAP_53_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_53_QID_BASE", - TRQ_SEL_FMAP_53_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_54_field_info[] = { - {"TRQ_SEL_FMAP_54_RSVD_1", - TRQ_SEL_FMAP_54_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_54_QID_MAX", - TRQ_SEL_FMAP_54_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_54_QID_BASE", - TRQ_SEL_FMAP_54_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_55_field_info[] = { - {"TRQ_SEL_FMAP_55_RSVD_1", - TRQ_SEL_FMAP_55_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_55_QID_MAX", - TRQ_SEL_FMAP_55_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_55_QID_BASE", - TRQ_SEL_FMAP_55_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_56_field_info[] = { - {"TRQ_SEL_FMAP_56_RSVD_1", - TRQ_SEL_FMAP_56_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_56_QID_MAX", - TRQ_SEL_FMAP_56_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_56_QID_BASE", - TRQ_SEL_FMAP_56_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_57_field_info[] = { - {"TRQ_SEL_FMAP_57_RSVD_1", - TRQ_SEL_FMAP_57_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_57_QID_MAX", - TRQ_SEL_FMAP_57_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_57_QID_BASE", - TRQ_SEL_FMAP_57_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_58_field_info[] = { - {"TRQ_SEL_FMAP_58_RSVD_1", - TRQ_SEL_FMAP_58_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_58_QID_MAX", - TRQ_SEL_FMAP_58_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_58_QID_BASE", - TRQ_SEL_FMAP_58_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_59_field_info[] = { - {"TRQ_SEL_FMAP_59_RSVD_1", - TRQ_SEL_FMAP_59_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_59_QID_MAX", - TRQ_SEL_FMAP_59_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_59_QID_BASE", - TRQ_SEL_FMAP_59_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5a_field_info[] = { - {"TRQ_SEL_FMAP_5A_RSVD_1", - TRQ_SEL_FMAP_5A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5A_QID_MAX", - TRQ_SEL_FMAP_5A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5A_QID_BASE", - TRQ_SEL_FMAP_5A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5b_field_info[] = { - {"TRQ_SEL_FMAP_5B_RSVD_1", - TRQ_SEL_FMAP_5B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5B_QID_MAX", - TRQ_SEL_FMAP_5B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5B_QID_BASE", - TRQ_SEL_FMAP_5B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5c_field_info[] = { - {"TRQ_SEL_FMAP_5C_RSVD_1", - TRQ_SEL_FMAP_5C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5C_QID_MAX", - TRQ_SEL_FMAP_5C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5C_QID_BASE", - TRQ_SEL_FMAP_5C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5d_field_info[] = { - {"TRQ_SEL_FMAP_5D_RSVD_1", - TRQ_SEL_FMAP_5D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5D_QID_MAX", - TRQ_SEL_FMAP_5D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5D_QID_BASE", - TRQ_SEL_FMAP_5D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5e_field_info[] = { - {"TRQ_SEL_FMAP_5E_RSVD_1", - TRQ_SEL_FMAP_5E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5E_QID_MAX", - TRQ_SEL_FMAP_5E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5E_QID_BASE", - TRQ_SEL_FMAP_5E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_5f_field_info[] = { - {"TRQ_SEL_FMAP_5F_RSVD_1", - TRQ_SEL_FMAP_5F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_5F_QID_MAX", - TRQ_SEL_FMAP_5F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_5F_QID_BASE", - TRQ_SEL_FMAP_5F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_60_field_info[] = { - {"TRQ_SEL_FMAP_60_RSVD_1", - TRQ_SEL_FMAP_60_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_60_QID_MAX", - TRQ_SEL_FMAP_60_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_60_QID_BASE", - TRQ_SEL_FMAP_60_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_61_field_info[] = { - {"TRQ_SEL_FMAP_61_RSVD_1", - TRQ_SEL_FMAP_61_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_61_QID_MAX", - TRQ_SEL_FMAP_61_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_61_QID_BASE", - TRQ_SEL_FMAP_61_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_62_field_info[] = { - {"TRQ_SEL_FMAP_62_RSVD_1", - TRQ_SEL_FMAP_62_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_62_QID_MAX", - TRQ_SEL_FMAP_62_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_62_QID_BASE", - TRQ_SEL_FMAP_62_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_63_field_info[] = { - {"TRQ_SEL_FMAP_63_RSVD_1", - TRQ_SEL_FMAP_63_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_63_QID_MAX", - TRQ_SEL_FMAP_63_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_63_QID_BASE", - TRQ_SEL_FMAP_63_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_64_field_info[] = { - {"TRQ_SEL_FMAP_64_RSVD_1", - TRQ_SEL_FMAP_64_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_64_QID_MAX", - TRQ_SEL_FMAP_64_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_64_QID_BASE", - TRQ_SEL_FMAP_64_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_65_field_info[] = { - {"TRQ_SEL_FMAP_65_RSVD_1", - TRQ_SEL_FMAP_65_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_65_QID_MAX", - TRQ_SEL_FMAP_65_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_65_QID_BASE", - TRQ_SEL_FMAP_65_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_66_field_info[] = { - {"TRQ_SEL_FMAP_66_RSVD_1", - TRQ_SEL_FMAP_66_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_66_QID_MAX", - TRQ_SEL_FMAP_66_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_66_QID_BASE", - TRQ_SEL_FMAP_66_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_67_field_info[] = { - {"TRQ_SEL_FMAP_67_RSVD_1", - TRQ_SEL_FMAP_67_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_67_QID_MAX", - TRQ_SEL_FMAP_67_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_67_QID_BASE", - TRQ_SEL_FMAP_67_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_68_field_info[] = { - {"TRQ_SEL_FMAP_68_RSVD_1", - TRQ_SEL_FMAP_68_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_68_QID_MAX", - TRQ_SEL_FMAP_68_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_68_QID_BASE", - TRQ_SEL_FMAP_68_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_69_field_info[] = { - {"TRQ_SEL_FMAP_69_RSVD_1", - TRQ_SEL_FMAP_69_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_69_QID_MAX", - TRQ_SEL_FMAP_69_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_69_QID_BASE", - TRQ_SEL_FMAP_69_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6a_field_info[] = { - {"TRQ_SEL_FMAP_6A_RSVD_1", - TRQ_SEL_FMAP_6A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6A_QID_MAX", - TRQ_SEL_FMAP_6A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6A_QID_BASE", - TRQ_SEL_FMAP_6A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6b_field_info[] = { - {"TRQ_SEL_FMAP_6B_RSVD_1", - TRQ_SEL_FMAP_6B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6B_QID_MAX", - TRQ_SEL_FMAP_6B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6B_QID_BASE", - TRQ_SEL_FMAP_6B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6c_field_info[] = { - {"TRQ_SEL_FMAP_6C_RSVD_1", - TRQ_SEL_FMAP_6C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6C_QID_MAX", - TRQ_SEL_FMAP_6C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6C_QID_BASE", - TRQ_SEL_FMAP_6C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6d_field_info[] = { - {"TRQ_SEL_FMAP_6D_RSVD_1", - TRQ_SEL_FMAP_6D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6D_QID_MAX", - TRQ_SEL_FMAP_6D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6D_QID_BASE", - TRQ_SEL_FMAP_6D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6e_field_info[] = { - {"TRQ_SEL_FMAP_6E_RSVD_1", - TRQ_SEL_FMAP_6E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6E_QID_MAX", - TRQ_SEL_FMAP_6E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6E_QID_BASE", - TRQ_SEL_FMAP_6E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_6f_field_info[] = { - {"TRQ_SEL_FMAP_6F_RSVD_1", - TRQ_SEL_FMAP_6F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_6F_QID_MAX", - TRQ_SEL_FMAP_6F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_6F_QID_BASE", - TRQ_SEL_FMAP_6F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_70_field_info[] = { - {"TRQ_SEL_FMAP_70_RSVD_1", - TRQ_SEL_FMAP_70_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_70_QID_MAX", - TRQ_SEL_FMAP_70_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_70_QID_BASE", - TRQ_SEL_FMAP_70_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_71_field_info[] = { - {"TRQ_SEL_FMAP_71_RSVD_1", - TRQ_SEL_FMAP_71_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_71_QID_MAX", - TRQ_SEL_FMAP_71_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_71_QID_BASE", - TRQ_SEL_FMAP_71_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_72_field_info[] = { - {"TRQ_SEL_FMAP_72_RSVD_1", - TRQ_SEL_FMAP_72_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_72_QID_MAX", - TRQ_SEL_FMAP_72_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_72_QID_BASE", - TRQ_SEL_FMAP_72_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_73_field_info[] = { - {"TRQ_SEL_FMAP_73_RSVD_1", - TRQ_SEL_FMAP_73_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_73_QID_MAX", - TRQ_SEL_FMAP_73_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_73_QID_BASE", - TRQ_SEL_FMAP_73_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_74_field_info[] = { - {"TRQ_SEL_FMAP_74_RSVD_1", - TRQ_SEL_FMAP_74_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_74_QID_MAX", - TRQ_SEL_FMAP_74_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_74_QID_BASE", - TRQ_SEL_FMAP_74_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_75_field_info[] = { - {"TRQ_SEL_FMAP_75_RSVD_1", - TRQ_SEL_FMAP_75_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_75_QID_MAX", - TRQ_SEL_FMAP_75_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_75_QID_BASE", - TRQ_SEL_FMAP_75_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_76_field_info[] = { - {"TRQ_SEL_FMAP_76_RSVD_1", - TRQ_SEL_FMAP_76_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_76_QID_MAX", - TRQ_SEL_FMAP_76_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_76_QID_BASE", - TRQ_SEL_FMAP_76_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_77_field_info[] = { - {"TRQ_SEL_FMAP_77_RSVD_1", - TRQ_SEL_FMAP_77_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_77_QID_MAX", - TRQ_SEL_FMAP_77_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_77_QID_BASE", - TRQ_SEL_FMAP_77_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_78_field_info[] = { - {"TRQ_SEL_FMAP_78_RSVD_1", - TRQ_SEL_FMAP_78_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_78_QID_MAX", - TRQ_SEL_FMAP_78_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_78_QID_BASE", - TRQ_SEL_FMAP_78_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_79_field_info[] = { - {"TRQ_SEL_FMAP_79_RSVD_1", - TRQ_SEL_FMAP_79_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_79_QID_MAX", - TRQ_SEL_FMAP_79_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_79_QID_BASE", - TRQ_SEL_FMAP_79_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7a_field_info[] = { - {"TRQ_SEL_FMAP_7A_RSVD_1", - TRQ_SEL_FMAP_7A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7A_QID_MAX", - TRQ_SEL_FMAP_7A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7A_QID_BASE", - TRQ_SEL_FMAP_7A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7b_field_info[] = { - {"TRQ_SEL_FMAP_7B_RSVD_1", - TRQ_SEL_FMAP_7B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7B_QID_MAX", - TRQ_SEL_FMAP_7B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7B_QID_BASE", - TRQ_SEL_FMAP_7B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7c_field_info[] = { - {"TRQ_SEL_FMAP_7C_RSVD_1", - TRQ_SEL_FMAP_7C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7C_QID_MAX", - TRQ_SEL_FMAP_7C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7C_QID_BASE", - TRQ_SEL_FMAP_7C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7d_field_info[] = { - {"TRQ_SEL_FMAP_7D_RSVD_1", - TRQ_SEL_FMAP_7D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7D_QID_MAX", - TRQ_SEL_FMAP_7D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7D_QID_BASE", - TRQ_SEL_FMAP_7D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7e_field_info[] = { - {"TRQ_SEL_FMAP_7E_RSVD_1", - TRQ_SEL_FMAP_7E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7E_QID_MAX", - TRQ_SEL_FMAP_7E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7E_QID_BASE", - TRQ_SEL_FMAP_7E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_7f_field_info[] = { - {"TRQ_SEL_FMAP_7F_RSVD_1", - TRQ_SEL_FMAP_7F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_7F_QID_MAX", - TRQ_SEL_FMAP_7F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_7F_QID_BASE", - TRQ_SEL_FMAP_7F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_80_field_info[] = { - {"TRQ_SEL_FMAP_80_RSVD_1", - TRQ_SEL_FMAP_80_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_80_QID_MAX", - TRQ_SEL_FMAP_80_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_80_QID_BASE", - TRQ_SEL_FMAP_80_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_81_field_info[] = { - {"TRQ_SEL_FMAP_81_RSVD_1", - TRQ_SEL_FMAP_81_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_81_QID_MAX", - TRQ_SEL_FMAP_81_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_81_QID_BASE", - TRQ_SEL_FMAP_81_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_82_field_info[] = { - {"TRQ_SEL_FMAP_82_RSVD_1", - TRQ_SEL_FMAP_82_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_82_QID_MAX", - TRQ_SEL_FMAP_82_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_82_QID_BASE", - TRQ_SEL_FMAP_82_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_83_field_info[] = { - {"TRQ_SEL_FMAP_83_RSVD_1", - TRQ_SEL_FMAP_83_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_83_QID_MAX", - TRQ_SEL_FMAP_83_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_83_QID_BASE", - TRQ_SEL_FMAP_83_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_84_field_info[] = { - {"TRQ_SEL_FMAP_84_RSVD_1", - TRQ_SEL_FMAP_84_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_84_QID_MAX", - TRQ_SEL_FMAP_84_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_84_QID_BASE", - TRQ_SEL_FMAP_84_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_85_field_info[] = { - {"TRQ_SEL_FMAP_85_RSVD_1", - TRQ_SEL_FMAP_85_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_85_QID_MAX", - TRQ_SEL_FMAP_85_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_85_QID_BASE", - TRQ_SEL_FMAP_85_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_86_field_info[] = { - {"TRQ_SEL_FMAP_86_RSVD_1", - TRQ_SEL_FMAP_86_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_86_QID_MAX", - TRQ_SEL_FMAP_86_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_86_QID_BASE", - TRQ_SEL_FMAP_86_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_87_field_info[] = { - {"TRQ_SEL_FMAP_87_RSVD_1", - TRQ_SEL_FMAP_87_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_87_QID_MAX", - TRQ_SEL_FMAP_87_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_87_QID_BASE", - TRQ_SEL_FMAP_87_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_88_field_info[] = { - {"TRQ_SEL_FMAP_88_RSVD_1", - TRQ_SEL_FMAP_88_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_88_QID_MAX", - TRQ_SEL_FMAP_88_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_88_QID_BASE", - TRQ_SEL_FMAP_88_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_89_field_info[] = { - {"TRQ_SEL_FMAP_89_RSVD_1", - TRQ_SEL_FMAP_89_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_89_QID_MAX", - TRQ_SEL_FMAP_89_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_89_QID_BASE", - TRQ_SEL_FMAP_89_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8a_field_info[] = { - {"TRQ_SEL_FMAP_8A_RSVD_1", - TRQ_SEL_FMAP_8A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8A_QID_MAX", - TRQ_SEL_FMAP_8A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8A_QID_BASE", - TRQ_SEL_FMAP_8A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8b_field_info[] = { - {"TRQ_SEL_FMAP_8B_RSVD_1", - TRQ_SEL_FMAP_8B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8B_QID_MAX", - TRQ_SEL_FMAP_8B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8B_QID_BASE", - TRQ_SEL_FMAP_8B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8c_field_info[] = { - {"TRQ_SEL_FMAP_8C_RSVD_1", - TRQ_SEL_FMAP_8C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8C_QID_MAX", - TRQ_SEL_FMAP_8C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8C_QID_BASE", - TRQ_SEL_FMAP_8C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8d_field_info[] = { - {"TRQ_SEL_FMAP_8D_RSVD_1", - TRQ_SEL_FMAP_8D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8D_QID_MAX", - TRQ_SEL_FMAP_8D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8D_QID_BASE", - TRQ_SEL_FMAP_8D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8e_field_info[] = { - {"TRQ_SEL_FMAP_8E_RSVD_1", - TRQ_SEL_FMAP_8E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8E_QID_MAX", - TRQ_SEL_FMAP_8E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8E_QID_BASE", - TRQ_SEL_FMAP_8E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_8f_field_info[] = { - {"TRQ_SEL_FMAP_8F_RSVD_1", - TRQ_SEL_FMAP_8F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_8F_QID_MAX", - TRQ_SEL_FMAP_8F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_8F_QID_BASE", - TRQ_SEL_FMAP_8F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_90_field_info[] = { - {"TRQ_SEL_FMAP_90_RSVD_1", - TRQ_SEL_FMAP_90_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_90_QID_MAX", - TRQ_SEL_FMAP_90_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_90_QID_BASE", - TRQ_SEL_FMAP_90_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_91_field_info[] = { - {"TRQ_SEL_FMAP_91_RSVD_1", - TRQ_SEL_FMAP_91_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_91_QID_MAX", - TRQ_SEL_FMAP_91_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_91_QID_BASE", - TRQ_SEL_FMAP_91_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_92_field_info[] = { - {"TRQ_SEL_FMAP_92_RSVD_1", - TRQ_SEL_FMAP_92_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_92_QID_MAX", - TRQ_SEL_FMAP_92_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_92_QID_BASE", - TRQ_SEL_FMAP_92_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_93_field_info[] = { - {"TRQ_SEL_FMAP_93_RSVD_1", - TRQ_SEL_FMAP_93_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_93_QID_MAX", - TRQ_SEL_FMAP_93_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_93_QID_BASE", - TRQ_SEL_FMAP_93_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_94_field_info[] = { - {"TRQ_SEL_FMAP_94_RSVD_1", - TRQ_SEL_FMAP_94_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_94_QID_MAX", - TRQ_SEL_FMAP_94_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_94_QID_BASE", - TRQ_SEL_FMAP_94_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_95_field_info[] = { - {"TRQ_SEL_FMAP_95_RSVD_1", - TRQ_SEL_FMAP_95_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_95_QID_MAX", - TRQ_SEL_FMAP_95_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_95_QID_BASE", - TRQ_SEL_FMAP_95_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_96_field_info[] = { - {"TRQ_SEL_FMAP_96_RSVD_1", - TRQ_SEL_FMAP_96_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_96_QID_MAX", - TRQ_SEL_FMAP_96_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_96_QID_BASE", - TRQ_SEL_FMAP_96_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_97_field_info[] = { - {"TRQ_SEL_FMAP_97_RSVD_1", - TRQ_SEL_FMAP_97_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_97_QID_MAX", - TRQ_SEL_FMAP_97_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_97_QID_BASE", - TRQ_SEL_FMAP_97_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_98_field_info[] = { - {"TRQ_SEL_FMAP_98_RSVD_1", - TRQ_SEL_FMAP_98_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_98_QID_MAX", - TRQ_SEL_FMAP_98_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_98_QID_BASE", - TRQ_SEL_FMAP_98_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_99_field_info[] = { - {"TRQ_SEL_FMAP_99_RSVD_1", - TRQ_SEL_FMAP_99_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_99_QID_MAX", - TRQ_SEL_FMAP_99_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_99_QID_BASE", - TRQ_SEL_FMAP_99_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9a_field_info[] = { - {"TRQ_SEL_FMAP_9A_RSVD_1", - TRQ_SEL_FMAP_9A_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9A_QID_MAX", - TRQ_SEL_FMAP_9A_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9A_QID_BASE", - TRQ_SEL_FMAP_9A_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9b_field_info[] = { - {"TRQ_SEL_FMAP_9B_RSVD_1", - TRQ_SEL_FMAP_9B_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9B_QID_MAX", - TRQ_SEL_FMAP_9B_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9B_QID_BASE", - TRQ_SEL_FMAP_9B_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9c_field_info[] = { - {"TRQ_SEL_FMAP_9C_RSVD_1", - TRQ_SEL_FMAP_9C_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9C_QID_MAX", - TRQ_SEL_FMAP_9C_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9C_QID_BASE", - TRQ_SEL_FMAP_9C_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9d_field_info[] = { - {"TRQ_SEL_FMAP_9D_RSVD_1", - TRQ_SEL_FMAP_9D_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9D_QID_MAX", - TRQ_SEL_FMAP_9D_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9D_QID_BASE", - TRQ_SEL_FMAP_9D_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9e_field_info[] = { - {"TRQ_SEL_FMAP_9E_RSVD_1", - TRQ_SEL_FMAP_9E_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9E_QID_MAX", - TRQ_SEL_FMAP_9E_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9E_QID_BASE", - TRQ_SEL_FMAP_9E_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_9f_field_info[] = { - {"TRQ_SEL_FMAP_9F_RSVD_1", - TRQ_SEL_FMAP_9F_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_9F_QID_MAX", - TRQ_SEL_FMAP_9F_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_9F_QID_BASE", - TRQ_SEL_FMAP_9F_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a0_field_info[] = { - {"TRQ_SEL_FMAP_A0_RSVD_1", - TRQ_SEL_FMAP_A0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A0_QID_MAX", - TRQ_SEL_FMAP_A0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A0_QID_BASE", - TRQ_SEL_FMAP_A0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a1_field_info[] = { - {"TRQ_SEL_FMAP_A1_RSVD_1", - TRQ_SEL_FMAP_A1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A1_QID_MAX", - TRQ_SEL_FMAP_A1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A1_QID_BASE", - TRQ_SEL_FMAP_A1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a2_field_info[] = { - {"TRQ_SEL_FMAP_A2_RSVD_1", - TRQ_SEL_FMAP_A2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A2_QID_MAX", - TRQ_SEL_FMAP_A2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A2_QID_BASE", - TRQ_SEL_FMAP_A2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a3_field_info[] = { - {"TRQ_SEL_FMAP_A3_RSVD_1", - TRQ_SEL_FMAP_A3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A3_QID_MAX", - TRQ_SEL_FMAP_A3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A3_QID_BASE", - TRQ_SEL_FMAP_A3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a4_field_info[] = { - {"TRQ_SEL_FMAP_A4_RSVD_1", - TRQ_SEL_FMAP_A4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A4_QID_MAX", - TRQ_SEL_FMAP_A4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A4_QID_BASE", - TRQ_SEL_FMAP_A4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a5_field_info[] = { - {"TRQ_SEL_FMAP_A5_RSVD_1", - TRQ_SEL_FMAP_A5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A5_QID_MAX", - TRQ_SEL_FMAP_A5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A5_QID_BASE", - TRQ_SEL_FMAP_A5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a6_field_info[] = { - {"TRQ_SEL_FMAP_A6_RSVD_1", - TRQ_SEL_FMAP_A6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A6_QID_MAX", - TRQ_SEL_FMAP_A6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A6_QID_BASE", - TRQ_SEL_FMAP_A6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a7_field_info[] = { - {"TRQ_SEL_FMAP_A7_RSVD_1", - TRQ_SEL_FMAP_A7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A7_QID_MAX", - TRQ_SEL_FMAP_A7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A7_QID_BASE", - TRQ_SEL_FMAP_A7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a8_field_info[] = { - {"TRQ_SEL_FMAP_A8_RSVD_1", - TRQ_SEL_FMAP_A8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A8_QID_MAX", - TRQ_SEL_FMAP_A8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A8_QID_BASE", - TRQ_SEL_FMAP_A8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_a9_field_info[] = { - {"TRQ_SEL_FMAP_A9_RSVD_1", - TRQ_SEL_FMAP_A9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_A9_QID_MAX", - TRQ_SEL_FMAP_A9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_A9_QID_BASE", - TRQ_SEL_FMAP_A9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_aa_field_info[] = { - {"TRQ_SEL_FMAP_AA_RSVD_1", - TRQ_SEL_FMAP_AA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AA_QID_MAX", - TRQ_SEL_FMAP_AA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AA_QID_BASE", - TRQ_SEL_FMAP_AA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ab_field_info[] = { - {"TRQ_SEL_FMAP_AB_RSVD_1", - TRQ_SEL_FMAP_AB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AB_QID_MAX", - TRQ_SEL_FMAP_AB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AB_QID_BASE", - TRQ_SEL_FMAP_AB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ac_field_info[] = { - {"TRQ_SEL_FMAP_AC_RSVD_1", - TRQ_SEL_FMAP_AC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AC_QID_MAX", - TRQ_SEL_FMAP_AC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AC_QID_BASE", - TRQ_SEL_FMAP_AC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ad_field_info[] = { - {"TRQ_SEL_FMAP_AD_RSVD_1", - TRQ_SEL_FMAP_AD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AD_QID_MAX", - TRQ_SEL_FMAP_AD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AD_QID_BASE", - TRQ_SEL_FMAP_AD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ae_field_info[] = { - {"TRQ_SEL_FMAP_AE_RSVD_1", - TRQ_SEL_FMAP_AE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AE_QID_MAX", - TRQ_SEL_FMAP_AE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AE_QID_BASE", - TRQ_SEL_FMAP_AE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_af_field_info[] = { - {"TRQ_SEL_FMAP_AF_RSVD_1", - TRQ_SEL_FMAP_AF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_AF_QID_MAX", - TRQ_SEL_FMAP_AF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_AF_QID_BASE", - TRQ_SEL_FMAP_AF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b0_field_info[] = { - {"TRQ_SEL_FMAP_B0_RSVD_1", - TRQ_SEL_FMAP_B0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B0_QID_MAX", - TRQ_SEL_FMAP_B0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B0_QID_BASE", - TRQ_SEL_FMAP_B0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b1_field_info[] = { - {"TRQ_SEL_FMAP_B1_RSVD_1", - TRQ_SEL_FMAP_B1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B1_QID_MAX", - TRQ_SEL_FMAP_B1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B1_QID_BASE", - TRQ_SEL_FMAP_B1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b2_field_info[] = { - {"TRQ_SEL_FMAP_B2_RSVD_1", - TRQ_SEL_FMAP_B2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B2_QID_MAX", - TRQ_SEL_FMAP_B2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B2_QID_BASE", - TRQ_SEL_FMAP_B2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b3_field_info[] = { - {"TRQ_SEL_FMAP_B3_RSVD_1", - TRQ_SEL_FMAP_B3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B3_QID_MAX", - TRQ_SEL_FMAP_B3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B3_QID_BASE", - TRQ_SEL_FMAP_B3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b4_field_info[] = { - {"TRQ_SEL_FMAP_B4_RSVD_1", - TRQ_SEL_FMAP_B4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B4_QID_MAX", - TRQ_SEL_FMAP_B4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B4_QID_BASE", - TRQ_SEL_FMAP_B4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b5_field_info[] = { - {"TRQ_SEL_FMAP_B5_RSVD_1", - TRQ_SEL_FMAP_B5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B5_QID_MAX", - TRQ_SEL_FMAP_B5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B5_QID_BASE", - TRQ_SEL_FMAP_B5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b6_field_info[] = { - {"TRQ_SEL_FMAP_B6_RSVD_1", - TRQ_SEL_FMAP_B6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B6_QID_MAX", - TRQ_SEL_FMAP_B6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B6_QID_BASE", - TRQ_SEL_FMAP_B6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b7_field_info[] = { - {"TRQ_SEL_FMAP_B7_RSVD_1", - TRQ_SEL_FMAP_B7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B7_QID_MAX", - TRQ_SEL_FMAP_B7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B7_QID_BASE", - TRQ_SEL_FMAP_B7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b8_field_info[] = { - {"TRQ_SEL_FMAP_B8_RSVD_1", - TRQ_SEL_FMAP_B8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B8_QID_MAX", - TRQ_SEL_FMAP_B8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B8_QID_BASE", - TRQ_SEL_FMAP_B8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_b9_field_info[] = { - {"TRQ_SEL_FMAP_B9_RSVD_1", - TRQ_SEL_FMAP_B9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_B9_QID_MAX", - TRQ_SEL_FMAP_B9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_B9_QID_BASE", - TRQ_SEL_FMAP_B9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ba_field_info[] = { - {"TRQ_SEL_FMAP_BA_RSVD_1", - TRQ_SEL_FMAP_BA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BA_QID_MAX", - TRQ_SEL_FMAP_BA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BA_QID_BASE", - TRQ_SEL_FMAP_BA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bb_field_info[] = { - {"TRQ_SEL_FMAP_BB_RSVD_1", - TRQ_SEL_FMAP_BB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BB_QID_MAX", - TRQ_SEL_FMAP_BB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BB_QID_BASE", - TRQ_SEL_FMAP_BB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bc_field_info[] = { - {"TRQ_SEL_FMAP_BC_RSVD_1", - TRQ_SEL_FMAP_BC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BC_QID_MAX", - TRQ_SEL_FMAP_BC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BC_QID_BASE", - TRQ_SEL_FMAP_BC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bd_field_info[] = { - {"TRQ_SEL_FMAP_BD_RSVD_1", - TRQ_SEL_FMAP_BD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BD_QID_MAX", - TRQ_SEL_FMAP_BD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BD_QID_BASE", - TRQ_SEL_FMAP_BD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_be_field_info[] = { - {"TRQ_SEL_FMAP_BE_RSVD_1", - TRQ_SEL_FMAP_BE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BE_QID_MAX", - TRQ_SEL_FMAP_BE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BE_QID_BASE", - TRQ_SEL_FMAP_BE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_bf_field_info[] = { - {"TRQ_SEL_FMAP_BF_RSVD_1", - TRQ_SEL_FMAP_BF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_BF_QID_MAX", - TRQ_SEL_FMAP_BF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_BF_QID_BASE", - TRQ_SEL_FMAP_BF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c0_field_info[] = { - {"TRQ_SEL_FMAP_C0_RSVD_1", - TRQ_SEL_FMAP_C0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C0_QID_MAX", - TRQ_SEL_FMAP_C0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C0_QID_BASE", - TRQ_SEL_FMAP_C0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c1_field_info[] = { - {"TRQ_SEL_FMAP_C1_RSVD_1", - TRQ_SEL_FMAP_C1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C1_QID_MAX", - TRQ_SEL_FMAP_C1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C1_QID_BASE", - TRQ_SEL_FMAP_C1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c2_field_info[] = { - {"TRQ_SEL_FMAP_C2_RSVD_1", - TRQ_SEL_FMAP_C2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C2_QID_MAX", - TRQ_SEL_FMAP_C2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C2_QID_BASE", - TRQ_SEL_FMAP_C2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c3_field_info[] = { - {"TRQ_SEL_FMAP_C3_RSVD_1", - TRQ_SEL_FMAP_C3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C3_QID_MAX", - TRQ_SEL_FMAP_C3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C3_QID_BASE", - TRQ_SEL_FMAP_C3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c4_field_info[] = { - {"TRQ_SEL_FMAP_C4_RSVD_1", - TRQ_SEL_FMAP_C4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C4_QID_MAX", - TRQ_SEL_FMAP_C4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C4_QID_BASE", - TRQ_SEL_FMAP_C4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c5_field_info[] = { - {"TRQ_SEL_FMAP_C5_RSVD_1", - TRQ_SEL_FMAP_C5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C5_QID_MAX", - TRQ_SEL_FMAP_C5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C5_QID_BASE", - TRQ_SEL_FMAP_C5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c6_field_info[] = { - {"TRQ_SEL_FMAP_C6_RSVD_1", - TRQ_SEL_FMAP_C6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C6_QID_MAX", - TRQ_SEL_FMAP_C6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C6_QID_BASE", - TRQ_SEL_FMAP_C6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c7_field_info[] = { - {"TRQ_SEL_FMAP_C7_RSVD_1", - TRQ_SEL_FMAP_C7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C7_QID_MAX", - TRQ_SEL_FMAP_C7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C7_QID_BASE", - TRQ_SEL_FMAP_C7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c8_field_info[] = { - {"TRQ_SEL_FMAP_C8_RSVD_1", - TRQ_SEL_FMAP_C8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C8_QID_MAX", - TRQ_SEL_FMAP_C8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C8_QID_BASE", - TRQ_SEL_FMAP_C8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_c9_field_info[] = { - {"TRQ_SEL_FMAP_C9_RSVD_1", - TRQ_SEL_FMAP_C9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_C9_QID_MAX", - TRQ_SEL_FMAP_C9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_C9_QID_BASE", - TRQ_SEL_FMAP_C9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ca_field_info[] = { - {"TRQ_SEL_FMAP_CA_RSVD_1", - TRQ_SEL_FMAP_CA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CA_QID_MAX", - TRQ_SEL_FMAP_CA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CA_QID_BASE", - TRQ_SEL_FMAP_CA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cb_field_info[] = { - {"TRQ_SEL_FMAP_CB_RSVD_1", - TRQ_SEL_FMAP_CB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CB_QID_MAX", - TRQ_SEL_FMAP_CB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CB_QID_BASE", - TRQ_SEL_FMAP_CB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cc_field_info[] = { - {"TRQ_SEL_FMAP_CC_RSVD_1", - TRQ_SEL_FMAP_CC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CC_QID_MAX", - TRQ_SEL_FMAP_CC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CC_QID_BASE", - TRQ_SEL_FMAP_CC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cd_field_info[] = { - {"TRQ_SEL_FMAP_CD_RSVD_1", - TRQ_SEL_FMAP_CD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CD_QID_MAX", - TRQ_SEL_FMAP_CD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CD_QID_BASE", - TRQ_SEL_FMAP_CD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ce_field_info[] = { - {"TRQ_SEL_FMAP_CE_RSVD_1", - TRQ_SEL_FMAP_CE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CE_QID_MAX", - TRQ_SEL_FMAP_CE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CE_QID_BASE", - TRQ_SEL_FMAP_CE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_cf_field_info[] = { - {"TRQ_SEL_FMAP_CF_RSVD_1", - TRQ_SEL_FMAP_CF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_CF_QID_MAX", - TRQ_SEL_FMAP_CF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_CF_QID_BASE", - TRQ_SEL_FMAP_CF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d0_field_info[] = { - {"TRQ_SEL_FMAP_D0_RSVD_1", - TRQ_SEL_FMAP_D0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D0_QID_MAX", - TRQ_SEL_FMAP_D0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D0_QID_BASE", - TRQ_SEL_FMAP_D0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d1_field_info[] = { - {"TRQ_SEL_FMAP_D1_RSVD_1", - TRQ_SEL_FMAP_D1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D1_QID_MAX", - TRQ_SEL_FMAP_D1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D1_QID_BASE", - TRQ_SEL_FMAP_D1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d2_field_info[] = { - {"TRQ_SEL_FMAP_D2_RSVD_1", - TRQ_SEL_FMAP_D2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D2_QID_MAX", - TRQ_SEL_FMAP_D2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D2_QID_BASE", - TRQ_SEL_FMAP_D2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d3_field_info[] = { - {"TRQ_SEL_FMAP_D3_RSVD_1", - TRQ_SEL_FMAP_D3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D3_QID_MAX", - TRQ_SEL_FMAP_D3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D3_QID_BASE", - TRQ_SEL_FMAP_D3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d4_field_info[] = { - {"TRQ_SEL_FMAP_D4_RSVD_1", - TRQ_SEL_FMAP_D4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D4_QID_MAX", - TRQ_SEL_FMAP_D4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D4_QID_BASE", - TRQ_SEL_FMAP_D4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d5_field_info[] = { - {"TRQ_SEL_FMAP_D5_RSVD_1", - TRQ_SEL_FMAP_D5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D5_QID_MAX", - TRQ_SEL_FMAP_D5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D5_QID_BASE", - TRQ_SEL_FMAP_D5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d6_field_info[] = { - {"TRQ_SEL_FMAP_D6_RSVD_1", - TRQ_SEL_FMAP_D6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D6_QID_MAX", - TRQ_SEL_FMAP_D6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D6_QID_BASE", - TRQ_SEL_FMAP_D6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d7_field_info[] = { - {"TRQ_SEL_FMAP_D7_RSVD_1", - TRQ_SEL_FMAP_D7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D7_QID_MAX", - TRQ_SEL_FMAP_D7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D7_QID_BASE", - TRQ_SEL_FMAP_D7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d8_field_info[] = { - {"TRQ_SEL_FMAP_D8_RSVD_1", - TRQ_SEL_FMAP_D8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D8_QID_MAX", - TRQ_SEL_FMAP_D8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D8_QID_BASE", - TRQ_SEL_FMAP_D8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_d9_field_info[] = { - {"TRQ_SEL_FMAP_D9_RSVD_1", - TRQ_SEL_FMAP_D9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_D9_QID_MAX", - TRQ_SEL_FMAP_D9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_D9_QID_BASE", - TRQ_SEL_FMAP_D9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_da_field_info[] = { - {"TRQ_SEL_FMAP_DA_RSVD_1", - TRQ_SEL_FMAP_DA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DA_QID_MAX", - TRQ_SEL_FMAP_DA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DA_QID_BASE", - TRQ_SEL_FMAP_DA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_db_field_info[] = { - {"TRQ_SEL_FMAP_DB_RSVD_1", - TRQ_SEL_FMAP_DB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DB_QID_MAX", - TRQ_SEL_FMAP_DB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DB_QID_BASE", - TRQ_SEL_FMAP_DB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_dc_field_info[] = { - {"TRQ_SEL_FMAP_DC_RSVD_1", - TRQ_SEL_FMAP_DC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DC_QID_MAX", - TRQ_SEL_FMAP_DC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DC_QID_BASE", - TRQ_SEL_FMAP_DC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_dd_field_info[] = { - {"TRQ_SEL_FMAP_DD_RSVD_1", - TRQ_SEL_FMAP_DD_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DD_QID_MAX", - TRQ_SEL_FMAP_DD_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DD_QID_BASE", - TRQ_SEL_FMAP_DD_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_de_field_info[] = { - {"TRQ_SEL_FMAP_DE_RSVD_1", - TRQ_SEL_FMAP_DE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DE_QID_MAX", - TRQ_SEL_FMAP_DE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DE_QID_BASE", - TRQ_SEL_FMAP_DE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_df_field_info[] = { - {"TRQ_SEL_FMAP_DF_RSVD_1", - TRQ_SEL_FMAP_DF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_DF_QID_MAX", - TRQ_SEL_FMAP_DF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_DF_QID_BASE", - TRQ_SEL_FMAP_DF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e0_field_info[] = { - {"TRQ_SEL_FMAP_E0_RSVD_1", - TRQ_SEL_FMAP_E0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E0_QID_MAX", - TRQ_SEL_FMAP_E0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E0_QID_BASE", - TRQ_SEL_FMAP_E0_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e1_field_info[] = { - {"TRQ_SEL_FMAP_E1_RSVD_1", - TRQ_SEL_FMAP_E1_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E1_QID_MAX", - TRQ_SEL_FMAP_E1_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E1_QID_BASE", - TRQ_SEL_FMAP_E1_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e2_field_info[] = { - {"TRQ_SEL_FMAP_E2_RSVD_1", - TRQ_SEL_FMAP_E2_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E2_QID_MAX", - TRQ_SEL_FMAP_E2_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E2_QID_BASE", - TRQ_SEL_FMAP_E2_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e3_field_info[] = { - {"TRQ_SEL_FMAP_E3_RSVD_1", - TRQ_SEL_FMAP_E3_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E3_QID_MAX", - TRQ_SEL_FMAP_E3_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E3_QID_BASE", - TRQ_SEL_FMAP_E3_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e4_field_info[] = { - {"TRQ_SEL_FMAP_E4_RSVD_1", - TRQ_SEL_FMAP_E4_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E4_QID_MAX", - TRQ_SEL_FMAP_E4_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E4_QID_BASE", - TRQ_SEL_FMAP_E4_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e5_field_info[] = { - {"TRQ_SEL_FMAP_E5_RSVD_1", - TRQ_SEL_FMAP_E5_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E5_QID_MAX", - TRQ_SEL_FMAP_E5_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E5_QID_BASE", - TRQ_SEL_FMAP_E5_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e6_field_info[] = { - {"TRQ_SEL_FMAP_E6_RSVD_1", - TRQ_SEL_FMAP_E6_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E6_QID_MAX", - TRQ_SEL_FMAP_E6_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E6_QID_BASE", - TRQ_SEL_FMAP_E6_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e7_field_info[] = { - {"TRQ_SEL_FMAP_E7_RSVD_1", - TRQ_SEL_FMAP_E7_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E7_QID_MAX", - TRQ_SEL_FMAP_E7_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E7_QID_BASE", - TRQ_SEL_FMAP_E7_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e8_field_info[] = { - {"TRQ_SEL_FMAP_E8_RSVD_1", - TRQ_SEL_FMAP_E8_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E8_QID_MAX", - TRQ_SEL_FMAP_E8_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E8_QID_BASE", - TRQ_SEL_FMAP_E8_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_e9_field_info[] = { - {"TRQ_SEL_FMAP_E9_RSVD_1", - TRQ_SEL_FMAP_E9_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_E9_QID_MAX", - TRQ_SEL_FMAP_E9_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_E9_QID_BASE", - TRQ_SEL_FMAP_E9_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ea_field_info[] = { - {"TRQ_SEL_FMAP_EA_RSVD_1", - TRQ_SEL_FMAP_EA_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EA_QID_MAX", - TRQ_SEL_FMAP_EA_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EA_QID_BASE", - TRQ_SEL_FMAP_EA_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_eb_field_info[] = { - {"TRQ_SEL_FMAP_EB_RSVD_1", - TRQ_SEL_FMAP_EB_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EB_QID_MAX", - TRQ_SEL_FMAP_EB_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EB_QID_BASE", - TRQ_SEL_FMAP_EB_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ec_field_info[] = { - {"TRQ_SEL_FMAP_EC_RSVD_1", - TRQ_SEL_FMAP_EC_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EC_QID_MAX", - TRQ_SEL_FMAP_EC_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EC_QID_BASE", - TRQ_SEL_FMAP_EC_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ed_field_info[] = { - {"TRQ_SEL_FMAP_ED_RSVD_1", - TRQ_SEL_FMAP_ED_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_ED_QID_MAX", - TRQ_SEL_FMAP_ED_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_ED_QID_BASE", - TRQ_SEL_FMAP_ED_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ee_field_info[] = { - {"TRQ_SEL_FMAP_EE_RSVD_1", - TRQ_SEL_FMAP_EE_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EE_QID_MAX", - TRQ_SEL_FMAP_EE_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EE_QID_BASE", - TRQ_SEL_FMAP_EE_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_ef_field_info[] = { - {"TRQ_SEL_FMAP_EF_RSVD_1", - TRQ_SEL_FMAP_EF_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_EF_QID_MAX", - TRQ_SEL_FMAP_EF_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_EF_QID_BASE", - TRQ_SEL_FMAP_EF_QID_BASE_MASK}, -}; - - -static struct regfield_info - trq_sel_fmap_f0_field_info[] = { - {"TRQ_SEL_FMAP_F0_RSVD_1", - TRQ_SEL_FMAP_F0_RSVD_1_MASK}, - {"TRQ_SEL_FMAP_F0_QID_MAX", - TRQ_SEL_FMAP_F0_QID_MAX_MASK}, - {"TRQ_SEL_FMAP_F0_QID_BASE", - TRQ_SEL_FMAP_F0_QID_BASE_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_3_field_info[] = { - {"IND_CTXT_DATA_3_DATA", - IND_CTXT_DATA_3_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_2_field_info[] = { - {"IND_CTXT_DATA_2_DATA", - IND_CTXT_DATA_2_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_1_field_info[] = { - {"IND_CTXT_DATA_1_DATA", - IND_CTXT_DATA_1_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt_data_0_field_info[] = { - {"IND_CTXT_DATA_0_DATA", - IND_CTXT_DATA_0_DATA_MASK}, -}; - - -static struct regfield_info - ind_ctxt3_field_info[] = { - {"IND_CTXT3", - IND_CTXT3_MASK}, -}; - - -static struct regfield_info - ind_ctxt2_field_info[] = { - {"IND_CTXT2", - IND_CTXT2_MASK}, -}; - - -static struct regfield_info - ind_ctxt1_field_info[] = { - {"IND_CTXT1", - IND_CTXT1_MASK}, -}; - - -static struct regfield_info - ind_ctxt0_field_info[] = { - {"IND_CTXT0", - IND_CTXT0_MASK}, -}; - - -static struct regfield_info - ind_ctxt_cmd_field_info[] = { - {"IND_CTXT_CMD_RSVD_1", - IND_CTXT_CMD_RSVD_1_MASK}, - {"IND_CTXT_CMD_QID", - IND_CTXT_CMD_QID_MASK}, - {"IND_CTXT_CMD_OP", - IND_CTXT_CMD_OP_MASK}, - {"IND_CTXT_CMD_SET", - IND_CTXT_CMD_SET_MASK}, - {"IND_CTXT_CMD_BUSY", - IND_CTXT_CMD_BUSY_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_1_field_info[] = { - {"C2H_TIMER_CNT_1_RSVD_1", - C2H_TIMER_CNT_1_RSVD_1_MASK}, - {"C2H_TIMER_CNT_1", - C2H_TIMER_CNT_1_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_2_field_info[] = { - {"C2H_TIMER_CNT_2_RSVD_1", - C2H_TIMER_CNT_2_RSVD_1_MASK}, - {"C2H_TIMER_CNT_2", - C2H_TIMER_CNT_2_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_3_field_info[] = { - {"C2H_TIMER_CNT_3_RSVD_1", - C2H_TIMER_CNT_3_RSVD_1_MASK}, - {"C2H_TIMER_CNT_3", - C2H_TIMER_CNT_3_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_4_field_info[] = { - {"C2H_TIMER_CNT_4_RSVD_1", - C2H_TIMER_CNT_4_RSVD_1_MASK}, - {"C2H_TIMER_CNT_4", - C2H_TIMER_CNT_4_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_5_field_info[] = { - {"C2H_TIMER_CNT_5_RSVD_1", - C2H_TIMER_CNT_5_RSVD_1_MASK}, - {"C2H_TIMER_CNT_5", - C2H_TIMER_CNT_5_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_6_field_info[] = { - {"C2H_TIMER_CNT_6_RSVD_1", - C2H_TIMER_CNT_6_RSVD_1_MASK}, - {"C2H_TIMER_CNT_6", - C2H_TIMER_CNT_6_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_7_field_info[] = { - {"C2H_TIMER_CNT_7_RSVD_1", - C2H_TIMER_CNT_7_RSVD_1_MASK}, - {"C2H_TIMER_CNT_7", - C2H_TIMER_CNT_7_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_8_field_info[] = { - {"C2H_TIMER_CNT_8_RSVD_1", - C2H_TIMER_CNT_8_RSVD_1_MASK}, - {"C2H_TIMER_CNT_8", - C2H_TIMER_CNT_8_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_9_field_info[] = { - {"C2H_TIMER_CNT_9_RSVD_1", - C2H_TIMER_CNT_9_RSVD_1_MASK}, - {"C2H_TIMER_CNT_9", - C2H_TIMER_CNT_9_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_a_field_info[] = { - {"C2H_TIMER_CNT_A_RSVD_1", - C2H_TIMER_CNT_A_RSVD_1_MASK}, - {"C2H_TIMER_CNT_A", - C2H_TIMER_CNT_A_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_b_field_info[] = { - {"C2H_TIMER_CNT_B_RSVD_1", - C2H_TIMER_CNT_B_RSVD_1_MASK}, - {"C2H_TIMER_CNT_B", - C2H_TIMER_CNT_B_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_c_field_info[] = { - {"C2H_TIMER_CNT_C_RSVD_1", - C2H_TIMER_CNT_C_RSVD_1_MASK}, - {"C2H_TIMER_CNT_C", - C2H_TIMER_CNT_C_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_d_field_info[] = { - {"C2H_TIMER_CNT_D_RSVD_1", - C2H_TIMER_CNT_D_RSVD_1_MASK}, - {"C2H_TIMER_CNT_D", - C2H_TIMER_CNT_D_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_e_field_info[] = { - {"C2H_TIMER_CNT_E_RSVD_1", - C2H_TIMER_CNT_E_RSVD_1_MASK}, - {"C2H_TIMER_CNT_E", - C2H_TIMER_CNT_E_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_f_field_info[] = { - {"C2H_TIMER_CNT_F_RSVD_1", - C2H_TIMER_CNT_F_RSVD_1_MASK}, - {"C2H_TIMER_CNT_F", - C2H_TIMER_CNT_F_MASK}, -}; - - -static struct regfield_info - c2h_timer_cnt_10_field_info[] = { - {"C2H_TIMER_CNT_10_RSVD_1", - C2H_TIMER_CNT_10_RSVD_1_MASK}, - {"C2H_TIMER_CNT_10", - C2H_TIMER_CNT_10_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_1_field_info[] = { - {"C2H_CNT_TH_1_RSVD_1", - C2H_CNT_TH_1_RSVD_1_MASK}, - {"C2H_CNT_TH_1_THESHOLD_CNT", - C2H_CNT_TH_1_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_2_field_info[] = { - {"C2H_CNT_TH_2_RSVD_1", - C2H_CNT_TH_2_RSVD_1_MASK}, - {"C2H_CNT_TH_2_THESHOLD_CNT", - C2H_CNT_TH_2_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_3_field_info[] = { - {"C2H_CNT_TH_3_RSVD_1", - C2H_CNT_TH_3_RSVD_1_MASK}, - {"C2H_CNT_TH_3_THESHOLD_CNT", - C2H_CNT_TH_3_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_4_field_info[] = { - {"C2H_CNT_TH_4_RSVD_1", - C2H_CNT_TH_4_RSVD_1_MASK}, - {"C2H_CNT_TH_4_THESHOLD_CNT", - C2H_CNT_TH_4_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_5_field_info[] = { - {"C2H_CNT_TH_5_RSVD_1", - C2H_CNT_TH_5_RSVD_1_MASK}, - {"C2H_CNT_TH_5_THESHOLD_CNT", - C2H_CNT_TH_5_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_6_field_info[] = { - {"C2H_CNT_TH_6_RSVD_1", - C2H_CNT_TH_6_RSVD_1_MASK}, - {"C2H_CNT_TH_6_THESHOLD_CNT", - C2H_CNT_TH_6_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_7_field_info[] = { - {"C2H_CNT_TH_7_RSVD_1", - C2H_CNT_TH_7_RSVD_1_MASK}, - {"C2H_CNT_TH_7_THESHOLD_CNT", - C2H_CNT_TH_7_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_8_field_info[] = { - {"C2H_CNT_TH_8_RSVD_1", - C2H_CNT_TH_8_RSVD_1_MASK}, - {"C2H_CNT_TH_8_THESHOLD_CNT", - C2H_CNT_TH_8_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_9_field_info[] = { - {"C2H_CNT_TH_9_RSVD_1", - C2H_CNT_TH_9_RSVD_1_MASK}, - {"C2H_CNT_TH_9_THESHOLD_CNT", - C2H_CNT_TH_9_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_a_field_info[] = { - {"C2H_CNT_TH_A_RSVD_1", - C2H_CNT_TH_A_RSVD_1_MASK}, - {"C2H_CNT_TH_A_THESHOLD_CNT", - C2H_CNT_TH_A_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_b_field_info[] = { - {"C2H_CNT_TH_B_RSVD_1", - C2H_CNT_TH_B_RSVD_1_MASK}, - {"C2H_CNT_TH_B_THESHOLD_CNT", - C2H_CNT_TH_B_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_c_field_info[] = { - {"C2H_CNT_TH_C_RSVD_1", - C2H_CNT_TH_C_RSVD_1_MASK}, - {"C2H_CNT_TH_C_THESHOLD_CNT", - C2H_CNT_TH_C_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_d_field_info[] = { - {"C2H_CNT_TH_D_RSVD_1", - C2H_CNT_TH_D_RSVD_1_MASK}, - {"C2H_CNT_TH_D_THESHOLD_CNT", - C2H_CNT_TH_D_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_e_field_info[] = { - {"C2H_CNT_TH_E_RSVD_1", - C2H_CNT_TH_E_RSVD_1_MASK}, - {"C2H_CNT_TH_E_THESHOLD_CNT", - C2H_CNT_TH_E_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_f_field_info[] = { - {"C2H_CNT_TH_F_RSVD_1", - C2H_CNT_TH_F_RSVD_1_MASK}, - {"C2H_CNT_TH_F_THESHOLD_CNT", - C2H_CNT_TH_F_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_cnt_th_10_field_info[] = { - {"C2H_CNT_TH_10_RSVD_1", - C2H_CNT_TH_10_RSVD_1_MASK}, - {"C2H_CNT_TH_10_THESHOLD_CNT", - C2H_CNT_TH_10_THESHOLD_CNT_MASK}, -}; - - -static struct regfield_info - c2h_qid2vec_map_qid_field_info[] = { - {"C2H_QID2VEC_MAP_QID_RSVD_1", - C2H_QID2VEC_MAP_QID_RSVD_1_MASK}, - {"C2H_QID2VEC_MAP_QID_QID", - C2H_QID2VEC_MAP_QID_QID_MASK}, -}; - - -static struct regfield_info - c2h_qid2vec_map_field_info[] = { - {"C2H_QID2VEC_MAP_RSVD_1", - C2H_QID2VEC_MAP_RSVD_1_MASK}, - {"C2H_QID2VEC_MAP_H2C_EN_COAL", - C2H_QID2VEC_MAP_H2C_EN_COAL_MASK}, - {"C2H_QID2VEC_MAP_H2C_VECTOR", - C2H_QID2VEC_MAP_H2C_VECTOR_MASK}, - {"C2H_QID2VEC_MAP_C2H_EN_COAL", - C2H_QID2VEC_MAP_C2H_EN_COAL_MASK}, - {"C2H_QID2VEC_MAP_C2H_VECTOR", - C2H_QID2VEC_MAP_C2H_VECTOR_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_c2h_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - C2H_STAT_S_AXIS_C2H_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_s_axis_wrb_accepted_field_info[] = { - {"C2H_STAT_S_AXIS_WRB_ACCEPTED", - C2H_STAT_S_AXIS_WRB_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_pkt_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED_D", - C2H_STAT_DESC_RSP_PKT_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_axis_pkg_cmp_field_info[] = { - {"C2H_STAT_AXIS_PKG_CMP", - C2H_STAT_AXIS_PKG_CMP_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ACCEPTED_D", - C2H_STAT_DESC_RSP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_cmp_field_info[] = { - {"C2H_STAT_DESC_RSP_CMP_D", - C2H_STAT_DESC_RSP_CMP_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_wrq_out_field_info[] = { - {"C2H_STAT_WRQ_OUT", - C2H_STAT_WRQ_OUT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wpl_ren_accepted_field_info[] = { - {"C2H_STAT_WPL_REN_ACCEPTED", - C2H_STAT_WPL_REN_ACCEPTED_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wrq_len_field_info[] = { - {"C2H_STAT_TOTAL_WRQ_LEN", - C2H_STAT_TOTAL_WRQ_LEN_MASK}, -}; - - -static struct regfield_info - c2h_stat_total_wpl_len_field_info[] = { - {"C2H_STAT_TOTAL_WPL_LEN", - C2H_STAT_TOTAL_WPL_LEN_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_0_field_info[] = { - {"C2H_BUF_SZ_0_SIZE", - C2H_BUF_SZ_0_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_1_field_info[] = { - {"C2H_BUF_SZ_1_SIZE", - C2H_BUF_SZ_1_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_2_field_info[] = { - {"C2H_BUF_SZ_2_SIZE", - C2H_BUF_SZ_2_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_3_field_info[] = { - {"C2H_BUF_SZ_3_SIZE", - C2H_BUF_SZ_3_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_4_field_info[] = { - {"C2H_BUF_SZ_4_SIZE", - C2H_BUF_SZ_4_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_5_field_info[] = { - {"C2H_BUF_SZ_5_SIZE", - C2H_BUF_SZ_5_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_7_field_info[] = { - {"C2H_BUF_SZ_7_SIZE", - C2H_BUF_SZ_7_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_8_field_info[] = { - {"C2H_BUF_SZ_8_SIZE", - C2H_BUF_SZ_8_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_9_field_info[] = { - {"C2H_BUF_SZ_9_SIZE", - C2H_BUF_SZ_9_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_10_field_info[] = { - {"C2H_BUF_SZ_10_SIZE", - C2H_BUF_SZ_10_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_11_field_info[] = { - {"C2H_BUF_SZ_11_SIZE", - C2H_BUF_SZ_11_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_12_field_info[] = { - {"C2H_BUF_SZ_12_SIZE", - C2H_BUF_SZ_12_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_13_field_info[] = { - {"C2H_BUF_SZ_13_SIZE", - C2H_BUF_SZ_13_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_14_field_info[] = { - {"C2H_BUF_SZ_14_SIZE", - C2H_BUF_SZ_14_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_buf_sz_15_field_info[] = { - {"C2H_BUF_SZ_15_SIZE", - C2H_BUF_SZ_15_SIZE_MASK}, -}; - - -static struct regfield_info - c2h_err_stat_field_info[] = { - {"C2H_ERR_STAT_RSVD_1", - C2H_ERR_STAT_RSVD_1_MASK}, - {"C2H_ERR_STAT_WRB_PRTY_ERR", - C2H_ERR_STAT_WRB_PRTY_ERR_MASK}, - {"C2H_ERR_STAT_WRB_CIDX_ERR", - C2H_ERR_STAT_WRB_CIDX_ERR_MASK}, - {"C2H_ERR_STAT_WRB_QFULL_ERR", - C2H_ERR_STAT_WRB_QFULL_ERR_MASK}, - {"C2H_ERR_STAT_WRB_INV_Q_ERR", - C2H_ERR_STAT_WRB_INV_Q_ERR_MASK}, - {"C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH", - C2H_ERR_STAT_PORT_ID_BYP_IN_MISMATCH_MASK}, - {"C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH", - C2H_ERR_STAT_PORT_ID_CTXT_MISMATCH_MASK}, - {"C2H_ERR_STAT_ERR_DESC_CNT", - C2H_ERR_STAT_ERR_DESC_CNT_MASK}, - {"C2H_ERR_STAT_RSVD_2", - C2H_ERR_STAT_RSVD_2_MASK}, - {"C2H_ERR_STAT_MSI_INT_FAIL", - C2H_ERR_STAT_MSI_INT_FAIL_MASK}, - {"C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR", - C2H_ERR_STAT_ENG_WPL_DATA_PAR_ERR_MASK}, - {"C2H_ERR_STAT_RSVD_3", - C2H_ERR_STAT_RSVD_3_MASK}, - {"C2H_ERR_STAT_DESC_RSP_ERR", - C2H_ERR_STAT_DESC_RSP_ERR_MASK}, - {"C2H_ERR_STAT_QID_MISMATCH", - C2H_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_ERR_STAT_RSVD_4", - C2H_ERR_STAT_RSVD_4_MASK}, - {"C2H_ERR_STAT_LEN_MISMATCH", - C2H_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_ERR_STAT_MTY_MISMATCH", - C2H_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_err_mask_field_info[] = { - {"C2H_ERR_EN", - C2H_ERR_EN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_stat_field_info[] = { - {"C2H_FATAL_ERR_STAT_RSVD_1", - C2H_FATAL_ERR_STAT_RSVD_1_MASK}, - {"C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR", - C2H_FATAL_ERR_STAT_WPL_DATA_PAR_ERR_MASK}, - {"C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_PLD_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_QID_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TUSER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_COAL_DATA_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_QID2VEC_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_INT_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_DESC_REQ_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE", - C2H_FATAL_ERR_STAT_WRB_CTXT_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE", - C2H_FATAL_ERR_STAT_PFCH_LL_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE", - C2H_FATAL_ERR_STAT_TIMER_FIFO_RAM_RDBE_MASK}, - {"C2H_FATAL_ERR_STAT_QID_MISMATCH", - C2H_FATAL_ERR_STAT_QID_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_RSVD_2", - C2H_FATAL_ERR_STAT_RSVD_2_MASK}, - {"C2H_FATAL_ERR_STAT_LEN_MISMATCH", - C2H_FATAL_ERR_STAT_LEN_MISMATCH_MASK}, - {"C2H_FATAL_ERR_STAT_MTY_MISMATCH", - C2H_FATAL_ERR_STAT_MTY_MISMATCH_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_mask_field_info[] = { - {"C2H_FATAL_ERR_C2HEN", - C2H_FATAL_ERR_C2HEN_MASK}, -}; - - -static struct regfield_info - c2h_fatal_err_enable_field_info[] = { - {"C2H_FATAL_ERR_ENABLE_RSVD_1", - C2H_FATAL_ERR_ENABLE_RSVD_1_MASK}, - {"C2H_FATAL_ERR_ENABLE_WPL_PAR_INV", - C2H_FATAL_ERR_ENABLE_WPL_PAR_INV_MASK}, - {"C2H_FATAL_ERR_ENABLE_WRQ_DIS", - C2H_FATAL_ERR_ENABLE_WRQ_DIS_MASK}, -}; - - -static struct regfield_info - glbl_err_int_field_info[] = { - {"GLBL_ERR_INT_RSVD_1", - GLBL_ERR_INT_RSVD_1_MASK}, - {"GLBL_ERR_INT_ARM", - GLBL_ERR_INT_ARM_MASK}, - {"GLBL_ERR_INT_EN_COAL", - GLBL_ERR_INT_EN_COAL_MASK}, - {"GLBL_ERR_INT_VEC", - GLBL_ERR_INT_VEC_MASK}, - {"GLBL_ERR_INT_FUNC", - GLBL_ERR_INT_FUNC_MASK}, -}; - - -static struct regfield_info - c2h_pfch_cfg_field_info[] = { - {"C2H_PFCH_CFG_EVT_QCNT_TH", - C2H_PFCH_CFG_EVT_QCNT_TH_MASK}, - {"C2H_PFCH_CFG_QCNT", - C2H_PFCH_CFG_QCNT_MASK}, - {"C2H_PFCH_CFG_NUM", - C2H_PFCH_CFG_NUM_MASK}, - {"C2H_PFCH_CFG_FL_TH", - C2H_PFCH_CFG_FL_TH_MASK}, -}; - - -static struct regfield_info - c2h_int_timer_tick_field_info[] = { - {"C2H_INT_TIMER_TICK", - C2H_INT_TIMER_TICK_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_drop_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED_D", - C2H_STAT_DESC_RSP_DROP_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_rsp_err_accepted_field_info[] = { - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED_D", - C2H_STAT_DESC_RSP_ERR_ACCEPTED_D_MASK}, -}; - - -static struct regfield_info - c2h_stat_desc_req_field_info[] = { - {"C2H_STAT_DESC_REQ", - C2H_STAT_DESC_REQ_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_0_field_info[] = { - {"C2H_STAT_DMA_ENG_0_RSVD_1", - C2H_STAT_DMA_ENG_0_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRB_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_QID_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_PLD_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_0_WRQ_FIFO_OUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_0_WRB_SM_CS", - C2H_STAT_DMA_ENG_0_WRB_SM_CS_MASK}, - {"C2H_STAT_DMA_ENG_0_MAIN_SM_CS", - C2H_STAT_DMA_ENG_0_MAIN_SM_CS_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_1_field_info[] = { - {"C2H_STAT_DMA_ENG_1_RSVD_1", - C2H_STAT_DMA_ENG_1_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_1_DESC_RSP_LAST", - C2H_STAT_DMA_ENG_1_DESC_RSP_LAST_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_1_PLD_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_1_QID_FIFO_IN_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_2_field_info[] = { - {"C2H_STAT_DMA_ENG_2_RSVD_1", - C2H_STAT_DMA_ENG_2_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_2_WRB_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_2_WRB_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_2_QID_FIFO_OUTPUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_3_field_info[] = { - {"C2H_STAT_DMA_ENG_3_RSVD_1", - C2H_STAT_DMA_ENG_3_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT", - C2H_STAT_DMA_ENG_3_ADDR_4K_SPLIT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_3_WRQ_FIFO_OUTPUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_err_ctxt_field_info[] = { - {"C2H_PFCH_ERR_CTXT_RSVD_1", - C2H_PFCH_ERR_CTXT_RSVD_1_MASK}, - {"C2H_PFCH_ERR_CTXT_ERR_STAT", - C2H_PFCH_ERR_CTXT_ERR_STAT_MASK}, - {"C2H_PFCH_ERR_CTXT_CMD_WR", - C2H_PFCH_ERR_CTXT_CMD_WR_MASK}, - {"C2H_PFCH_ERR_CTXT_QID", - C2H_PFCH_ERR_CTXT_QID_MASK}, - {"C2H_PFCH_ERR_CTXT_DONE", - C2H_PFCH_ERR_CTXT_DONE_MASK}, -}; - - -static struct regfield_info - c2h_first_err_qid_field_info[] = { - {"C2H_FIRST_ERR_QID_RSVD_1", - C2H_FIRST_ERR_QID_RSVD_1_MASK}, - {"C2H_FIRST_ERR_QID_ERR_STAT", - C2H_FIRST_ERR_QID_ERR_STAT_MASK}, - {"C2H_FIRST_ERR_QID_CMD_WR", - C2H_FIRST_ERR_QID_CMD_WR_MASK}, - {"C2H_FIRST_ERR_QID_QID", - C2H_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_in_field_info[] = { - {"STAT_NUM_WRB_IN_RSVD_1", - STAT_NUM_WRB_IN_RSVD_1_MASK}, - {"STAT_NUM_WRB_IN_WRB_CNT", - STAT_NUM_WRB_IN_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_out_field_info[] = { - {"STAT_NUM_WRB_OUT_RSVD_1", - STAT_NUM_WRB_OUT_RSVD_1_MASK}, - {"STAT_NUM_WRB_OUT_WRB_CNT", - STAT_NUM_WRB_OUT_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_wrb_drp_field_info[] = { - {"STAT_NUM_WRB_DRP_RSVD_1", - STAT_NUM_WRB_DRP_RSVD_1_MASK}, - {"STAT_NUM_WRB_DRP_WRB_CNT", - STAT_NUM_WRB_DRP_WRB_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_stat_desc_out_field_info[] = { - {"STAT_NUM_STAT_DESC_OUT_RSVD_1", - STAT_NUM_STAT_DESC_OUT_RSVD_1_MASK}, - {"STAT_NUM_STAT_DESC_OUT_CNT", - STAT_NUM_STAT_DESC_OUT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_dsc_crdt_sent_field_info[] = { - {"STAT_NUM_DSC_CRDT_SENT_RSVD_1", - STAT_NUM_DSC_CRDT_SENT_RSVD_1_MASK}, - {"STAT_NUM_DSC_CRDT_SENT_CNT", - STAT_NUM_DSC_CRDT_SENT_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_fch_dsc_rcvd_field_info[] = { - {"STAT_NUM_FCH_DSC_RCVD_RSVD_1", - STAT_NUM_FCH_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_FCH_DSC_RCVD_DSC_CNT", - STAT_NUM_FCH_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - stat_num_byp_dsc_rcvd_field_info[] = { - {"STAT_NUM_BYP_DSC_RCVD_RSVD_1", - STAT_NUM_BYP_DSC_RCVD_RSVD_1_MASK}, - {"STAT_NUM_BYP_DSC_RCVD_DSC_CNT", - STAT_NUM_BYP_DSC_RCVD_DSC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_wrb_coal_cfg_field_info[] = { - {"C2H_WRB_COAL_CFG_MAX_BUF_SZ", - C2H_WRB_COAL_CFG_MAX_BUF_SZ_MASK}, - {"C2H_WRB_COAL_CFG_TICK_VAL", - C2H_WRB_COAL_CFG_TICK_VAL_MASK}, - {"C2H_WRB_COAL_CFG_TICK_CNT", - C2H_WRB_COAL_CFG_TICK_CNT_MASK}, - {"C2H_WRB_COAL_CFG_SET_GLB_FLUSH", - C2H_WRB_COAL_CFG_SET_GLB_FLUSH_MASK}, - {"C2H_WRB_COAL_CFG_DONE_GLB_FLUSH", - C2H_WRB_COAL_CFG_DONE_GLB_FLUSH_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_req_field_info[] = { - {"C2H_INTR_H2C_REQ_RSVD_1", - C2H_INTR_H2C_REQ_RSVD_1_MASK}, - {"C2H_INTR_H2C_REQ_CNT", - C2H_INTR_H2C_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_mm_req_field_info[] = { - {"C2H_INTR_C2H_MM_REQ_RSVD_1", - C2H_INTR_C2H_MM_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_MM_REQ_CNT", - C2H_INTR_C2H_MM_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_err_int_req_field_info[] = { - {"C2H_INTR_ERR_INT_REQ_RSVD_1", - C2H_INTR_ERR_INT_REQ_RSVD_1_MASK}, - {"C2H_INTR_ERR_INT_REQ_CNT", - C2H_INTR_ERR_INT_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_req_field_info[] = { - {"C2H_INTR_C2H_ST_REQ_RSVD_1", - C2H_INTR_C2H_ST_REQ_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_REQ_CNT", - C2H_INTR_C2H_ST_REQ_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT", - C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info[] = { - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT", - C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_ack_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1", - C2H_INTR_C2H_ST_MSIX_ACK_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_ACK_CNT", - C2H_INTR_C2H_ST_MSIX_ACK_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_msix_fail_field_info[] = { - {"C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1", - C2H_INTR_C2H_ST_MSIX_FAIL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_MSIX_FAIL_CNT", - C2H_INTR_C2H_ST_MSIX_FAIL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_no_msix_field_info[] = { - {"C2H_INTR_C2H_ST_NO_MSIX_RSVD_1", - C2H_INTR_C2H_ST_NO_MSIX_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_NO_MSIX_CNT", - C2H_INTR_C2H_ST_NO_MSIX_CNT_MASK}, -}; - - -static struct regfield_info - c2h_intr_c2h_st_ctxt_inval_field_info[] = { - {"C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1", - C2H_INTR_C2H_ST_CTXT_INVAL_RSVD_1_MASK}, - {"C2H_INTR_C2H_ST_CTXT_INVAL_CNT", - C2H_INTR_C2H_ST_CTXT_INVAL_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_wr_cmp_field_info[] = { - {"C2H_STAT_WR_CMP_RSVD_1", - C2H_STAT_WR_CMP_RSVD_1_MASK}, - {"C2H_STAT_WR_CMP_CNT", - C2H_STAT_WR_CMP_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_4_field_info[] = { - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_4_WRB_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT", - C2H_STAT_DMA_ENG_4_TUSER_FIFO_OUT_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_dbg_dma_eng_5_field_info[] = { - {"C2H_STAT_DMA_ENG_5_RSVD_1", - C2H_STAT_DMA_ENG_5_RSVD_1_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD", - C2H_STAT_DMA_ENG_5_TUSER_COMB_OUT_VLD_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY", - C2H_STAT_DMA_ENG_5_TUSER_FIFO_IN_RDY_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT", - C2H_STAT_DMA_ENG_5_TUSER_COMB_IN_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT", - C2H_STAT_DMA_ENG_5_TUSE_COMB_OUTPUT_CNT_MASK}, - {"C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT", - C2H_STAT_DMA_ENG_5_TUSER_COMB_CNT_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_qid_field_info[] = { - {"C2H_PFCH_QID_RSVD_1", - C2H_PFCH_QID_RSVD_1_MASK}, - {"C2H_PFCH_QID_ERR_CTXT", - C2H_PFCH_QID_ERR_CTXT_MASK}, - {"C2H_PFCH_QID_TARGET", - C2H_PFCH_QID_TARGET_MASK}, - {"C2H_PFCH_QID_QID_OR_TAG", - C2H_PFCH_QID_QID_OR_TAG_MASK}, -}; - - -static struct regfield_info - c2h_dbg_pfch_field_info[] = { - {"C2H_PFCH_DATA", - C2H_PFCH_DATA_MASK}, -}; - - -static struct regfield_info - c2h_int_dbg_field_info[] = { - {"C2H_INT_RSVD_1", - C2H_INT_RSVD_1_MASK}, - {"C2H_INT_INT_COAL_SM", - C2H_INT_INT_COAL_SM_MASK}, - {"C2H_INT_INT_SM", - C2H_INT_INT_SM_MASK}, -}; - - -static struct regfield_info - c2h_stat_imm_accepted_field_info[] = { - {"C2H_STAT_IMM_ACCEPTED_RSVD_1", - C2H_STAT_IMM_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_IMM_ACCEPTED_CNT", - C2H_STAT_IMM_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_marker_accepted_field_info[] = { - {"C2H_STAT_MARKER_ACCEPTED_RSVD_1", - C2H_STAT_MARKER_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_MARKER_ACCEPTED_CNT", - C2H_STAT_MARKER_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_stat_disable_cmp_accepted_field_info[] = { - {"C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1", - C2H_STAT_DISABLE_CMP_ACCEPTED_RSVD_1_MASK}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED_CNT", - C2H_STAT_DISABLE_CMP_ACCEPTED_CNT_MASK}, -}; - - -static struct regfield_info - c2h_pld_fifo_crdt_cnt_field_info[] = { - {"C2H_PLD_FIFO_CRDT_CNT_RSVD_1", - C2H_PLD_FIFO_CRDT_CNT_RSVD_1_MASK}, - {"C2H_PLD_FIFO_CRDT_CNT_CNT", - C2H_PLD_FIFO_CRDT_CNT_CNT_MASK}, -}; - - -static struct regfield_info - h2c_err_stat_field_info[] = { - {"H2C_ERR_STAT_RSVD_1", - H2C_ERR_STAT_RSVD_1_MASK}, - {"H2C_ERR_STAT_SBE", - H2C_ERR_STAT_SBE_MASK}, - {"H2C_ERR_STAT_DBE", - H2C_ERR_STAT_DBE_MASK}, - {"H2C_ERR_STAT_NO_DMA_DS", - H2C_ERR_STAT_NO_DMA_DS_MASK}, - {"H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR", - H2C_ERR_STAT_SDI_MRKR_REQ_MOP_ERR_MASK}, - {"H2C_ERR_STAT_ZERO_LEN_DS", - H2C_ERR_STAT_ZERO_LEN_DS_MASK}, -}; - - -static struct regfield_info - h2c_err_mask_field_info[] = { - {"H2C_ERR_EN", - H2C_ERR_EN_MASK}, -}; - - -static struct regfield_info - h2c_first_err_qid_field_info[] = { - {"H2C_FIRST_ERR_QID_RSVD_1", - H2C_FIRST_ERR_QID_RSVD_1_MASK}, - {"H2C_FIRST_ERR_QID_ERR_TYPE", - H2C_FIRST_ERR_QID_ERR_TYPE_MASK}, - {"H2C_FIRST_ERR_QID_RSVD_2", - H2C_FIRST_ERR_QID_RSVD_2_MASK}, - {"H2C_FIRST_ERR_QID_QID", - H2C_FIRST_ERR_QID_QID_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg0_field_info[] = { - {"H2C_REG0_NUM_DSC_RCVD", - H2C_REG0_NUM_DSC_RCVD_MASK}, - {"H2C_REG0_NUM_WRB_SENT", - H2C_REG0_NUM_WRB_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg1_field_info[] = { - {"H2C_REG1_NUM_REQ_SENT", - H2C_REG1_NUM_REQ_SENT_MASK}, - {"H2C_REG1_NUM_CMP_SENT", - H2C_REG1_NUM_CMP_SENT_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg2_field_info[] = { - {"H2C_REG2_RSVD_1", - H2C_REG2_RSVD_1_MASK}, - {"H2C_REG2_NUM_ERR_DSC_RCVD", - H2C_REG2_NUM_ERR_DSC_RCVD_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg3_field_info[] = { - {"H2C_REG3", - H2C_REG3_MASK}, - {"H2C_REG3_DSCO_FIFO_EMPTY", - H2C_REG3_DSCO_FIFO_EMPTY_MASK}, - {"H2C_REG3_DSCO_FIFO_FULL", - H2C_REG3_DSCO_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RC_STATE", - H2C_REG3_CUR_RC_STATE_MASK}, - {"H2C_REG3_RDREQ_LINES", - H2C_REG3_RDREQ_LINES_MASK}, - {"H2C_REG3_RDATA_LINES_AVAIL", - H2C_REG3_RDATA_LINES_AVAIL_MASK}, - {"H2C_REG3_PEND_FIFO_EMPTY", - H2C_REG3_PEND_FIFO_EMPTY_MASK}, - {"H2C_REG3_PEND_FIFO_FULL", - H2C_REG3_PEND_FIFO_FULL_MASK}, - {"H2C_REG3_CUR_RQ_STATE", - H2C_REG3_CUR_RQ_STATE_MASK}, - {"H2C_REG3_DSCI_FIFO_FULL", - H2C_REG3_DSCI_FIFO_FULL_MASK}, - {"H2C_REG3_DSCI_FIFO_EMPTY", - H2C_REG3_DSCI_FIFO_EMPTY_MASK}, -}; - - -static struct regfield_info - h2c_dbg_reg4_field_info[] = { - {"H2C_REG4_RDREQ_ADDR", - H2C_REG4_RDREQ_ADDR_MASK}, -}; - - -static struct regfield_info - h2c_fatal_err_en_field_info[] = { - {"H2C_FATAL_ERR_EN_RSVD_1", - H2C_FATAL_ERR_EN_RSVD_1_MASK}, - {"H2C_FATAL_ERR_EN_H2C", - H2C_FATAL_ERR_EN_H2C_MASK}, -}; - - -static struct regfield_info - c2h_channel_ctl_field_info[] = { - {"C2H_CHANNEL_CTL_RSVD_1", - C2H_CHANNEL_CTL_RSVD_1_MASK}, - {"C2H_CHANNEL_CTL_RUN", - C2H_CHANNEL_CTL_RUN_MASK}, -}; - - -static struct regfield_info - c2h_channel_ctl_1_field_info[] = { - {"C2H_CHANNEL_CTL_1_RUN", - C2H_CHANNEL_CTL_1_RUN_MASK}, - {"C2H_CHANNEL_CTL_1_RUN_1", - C2H_CHANNEL_CTL_1_RUN_1_MASK}, -}; - - -static struct regfield_info - c2h_mm_status_field_info[] = { - {"C2H_MM_STATUS_RSVD_1", - C2H_MM_STATUS_RSVD_1_MASK}, - {"C2H_MM_STATUS_RUN", - C2H_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - c2h_channel_cmpl_desc_cnt_field_info[] = { - {"C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO", - C2H_CHANNEL_CMPL_DESC_CNT_C2H_CO_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_enable_mask_field_info[] = { - {"C2H_MM_ERR_CODE_ENABLE_RSVD_1", - C2H_MM_ERR_CODE_ENABLE_RSVD_1_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM", - C2H_MM_ERR_CODE_ENABLE_WR_UC_RAM_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_UR", - C2H_MM_ERR_CODE_ENABLE_WR_UR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_FLR", - C2H_MM_ERR_CODE_ENABLE_WR_FLR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RSVD_2", - C2H_MM_ERR_CODE_ENABLE_RSVD_2_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_RD_SLV_ERR_MASK}, - {"C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - C2H_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_code_field_info[] = { - {"C2H_MM_ERR_CODE_RSVD_1", - C2H_MM_ERR_CODE_RSVD_1_MASK}, - {"C2H_MM_ERR_CODE_VALID", - C2H_MM_ERR_CODE_VALID_MASK}, - {"C2H_MM_ERR_CODE_RDWR", - C2H_MM_ERR_CODE_RDWR_MASK}, - {"C2H_MM_ERR_CODE", - C2H_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - c2h_mm_err_info_field_info[] = { - {"C2H_MM_ERR_INFO_RSVD_1", - C2H_MM_ERR_INFO_RSVD_1_MASK}, - {"C2H_MM_ERR_INFO_QID", - C2H_MM_ERR_INFO_QID_MASK}, - {"C2H_MM_ERR_INFO_DIR", - C2H_MM_ERR_INFO_DIR_MASK}, - {"C2H_MM_ERR_INFO_CIDX", - C2H_MM_ERR_INFO_CIDX_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_ctl_field_info[] = { - {"C2H_MM_PERF_MON_CTL_RSVD_1", - C2H_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_START", - C2H_MM_PERF_MON_CTL_IMM_START_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_START", - C2H_MM_PERF_MON_CTL_RUN_START_MASK}, - {"C2H_MM_PERF_MON_CTL_IMM_CLEAR", - C2H_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"C2H_MM_PERF_MON_CTL_RUN_CLEAR", - C2H_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_cycle_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - C2H_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - C2H_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt0_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT0_DCNT", - C2H_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_perf_mon_data_cnt1_field_info[] = { - {"C2H_MM_PERF_MON_DATA_CNT1_RSVD_1", - C2H_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"C2H_MM_PERF_MON_DATA_CNT1_DCNT", - C2H_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - c2h_mm_dbg_field_info[] = { - {"C2H_MM_RSVD_1", - C2H_MM_RSVD_1_MASK}, - {"C2H_MM_RRQ_ENTRIES", - C2H_MM_RRQ_ENTRIES_MASK}, - {"C2H_MM_DAT_FIFO_SPC", - C2H_MM_DAT_FIFO_SPC_MASK}, - {"C2H_MM_RD_STALL", - C2H_MM_RD_STALL_MASK}, - {"C2H_MM_RRQ_FIFO_FI", - C2H_MM_RRQ_FIFO_FI_MASK}, - {"C2H_MM_WR_STALL", - C2H_MM_WR_STALL_MASK}, - {"C2H_MM_WRQ_FIFO_FI", - C2H_MM_WRQ_FIFO_FI_MASK}, - {"C2H_MM_WBK_STALL", - C2H_MM_WBK_STALL_MASK}, - {"C2H_MM_DSC_FIFO_EP", - C2H_MM_DSC_FIFO_EP_MASK}, - {"C2H_MM_DSC_FIFO_FL", - C2H_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_field_info[] = { - {"H2C_CHANNEL_CTL_RSVD_1", - H2C_CHANNEL_CTL_RSVD_1_MASK}, - {"H2C_CHANNEL_CTL_RUN", - H2C_CHANNEL_CTL_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_1_field_info[] = { - {"H2C_CHANNEL_CTL_1_RUN", - H2C_CHANNEL_CTL_1_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_ctl_2_field_info[] = { - {"H2C_CHANNEL_CTL_2_RUN", - H2C_CHANNEL_CTL_2_RUN_MASK}, -}; - - -static struct regfield_info - h2c_mm_status_field_info[] = { - {"H2C_MM_STATUS_RSVD_1", - H2C_MM_STATUS_RSVD_1_MASK}, - {"H2C_MM_STATUS_RUN", - H2C_MM_STATUS_RUN_MASK}, -}; - - -static struct regfield_info - h2c_channel_cmpl_desc_cnt_field_info[] = { - {"H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO", - H2C_CHANNEL_CMPL_DESC_CNT_H2C_CO_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_enable_mask_field_info[] = { - {"H2C_MM_ERR_CODE_ENABLE_RSVD_1", - H2C_MM_ERR_CODE_ENABLE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_SLV_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR", - H2C_MM_ERR_CODE_ENABLE_WR_DEC_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_2", - H2C_MM_ERR_CODE_ENABLE_RSVD_2_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_RQ_DIS_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_3", - H2C_MM_ERR_CODE_ENABLE_RSVD_3_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_DAT_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_4", - H2C_MM_ERR_CODE_ENABLE_RSVD_4_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_FLR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_5", - H2C_MM_ERR_CODE_ENABLE_RSVD_5_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_ADR_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_PARA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HDR_BYTE_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_UR_CA", - H2C_MM_ERR_CODE_ENABLE_RD_UR_CA_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR", - H2C_MM_ERR_CODE_ENABLE_RD_HRD_POISON_ERR_MASK}, - {"H2C_MM_ERR_CODE_ENABLE_RSVD_6", - H2C_MM_ERR_CODE_ENABLE_RSVD_6_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_code_field_info[] = { - {"H2C_MM_ERR_CODE_RSVD_1", - H2C_MM_ERR_CODE_RSVD_1_MASK}, - {"H2C_MM_ERR_CODE_VALID", - H2C_MM_ERR_CODE_VALID_MASK}, - {"H2C_MM_ERR_CODE_RDWR", - H2C_MM_ERR_CODE_RDWR_MASK}, - {"H2C_MM_ERR_CODE", - H2C_MM_ERR_CODE_MASK}, -}; - - -static struct regfield_info - h2c_mm_err_info_field_info[] = { - {"H2C_MM_ERR_INFO_RSVD_1", - H2C_MM_ERR_INFO_RSVD_1_MASK}, - {"H2C_MM_ERR_INFO_QID", - H2C_MM_ERR_INFO_QID_MASK}, - {"H2C_MM_ERR_INFO_DIR", - H2C_MM_ERR_INFO_DIR_MASK}, - {"H2C_MM_ERR_INFO_CIDX", - H2C_MM_ERR_INFO_CIDX_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_ctl_field_info[] = { - {"H2C_MM_PERF_MON_CTL_RSVD_1", - H2C_MM_PERF_MON_CTL_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_START", - H2C_MM_PERF_MON_CTL_IMM_START_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_START", - H2C_MM_PERF_MON_CTL_RUN_START_MASK}, - {"H2C_MM_PERF_MON_CTL_IMM_CLEAR", - H2C_MM_PERF_MON_CTL_IMM_CLEAR_MASK}, - {"H2C_MM_PERF_MON_CTL_RUN_CLEAR", - H2C_MM_PERF_MON_CTL_RUN_CLEAR_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT0_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_cycle_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1", - H2C_MM_PERF_MON_CYCLE_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT", - H2C_MM_PERF_MON_CYCLE_CNT1_CYC_CNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt0_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT0_DCNT", - H2C_MM_PERF_MON_DATA_CNT0_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_perf_mon_data_cnt1_field_info[] = { - {"H2C_MM_PERF_MON_DATA_CNT1_RSVD_1", - H2C_MM_PERF_MON_DATA_CNT1_RSVD_1_MASK}, - {"H2C_MM_PERF_MON_DATA_CNT1_DCNT", - H2C_MM_PERF_MON_DATA_CNT1_DCNT_MASK}, -}; - - -static struct regfield_info - h2c_mm_dbg_field_info[] = { - {"H2C_MM_RSVD_1", - H2C_MM_RSVD_1_MASK}, - {"H2C_MM_RRQ_ENTRIES", - H2C_MM_RRQ_ENTRIES_MASK}, - {"H2C_MM_DAT_FIFO_SPC", - H2C_MM_DAT_FIFO_SPC_MASK}, - {"H2C_MM_RD_STALL", - H2C_MM_RD_STALL_MASK}, - {"H2C_MM_RRQ_FIFO_FI", - H2C_MM_RRQ_FIFO_FI_MASK}, - {"H2C_MM_WR_STALL", - H2C_MM_WR_STALL_MASK}, - {"H2C_MM_WRQ_FIFO_FI", - H2C_MM_WRQ_FIFO_FI_MASK}, - {"H2C_MM_WBK_STALL", - H2C_MM_WBK_STALL_MASK}, - {"H2C_MM_DSC_FIFO_EP", - H2C_MM_DSC_FIFO_EP_MASK}, - {"H2C_MM_DSC_FIFO_FL", - H2C_MM_DSC_FIFO_FL_MASK}, -}; - - -static struct regfield_info - func_status_reg_field_info[] = { - {"FUNC_STATUS_REG_RSVD_1", - FUNC_STATUS_REG_RSVD_1_MASK}, - {"FUNC_STATUS_REG_CUR_SRC_FN", - FUNC_STATUS_REG_CUR_SRC_FN_MASK}, - {"FUNC_STATUS_REG_ACK", - FUNC_STATUS_REG_ACK_MASK}, - {"FUNC_STATUS_REG_O_MSG", - FUNC_STATUS_REG_O_MSG_MASK}, - {"FUNC_STATUS_REG_I_MSG", - FUNC_STATUS_REG_I_MSG_MASK}, -}; - - -static struct regfield_info - func_cmd_reg_field_info[] = { - {"FUNC_CMD_REG_RSVD_1", - FUNC_CMD_REG_RSVD_1_MASK}, - {"FUNC_CMD_REG_RSVD_2", - FUNC_CMD_REG_RSVD_2_MASK}, - {"FUNC_CMD_REG_MSG_RCV", - FUNC_CMD_REG_MSG_RCV_MASK}, - {"FUNC_CMD_REG_MSG_SENT", - FUNC_CMD_REG_MSG_SENT_MASK}, -}; - - -static struct regfield_info - func_interrupt_vector_reg_field_info[] = { - {"FUNC_INTERRUPT_VECTOR_REG_RSVD_1", - FUNC_INTERRUPT_VECTOR_REG_RSVD_1_MASK}, - {"FUNC_INTERRUPT_VECTOR_REG_IN", - FUNC_INTERRUPT_VECTOR_REG_IN_MASK}, -}; - - -static struct regfield_info - target_func_reg_field_info[] = { - {"TARGET_FUNC_REG_RSVD_1", - TARGET_FUNC_REG_RSVD_1_MASK}, - {"TARGET_FUNC_REG_N_ID", - TARGET_FUNC_REG_N_ID_MASK}, -}; - - -static struct regfield_info - func_interrupt_ctl_reg_field_info[] = { - {"FUNC_INTERRUPT_CTL_REG_RSVD_1", - FUNC_INTERRUPT_CTL_REG_RSVD_1_MASK}, - {"FUNC_INTERRUPT_CTL_REG_INT_EN", - FUNC_INTERRUPT_CTL_REG_INT_EN_MASK}, -}; - -static struct xreg_info qdma_s80_hard_config_regs[] = { -{"CFG_BLK_IDENTIFIER", 0x00, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_identifier_field_info), - cfg_blk_identifier_field_info -}, -{"CFG_BLK_BUSDEV", 0x04, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_busdev_field_info), - cfg_blk_busdev_field_info -}, -{"CFG_BLK_PCIE_MAX_PLD_SIZE", 0x08, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_pld_size_field_info), - cfg_blk_pcie_max_pld_size_field_info -}, -{"CFG_BLK_PCIE_MAX_READ_REQ_SIZE", 0x0c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_pcie_max_read_req_size_field_info), - cfg_blk_pcie_max_read_req_size_field_info -}, -{"CFG_BLK_SYSTEM_ID", 0x10, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_system_id_field_info), - cfg_blk_system_id_field_info -}, -{"CFG_BLK_MSI_ENABLE", 0x014, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_msi_enable_field_info), - cfg_blk_msi_enable_field_info -}, -{"CFG_PCIE_DATA_WIDTH", 0x18, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_data_width_field_info), - cfg_pcie_data_width_field_info -}, -{"CFG_PCIE_CTL", 0x1c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_pcie_ctl_field_info), - cfg_pcie_ctl_field_info -}, -{"CFG_AXI_USER_MAX_PLD_SIZE", 0x40, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_pld_size_field_info), - cfg_axi_user_max_pld_size_field_info -}, -{"CFG_AXI_USER_MAX_READ_REQ_SIZE", 0x44, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_axi_user_max_read_req_size_field_info), - cfg_axi_user_max_read_req_size_field_info -}, -{"CFG_BLK_MISC_CTL", 0x4c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_misc_ctl_field_info), - cfg_blk_misc_ctl_field_info -}, -{"CFG_BLK_SCRATCH_0", 0x80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_0_field_info), - cfg_blk_scratch_0_field_info -}, -{"CFG_BLK_SCRATCH_1", 0x84, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_1_field_info), - cfg_blk_scratch_1_field_info -}, -{"CFG_BLK_SCRATCH_2", 0x88, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_2_field_info), - cfg_blk_scratch_2_field_info -}, -{"CFG_BLK_SCRATCH_3", 0x8c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_3_field_info), - cfg_blk_scratch_3_field_info -}, -{"CFG_BLK_SCRATCH_4", 0x90, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_4_field_info), - cfg_blk_scratch_4_field_info -}, -{"CFG_BLK_SCRATCH_5", 0x94, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_5_field_info), - cfg_blk_scratch_5_field_info -}, -{"CFG_BLK_SCRATCH_6", 0x98, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_6_field_info), - cfg_blk_scratch_6_field_info -}, -{"CFG_BLK_SCRATCH_7", 0x9c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(cfg_blk_scratch_7_field_info), - cfg_blk_scratch_7_field_info -}, -{"RAM_SBE_MSK_A", 0xf0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_msk_a_field_info), - ram_sbe_msk_a_field_info -}, -{"RAM_SBE_STS_A", 0xf4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_sbe_sts_a_field_info), - ram_sbe_sts_a_field_info -}, -{"RAM_DBE_MSK_A", 0xf8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_msk_a_field_info), - ram_dbe_msk_a_field_info -}, -{"RAM_DBE_STS_A", 0xfc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ram_dbe_sts_a_field_info), - ram_dbe_sts_a_field_info -}, -{"GLBL2_IDENTIFIER", 0x100, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_identifier_field_info), - glbl2_identifier_field_info -}, -{"GLBL2_PF_BARLITE_INT", 0x104, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_barlite_int_field_info), - glbl2_pf_barlite_int_field_info -}, -{"GLBL2_PF_VF_BARLITE_INT", 0x108, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_vf_barlite_int_field_info), - glbl2_pf_vf_barlite_int_field_info -}, -{"GLBL2_PF_BARLITE_EXT", 0x10c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_barlite_ext_field_info), - glbl2_pf_barlite_ext_field_info -}, -{"GLBL2_PF_VF_BARLITE_EXT", 0x110, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_pf_vf_barlite_ext_field_info), - glbl2_pf_vf_barlite_ext_field_info -}, -{"GLBL2_CHANNEL_INST", 0x114, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_inst_field_info), - glbl2_channel_inst_field_info -}, -{"GLBL2_CHANNEL_MDMA", 0x118, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_mdma_field_info), - glbl2_channel_mdma_field_info -}, -{"GLBL2_CHANNEL_STRM", 0x11c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_strm_field_info), - glbl2_channel_strm_field_info -}, -{"GLBL2_CHANNEL_CAP", 0x120, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_cap_field_info), - glbl2_channel_cap_field_info -}, -{"GLBL2_CHANNEL_PASID_CAP", 0x128, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_pasid_cap_field_info), - glbl2_channel_pasid_cap_field_info -}, -{"GLBL2_CHANNEL_FUNC_RET", 0x12c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_channel_func_ret_field_info), - glbl2_channel_func_ret_field_info -}, -{"GLBL2_SYSTEM_ID", 0x130, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_system_id_field_info), - glbl2_system_id_field_info -}, -{"GLBL2_MISC_CAP", 0x134, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_misc_cap_field_info), - glbl2_misc_cap_field_info -}, -{"GLBL2_DBG_PCIE_RQ0", 0x1b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq0_field_info), - glbl2_dbg_pcie_rq0_field_info -}, -{"GLBL2_DBG_PCIE_RQ1", 0x1bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_pcie_rq1_field_info), - glbl2_dbg_pcie_rq1_field_info -}, -{"GLBL2_DBG_AXIMM_WR0", 0x1c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr0_field_info), - glbl2_dbg_aximm_wr0_field_info -}, -{"GLBL2_DBG_AXIMM_WR1", 0x1c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_wr1_field_info), - glbl2_dbg_aximm_wr1_field_info -}, -{"GLBL2_DBG_AXIMM_RD0", 0x1c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd0_field_info), - glbl2_dbg_aximm_rd0_field_info -}, -{"GLBL2_DBG_AXIMM_RD1", 0x1cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(glbl2_dbg_aximm_rd1_field_info), - glbl2_dbg_aximm_rd1_field_info -}, -{"GLBL_RNG_SZ_1", 0x204, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_1_field_info), - glbl_rng_sz_1_field_info -}, -{"GLBL_RNG_SZ_2", 0x208, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_2_field_info), - glbl_rng_sz_2_field_info -}, -{"GLBL_RNG_SZ_3", 0x20c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_3_field_info), - glbl_rng_sz_3_field_info -}, -{"GLBL_RNG_SZ_4", 0x210, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_4_field_info), - glbl_rng_sz_4_field_info -}, -{"GLBL_RNG_SZ_5", 0x214, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_5_field_info), - glbl_rng_sz_5_field_info -}, -{"GLBL_RNG_SZ_6", 0x218, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_6_field_info), - glbl_rng_sz_6_field_info -}, -{"GLBL_RNG_SZ_7", 0x21c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_7_field_info), - glbl_rng_sz_7_field_info -}, -{"GLBL_RNG_SZ_8", 0x220, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_8_field_info), - glbl_rng_sz_8_field_info -}, -{"GLBL_RNG_SZ_9", 0x224, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_9_field_info), - glbl_rng_sz_9_field_info -}, -{"GLBL_RNG_SZ_A", 0x228, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_a_field_info), - glbl_rng_sz_a_field_info -}, -{"GLBL_RNG_SZ_B", 0x22c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_b_field_info), - glbl_rng_sz_b_field_info -}, -{"GLBL_RNG_SZ_C", 0x230, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_c_field_info), - glbl_rng_sz_c_field_info -}, -{"GLBL_RNG_SZ_D", 0x234, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_d_field_info), - glbl_rng_sz_d_field_info -}, -{"GLBL_RNG_SZ_E", 0x238, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_e_field_info), - glbl_rng_sz_e_field_info -}, -{"GLBL_RNG_SZ_F", 0x23c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_f_field_info), - glbl_rng_sz_f_field_info -}, -{"GLBL_RNG_SZ_10", 0x240, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_rng_sz_10_field_info), - glbl_rng_sz_10_field_info -}, -{"GLBL_ERR_STAT", 0x248, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_stat_field_info), - glbl_err_stat_field_info -}, -{"GLBL_ERR_MASK", 0x24c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_mask_field_info), - glbl_err_mask_field_info -}, -{"GLBL_DSC_CFG", 0x250, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_cfg_field_info), - glbl_dsc_cfg_field_info -}, -{"GLBL_DSC_ERR_STS", 0x254, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_sts_field_info), - glbl_dsc_err_sts_field_info -}, -{"GLBL_DSC_ERR_MSK", 0x258, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_msk_field_info), - glbl_dsc_err_msk_field_info -}, -{"GLBL_DSC_ERR_LOG0", 0x25c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log0_field_info), - glbl_dsc_err_log0_field_info -}, -{"GLBL_DSC_ERR_LOG1", 0x260, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_err_log1_field_info), - glbl_dsc_err_log1_field_info -}, -{"GLBL_TRQ_ERR_STS", 0x264, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_sts_field_info), - glbl_trq_err_sts_field_info -}, -{"GLBL_TRQ_ERR_MSK", 0x268, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_msk_field_info), - glbl_trq_err_msk_field_info -}, -{"GLBL_TRQ_ERR_LOG", 0x26c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_trq_err_log_field_info), - glbl_trq_err_log_field_info -}, -{"GLBL_DSC_DBG_DAT0", 0x270, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat0_field_info), - glbl_dsc_dbg_dat0_field_info -}, -{"GLBL_DSC_DBG_DAT1", 0x274, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_dsc_dbg_dat1_field_info), - glbl_dsc_dbg_dat1_field_info -}, -{"TRQ_SEL_FMAP_0", 0x400, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_0_field_info), - trq_sel_fmap_0_field_info -}, -{"TRQ_SEL_FMAP_1", 0x404, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1_field_info), - trq_sel_fmap_1_field_info -}, -{"TRQ_SEL_FMAP_2", 0x408, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2_field_info), - trq_sel_fmap_2_field_info -}, -{"TRQ_SEL_FMAP_3", 0x40c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3_field_info), - trq_sel_fmap_3_field_info -}, -{"TRQ_SEL_FMAP_4", 0x410, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4_field_info), - trq_sel_fmap_4_field_info -}, -{"TRQ_SEL_FMAP_5", 0x414, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5_field_info), - trq_sel_fmap_5_field_info -}, -{"TRQ_SEL_FMAP_6", 0x418, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6_field_info), - trq_sel_fmap_6_field_info -}, -{"TRQ_SEL_FMAP_7", 0x41c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7_field_info), - trq_sel_fmap_7_field_info -}, -{"TRQ_SEL_FMAP_8", 0x420, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8_field_info), - trq_sel_fmap_8_field_info -}, -{"TRQ_SEL_FMAP_9", 0x424, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9_field_info), - trq_sel_fmap_9_field_info -}, -{"TRQ_SEL_FMAP_A", 0x428, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a_field_info), - trq_sel_fmap_a_field_info -}, -{"TRQ_SEL_FMAP_B", 0x42c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b_field_info), - trq_sel_fmap_b_field_info -}, -{"TRQ_SEL_FMAP_D", 0x430, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d_field_info), - trq_sel_fmap_d_field_info -}, -{"TRQ_SEL_FMAP_E", 0x434, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e_field_info), - trq_sel_fmap_e_field_info -}, -{"TRQ_SEL_FMAP_F", 0x438, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_f_field_info), - trq_sel_fmap_f_field_info -}, -{"TRQ_SEL_FMAP_10", 0x43c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_10_field_info), - trq_sel_fmap_10_field_info -}, -{"TRQ_SEL_FMAP_11", 0x440, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_11_field_info), - trq_sel_fmap_11_field_info -}, -{"TRQ_SEL_FMAP_12", 0x444, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_12_field_info), - trq_sel_fmap_12_field_info -}, -{"TRQ_SEL_FMAP_13", 0x448, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_13_field_info), - trq_sel_fmap_13_field_info -}, -{"TRQ_SEL_FMAP_14", 0x44c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_14_field_info), - trq_sel_fmap_14_field_info -}, -{"TRQ_SEL_FMAP_15", 0x450, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_15_field_info), - trq_sel_fmap_15_field_info -}, -{"TRQ_SEL_FMAP_16", 0x454, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_16_field_info), - trq_sel_fmap_16_field_info -}, -{"TRQ_SEL_FMAP_17", 0x458, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_17_field_info), - trq_sel_fmap_17_field_info -}, -{"TRQ_SEL_FMAP_18", 0x45c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_18_field_info), - trq_sel_fmap_18_field_info -}, -{"TRQ_SEL_FMAP_19", 0x460, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_19_field_info), - trq_sel_fmap_19_field_info -}, -{"TRQ_SEL_FMAP_1A", 0x464, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1a_field_info), - trq_sel_fmap_1a_field_info -}, -{"TRQ_SEL_FMAP_1B", 0x468, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1b_field_info), - trq_sel_fmap_1b_field_info -}, -{"TRQ_SEL_FMAP_1C", 0x46c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1c_field_info), - trq_sel_fmap_1c_field_info -}, -{"TRQ_SEL_FMAP_1D", 0x470, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1d_field_info), - trq_sel_fmap_1d_field_info -}, -{"TRQ_SEL_FMAP_1E", 0x474, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1e_field_info), - trq_sel_fmap_1e_field_info -}, -{"TRQ_SEL_FMAP_1F", 0x478, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_1f_field_info), - trq_sel_fmap_1f_field_info -}, -{"TRQ_SEL_FMAP_20", 0x47c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_20_field_info), - trq_sel_fmap_20_field_info -}, -{"TRQ_SEL_FMAP_21", 0x480, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_21_field_info), - trq_sel_fmap_21_field_info -}, -{"TRQ_SEL_FMAP_22", 0x484, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_22_field_info), - trq_sel_fmap_22_field_info -}, -{"TRQ_SEL_FMAP_23", 0x488, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_23_field_info), - trq_sel_fmap_23_field_info -}, -{"TRQ_SEL_FMAP_24", 0x48c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_24_field_info), - trq_sel_fmap_24_field_info -}, -{"TRQ_SEL_FMAP_25", 0x490, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_25_field_info), - trq_sel_fmap_25_field_info -}, -{"TRQ_SEL_FMAP_26", 0x494, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_26_field_info), - trq_sel_fmap_26_field_info -}, -{"TRQ_SEL_FMAP_27", 0x498, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_27_field_info), - trq_sel_fmap_27_field_info -}, -{"TRQ_SEL_FMAP_28", 0x49c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_28_field_info), - trq_sel_fmap_28_field_info -}, -{"TRQ_SEL_FMAP_29", 0x4a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_29_field_info), - trq_sel_fmap_29_field_info -}, -{"TRQ_SEL_FMAP_2A", 0x4a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2a_field_info), - trq_sel_fmap_2a_field_info -}, -{"TRQ_SEL_FMAP_2B", 0x4a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2b_field_info), - trq_sel_fmap_2b_field_info -}, -{"TRQ_SEL_FMAP_2C", 0x4ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2c_field_info), - trq_sel_fmap_2c_field_info -}, -{"TRQ_SEL_FMAP_2D", 0x4b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2d_field_info), - trq_sel_fmap_2d_field_info -}, -{"TRQ_SEL_FMAP_2E", 0x4b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2e_field_info), - trq_sel_fmap_2e_field_info -}, -{"TRQ_SEL_FMAP_2F", 0x4b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_2f_field_info), - trq_sel_fmap_2f_field_info -}, -{"TRQ_SEL_FMAP_30", 0x4bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_30_field_info), - trq_sel_fmap_30_field_info -}, -{"TRQ_SEL_FMAP_31", 0x4d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_31_field_info), - trq_sel_fmap_31_field_info -}, -{"TRQ_SEL_FMAP_32", 0x4d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_32_field_info), - trq_sel_fmap_32_field_info -}, -{"TRQ_SEL_FMAP_33", 0x4d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_33_field_info), - trq_sel_fmap_33_field_info -}, -{"TRQ_SEL_FMAP_34", 0x4dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_34_field_info), - trq_sel_fmap_34_field_info -}, -{"TRQ_SEL_FMAP_35", 0x4e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_35_field_info), - trq_sel_fmap_35_field_info -}, -{"TRQ_SEL_FMAP_36", 0x4e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_36_field_info), - trq_sel_fmap_36_field_info -}, -{"TRQ_SEL_FMAP_37", 0x4e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_37_field_info), - trq_sel_fmap_37_field_info -}, -{"TRQ_SEL_FMAP_38", 0x4ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_38_field_info), - trq_sel_fmap_38_field_info -}, -{"TRQ_SEL_FMAP_39", 0x4f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_39_field_info), - trq_sel_fmap_39_field_info -}, -{"TRQ_SEL_FMAP_3A", 0x4f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3a_field_info), - trq_sel_fmap_3a_field_info -}, -{"TRQ_SEL_FMAP_3B", 0x4f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3b_field_info), - trq_sel_fmap_3b_field_info -}, -{"TRQ_SEL_FMAP_3C", 0x4fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3c_field_info), - trq_sel_fmap_3c_field_info -}, -{"TRQ_SEL_FMAP_3D", 0x500, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3d_field_info), - trq_sel_fmap_3d_field_info -}, -{"TRQ_SEL_FMAP_3E", 0x504, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3e_field_info), - trq_sel_fmap_3e_field_info -}, -{"TRQ_SEL_FMAP_3F", 0x508, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_3f_field_info), - trq_sel_fmap_3f_field_info -}, -{"TRQ_SEL_FMAP_40", 0x50c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_40_field_info), - trq_sel_fmap_40_field_info -}, -{"TRQ_SEL_FMAP_41", 0x510, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_41_field_info), - trq_sel_fmap_41_field_info -}, -{"TRQ_SEL_FMAP_42", 0x514, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_42_field_info), - trq_sel_fmap_42_field_info -}, -{"TRQ_SEL_FMAP_43", 0x518, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_43_field_info), - trq_sel_fmap_43_field_info -}, -{"TRQ_SEL_FMAP_44", 0x51c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_44_field_info), - trq_sel_fmap_44_field_info -}, -{"TRQ_SEL_FMAP_45", 0x520, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_45_field_info), - trq_sel_fmap_45_field_info -}, -{"TRQ_SEL_FMAP_46", 0x524, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_46_field_info), - trq_sel_fmap_46_field_info -}, -{"TRQ_SEL_FMAP_47", 0x528, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_47_field_info), - trq_sel_fmap_47_field_info -}, -{"TRQ_SEL_FMAP_48", 0x52c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_48_field_info), - trq_sel_fmap_48_field_info -}, -{"TRQ_SEL_FMAP_49", 0x530, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_49_field_info), - trq_sel_fmap_49_field_info -}, -{"TRQ_SEL_FMAP_4A", 0x534, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4a_field_info), - trq_sel_fmap_4a_field_info -}, -{"TRQ_SEL_FMAP_4B", 0x538, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4b_field_info), - trq_sel_fmap_4b_field_info -}, -{"TRQ_SEL_FMAP_4C", 0x53c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4c_field_info), - trq_sel_fmap_4c_field_info -}, -{"TRQ_SEL_FMAP_4D", 0x540, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4d_field_info), - trq_sel_fmap_4d_field_info -}, -{"TRQ_SEL_FMAP_4E", 0x544, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4e_field_info), - trq_sel_fmap_4e_field_info -}, -{"TRQ_SEL_FMAP_4F", 0x548, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_4f_field_info), - trq_sel_fmap_4f_field_info -}, -{"TRQ_SEL_FMAP_50", 0x54c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_50_field_info), - trq_sel_fmap_50_field_info -}, -{"TRQ_SEL_FMAP_51", 0x550, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_51_field_info), - trq_sel_fmap_51_field_info -}, -{"TRQ_SEL_FMAP_52", 0x554, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_52_field_info), - trq_sel_fmap_52_field_info -}, -{"TRQ_SEL_FMAP_53", 0x558, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_53_field_info), - trq_sel_fmap_53_field_info -}, -{"TRQ_SEL_FMAP_54", 0x55c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_54_field_info), - trq_sel_fmap_54_field_info -}, -{"TRQ_SEL_FMAP_55", 0x560, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_55_field_info), - trq_sel_fmap_55_field_info -}, -{"TRQ_SEL_FMAP_56", 0x564, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_56_field_info), - trq_sel_fmap_56_field_info -}, -{"TRQ_SEL_FMAP_57", 0x568, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_57_field_info), - trq_sel_fmap_57_field_info -}, -{"TRQ_SEL_FMAP_58", 0x56c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_58_field_info), - trq_sel_fmap_58_field_info -}, -{"TRQ_SEL_FMAP_59", 0x570, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_59_field_info), - trq_sel_fmap_59_field_info -}, -{"TRQ_SEL_FMAP_5A", 0x574, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5a_field_info), - trq_sel_fmap_5a_field_info -}, -{"TRQ_SEL_FMAP_5B", 0x578, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5b_field_info), - trq_sel_fmap_5b_field_info -}, -{"TRQ_SEL_FMAP_5C", 0x57c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5c_field_info), - trq_sel_fmap_5c_field_info -}, -{"TRQ_SEL_FMAP_5D", 0x580, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5d_field_info), - trq_sel_fmap_5d_field_info -}, -{"TRQ_SEL_FMAP_5E", 0x584, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5e_field_info), - trq_sel_fmap_5e_field_info -}, -{"TRQ_SEL_FMAP_5F", 0x588, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_5f_field_info), - trq_sel_fmap_5f_field_info -}, -{"TRQ_SEL_FMAP_60", 0x58c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_60_field_info), - trq_sel_fmap_60_field_info -}, -{"TRQ_SEL_FMAP_61", 0x590, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_61_field_info), - trq_sel_fmap_61_field_info -}, -{"TRQ_SEL_FMAP_62", 0x594, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_62_field_info), - trq_sel_fmap_62_field_info -}, -{"TRQ_SEL_FMAP_63", 0x598, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_63_field_info), - trq_sel_fmap_63_field_info -}, -{"TRQ_SEL_FMAP_64", 0x59c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_64_field_info), - trq_sel_fmap_64_field_info -}, -{"TRQ_SEL_FMAP_65", 0x5a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_65_field_info), - trq_sel_fmap_65_field_info -}, -{"TRQ_SEL_FMAP_66", 0x5a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_66_field_info), - trq_sel_fmap_66_field_info -}, -{"TRQ_SEL_FMAP_67", 0x5a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_67_field_info), - trq_sel_fmap_67_field_info -}, -{"TRQ_SEL_FMAP_68", 0x5ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_68_field_info), - trq_sel_fmap_68_field_info -}, -{"TRQ_SEL_FMAP_69", 0x5b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_69_field_info), - trq_sel_fmap_69_field_info -}, -{"TRQ_SEL_FMAP_6A", 0x5b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6a_field_info), - trq_sel_fmap_6a_field_info -}, -{"TRQ_SEL_FMAP_6B", 0x5b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6b_field_info), - trq_sel_fmap_6b_field_info -}, -{"TRQ_SEL_FMAP_6C", 0x5bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6c_field_info), - trq_sel_fmap_6c_field_info -}, -{"TRQ_SEL_FMAP_6D", 0x5c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6d_field_info), - trq_sel_fmap_6d_field_info -}, -{"TRQ_SEL_FMAP_6E", 0x5c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6e_field_info), - trq_sel_fmap_6e_field_info -}, -{"TRQ_SEL_FMAP_6F", 0x5c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_6f_field_info), - trq_sel_fmap_6f_field_info -}, -{"TRQ_SEL_FMAP_70", 0x5cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_70_field_info), - trq_sel_fmap_70_field_info -}, -{"TRQ_SEL_FMAP_71", 0x5d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_71_field_info), - trq_sel_fmap_71_field_info -}, -{"TRQ_SEL_FMAP_72", 0x5d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_72_field_info), - trq_sel_fmap_72_field_info -}, -{"TRQ_SEL_FMAP_73", 0x5d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_73_field_info), - trq_sel_fmap_73_field_info -}, -{"TRQ_SEL_FMAP_74", 0x5dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_74_field_info), - trq_sel_fmap_74_field_info -}, -{"TRQ_SEL_FMAP_75", 0x5e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_75_field_info), - trq_sel_fmap_75_field_info -}, -{"TRQ_SEL_FMAP_76", 0x5e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_76_field_info), - trq_sel_fmap_76_field_info -}, -{"TRQ_SEL_FMAP_77", 0x5e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_77_field_info), - trq_sel_fmap_77_field_info -}, -{"TRQ_SEL_FMAP_78", 0x5ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_78_field_info), - trq_sel_fmap_78_field_info -}, -{"TRQ_SEL_FMAP_79", 0x5f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_79_field_info), - trq_sel_fmap_79_field_info -}, -{"TRQ_SEL_FMAP_7A", 0x5f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7a_field_info), - trq_sel_fmap_7a_field_info -}, -{"TRQ_SEL_FMAP_7B", 0x5f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7b_field_info), - trq_sel_fmap_7b_field_info -}, -{"TRQ_SEL_FMAP_7C", 0x5fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7c_field_info), - trq_sel_fmap_7c_field_info -}, -{"TRQ_SEL_FMAP_7D", 0x600, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7d_field_info), - trq_sel_fmap_7d_field_info -}, -{"TRQ_SEL_FMAP_7E", 0x604, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7e_field_info), - trq_sel_fmap_7e_field_info -}, -{"TRQ_SEL_FMAP_7F", 0x608, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_7f_field_info), - trq_sel_fmap_7f_field_info -}, -{"TRQ_SEL_FMAP_80", 0x60c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_80_field_info), - trq_sel_fmap_80_field_info -}, -{"TRQ_SEL_FMAP_81", 0x610, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_81_field_info), - trq_sel_fmap_81_field_info -}, -{"TRQ_SEL_FMAP_82", 0x614, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_82_field_info), - trq_sel_fmap_82_field_info -}, -{"TRQ_SEL_FMAP_83", 0x618, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_83_field_info), - trq_sel_fmap_83_field_info -}, -{"TRQ_SEL_FMAP_84", 0x61c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_84_field_info), - trq_sel_fmap_84_field_info -}, -{"TRQ_SEL_FMAP_85", 0x620, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_85_field_info), - trq_sel_fmap_85_field_info -}, -{"TRQ_SEL_FMAP_86", 0x624, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_86_field_info), - trq_sel_fmap_86_field_info -}, -{"TRQ_SEL_FMAP_87", 0x628, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_87_field_info), - trq_sel_fmap_87_field_info -}, -{"TRQ_SEL_FMAP_88", 0x62c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_88_field_info), - trq_sel_fmap_88_field_info -}, -{"TRQ_SEL_FMAP_89", 0x630, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_89_field_info), - trq_sel_fmap_89_field_info -}, -{"TRQ_SEL_FMAP_8A", 0x634, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8a_field_info), - trq_sel_fmap_8a_field_info -}, -{"TRQ_SEL_FMAP_8B", 0x638, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8b_field_info), - trq_sel_fmap_8b_field_info -}, -{"TRQ_SEL_FMAP_8C", 0x63c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8c_field_info), - trq_sel_fmap_8c_field_info -}, -{"TRQ_SEL_FMAP_8D", 0x640, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8d_field_info), - trq_sel_fmap_8d_field_info -}, -{"TRQ_SEL_FMAP_8E", 0x644, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8e_field_info), - trq_sel_fmap_8e_field_info -}, -{"TRQ_SEL_FMAP_8F", 0x648, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_8f_field_info), - trq_sel_fmap_8f_field_info -}, -{"TRQ_SEL_FMAP_90", 0x64c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_90_field_info), - trq_sel_fmap_90_field_info -}, -{"TRQ_SEL_FMAP_91", 0x650, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_91_field_info), - trq_sel_fmap_91_field_info -}, -{"TRQ_SEL_FMAP_92", 0x654, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_92_field_info), - trq_sel_fmap_92_field_info -}, -{"TRQ_SEL_FMAP_93", 0x658, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_93_field_info), - trq_sel_fmap_93_field_info -}, -{"TRQ_SEL_FMAP_94", 0x65c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_94_field_info), - trq_sel_fmap_94_field_info -}, -{"TRQ_SEL_FMAP_95", 0x660, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_95_field_info), - trq_sel_fmap_95_field_info -}, -{"TRQ_SEL_FMAP_96", 0x664, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_96_field_info), - trq_sel_fmap_96_field_info -}, -{"TRQ_SEL_FMAP_97", 0x668, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_97_field_info), - trq_sel_fmap_97_field_info -}, -{"TRQ_SEL_FMAP_98", 0x66c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_98_field_info), - trq_sel_fmap_98_field_info -}, -{"TRQ_SEL_FMAP_99", 0x670, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_99_field_info), - trq_sel_fmap_99_field_info -}, -{"TRQ_SEL_FMAP_9A", 0x674, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9a_field_info), - trq_sel_fmap_9a_field_info -}, -{"TRQ_SEL_FMAP_9B", 0x678, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9b_field_info), - trq_sel_fmap_9b_field_info -}, -{"TRQ_SEL_FMAP_9C", 0x67c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9c_field_info), - trq_sel_fmap_9c_field_info -}, -{"TRQ_SEL_FMAP_9D", 0x680, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9d_field_info), - trq_sel_fmap_9d_field_info -}, -{"TRQ_SEL_FMAP_9E", 0x684, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9e_field_info), - trq_sel_fmap_9e_field_info -}, -{"TRQ_SEL_FMAP_9F", 0x688, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_9f_field_info), - trq_sel_fmap_9f_field_info -}, -{"TRQ_SEL_FMAP_A0", 0x68c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a0_field_info), - trq_sel_fmap_a0_field_info -}, -{"TRQ_SEL_FMAP_A1", 0x690, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a1_field_info), - trq_sel_fmap_a1_field_info -}, -{"TRQ_SEL_FMAP_A2", 0x694, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a2_field_info), - trq_sel_fmap_a2_field_info -}, -{"TRQ_SEL_FMAP_A3", 0x698, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a3_field_info), - trq_sel_fmap_a3_field_info -}, -{"TRQ_SEL_FMAP_A4", 0x69c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a4_field_info), - trq_sel_fmap_a4_field_info -}, -{"TRQ_SEL_FMAP_A5", 0x6a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a5_field_info), - trq_sel_fmap_a5_field_info -}, -{"TRQ_SEL_FMAP_A6", 0x6a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a6_field_info), - trq_sel_fmap_a6_field_info -}, -{"TRQ_SEL_FMAP_A7", 0x6a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a7_field_info), - trq_sel_fmap_a7_field_info -}, -{"TRQ_SEL_FMAP_A8", 0x6ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a8_field_info), - trq_sel_fmap_a8_field_info -}, -{"TRQ_SEL_FMAP_A9", 0x6b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_a9_field_info), - trq_sel_fmap_a9_field_info -}, -{"TRQ_SEL_FMAP_AA", 0x6b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_aa_field_info), - trq_sel_fmap_aa_field_info -}, -{"TRQ_SEL_FMAP_AB", 0x6b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ab_field_info), - trq_sel_fmap_ab_field_info -}, -{"TRQ_SEL_FMAP_AC", 0x6bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ac_field_info), - trq_sel_fmap_ac_field_info -}, -{"TRQ_SEL_FMAP_AD", 0x6d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ad_field_info), - trq_sel_fmap_ad_field_info -}, -{"TRQ_SEL_FMAP_AE", 0x6d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ae_field_info), - trq_sel_fmap_ae_field_info -}, -{"TRQ_SEL_FMAP_AF", 0x6d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_af_field_info), - trq_sel_fmap_af_field_info -}, -{"TRQ_SEL_FMAP_B0", 0x6dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b0_field_info), - trq_sel_fmap_b0_field_info -}, -{"TRQ_SEL_FMAP_B1", 0x6e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b1_field_info), - trq_sel_fmap_b1_field_info -}, -{"TRQ_SEL_FMAP_B2", 0x6e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b2_field_info), - trq_sel_fmap_b2_field_info -}, -{"TRQ_SEL_FMAP_B3", 0x6e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b3_field_info), - trq_sel_fmap_b3_field_info -}, -{"TRQ_SEL_FMAP_B4", 0x6ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b4_field_info), - trq_sel_fmap_b4_field_info -}, -{"TRQ_SEL_FMAP_B5", 0x6f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b5_field_info), - trq_sel_fmap_b5_field_info -}, -{"TRQ_SEL_FMAP_B6", 0x6f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b6_field_info), - trq_sel_fmap_b6_field_info -}, -{"TRQ_SEL_FMAP_B7", 0x6f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b7_field_info), - trq_sel_fmap_b7_field_info -}, -{"TRQ_SEL_FMAP_B8", 0x6fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b8_field_info), - trq_sel_fmap_b8_field_info -}, -{"TRQ_SEL_FMAP_B9", 0x700, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_b9_field_info), - trq_sel_fmap_b9_field_info -}, -{"TRQ_SEL_FMAP_BA", 0x704, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ba_field_info), - trq_sel_fmap_ba_field_info -}, -{"TRQ_SEL_FMAP_BB", 0x708, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bb_field_info), - trq_sel_fmap_bb_field_info -}, -{"TRQ_SEL_FMAP_BC", 0x70c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bc_field_info), - trq_sel_fmap_bc_field_info -}, -{"TRQ_SEL_FMAP_BD", 0x710, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bd_field_info), - trq_sel_fmap_bd_field_info -}, -{"TRQ_SEL_FMAP_BE", 0x714, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_be_field_info), - trq_sel_fmap_be_field_info -}, -{"TRQ_SEL_FMAP_BF", 0x718, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_bf_field_info), - trq_sel_fmap_bf_field_info -}, -{"TRQ_SEL_FMAP_C0", 0x71c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c0_field_info), - trq_sel_fmap_c0_field_info -}, -{"TRQ_SEL_FMAP_C1", 0x720, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c1_field_info), - trq_sel_fmap_c1_field_info -}, -{"TRQ_SEL_FMAP_C2", 0x734, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c2_field_info), - trq_sel_fmap_c2_field_info -}, -{"TRQ_SEL_FMAP_C3", 0x748, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c3_field_info), - trq_sel_fmap_c3_field_info -}, -{"TRQ_SEL_FMAP_C4", 0x74c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c4_field_info), - trq_sel_fmap_c4_field_info -}, -{"TRQ_SEL_FMAP_C5", 0x750, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c5_field_info), - trq_sel_fmap_c5_field_info -}, -{"TRQ_SEL_FMAP_C6", 0x754, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c6_field_info), - trq_sel_fmap_c6_field_info -}, -{"TRQ_SEL_FMAP_C7", 0x758, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c7_field_info), - trq_sel_fmap_c7_field_info -}, -{"TRQ_SEL_FMAP_C8", 0x75c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c8_field_info), - trq_sel_fmap_c8_field_info -}, -{"TRQ_SEL_FMAP_C9", 0x760, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_c9_field_info), - trq_sel_fmap_c9_field_info -}, -{"TRQ_SEL_FMAP_CA", 0x764, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ca_field_info), - trq_sel_fmap_ca_field_info -}, -{"TRQ_SEL_FMAP_CB", 0x768, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cb_field_info), - trq_sel_fmap_cb_field_info -}, -{"TRQ_SEL_FMAP_CC", 0x76c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cc_field_info), - trq_sel_fmap_cc_field_info -}, -{"TRQ_SEL_FMAP_CD", 0x770, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cd_field_info), - trq_sel_fmap_cd_field_info -}, -{"TRQ_SEL_FMAP_CE", 0x774, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ce_field_info), - trq_sel_fmap_ce_field_info -}, -{"TRQ_SEL_FMAP_CF", 0x778, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_cf_field_info), - trq_sel_fmap_cf_field_info -}, -{"TRQ_SEL_FMAP_D0", 0x77c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d0_field_info), - trq_sel_fmap_d0_field_info -}, -{"TRQ_SEL_FMAP_D1", 0x780, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d1_field_info), - trq_sel_fmap_d1_field_info -}, -{"TRQ_SEL_FMAP_D2", 0x784, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d2_field_info), - trq_sel_fmap_d2_field_info -}, -{"TRQ_SEL_FMAP_D3", 0x788, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d3_field_info), - trq_sel_fmap_d3_field_info -}, -{"TRQ_SEL_FMAP_D4", 0x78c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d4_field_info), - trq_sel_fmap_d4_field_info -}, -{"TRQ_SEL_FMAP_D5", 0x790, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d5_field_info), - trq_sel_fmap_d5_field_info -}, -{"TRQ_SEL_FMAP_D6", 0x794, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d6_field_info), - trq_sel_fmap_d6_field_info -}, -{"TRQ_SEL_FMAP_D7", 0x798, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d7_field_info), - trq_sel_fmap_d7_field_info -}, -{"TRQ_SEL_FMAP_D8", 0x79c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d8_field_info), - trq_sel_fmap_d8_field_info -}, -{"TRQ_SEL_FMAP_D9", 0x7a0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_d9_field_info), - trq_sel_fmap_d9_field_info -}, -{"TRQ_SEL_FMAP_DA", 0x7a4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_da_field_info), - trq_sel_fmap_da_field_info -}, -{"TRQ_SEL_FMAP_DB", 0x7a8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_db_field_info), - trq_sel_fmap_db_field_info -}, -{"TRQ_SEL_FMAP_DC", 0x7ac, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_dc_field_info), - trq_sel_fmap_dc_field_info -}, -{"TRQ_SEL_FMAP_DD", 0x7b0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_dd_field_info), - trq_sel_fmap_dd_field_info -}, -{"TRQ_SEL_FMAP_DE", 0x7b4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_de_field_info), - trq_sel_fmap_de_field_info -}, -{"TRQ_SEL_FMAP_DF", 0x7b8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_df_field_info), - trq_sel_fmap_df_field_info -}, -{"TRQ_SEL_FMAP_E0", 0x7bc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e0_field_info), - trq_sel_fmap_e0_field_info -}, -{"TRQ_SEL_FMAP_E1", 0x7c0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e1_field_info), - trq_sel_fmap_e1_field_info -}, -{"TRQ_SEL_FMAP_E2", 0x7c4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e2_field_info), - trq_sel_fmap_e2_field_info -}, -{"TRQ_SEL_FMAP_E3", 0x7c8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e3_field_info), - trq_sel_fmap_e3_field_info -}, -{"TRQ_SEL_FMAP_E4", 0x7cc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e4_field_info), - trq_sel_fmap_e4_field_info -}, -{"TRQ_SEL_FMAP_E5", 0x7d0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e5_field_info), - trq_sel_fmap_e5_field_info -}, -{"TRQ_SEL_FMAP_E6", 0x7d4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e6_field_info), - trq_sel_fmap_e6_field_info -}, -{"TRQ_SEL_FMAP_E7", 0x7d8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e7_field_info), - trq_sel_fmap_e7_field_info -}, -{"TRQ_SEL_FMAP_E8", 0x7dc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e8_field_info), - trq_sel_fmap_e8_field_info -}, -{"TRQ_SEL_FMAP_E9", 0x7e0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_e9_field_info), - trq_sel_fmap_e9_field_info -}, -{"TRQ_SEL_FMAP_EA", 0x7e4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ea_field_info), - trq_sel_fmap_ea_field_info -}, -{"TRQ_SEL_FMAP_EB", 0x7e8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_eb_field_info), - trq_sel_fmap_eb_field_info -}, -{"TRQ_SEL_FMAP_EC", 0x7ec, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ec_field_info), - trq_sel_fmap_ec_field_info -}, -{"TRQ_SEL_FMAP_ED", 0x7f0, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ed_field_info), - trq_sel_fmap_ed_field_info -}, -{"TRQ_SEL_FMAP_EE", 0x7f4, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ee_field_info), - trq_sel_fmap_ee_field_info -}, -{"TRQ_SEL_FMAP_EF", 0x7f8, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_ef_field_info), - trq_sel_fmap_ef_field_info -}, -{"TRQ_SEL_FMAP_F0", 0x7fc, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(trq_sel_fmap_f0_field_info), - trq_sel_fmap_f0_field_info -}, -{"IND_CTXT_DATA_3", 0x804, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_3_field_info), - ind_ctxt_data_3_field_info -}, -{"IND_CTXT_DATA_2", 0x808, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_2_field_info), - ind_ctxt_data_2_field_info -}, -{"IND_CTXT_DATA_1", 0x80c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_1_field_info), - ind_ctxt_data_1_field_info -}, -{"IND_CTXT_DATA_0", 0x810, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_data_0_field_info), - ind_ctxt_data_0_field_info -}, -{"IND_CTXT3", 0x814, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt3_field_info), - ind_ctxt3_field_info -}, -{"IND_CTXT2", 0x818, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt2_field_info), - ind_ctxt2_field_info -}, -{"IND_CTXT1", 0x81c, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt1_field_info), - ind_ctxt1_field_info -}, -{"IND_CTXT0", 0x820, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt0_field_info), - ind_ctxt0_field_info -}, -{"IND_CTXT_CMD", 0x824, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(ind_ctxt_cmd_field_info), - ind_ctxt_cmd_field_info -}, -{"C2H_TIMER_CNT_1", 0xa00, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_1_field_info), - c2h_timer_cnt_1_field_info -}, -{"C2H_TIMER_CNT_2", 0xa04, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_2_field_info), - c2h_timer_cnt_2_field_info -}, -{"C2H_TIMER_CNT_3", 0xa08, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_3_field_info), - c2h_timer_cnt_3_field_info -}, -{"C2H_TIMER_CNT_4", 0xa0c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_4_field_info), - c2h_timer_cnt_4_field_info -}, -{"C2H_TIMER_CNT_5", 0xa10, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_5_field_info), - c2h_timer_cnt_5_field_info -}, -{"C2H_TIMER_CNT_6", 0xa14, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_6_field_info), - c2h_timer_cnt_6_field_info -}, -{"C2H_TIMER_CNT_7", 0xa18, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_7_field_info), - c2h_timer_cnt_7_field_info -}, -{"C2H_TIMER_CNT_8", 0xa1c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_8_field_info), - c2h_timer_cnt_8_field_info -}, -{"C2H_TIMER_CNT_9", 0xa20, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_9_field_info), - c2h_timer_cnt_9_field_info -}, -{"C2H_TIMER_CNT_A", 0xa24, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_a_field_info), - c2h_timer_cnt_a_field_info -}, -{"C2H_TIMER_CNT_B", 0xa28, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_b_field_info), - c2h_timer_cnt_b_field_info -}, -{"C2H_TIMER_CNT_C", 0xa2c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_c_field_info), - c2h_timer_cnt_c_field_info -}, -{"C2H_TIMER_CNT_D", 0xa30, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_d_field_info), - c2h_timer_cnt_d_field_info -}, -{"C2H_TIMER_CNT_E", 0xa34, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_e_field_info), - c2h_timer_cnt_e_field_info -}, -{"C2H_TIMER_CNT_F", 0xa38, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_f_field_info), - c2h_timer_cnt_f_field_info -}, -{"C2H_TIMER_CNT_10", 0xa3c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_timer_cnt_10_field_info), - c2h_timer_cnt_10_field_info -}, -{"C2H_CNT_TH_1", 0xa40, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_1_field_info), - c2h_cnt_th_1_field_info -}, -{"C2H_CNT_TH_2", 0xa44, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_2_field_info), - c2h_cnt_th_2_field_info -}, -{"C2H_CNT_TH_3", 0xa48, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_3_field_info), - c2h_cnt_th_3_field_info -}, -{"C2H_CNT_TH_4", 0xa4c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_4_field_info), - c2h_cnt_th_4_field_info -}, -{"C2H_CNT_TH_5", 0xa50, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_5_field_info), - c2h_cnt_th_5_field_info -}, -{"C2H_CNT_TH_6", 0xa54, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_6_field_info), - c2h_cnt_th_6_field_info -}, -{"C2H_CNT_TH_7", 0xa58, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_7_field_info), - c2h_cnt_th_7_field_info -}, -{"C2H_CNT_TH_8", 0xa5c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_8_field_info), - c2h_cnt_th_8_field_info -}, -{"C2H_CNT_TH_9", 0xa60, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_9_field_info), - c2h_cnt_th_9_field_info -}, -{"C2H_CNT_TH_A", 0xa64, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_a_field_info), - c2h_cnt_th_a_field_info -}, -{"C2H_CNT_TH_B", 0xa68, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_b_field_info), - c2h_cnt_th_b_field_info -}, -{"C2H_CNT_TH_C", 0xa6c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_c_field_info), - c2h_cnt_th_c_field_info -}, -{"C2H_CNT_TH_D", 0xa70, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_d_field_info), - c2h_cnt_th_d_field_info -}, -{"C2H_CNT_TH_E", 0xa74, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_e_field_info), - c2h_cnt_th_e_field_info -}, -{"C2H_CNT_TH_F", 0xa78, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_f_field_info), - c2h_cnt_th_f_field_info -}, -{"C2H_CNT_TH_10", 0xa7c, - 1, 0, 0, 0, - 0, QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_cnt_th_10_field_info), - c2h_cnt_th_10_field_info -}, -{"C2H_QID2VEC_MAP_QID", 0xa80, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_qid2vec_map_qid_field_info), - c2h_qid2vec_map_qid_field_info -}, -{"C2H_QID2VEC_MAP", 0xa84, - 1, 0, 0, 0, - 0, QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_qid2vec_map_field_info), - c2h_qid2vec_map_field_info -}, -{"C2H_STAT_S_AXIS_C2H_ACCEPTED", 0xa88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_c2h_accepted_field_info), - c2h_stat_s_axis_c2h_accepted_field_info -}, -{"C2H_STAT_S_AXIS_WRB_ACCEPTED", 0xa8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_s_axis_wrb_accepted_field_info), - c2h_stat_s_axis_wrb_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_PKT_ACCEPTED", 0xa90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_pkt_accepted_field_info), - c2h_stat_desc_rsp_pkt_accepted_field_info -}, -{"C2H_STAT_AXIS_PKG_CMP", 0xa94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_axis_pkg_cmp_field_info), - c2h_stat_axis_pkg_cmp_field_info -}, -{"C2H_STAT_DESC_RSP_ACCEPTED", 0xa98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_accepted_field_info), - c2h_stat_desc_rsp_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_CMP", 0xa9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_rsp_cmp_field_info), - c2h_stat_desc_rsp_cmp_field_info -}, -{"C2H_STAT_WRQ_OUT", 0xaa0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wrq_out_field_info), - c2h_stat_wrq_out_field_info -}, -{"C2H_STAT_WPL_REN_ACCEPTED", 0xaa4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wpl_ren_accepted_field_info), - c2h_stat_wpl_ren_accepted_field_info -}, -{"C2H_STAT_TOTAL_WRQ_LEN", 0xaa8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wrq_len_field_info), - c2h_stat_total_wrq_len_field_info -}, -{"C2H_STAT_TOTAL_WPL_LEN", 0xaac, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_total_wpl_len_field_info), - c2h_stat_total_wpl_len_field_info -}, -{"C2H_BUF_SZ_0", 0xab0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_0_field_info), - c2h_buf_sz_0_field_info -}, -{"C2H_BUF_SZ_1", 0xab4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_1_field_info), - c2h_buf_sz_1_field_info -}, -{"C2H_BUF_SZ_2", 0xab8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_2_field_info), - c2h_buf_sz_2_field_info -}, -{"C2H_BUF_SZ_3", 0xabc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_3_field_info), - c2h_buf_sz_3_field_info -}, -{"C2H_BUF_SZ_4", 0xac0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_4_field_info), - c2h_buf_sz_4_field_info -}, -{"C2H_BUF_SZ_5", 0xac4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_5_field_info), - c2h_buf_sz_5_field_info -}, -{"C2H_BUF_SZ_7", 0xac8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_7_field_info), - c2h_buf_sz_7_field_info -}, -{"C2H_BUF_SZ_8", 0xacc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_8_field_info), - c2h_buf_sz_8_field_info -}, -{"C2H_BUF_SZ_9", 0xad0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_9_field_info), - c2h_buf_sz_9_field_info -}, -{"C2H_BUF_SZ_10", 0xad4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_10_field_info), - c2h_buf_sz_10_field_info -}, -{"C2H_BUF_SZ_11", 0xad8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_11_field_info), - c2h_buf_sz_11_field_info -}, -{"C2H_BUF_SZ_12", 0xae0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_12_field_info), - c2h_buf_sz_12_field_info -}, -{"C2H_BUF_SZ_13", 0xae4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_13_field_info), - c2h_buf_sz_13_field_info -}, -{"C2H_BUF_SZ_14", 0xae8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_14_field_info), - c2h_buf_sz_14_field_info -}, -{"C2H_BUF_SZ_15", 0xaec, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_buf_sz_15_field_info), - c2h_buf_sz_15_field_info -}, -{"C2H_ERR_STAT", 0xaf0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_stat_field_info), - c2h_err_stat_field_info -}, -{"C2H_ERR_MASK", 0xaf4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_err_mask_field_info), - c2h_err_mask_field_info -}, -{"C2H_FATAL_ERR_STAT", 0xaf8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_stat_field_info), - c2h_fatal_err_stat_field_info -}, -{"C2H_FATAL_ERR_MASK", 0xafc, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_mask_field_info), - c2h_fatal_err_mask_field_info -}, -{"C2H_FATAL_ERR_ENABLE", 0xb00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_fatal_err_enable_field_info), - c2h_fatal_err_enable_field_info -}, -{"GLBL_ERR_INT", 0xb04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(glbl_err_int_field_info), - glbl_err_int_field_info -}, -{"C2H_PFCH_CFG", 0xb08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pfch_cfg_field_info), - c2h_pfch_cfg_field_info -}, -{"C2H_INT_TIMER_TICK", 0xb0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_timer_tick_field_info), - c2h_int_timer_tick_field_info -}, -{"C2H_STAT_DESC_RSP_DROP_ACCEPTED", 0xb10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_drop_accepted_field_info), - c2h_stat_desc_rsp_drop_accepted_field_info -}, -{"C2H_STAT_DESC_RSP_ERR_ACCEPTED", 0xb14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_stat_desc_rsp_err_accepted_field_info), - c2h_stat_desc_rsp_err_accepted_field_info -}, -{"C2H_STAT_DESC_REQ", 0xb18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_desc_req_field_info), - c2h_stat_desc_req_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_0", 0xb1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_0_field_info), - c2h_stat_dbg_dma_eng_0_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_1", 0xb20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_1_field_info), - c2h_stat_dbg_dma_eng_1_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_2", 0xb24, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_2_field_info), - c2h_stat_dbg_dma_eng_2_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_3", 0xb28, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_3_field_info), - c2h_stat_dbg_dma_eng_3_field_info -}, -{"C2H_DBG_PFCH_ERR_CTXT", 0xb2c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_err_ctxt_field_info), - c2h_dbg_pfch_err_ctxt_field_info -}, -{"C2H_FIRST_ERR_QID", 0xb30, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_first_err_qid_field_info), - c2h_first_err_qid_field_info -}, -{"STAT_NUM_WRB_IN", 0xb34, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_in_field_info), - stat_num_wrb_in_field_info -}, -{"STAT_NUM_WRB_OUT", 0xb38, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_out_field_info), - stat_num_wrb_out_field_info -}, -{"STAT_NUM_WRB_DRP", 0xb3c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_wrb_drp_field_info), - stat_num_wrb_drp_field_info -}, -{"STAT_NUM_STAT_DESC_OUT", 0xb40, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_stat_desc_out_field_info), - stat_num_stat_desc_out_field_info -}, -{"STAT_NUM_DSC_CRDT_SENT", 0xb44, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_dsc_crdt_sent_field_info), - stat_num_dsc_crdt_sent_field_info -}, -{"STAT_NUM_FCH_DSC_RCVD", 0xb48, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_fch_dsc_rcvd_field_info), - stat_num_fch_dsc_rcvd_field_info -}, -{"STAT_NUM_BYP_DSC_RCVD", 0xb4c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(stat_num_byp_dsc_rcvd_field_info), - stat_num_byp_dsc_rcvd_field_info -}, -{"C2H_WRB_COAL_CFG", 0xb50, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_wrb_coal_cfg_field_info), - c2h_wrb_coal_cfg_field_info -}, -{"C2H_INTR_H2C_REQ", 0xb54, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_h2c_req_field_info), - c2h_intr_h2c_req_field_info -}, -{"C2H_INTR_C2H_MM_REQ", 0xb58, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_mm_req_field_info), - c2h_intr_c2h_mm_req_field_info -}, -{"C2H_INTR_ERR_INT_REQ", 0xb5c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_err_int_req_field_info), - c2h_intr_err_int_req_field_info -}, -{"C2H_INTR_C2H_ST_REQ", 0xb60, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_req_field_info), - c2h_intr_c2h_st_req_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK", 0xb64, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_ack_field_info), - c2h_intr_h2c_err_c2h_mm_msix_ack_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL", 0xb68, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_fail_field_info), - c2h_intr_h2c_err_c2h_mm_msix_fail_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX", 0xb6c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info), - c2h_intr_h2c_err_c2h_mm_msix_no_msix_field_info -}, -{"C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL", 0xb70, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info), - c2h_intr_h2c_err_c2h_mm_ctxt_inval_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_ACK", 0xb74, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_ack_field_info), - c2h_intr_c2h_st_msix_ack_field_info -}, -{"C2H_INTR_C2H_ST_MSIX_FAIL", 0xb78, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(c2h_intr_c2h_st_msix_fail_field_info), - c2h_intr_c2h_st_msix_fail_field_info -}, -{"C2H_INTR_C2H_ST_NO_MSIX", 0xb7c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_no_msix_field_info), - c2h_intr_c2h_st_no_msix_field_info -}, -{"C2H_INTR_C2H_ST_CTXT_INVAL", 0xb80, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_intr_c2h_st_ctxt_inval_field_info), - c2h_intr_c2h_st_ctxt_inval_field_info -}, -{"C2H_STAT_WR_CMP", 0xb84, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_wr_cmp_field_info), - c2h_stat_wr_cmp_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_4", 0xb88, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_4_field_info), - c2h_stat_dbg_dma_eng_4_field_info -}, -{"C2H_STAT_DBG_DMA_ENG_5", 0xb8c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_dbg_dma_eng_5_field_info), - c2h_stat_dbg_dma_eng_5_field_info -}, -{"C2H_DBG_PFCH_QID", 0xb90, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_qid_field_info), - c2h_dbg_pfch_qid_field_info -}, -{"C2H_DBG_PFCH", 0xb94, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_dbg_pfch_field_info), - c2h_dbg_pfch_field_info -}, -{"C2H_INT_DBG", 0xb98, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_int_dbg_field_info), - c2h_int_dbg_field_info -}, -{"C2H_STAT_IMM_ACCEPTED", 0xb9c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_imm_accepted_field_info), - c2h_stat_imm_accepted_field_info -}, -{"C2H_STAT_MARKER_ACCEPTED", 0xba0, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_marker_accepted_field_info), - c2h_stat_marker_accepted_field_info -}, -{"C2H_STAT_DISABLE_CMP_ACCEPTED", 0xba4, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_stat_disable_cmp_accepted_field_info), - c2h_stat_disable_cmp_accepted_field_info -}, -{"C2H_PLD_FIFO_CRDT_CNT", 0xba8, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_pld_fifo_crdt_cnt_field_info), - c2h_pld_fifo_crdt_cnt_field_info -}, -{"H2C_ERR_STAT", 0xe00, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_stat_field_info), - h2c_err_stat_field_info -}, -{"H2C_ERR_MASK", 0xe04, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_err_mask_field_info), - h2c_err_mask_field_info -}, -{"H2C_FIRST_ERR_QID", 0xe08, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_first_err_qid_field_info), - h2c_first_err_qid_field_info -}, -{"H2C_DBG_REG0", 0xe0c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg0_field_info), - h2c_dbg_reg0_field_info -}, -{"H2C_DBG_REG1", 0xe10, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg1_field_info), - h2c_dbg_reg1_field_info -}, -{"H2C_DBG_REG2", 0xe14, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg2_field_info), - h2c_dbg_reg2_field_info -}, -{"H2C_DBG_REG3", 0xe18, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg3_field_info), - h2c_dbg_reg3_field_info -}, -{"H2C_DBG_REG4", 0xe1c, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_dbg_reg4_field_info), - h2c_dbg_reg4_field_info -}, -{"H2C_FATAL_ERR_EN", 0xe20, - 1, 0, 0, 0, - 0, QDMA_ST_MODE, QDMA_REG_READ_PF_VF, - ARRAY_SIZE(h2c_fatal_err_en_field_info), - h2c_fatal_err_en_field_info -}, -{"C2H_CHANNEL_CTL", 0x1004, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_ctl_field_info), - c2h_channel_ctl_field_info -}, -{"C2H_CHANNEL_CTL_1", 0x1008, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_ctl_1_field_info), - c2h_channel_ctl_1_field_info -}, -{"C2H_MM_STATUS", 0x1040, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_status_field_info), - c2h_mm_status_field_info -}, -{"C2H_CHANNEL_CMPL_DESC_CNT", 0x1048, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_channel_cmpl_desc_cnt_field_info), - c2h_channel_cmpl_desc_cnt_field_info -}, -{"C2H_MM_ERR_CODE_ENABLE_MASK", 0x1054, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_enable_mask_field_info), - c2h_mm_err_code_enable_mask_field_info -}, -{"C2H_MM_ERR_CODE", 0x1058, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_code_field_info), - c2h_mm_err_code_field_info -}, -{"C2H_MM_ERR_INFO", 0x105c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_err_info_field_info), - c2h_mm_err_info_field_info -}, -{"C2H_MM_PERF_MON_CTL", 0x10c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_ctl_field_info), - c2h_mm_perf_mon_ctl_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT0", 0x10c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt0_field_info), - c2h_mm_perf_mon_cycle_cnt0_field_info -}, -{"C2H_MM_PERF_MON_CYCLE_CNT1", 0x10c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_cycle_cnt1_field_info), - c2h_mm_perf_mon_cycle_cnt1_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT0", 0x10cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt0_field_info), - c2h_mm_perf_mon_data_cnt0_field_info -}, -{"C2H_MM_PERF_MON_DATA_CNT1", 0x10d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_perf_mon_data_cnt1_field_info), - c2h_mm_perf_mon_data_cnt1_field_info -}, -{"C2H_MM_DBG", 0x10e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(c2h_mm_dbg_field_info), - c2h_mm_dbg_field_info -}, -{"H2C_CHANNEL_CTL", 0x1204, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_field_info), - h2c_channel_ctl_field_info -}, -{"H2C_CHANNEL_CTL_1", 0x1208, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_1_field_info), - h2c_channel_ctl_1_field_info -}, -{"H2C_CHANNEL_CTL_2", 0x120c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_ctl_2_field_info), - h2c_channel_ctl_2_field_info -}, -{"H2C_MM_STATUS", 0x1240, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_status_field_info), - h2c_mm_status_field_info -}, -{"H2C_CHANNEL_CMPL_DESC_CNT", 0x1248, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_channel_cmpl_desc_cnt_field_info), - h2c_channel_cmpl_desc_cnt_field_info -}, -{"H2C_MM_ERR_CODE_ENABLE_MASK", 0x1254, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_enable_mask_field_info), - h2c_mm_err_code_enable_mask_field_info -}, -{"H2C_MM_ERR_CODE", 0x1258, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_code_field_info), - h2c_mm_err_code_field_info -}, -{"H2C_MM_ERR_INFO", 0x125c, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_err_info_field_info), - h2c_mm_err_info_field_info -}, -{"H2C_MM_PERF_MON_CTL", 0x12c0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_ctl_field_info), - h2c_mm_perf_mon_ctl_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT0", 0x12c4, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt0_field_info), - h2c_mm_perf_mon_cycle_cnt0_field_info -}, -{"H2C_MM_PERF_MON_CYCLE_CNT1", 0x12c8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_cycle_cnt1_field_info), - h2c_mm_perf_mon_cycle_cnt1_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT0", 0x12cc, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt0_field_info), - h2c_mm_perf_mon_data_cnt0_field_info -}, -{"H2C_MM_PERF_MON_DATA_CNT1", 0x12d0, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_perf_mon_data_cnt1_field_info), - h2c_mm_perf_mon_data_cnt1_field_info -}, -{"H2C_MM_DBG", 0x12e8, - 1, 0, 0, 0, - 0, QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(h2c_mm_dbg_field_info), - h2c_mm_dbg_field_info -}, -{"FUNC_STATUS_REG", 0x2400, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_status_reg_field_info), - func_status_reg_field_info -}, -{"FUNC_CMD_REG", 0x2404, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_cmd_reg_field_info), - func_cmd_reg_field_info -}, -{"FUNC_INTERRUPT_VECTOR_REG", 0x2408, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_interrupt_vector_reg_field_info), - func_interrupt_vector_reg_field_info -}, -{"TARGET_FUNC_REG", 0x240c, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(target_func_reg_field_info), - target_func_reg_field_info -}, -{"FUNC_INTERRUPT_CTL_REG", 0x2410, - 1, 0, 0, 0, - 0, QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, - ARRAY_SIZE(func_interrupt_ctl_reg_field_info), - func_interrupt_ctl_reg_field_info -}, - -}; - -uint32_t qdma_s80_hard_config_num_regs_get(void) -{ - return (sizeof(qdma_s80_hard_config_regs)/ - sizeof(qdma_s80_hard_config_regs[0])); -} - -struct xreg_info *qdma_s80_hard_config_regs_get(void) -{ - return qdma_s80_hard_config_regs; -} - diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_access.c b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_access.c deleted file mode 100644 index 01b389e..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_access.c +++ /dev/null @@ -1,6151 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - - -#include "qdma_soft_access.h" -#include "qdma_soft_reg.h" -#include "qdma_reg_dump.h" - - -#ifdef ENABLE_WPP_TRACING -#include "qdma_soft_access.tmh" -#endif - -/** QDMA Context array size */ -#define QDMA_FMAP_NUM_WORDS 2 -#define QDMA_SW_CONTEXT_NUM_WORDS 5 -#define QDMA_PFETCH_CONTEXT_NUM_WORDS 2 -#define QDMA_CMPT_CONTEXT_NUM_WORDS 5 -#define QDMA_HW_CONTEXT_NUM_WORDS 2 -#define QDMA_CR_CONTEXT_NUM_WORDS 1 -#define QDMA_IND_INTR_CONTEXT_NUM_WORDS 3 -#define QDMA_REG_IND_CTXT_REG_COUNT 8 - - -#define QDMA_REG_GROUP_1_START_ADDR 0x000 -#define QDMA_REG_GROUP_2_START_ADDR 0x400 -#define QDMA_REG_GROUP_3_START_ADDR 0xB00 -#define QDMA_REG_GROUP_4_START_ADDR 0x1014 - -static void qdma_hw_st_h2c_err_process(void *dev_hndl); -static void qdma_hw_st_c2h_err_process(void *dev_hndl); -static void qdma_hw_desc_err_process(void *dev_hndl); -static void qdma_hw_trq_err_process(void *dev_hndl); -static void qdma_hw_ram_sbe_err_process(void *dev_hndl); -static void qdma_hw_ram_dbe_err_process(void *dev_hndl); - -static struct xreg_info qdma_config_regs[] = { - - /* QDMA_TRQ_SEL_GLBL1 (0x00000) */ - {"CFG_BLOCK_ID", - 0x00, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_BUSDEV", - 0x04, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_MAX_PL_SZ", - 0x08, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_MAX_RDRQ_SZ", - 0x0C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_SYS_ID", - 0x10, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_MSI_EN", - 0x14, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_DATA_WIDTH", - 0x18, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_PCIE_CTRL", - 0x1C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_AXI_USR_MAX_PL_SZ", - 0x40, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_AXI_USR_MAX_RDRQ_SZ", - 0x44, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_MISC_CTRL", - 0x4C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"CFG_SCRATCH_REG", - 0x80, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_SBE_MSK_A", - 0xF0, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_SBE_STS_A", - 0xF4, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_DBE_MSK_A", - 0xF8, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_RAM_DBE_STS_A", - 0xFC, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_GLBL2 (0x00100) */ - {"GLBL2_ID", - 0x100, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_BL_INT", - 0x104, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_VF_BL_INT", - 0x108, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_BL_EXT", - 0x10C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PF_VF_BL_EXT", - 0x110, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_INST", - 0x114, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_QDMA", - 0x118, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_CHNL_STRM", - 0x11C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_QDMA_CAP", - 0x120, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_PASID_CAP", - 0x128, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_FUNC_RET", - 0x12C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_SYS_ID", - 0x130, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_MISC_CAP", - 0x134, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_PCIE_RQ", - 0x1B8, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_AXIMM_WR", - 0x1C0, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL2_DBG_AXIMM_RD", - 0x1C8, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_GLBL (0x00200) */ - {"GLBL_RNGSZ", - 0x204, 16, 1, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"GLBL_ERR_STAT", - 0x248, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_ERR_MASK", - 0x24C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_CFG", - 0x250, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_STS", - 0x254, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_MSK", - 0x258, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_LOG", - 0x25C, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_STS", - 0x264, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_MSK", - 0x268, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_TRQ_ERR_LOG", - 0x26C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_DBG_DAT", - 0x270, 2, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_DSC_ERR_LOG2", - 0x27C, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_INTERRUPT_CFG", - 0x288, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - - /* QDMA_TRQ_SEL_FMAP (0x00400 - 0x7FC) */ - /* TODO: max 256, display 4 for now */ - {"TRQ_SEL_FMAP", - 0x400, 4, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_IND (0x00800) */ - {"IND_CTXT_DATA", - 0x804, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"IND_CTXT_MASK", - 0x824, 8, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"IND_CTXT_CMD", - 0x844, 1, 0, 0, 0, 0, - QDMA_MM_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_C2H (0x00A00) */ - {"C2H_TIMER_CNT", - 0xA00, 16, 0, 0, 0, 0, - QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CNT_THRESH", - 0xA40, 16, 0, 0, 0, 0, - QDMA_COMPLETION_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_S_AXIS_C2H_ACCEPTED", - 0xA88, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_S_AXIS_CMPT_ACCEPTED", - 0xA8C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_PKT_ACCEPTED", - 0xA90, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_AXIS_PKG_CMP", - 0xA94, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_ACCEPTED", - 0xA98, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_CMP", - 0xA9C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WRQ_OUT", - 0xAA0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WPL_REN_ACCEPTED", - 0xAA4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_TOTAL_WRQ_LEN", - 0xAA8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_TOTAL_WPL_LEN", - 0xAAC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_BUF_SZ", - 0xAB0, 16, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_ERR_STAT", - 0xAF0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_ERR_MASK", - 0xAF4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_STAT", - 0xAF8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_MASK", - 0xAFC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_FATAL_ERR_ENABLE", - 0xB00, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"GLBL_ERR_INT", - 0xB04, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_PFCH_CFG", - 0xB08, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INT_TIMER_TICK", - 0xB0C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DESC_RSP_DROP_ACCEPTED", - 0xB10, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_RSP_ERR_ACCEPTED", - 0xB14, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_STAT_DESC_REQ", - 0xB18, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG", - 0xB1C, 4, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH_ERR_CTXT", - 0xB2C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_FIRST_ERR_QID", - 0xB30, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"STAT_NUM_CMPT_IN", - 0xB34, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_CMPT_OUT", - 0xB38, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_CMPT_DRP", - 0xB3C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_STAT_DESC_OUT", - 0xB40, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_DSC_CRDT_SENT", - 0xB44, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_FCH_DSC_RCVD", - 0xB48, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"STAT_NUM_BYP_DSC_RCVD", - 0xB4C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CMPT_COAL_CFG", - 0xB50, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_REQ", - 0xB54, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_MM_REQ", - 0xB58, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_ERR_INT_REQ", - 0xB5C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_REQ", - 0xB60, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_MSIX_ACK", - 0xB64, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_MSIX_FAIL", - 0xB68, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_NO_MSIX", - 0xB6C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_H2C_ERR_MM_CTXT_INVAL", - 0xB70, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_C2H_ST_MSIX_ACK", - 0xB74, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_MSIX_FAIL", - 0xB78, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"C2H_INTR_C2H_ST_NO_MSIX", - 0xB7C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_C2H_ST_CTXT_INVAL", - 0xB80, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_WR_CMP", - 0xB84, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG_4", - 0xB88, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DEBUG_DMA_ENG_5", - 0xB8C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH_QID", - 0xB90, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DBG_PFCH", - 0xB94, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INT_DEBUG", - 0xB98, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_IMM_ACCEPTED", - 0xB9C, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_MARKER_ACCEPTED", - 0xBA0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_STAT_DISABLE_CMP_ACCEPTED", - 0xBA4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_C2H_PAYLOAD_FIFO_CRDT_CNT", - 0xBA8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_DYN_REQ", - 0xBAC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_INTR_DYN_MSIX", - 0xBB0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_LEN_MISMATCH", - 0xBB4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_DESC_RSP_LEN", - 0xBB8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_QID_FIFO_LEN", - 0xBBC, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_DROP_PAYLOAD_CNT", - 0xBC0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"QDMA_C2H_CMPT_FORMAT", - 0xBC4, 7, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_PFCH_CACHE_DEPTH", - 0xBE0, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_CMPT_COAL_BUF_DEPTH", - 0xBE4, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_PFCH_CRDT", - 0xBE8, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_H2C(0x00E00) Register Space*/ - {"H2C_ERR_STAT", - 0xE00, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_ERR_MASK", - 0xE04, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_FIRST_ERR_QID", - 0xE08, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_VF, 0, NULL}, - {"H2C_DBG_REG", - 0xE0C, 5, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_FATAL_ERR_EN", - 0xE20, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_REQ_THROT", - 0xE24, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_ALN_DBG_REG0", - 0xE28, 1, 0, 0, 0, 0, - QDMA_ST_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_C2H_MM (0x1000) */ - {"C2H_MM_CONTROL", - 0x1004, 3, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_STATUS", - 0x1040, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_CMPL_DSC_CNT", - 0x1048, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_CODE_EN_MASK", - 0x1054, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_CODE", - 0x1058, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_ERR_INFO", - 0x105C, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_CTRL", - 0x10C0, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_CY_CNT", - 0x10C4, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_PERF_MON_DATA_CNT", - 0x10CC, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"C2H_MM_DBG_INFO", - 0x10E8, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_TRQ_SEL_H2C_MM (0x1200)*/ - {"H2C_MM_CONTROL", - 0x1204, 3, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_STATUS", - 0x1240, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_CMPL_DSC_CNT", - 0x1248, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_CODE_EN_MASK", - 0x1254, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_CODE", - 0x1258, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_ERR_INFO", - 0x125C, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_CTRL", - 0x12C0, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_CY_CNT", - 0x12C4, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_PERF_MON_DATA_CNT", - 0x12CC, 2, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_DBG_INFO", - 0x12E8, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"H2C_MM_REQ_THROT", - 0x12EC, 1, 0, 0, 0, 0, - QDMA_MM_MODE, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - /* QDMA_PF_MAILBOX (0x2400) */ - {"FUNC_STATUS", - 0x2400, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FUNC_CMD", - 0x2404, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FUNC_INTR_VEC", - 0x2408, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"TARGET_FUNC", - 0x240C, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"INTR_CTRL", - 0x2410, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"PF_ACK", - 0x2420, 8, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"FLR_CTRL_STATUS", - 0x2500, 1, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"MSG_IN", - 0x2800, 32, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - {"MSG_OUT", - 0x2C00, 32, 0, 0, 0, 0, - QDMA_MAILBOX, QDMA_REG_READ_PF_ONLY, 0, NULL}, - - {"", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL } -}; - - -static struct qdma_hw_err_info qdma_err_info[QDMA_ERRS_ALL] = { - /* Descriptor errors */ - { - QDMA_DSC_ERR_POISON, - "Poison error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_POISON_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_UR_CA, - "Unsupported request or completer aborted error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_UR_CA_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_PARAM, - "Parameter mismatch error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_PARAM_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_ADDR, - "Address mismatch error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_ADDR_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_TAG, - "Unexpected tag error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_TAG_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_FLR, - "FLR error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_FLR_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_TIMEOUT, - "Timed out error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_TIMEOUT_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DAT_POISON, - "Poison data error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DAT_POISON_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_FLR_CANCEL, - "Descriptor fetch cancelled due to FLR error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_FLR_CANCEL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DMA, - "DMA engine error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DMA_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DSC, - "Invalid PIDX update error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DSC_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_RQ_CANCEL, - "Descriptor fetch cancelled due to disable register status error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_RQ_CANCEL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_DBE, - "UNC_ERR_RAM_DBE error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_DBE_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_SBE, - "UNC_ERR_RAM_SBE error", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_SBE_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - { - QDMA_DSC_ERR_ALL, - "All Descriptor errors", - QDMA_OFFSET_GLBL_DSC_ERR_MASK, - QDMA_OFFSET_GLBL_DSC_ERR_STAT, - QDMA_GLBL_DSC_ERR_ALL_MASK, - QDMA_GLBL_ERR_DSC_MASK, - &qdma_hw_desc_err_process - }, - - /* TRQ errors */ - { - QDMA_TRQ_ERR_UNMAPPED, - "Access targeted unmapped register space error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_UNMAPPED_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_QID_RANGE, - "Qid range error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_QID_RANGE_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_VF_ACCESS, - "Invalid VF access error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_VF_ACCESS_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_TCP_TIMEOUT, - "Timeout on request error", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_TCP_TIMEOUT_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - { - QDMA_TRQ_ERR_ALL, - "All TRQ errors", - QDMA_OFFSET_GLBL_TRQ_ERR_MASK, - QDMA_OFFSET_GLBL_TRQ_ERR_STAT, - QDMA_GLBL_TRQ_ERR_ALL_MASK, - QDMA_GLBL_ERR_TRQ_MASK, - &qdma_hw_trq_err_process - }, - - /* C2H Errors*/ - { - QDMA_ST_C2H_ERR_MTY_MISMATCH, - "MTY mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_MTY_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_LEN_MISMATCH, - "Packet length mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_LEN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_QID_MISMATCH, - "Qid mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_QID_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_DESC_RSP_ERR, - "Descriptor error bit set", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_DESC_RSP_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - "Data parity error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ENG_WPL_DATA_PAR_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_MSI_INT_FAIL, - "MSI got a fail response error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_MSI_INT_FAIL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ERR_DESC_CNT, - "Descriptor count error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ERR_DESC_CNT_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - "Port id in packet and pfetch ctxt mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_PORTID_CTXT_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - "Port id in packet and bypass interface mismatch error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_PORTID_BYP_IN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - "Writeback on invalid queue error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_INV_Q_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - "Completion queue gets full error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_QFULL_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - "Bad CIDX update by the software error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_CIDX_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - "C2H completion Parity error", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_CMPT_PRTY_ERR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_C2H_ERR_ALL, - "All C2h errors", - QDMA_OFFSET_C2H_ERR_MASK, - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_C2H_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - - /* C2H fatal errors */ - { - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - "Fatal MTY mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_MTY_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_LEN_MISMATCH, - "Fatal Len mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_LEN_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_QID_MISMATCH, - "Fatal Qid mismatch error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_QID_MISMATCH_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_TIMER_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PFCH_II_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_CMPT_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PFCH_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_INT_CTXT_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_TUSER_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_QID_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_WPL_DATA_PAR, - "RAM double bit fatal error", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_WPL_DATA_PAR_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - { - QDMA_ST_FATAL_ERR_ALL, - "All fatal errors", - QDMA_OFFSET_C2H_FATAL_ERR_MASK, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_C2H_FATAL_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_C2H_MASK, - &qdma_hw_st_c2h_err_process - }, - - /* H2C St errors */ - { - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - "Zero length descriptor error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_ZERO_LEN_DESC_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_CSI_MOP, - "Non EOP descriptor received error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_CSI_MOP_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_NO_DMA_DSC, - "No DMA descriptor received error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_NO_DMA_DSC_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_SBE, - "Single bit error detected on H2C-ST data error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_SBE_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_DBE, - "Double bit error detected on H2C-ST data error", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_DBE_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - { - QDMA_ST_H2C_ERR_ALL, - "All H2C errors", - QDMA_OFFSET_H2C_ERR_MASK, - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_H2C_ERR_ALL_MASK, - QDMA_GLBL_ERR_ST_H2C_MASK, - &qdma_hw_st_h2c_err_process - }, - - /* SBE errors */ - { - QDMA_SBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_MI_H2C0_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_MI_C2H0_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_C2H_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_C2H_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_FUNC_MAP, - "Function map RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_FUNC_MAP_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_HW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CRD_RCV_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_SW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CPLI_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DSC_CPLD_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PASID_CTXT_RAM, - "PASID configuration RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PASID_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_TIMER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_QID_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_TUSER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_WRB_COAL_DATA_RAM, - "Completion Coalescing RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_WRB_COAL_DATA_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_INT_QID2VEC_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_INT_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PFCH_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_WRB_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_PFCH_LL_RAM_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_H2C_PEND_FIFO, - "H2C ST pending fifo RAM single bit ECC error", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_H2C_PEND_FIFO_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - { - QDMA_SBE_ERR_ALL, - "All SBE errors", - QDMA_OFFSET_RAM_SBE_MASK, - QDMA_OFFSET_RAM_SBE_STAT, - QDMA_SBE_ERR_ALL_MASK, - QDMA_GLBL_ERR_RAM_SBE_MASK, - &qdma_hw_ram_sbe_err_process - }, - - - /* DBE Errors */ - { - QDMA_DBE_ERR_MI_H2C0_DAT, - "H2C MM data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_MI_H2C0_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_MI_C2H0_DAT, - "C2H MM data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_MI_C2H0_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_RD_BRG_DAT, - "Bridge master read double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_WR_BRG_DAT, - "Bridge master write double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_C2H_RD_BRG_DAT, - "Bridge slave read data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_C2H_RD_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_C2H_WR_BRG_DAT, - "Bridge slave write data buffer double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_C2H_WR_BRG_DAT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_FUNC_MAP, - "Function map RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_FUNC_MAP_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_HW_CTXT, - "Descriptor engine hardware context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_HW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CRD_RCV, - "Descriptor engine receive credit context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CRD_RCV_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_SW_CTXT, - "Descriptor engine software context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_SW_CTXT_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CPLI, - "Descriptor engine fetch completion information RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CPLI_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DSC_CPLD, - "Descriptor engine fetch completion data RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DSC_CPLD_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PASID_CTXT_RAM, - "PASID configuration RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PASID_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_TIMER_FIFO_RAM, - "Timer fifo RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_TIMER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM, - "C2H ST payload RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_QID_FIFO_RAM, - "C2H ST QID FIFO RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_QID_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_TUSER_FIFO_RAM, - "C2H ST TUSER RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_TUSER_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_WRB_COAL_DATA_RAM, - "Completion Coalescing RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_WRB_COAL_DATA_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_INT_QID2VEC_RAM, - "Interrupt QID2VEC RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_INT_QID2VEC_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_INT_CTXT_RAM, - "Interrupt context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_INT_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - "C2H ST descriptor request RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PFCH_CTXT_RAM, - "C2H ST prefetch RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PFCH_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_WRB_CTXT_RAM, - "C2H ST completion context RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_WRB_CTXT_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_PFCH_LL_RAM, - "C2H ST prefetch list RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_PFCH_LL_RAM_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_H2C_PEND_FIFO, - "H2C pending fifo RAM double bit ECC error", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_H2C_PEND_FIFO_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - }, - { - QDMA_DBE_ERR_ALL, - "All DBE errors", - QDMA_OFFSET_RAM_DBE_MASK, - QDMA_OFFSET_RAM_DBE_STAT, - QDMA_DBE_ERR_ALL_MASK, - QDMA_GLBL_ERR_RAM_DBE_MASK, - &qdma_hw_ram_dbe_err_process - } -}; - -static int32_t all_hw_errs[TOTAL_LEAF_ERROR_AGGREGATORS] = { - - QDMA_DSC_ERR_ALL, - QDMA_TRQ_ERR_ALL, - QDMA_ST_C2H_ERR_ALL, - QDMA_ST_FATAL_ERR_ALL, - QDMA_ST_H2C_ERR_ALL, - QDMA_SBE_ERR_ALL, - QDMA_DBE_ERR_ALL -}; - -static int qdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid); -static int qdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data); -static int qdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt); - - -static struct qctx_entry sw_ctxt_entries[] = { - {"PIDX", 0}, - {"IRQ Arm", 0}, - {"Function Id", 0}, - {"Queue Enable", 0}, - {"Fetch Credit Enable", 0}, - {"Write back/Intr Check", 0}, - {"Write back/Intr Interval", 0}, - {"Address Translation", 0}, - {"Fetch Max", 0}, - {"Ring Size", 0}, - {"Descriptor Size", 0}, - {"Bypass Enable", 0}, - {"MM Channel", 0}, - {"Writeback Enable", 0}, - {"Interrupt Enable", 0}, - {"Port Id", 0}, - {"Interrupt No Last", 0}, - {"Error", 0}, - {"Writeback Error Sent", 0}, - {"IRQ Request", 0}, - {"Marker Disable", 0}, - {"Is Memory Mapped", 0}, - {"Descriptor Ring Base Addr (Low)", 0}, - {"Descriptor Ring Base Addr (High)", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, -}; - -static struct qctx_entry hw_ctxt_entries[] = { - {"CIDX", 0}, - {"Credits Consumed", 0}, - {"Descriptors Pending", 0}, - {"Queue Invalid No Desc Pending", 0}, - {"Eviction Pending", 0}, - {"Fetch Pending", 0}, -}; - -static struct qctx_entry credit_ctxt_entries[] = { - {"Credit", 0}, -}; - -static struct qctx_entry cmpt_ctxt_entries[] = { - {"Enable Status Desc Update", 0}, - {"Enable Interrupt", 0}, - {"Trigger Mode", 0}, - {"Function Id", 0}, - {"Counter Index", 0}, - {"Timer Index", 0}, - {"Interrupt State", 0}, - {"Color", 0}, - {"Ring Size", 0}, - {"Base Address (Low)", 0}, - {"Base Address (High)", 0}, - {"Descriptor Size", 0}, - {"PIDX", 0}, - {"CIDX", 0}, - {"Valid", 0}, - {"Error", 0}, - {"Trigger Pending", 0}, - {"Timer Running", 0}, - {"Full Update", 0}, - {"Over Flow Check Disable", 0}, - {"Address Translation", 0}, - {"Interrupt Vector/Ring Index", 0}, - {"Interrupt Aggregation", 0}, -}; - -static struct qctx_entry c2h_pftch_ctxt_entries[] = { - {"Bypass", 0}, - {"Buffer Size Index", 0}, - {"Port Id", 0}, - {"Error", 0}, - {"Prefetch Enable", 0}, - {"In Prefetch", 0}, - {"Software Credit", 0}, - {"Valid", 0}, -}; - -static struct qctx_entry ind_intr_ctxt_entries[] = { - {"valid", 0}, - {"vec", 0}, - {"int_st", 0}, - {"color", 0}, - {"baddr_4k (Low)", 0}, - {"baddr_4k (High)", 0}, - {"page_size", 0}, - {"pidx", 0}, - {"at", 0}, -}; - -uint32_t qdma_soft_reg_dump_buf_len(void) -{ - uint32_t length = ((sizeof(qdma_config_regs) / - sizeof(qdma_config_regs[0])) + 1) * - REG_DUMP_SIZE_PER_LINE; - return length; -} - -uint32_t qdma_get_config_num_regs(void) -{ - return (sizeof(qdma_config_regs)/ - sizeof(qdma_config_regs[0])); -} - -struct xreg_info *qdma_get_config_regs(void) -{ - return qdma_config_regs; -} - -int qdma_soft_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen) -{ - uint32_t len = 0; - int rv = 0; - - *buflen = 0; - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - len += (((sizeof(cmpt_ctxt_entries) / - sizeof(cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - } else { - len += (((sizeof(sw_ctxt_entries) / - sizeof(sw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(hw_ctxt_entries) / - sizeof(hw_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(credit_ctxt_entries) / - sizeof(credit_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - len += (((sizeof(cmpt_ctxt_entries) / - sizeof(cmpt_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - - len += (((sizeof(c2h_pftch_ctxt_entries) / - sizeof(c2h_pftch_ctxt_entries[0])) - + 1) * REG_DUMP_SIZE_PER_LINE); - } - } - - *buflen = len; - return rv; -} - -/* - * qdma_acc_fill_sw_ctxt() - Helper function to fill sw context into structure - * - */ -static void qdma_fill_sw_ctxt(struct qdma_descq_sw_ctxt *sw_ctxt) -{ - sw_ctxt_entries[0].value = sw_ctxt->pidx; - sw_ctxt_entries[1].value = sw_ctxt->irq_arm; - sw_ctxt_entries[2].value = sw_ctxt->fnc_id; - sw_ctxt_entries[3].value = sw_ctxt->qen; - sw_ctxt_entries[4].value = sw_ctxt->frcd_en; - sw_ctxt_entries[5].value = sw_ctxt->wbi_chk; - sw_ctxt_entries[6].value = sw_ctxt->wbi_intvl_en; - sw_ctxt_entries[7].value = sw_ctxt->at; - sw_ctxt_entries[8].value = sw_ctxt->fetch_max; - sw_ctxt_entries[9].value = sw_ctxt->rngsz_idx; - sw_ctxt_entries[10].value = sw_ctxt->desc_sz; - sw_ctxt_entries[11].value = sw_ctxt->bypass; - sw_ctxt_entries[12].value = sw_ctxt->mm_chn; - sw_ctxt_entries[13].value = sw_ctxt->wbk_en; - sw_ctxt_entries[14].value = sw_ctxt->irq_en; - sw_ctxt_entries[15].value = sw_ctxt->port_id; - sw_ctxt_entries[16].value = sw_ctxt->irq_no_last; - sw_ctxt_entries[17].value = sw_ctxt->err; - sw_ctxt_entries[18].value = sw_ctxt->err_wb_sent; - sw_ctxt_entries[19].value = sw_ctxt->irq_req; - sw_ctxt_entries[20].value = sw_ctxt->mrkr_dis; - sw_ctxt_entries[21].value = sw_ctxt->is_mm; - sw_ctxt_entries[22].value = sw_ctxt->ring_bs_addr & 0xFFFFFFFF; - sw_ctxt_entries[23].value = - (sw_ctxt->ring_bs_addr >> 32) & 0xFFFFFFFF; - sw_ctxt_entries[24].value = sw_ctxt->vec; - sw_ctxt_entries[25].value = sw_ctxt->intr_aggr; -} - -/* - * qdma_acc_fill_cmpt_ctxt() - Helper function to fill completion context - * into structure - * - */ -static void qdma_fill_cmpt_ctxt(struct qdma_descq_cmpt_ctxt *cmpt_ctxt) -{ - cmpt_ctxt_entries[0].value = cmpt_ctxt->en_stat_desc; - cmpt_ctxt_entries[1].value = cmpt_ctxt->en_int; - cmpt_ctxt_entries[2].value = cmpt_ctxt->trig_mode; - cmpt_ctxt_entries[3].value = cmpt_ctxt->fnc_id; - cmpt_ctxt_entries[4].value = cmpt_ctxt->counter_idx; - cmpt_ctxt_entries[5].value = cmpt_ctxt->timer_idx; - cmpt_ctxt_entries[6].value = cmpt_ctxt->in_st; - cmpt_ctxt_entries[7].value = cmpt_ctxt->color; - cmpt_ctxt_entries[8].value = cmpt_ctxt->ringsz_idx; - cmpt_ctxt_entries[9].value = cmpt_ctxt->bs_addr & 0xFFFFFFFF; - cmpt_ctxt_entries[10].value = - (cmpt_ctxt->bs_addr >> 32) & 0xFFFFFFFF; - cmpt_ctxt_entries[11].value = cmpt_ctxt->desc_sz; - cmpt_ctxt_entries[12].value = cmpt_ctxt->pidx; - cmpt_ctxt_entries[13].value = cmpt_ctxt->cidx; - cmpt_ctxt_entries[14].value = cmpt_ctxt->valid; - cmpt_ctxt_entries[15].value = cmpt_ctxt->err; - cmpt_ctxt_entries[16].value = cmpt_ctxt->user_trig_pend; - cmpt_ctxt_entries[17].value = cmpt_ctxt->timer_running; - cmpt_ctxt_entries[18].value = cmpt_ctxt->full_upd; - cmpt_ctxt_entries[19].value = cmpt_ctxt->ovf_chk_dis; - cmpt_ctxt_entries[20].value = cmpt_ctxt->at; - cmpt_ctxt_entries[21].value = cmpt_ctxt->vec; - cmpt_ctxt_entries[22].value = cmpt_ctxt->int_aggr; -} - -/* - * qdma_acc_fill_hw_ctxt() - Helper function to fill HW context into structure - * - */ -static void qdma_fill_hw_ctxt(struct qdma_descq_hw_ctxt *hw_ctxt) -{ - hw_ctxt_entries[0].value = hw_ctxt->cidx; - hw_ctxt_entries[1].value = hw_ctxt->crd_use; - hw_ctxt_entries[2].value = hw_ctxt->dsc_pend; - hw_ctxt_entries[3].value = hw_ctxt->idl_stp_b; - hw_ctxt_entries[4].value = hw_ctxt->evt_pnd; - hw_ctxt_entries[5].value = hw_ctxt->fetch_pnd; -} - -/* - * qdma_acc_fill_credit_ctxt() - Helper function to fill Credit context - * into structure - * - */ -static void qdma_fill_credit_ctxt(struct qdma_descq_credit_ctxt *cr_ctxt) -{ - credit_ctxt_entries[0].value = cr_ctxt->credit; -} - -/* - * qdma_acc_fill_pfetch_ctxt() - Helper function to fill Prefetch context - * into structure - * - */ -static void qdma_fill_pfetch_ctxt(struct qdma_descq_prefetch_ctxt *pfetch_ctxt) -{ - c2h_pftch_ctxt_entries[0].value = pfetch_ctxt->bypass; - c2h_pftch_ctxt_entries[1].value = pfetch_ctxt->bufsz_idx; - c2h_pftch_ctxt_entries[2].value = pfetch_ctxt->port_id; - c2h_pftch_ctxt_entries[3].value = pfetch_ctxt->err; - c2h_pftch_ctxt_entries[4].value = pfetch_ctxt->pfch_en; - c2h_pftch_ctxt_entries[5].value = pfetch_ctxt->pfch; - c2h_pftch_ctxt_entries[6].value = pfetch_ctxt->sw_crdt; - c2h_pftch_ctxt_entries[7].value = pfetch_ctxt->valid; -} - -/* - * dump_soft_context() - Helper function to dump queue context into string - * - * return len - length of the string copied into buffer - */ -static int dump_soft_context(struct qdma_descq_context *queue_context, - uint8_t st, enum qdma_dev_q_type q_type, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - if (queue_context == NULL) { - qdma_log_error("%s: queue_context is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (q_type == QDMA_DEV_Q_TYPE_CMPT) { - qdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_H2C) { - qdma_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_fill_credit_ctxt(&queue_context->cr_ctxt); - } else if (q_type == QDMA_DEV_Q_TYPE_C2H) { - qdma_fill_sw_ctxt(&queue_context->sw_ctxt); - qdma_fill_hw_ctxt(&queue_context->hw_ctxt); - qdma_fill_credit_ctxt(&queue_context->cr_ctxt); - if (st) { - qdma_fill_pfetch_ctxt(&queue_context->pfetch_ctxt); - qdma_fill_cmpt_ctxt(&queue_context->cmpt_ctxt); - } - } - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - /* SW context dump */ - n = sizeof(sw_ctxt_entries) / sizeof((sw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "SW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - sw_ctxt_entries[i].name, - sw_ctxt_entries[i].value, - sw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* HW context dump */ - n = sizeof(hw_ctxt_entries) / sizeof((hw_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", "HW Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - hw_ctxt_entries[i].name, - hw_ctxt_entries[i].value, - hw_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - /* Credit context dump */ - n = sizeof(credit_ctxt_entries) / - sizeof((credit_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Credit Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - credit_ctxt_entries[i].name, - credit_ctxt_entries[i].value, - credit_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if ((q_type == QDMA_DEV_Q_TYPE_CMPT) || - (st && q_type == QDMA_DEV_Q_TYPE_C2H)) { - /* Completion context dump */ - n = sizeof(cmpt_ctxt_entries) / sizeof((cmpt_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Completion Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - cmpt_ctxt_entries[i].name, - cmpt_ctxt_entries[i].value, - cmpt_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - if (st && q_type == QDMA_DEV_Q_TYPE_C2H) { - /* Prefetch context dump */ - n = sizeof(c2h_pftch_ctxt_entries) / - sizeof(c2h_pftch_ctxt_entries[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || - ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%40s", - "Prefetch Context"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, - (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - c2h_pftch_ctxt_entries[i].name, - c2h_pftch_ctxt_entries[i].value, - c2h_pftch_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - -/* - * qdma_indirect_reg_invalidate() - helper function to invalidate indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_invalidate(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_INV; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_clear() - helper function to clear indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_clear(void *dev_hndl, - enum ind_ctxt_cmd_sel sel, uint16_t hw_qid) -{ - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_CLR; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_read() - helper function to read indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_read(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t cnt, uint32_t *data) -{ - uint32_t index = 0, reg_addr = QDMA_OFFSET_IND_CTXT_DATA; - union qdma_ind_ctxt_cmd cmd; - - qdma_reg_access_lock(dev_hndl); - - /* set command register */ - cmd.word = 0; - cmd.bits.qid = hw_qid; - cmd.bits.op = QDMA_CTXT_CMD_RD; - cmd.bits.sel = sel; - qdma_reg_write(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, cmd.word); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - for (index = 0; index < cnt; index++, reg_addr += sizeof(uint32_t)) - data[index] = qdma_reg_read(dev_hndl, reg_addr); - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/* - * qdma_indirect_reg_write() - helper function to write indirect - * context registers. - * - * return -QDMA_ERR_HWACC_BUSY_TIMEOUT if register - * value didn't match, QDMA_SUCCESS other wise - */ -static int qdma_indirect_reg_write(void *dev_hndl, enum ind_ctxt_cmd_sel sel, - uint16_t hw_qid, uint32_t *data, uint16_t cnt) -{ - uint32_t index, reg_addr; - struct qdma_indirect_ctxt_regs regs; - uint32_t *wr_data = (uint32_t *)®s; - - qdma_reg_access_lock(dev_hndl); - - /* write the context data */ - for (index = 0; index < QDMA_IND_CTXT_DATA_NUM_REGS; index++) { - if (index < cnt) - regs.qdma_ind_ctxt_data[index] = data[index]; - else - regs.qdma_ind_ctxt_data[index] = 0; - regs.qdma_ind_ctxt_mask[index] = 0xFFFFFFFF; - } - - regs.cmd.word = 0; - regs.cmd.bits.qid = hw_qid; - regs.cmd.bits.op = QDMA_CTXT_CMD_WR; - regs.cmd.bits.sel = sel; - reg_addr = QDMA_OFFSET_IND_CTXT_DATA; - - for (index = 0; index < ((2 * QDMA_IND_CTXT_DATA_NUM_REGS) + 1); - index++, reg_addr += sizeof(uint32_t)) - qdma_reg_write(dev_hndl, reg_addr, wr_data[index]); - - /* check if the operation went through well */ - if (hw_monitor_reg(dev_hndl, QDMA_OFFSET_IND_CTXT_CMD, - QDMA_IND_CTXT_CMD_BUSY_MASK, 0, - QDMA_REG_POLL_DFLT_INTERVAL_US, - QDMA_REG_POLL_DFLT_TIMEOUT_US)) { - qdma_reg_access_release(dev_hndl); - qdma_log_error("%s: hw_monitor_reg failed with err:%d\n", - __func__, - -QDMA_ERR_HWACC_BUSY_TIMEOUT); - return -QDMA_ERR_HWACC_BUSY_TIMEOUT; - } - - qdma_reg_access_release(dev_hndl); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_version() - Function to get the qdma version - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @version_info: pointer to hold the version info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info) -{ - uint32_t reg_val = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_VERSION : - QDMA_OFFSET_GLBL2_MISC_CAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, reg_addr); - - qdma_fetch_version_details(is_vf, reg_val, version_info); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_fmap_write() - create fmap context and program it - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_write(void *dev_hndl, uint16_t func_id, - const struct qdma_fmap_cfg *config) -{ - uint32_t fmap[QDMA_FMAP_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - fmap[num_words_count++] = - FIELD_SET(QDMA_FMAP_CTXT_W0_QID_MASK, config->qbase); - fmap[num_words_count++] = - FIELD_SET(QDMA_FMAP_CTXT_W1_QID_MAX_MASK, config->qmax); - - return qdma_indirect_reg_write(dev_hndl, sel, func_id, - fmap, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_fmap_read() - read fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the output fmap data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_read(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config) -{ - int rv = QDMA_SUCCESS; - uint32_t fmap[QDMA_FMAP_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl || !config) { - qdma_log_error("%s: dev_handle=%p fmap=%p NULL, err:%d\n", - __func__, dev_hndl, config, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, func_id, - QDMA_FMAP_NUM_WORDS, fmap); - if (rv < 0) - return rv; - - config->qbase = FIELD_GET(QDMA_FMAP_CTXT_W0_QID_MASK, fmap[0]); - config->qmax = FIELD_GET(QDMA_FMAP_CTXT_W1_QID_MAX_MASK, fmap[1]); - - qdma_log_debug("%s: func_id=%hu, qbase=%hu, qmax=%hu\n", __func__, - func_id, config->qbase, config->qmax); - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_fmap_clear() - clear fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_fmap_clear(void *dev_hndl, uint16_t func_id) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_FMAP; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_log_debug("%s: func_id=%hu\n", __func__, func_id); - return qdma_indirect_reg_clear(dev_hndl, sel, func_id); -} - -/*****************************************************************************/ -/** - * qdma_fmap_conf() - configure fmap context - * - * @dev_hndl: device handle - * @func_id: function id of the device - * @config: pointer to the fmap data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_INVALIDATE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_fmap_read(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_fmap_write(dev_hndl, func_id, config); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_fmap_clear(dev_hndl, func_id); - break; - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_sw_context_write() - create sw context and program it - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the SW context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_write(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - const struct qdma_descq_sw_ctxt *ctxt) -{ - uint32_t sw_ctxt[QDMA_SW_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W0_PIDX, ctxt->pidx) | - FIELD_SET(QDMA_SW_CTXT_W0_IRQ_ARM_MASK, ctxt->irq_arm) | - FIELD_SET(QDMA_SW_CTXT_W0_FUNC_ID_MASK, ctxt->fnc_id); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x\n", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W1_QEN_MASK, ctxt->qen) | - FIELD_SET(QDMA_SW_CTXT_W1_FCRD_EN_MASK, ctxt->frcd_en) | - FIELD_SET(QDMA_SW_CTXT_W1_WBI_CHK_MASK, ctxt->wbi_chk) | - FIELD_SET(QDMA_SW_CTXT_W1_WB_INT_EN_MASK, ctxt->wbi_intvl_en) | - FIELD_SET(QDMA_SW_CTXT_W1_AT_MASK, ctxt->at) | - FIELD_SET(QDMA_SW_CTXT_W1_FETCH_MAX_MASK, ctxt->fetch_max) | - FIELD_SET(QDMA_SW_CTXT_W1_RNG_SZ_MASK, ctxt->rngsz_idx) | - FIELD_SET(QDMA_SW_CTXT_W1_DSC_SZ_MASK, ctxt->desc_sz) | - FIELD_SET(QDMA_SW_CTXT_W1_BYP_MASK, ctxt->bypass) | - FIELD_SET(QDMA_SW_CTXT_W1_MM_CHN_MASK, ctxt->mm_chn) | - FIELD_SET(QDMA_SW_CTXT_W1_WBK_EN_MASK, ctxt->wbk_en) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_EN_MASK, ctxt->irq_en) | - FIELD_SET(QDMA_SW_CTXT_W1_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK, ctxt->irq_no_last) | - FIELD_SET(QDMA_SW_CTXT_W1_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK, ctxt->err_wb_sent) | - FIELD_SET(QDMA_SW_CTXT_W1_IRQ_REQ_MASK, ctxt->irq_req) | - FIELD_SET(QDMA_SW_CTXT_W1_MRKR_DIS_MASK, ctxt->mrkr_dis) | - FIELD_SET(QDMA_SW_CTXT_W1_IS_MM_MASK, ctxt->is_mm); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,err=%x", - __func__, ctxt->port_id, ctxt->irq_no_last, ctxt->err); - qdma_log_debug(", err_wb_sent=%x\n", ctxt->err_wb_sent); - - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - sw_ctxt[num_words_count++] = ctxt->ring_bs_addr & 0xffffffff; - sw_ctxt[num_words_count++] = (ctxt->ring_bs_addr >> 32) & 0xffffffff; - - sw_ctxt[num_words_count++] = - FIELD_SET(QDMA_SW_CTXT_W4_VEC_MASK, ctxt->vec) | - FIELD_SET(QDMA_SW_CTXT_W4_INTR_AGGR_MASK, ctxt->intr_aggr); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - sw_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_sw_context_read() - read sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t sw_ctxt[QDMA_SW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle=%p sw_ctxt=%p NULL, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_SW_CONTEXT_NUM_WORDS, sw_ctxt); - if (rv < 0) - return rv; - - ctxt->pidx = FIELD_GET(QDMA_SW_CTXT_W0_PIDX, sw_ctxt[0]); - ctxt->irq_arm = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W0_IRQ_ARM_MASK, sw_ctxt[0])); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W0_FUNC_ID_MASK, sw_ctxt[0])); - - qdma_log_debug("%s: pidx=%x, irq_arm=%x, fnc_id=%x", - __func__, ctxt->pidx, ctxt->irq_arm, ctxt->fnc_id); - - ctxt->qen = FIELD_GET(QDMA_SW_CTXT_W1_QEN_MASK, sw_ctxt[1]); - ctxt->frcd_en = FIELD_GET(QDMA_SW_CTXT_W1_FCRD_EN_MASK, sw_ctxt[1]); - ctxt->wbi_chk = FIELD_GET(QDMA_SW_CTXT_W1_WBI_CHK_MASK, sw_ctxt[1]); - ctxt->wbi_intvl_en = - FIELD_GET(QDMA_SW_CTXT_W1_WB_INT_EN_MASK, sw_ctxt[1]); - ctxt->at = FIELD_GET(QDMA_SW_CTXT_W1_AT_MASK, sw_ctxt[1]); - ctxt->fetch_max = - FIELD_GET(QDMA_SW_CTXT_W1_FETCH_MAX_MASK, sw_ctxt[1]); - ctxt->rngsz_idx = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_RNG_SZ_MASK, sw_ctxt[1])); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_DSC_SZ_MASK, sw_ctxt[1])); - ctxt->bypass = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_BYP_MASK, sw_ctxt[1])); - ctxt->mm_chn = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_MM_CHN_MASK, sw_ctxt[1])); - ctxt->wbk_en = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_WBK_EN_MASK, sw_ctxt[1])); - ctxt->irq_en = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_EN_MASK, sw_ctxt[1])); - ctxt->port_id = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_PORT_ID_MASK, sw_ctxt[1])); - ctxt->irq_no_last = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK, - sw_ctxt[1])); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_ERR_MASK, sw_ctxt[1])); - ctxt->err_wb_sent = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK, - sw_ctxt[1])); - ctxt->irq_req = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IRQ_REQ_MASK, sw_ctxt[1])); - ctxt->mrkr_dis = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_MRKR_DIS_MASK, sw_ctxt[1])); - ctxt->is_mm = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W1_IS_MM_MASK, sw_ctxt[1])); - - qdma_log_debug("%s: qen=%x, frcd_en=%x, wbi_chk=%x, wbi_intvl_en=%x\n", - __func__, ctxt->qen, ctxt->frcd_en, ctxt->wbi_chk, - ctxt->wbi_intvl_en); - qdma_log_debug("%s: at=%x, fetch_max=%x, rngsz_idx=%x, desc_sz=%x\n", - __func__, ctxt->at, ctxt->fetch_max, ctxt->rngsz_idx, - ctxt->desc_sz); - qdma_log_debug("%s: bypass=%x, mm_chn=%x, wbk_en=%x, irq_en=%x\n", - __func__, ctxt->bypass, ctxt->mm_chn, ctxt->wbk_en, - ctxt->irq_en); - qdma_log_debug("%s: port_id=%x, irq_no_last=%x,", - __func__, ctxt->port_id, ctxt->irq_no_last); - qdma_log_debug(" err=%x, err_wb_sent=%x\n", - ctxt->err, ctxt->err_wb_sent); - qdma_log_debug("%s: irq_req=%x, mrkr_dis=%x, is_mm=%x\n", - __func__, ctxt->irq_req, ctxt->mrkr_dis, ctxt->is_mm); - - ctxt->ring_bs_addr = ((uint64_t)sw_ctxt[3] << 32) | (sw_ctxt[2]); - - ctxt->vec = FIELD_GET(QDMA_SW_CTXT_W4_VEC_MASK, sw_ctxt[4]); - ctxt->intr_aggr = - (uint8_t)(FIELD_GET(QDMA_SW_CTXT_W4_INTR_AGGR_MASK, - sw_ctxt[4])); - - qdma_log_debug("%s: vec=%x, intr_aggr=%x\n", - __func__, ctxt->vec, ctxt->intr_aggr); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_sw_context_clear() - clear sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_sw_context_invalidate() - invalidate sw context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_sw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? - QDMA_CTXT_SEL_SW_C2H : QDMA_CTXT_SEL_SW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_sw_ctx_conf() - configure SW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_sw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_sw_context_write(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_sw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_sw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_write() - create prefetch context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the prefetch context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_prefetch_ctxt *ctxt) -{ - uint32_t pfetch_ctxt[QDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, ctxt->sw_crdt); - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, ctxt->sw_crdt); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(QDMA_PFTCH_CTXT_W0_BYPASS_MASK, ctxt->bypass) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK, - ctxt->bufsz_idx) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_PORT_ID_MASK, ctxt->port_id) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK, ctxt->pfch_en) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK, ctxt->pfch) | - FIELD_SET(QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK, sw_crdt_l); - - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - pfetch_ctxt[num_words_count++] = - FIELD_SET(QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK, sw_crdt_h) | - FIELD_SET(QDMA_PFTCH_CTXT_W1_VALID_MASK, ctxt->valid); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - pfetch_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_read() - read prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t pfetch_ctxt[QDMA_PFETCH_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - uint32_t sw_crdt_l, sw_crdt_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or pfetch ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_PFETCH_CONTEXT_NUM_WORDS, pfetch_ctxt); - if (rv < 0) - return rv; - - ctxt->bypass = - FIELD_GET(QDMA_PFTCH_CTXT_W0_BYPASS_MASK, pfetch_ctxt[0]); - ctxt->bufsz_idx = - FIELD_GET(QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK, pfetch_ctxt[0]); - ctxt->port_id = - FIELD_GET(QDMA_PFTCH_CTXT_W0_PORT_ID_MASK, pfetch_ctxt[0]); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_ERR_MASK, - pfetch_ctxt[0])); - ctxt->pfch_en = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK, - pfetch_ctxt[0])); - ctxt->pfch = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK, - pfetch_ctxt[0])); - sw_crdt_l = - FIELD_GET(QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK, pfetch_ctxt[0]); - - sw_crdt_h = - FIELD_GET(QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK, pfetch_ctxt[1]); - ctxt->valid = - (uint8_t)(FIELD_GET(QDMA_PFTCH_CTXT_W1_VALID_MASK, - pfetch_ctxt[1])); - - ctxt->sw_crdt = - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_L_MASK, sw_crdt_l) | - FIELD_SET(QDMA_PFTCH_CTXT_SW_CRDT_GET_H_MASK, sw_crdt_h); - - qdma_log_debug("%s: sw_crdt_l=%u, sw_crdt_h=%u, hw_qid=%hu\n", - __func__, sw_crdt_l, sw_crdt_h, hw_qid); - qdma_log_debug("%s: bypass=%x, bufsz_idx=%x, port_id=%x\n", - __func__, ctxt->bypass, ctxt->bufsz_idx, ctxt->port_id); - qdma_log_debug("%s: err=%x, pfch_en=%x, pfch=%x, ctxt->valid=%x\n", - __func__, ctxt->err, ctxt->pfch_en, ctxt->pfch, - ctxt->valid); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_clear() - clear prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_context_invalidate() - invalidate prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_pfetch_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_PFTCH; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_pfetch_ctx_conf() - configure prefetch context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_pfetch_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_pfetch_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_pfetch_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_pfetch_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_write() - create completion context and program it - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the cmpt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_write(void *dev_hndl, uint16_t hw_qid, - const struct qdma_descq_cmpt_ctxt *ctxt) -{ - uint32_t cmpt_ctxt[QDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - uint16_t num_words_count = 0; - uint32_t baddr_l, baddr_h, pidx_l, pidx_h; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - /* Input args check */ - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (ctxt->trig_mode > QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR) { - qdma_log_error("%s: trig_mode(%d) > (%d) is invalid, err:%d\n", - __func__, - ctxt->trig_mode, - QDMA_CMPT_UPDATE_TRIG_MODE_TMR_CNTR, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_COMPL_CTXT_BADDR_GET_L_MASK, - ctxt->bs_addr); - baddr_h = (uint32_t)FIELD_GET(QDMA_COMPL_CTXT_BADDR_GET_H_MASK, - ctxt->bs_addr); - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, ctxt->pidx); - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, ctxt->pidx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK, - ctxt->en_stat_desc) | - FIELD_SET(QDMA_COMPL_CTXT_W0_EN_INT_MASK, ctxt->en_int) | - FIELD_SET(QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK, ctxt->trig_mode) | - FIELD_SET(QDMA_COMPL_CTXT_W0_FNC_ID_MASK, ctxt->fnc_id) | - FIELD_SET(QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK, - ctxt->counter_idx) | - FIELD_SET(QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK, ctxt->timer_idx) | - FIELD_SET(QDMA_COMPL_CTXT_W0_INT_ST_MASK, ctxt->in_st) | - FIELD_SET(QDMA_COMPL_CTXT_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(QDMA_COMPL_CTXT_W0_RING_SZ_MASK, ctxt->ringsz_idx); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK, baddr_l); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK, baddr_h) | - FIELD_SET(QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK, ctxt->desc_sz) | - FIELD_SET(QDMA_COMPL_CTXT_W2_PIDX_L_MASK, pidx_l); - - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W3_PIDX_H_MASK, pidx_h) | - FIELD_SET(QDMA_COMPL_CTXT_W3_CIDX_MASK, ctxt->cidx) | - FIELD_SET(QDMA_COMPL_CTXT_W3_VALID_MASK, ctxt->valid) | - FIELD_SET(QDMA_COMPL_CTXT_W3_ERR_MASK, ctxt->err) | - FIELD_SET(QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK, - ctxt->user_trig_pend); - - cmpt_ctxt[num_words_count++] = - FIELD_SET(QDMA_COMPL_CTXT_W4_TMR_RUN_MASK, - ctxt->timer_running) | - FIELD_SET(QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK, ctxt->full_upd) | - FIELD_SET(QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK, - ctxt->ovf_chk_dis) | - FIELD_SET(QDMA_COMPL_CTXT_W4_AT_MASK, ctxt->at) | - FIELD_SET(QDMA_COMPL_CTXT_W4_INTR_VEC_MASK, ctxt->vec) | - FIELD_SET(QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK, ctxt->int_aggr); - - return qdma_indirect_reg_write(dev_hndl, sel, hw_qid, - cmpt_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_read() - read completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_read(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cmpt_ctxt[QDMA_CMPT_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - uint32_t baddr_l, baddr_h, pidx_l, pidx_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or cmpt ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CMPT_CONTEXT_NUM_WORDS, cmpt_ctxt); - if (rv < 0) - return rv; - - ctxt->en_stat_desc = - FIELD_GET(QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK, cmpt_ctxt[0]); - ctxt->en_int = FIELD_GET(QDMA_COMPL_CTXT_W0_EN_INT_MASK, cmpt_ctxt[0]); - ctxt->trig_mode = - FIELD_GET(QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK, cmpt_ctxt[0]); - ctxt->fnc_id = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_FNC_ID_MASK, - cmpt_ctxt[0])); - ctxt->counter_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->timer_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK, - cmpt_ctxt[0])); - ctxt->in_st = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_INT_ST_MASK, - cmpt_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_COLOR_MASK, - cmpt_ctxt[0])); - ctxt->ringsz_idx = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W0_RING_SZ_MASK, - cmpt_ctxt[0])); - - baddr_l = FIELD_GET(QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK, cmpt_ctxt[1]); - - baddr_h = FIELD_GET(QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK, cmpt_ctxt[2]); - ctxt->desc_sz = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK, - cmpt_ctxt[2])); - pidx_l = FIELD_GET(QDMA_COMPL_CTXT_W2_PIDX_L_MASK, cmpt_ctxt[2]); - - pidx_h = FIELD_GET(QDMA_COMPL_CTXT_W3_PIDX_H_MASK, cmpt_ctxt[3]); - ctxt->cidx = - (uint16_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_CIDX_MASK, - cmpt_ctxt[3])); - ctxt->valid = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_VALID_MASK, - cmpt_ctxt[3])); - ctxt->err = - (uint8_t)(FIELD_GET(QDMA_COMPL_CTXT_W3_ERR_MASK, cmpt_ctxt[3])); - ctxt->user_trig_pend = (uint8_t) - (FIELD_GET(QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK, cmpt_ctxt[3])); - - ctxt->timer_running = - FIELD_GET(QDMA_COMPL_CTXT_W4_TMR_RUN_MASK, cmpt_ctxt[4]); - ctxt->full_upd = - FIELD_GET(QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK, cmpt_ctxt[4]); - ctxt->ovf_chk_dis = - FIELD_GET(QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK, cmpt_ctxt[4]); - ctxt->at = FIELD_GET(QDMA_COMPL_CTXT_W4_AT_MASK, cmpt_ctxt[4]); - ctxt->vec = FIELD_GET(QDMA_COMPL_CTXT_W4_INTR_VEC_MASK, cmpt_ctxt[4]); - ctxt->int_aggr = (uint8_t) - (FIELD_GET(QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK, cmpt_ctxt[4])); - - ctxt->bs_addr = - FIELD_SET(QDMA_COMPL_CTXT_BADDR_GET_L_MASK, (uint64_t)baddr_l) | - FIELD_SET(QDMA_COMPL_CTXT_BADDR_GET_H_MASK, (uint64_t)baddr_h); - - ctxt->pidx = - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_L_MASK, pidx_l) | - FIELD_SET(QDMA_COMPL_CTXT_PIDX_GET_H_MASK, pidx_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_clear() - clear completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_clear(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_context_invalidate() - invalidate completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_cmpt_context_invalidate(void *dev_hndl, uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_CMPT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_cmpt_ctx_conf() - configure completion context - * - * @dev_hndl: device handle - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_cmpt_context_read(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_cmpt_context_write(dev_hndl, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_cmpt_context_clear(dev_hndl, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_cmpt_context_invalidate(dev_hndl, hw_qid); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_hw_context_read() - read hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, struct qdma_descq_hw_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t hw_ctxt[QDMA_HW_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_handle or hw_ctxt NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_HW_CONTEXT_NUM_WORDS, hw_ctxt); - if (rv < 0) - return rv; - - ctxt->cidx = FIELD_GET(QDMA_HW_CTXT_W0_CIDX_MASK, hw_ctxt[0]); - ctxt->crd_use = - (uint16_t)(FIELD_GET(QDMA_HW_CTXT_W0_CRD_USE_MASK, hw_ctxt[0])); - - ctxt->dsc_pend = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_DSC_PND_MASK, hw_ctxt[1])); - ctxt->idl_stp_b = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_IDL_STP_B_MASK, - hw_ctxt[1])); - ctxt->evt_pnd = - (uint8_t)(FIELD_GET(QDMA_HW_CTXT_W1_EVENT_PEND_MASK, - hw_ctxt[1])); - ctxt->fetch_pnd = (uint8_t) - (FIELD_GET(QDMA_HW_CTXT_W1_FETCH_PEND_MASK, hw_ctxt[1])); - - qdma_log_debug("%s: cidx=%hu, crd_use=%hu, dsc_pend=%x\n", - __func__, ctxt->cidx, ctxt->crd_use, ctxt->dsc_pend); - qdma_log_debug("%s: idl_stp_b=%x, evt_pnd=%x, fetch_pnd=%x\n", - __func__, ctxt->idl_stp_b, ctxt->evt_pnd, - ctxt->fetch_pnd); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_context_clear() - clear hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_hw_context_invalidate() - invalidate hardware context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_hw_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_HW_C2H : - QDMA_CTXT_SEL_HW_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_hw_ctx_conf() - configure HW context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_hw_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_hw_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_hw_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_credit_context_read() - read credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_read(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t cr_ctxt[QDMA_CR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p credit_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, hw_qid, - QDMA_CR_CONTEXT_NUM_WORDS, cr_ctxt); - if (rv < 0) - return rv; - - ctxt->credit = FIELD_GET(QDMA_CR_CTXT_W0_CREDT_MASK, cr_ctxt[0]); - - qdma_log_debug("%s: credit=%u\n", __func__, ctxt->credit); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_credit_context_clear() - clear credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_clear(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_credit_context_invalidate() - invalidate credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_credit_context_invalidate(void *dev_hndl, uint8_t c2h, - uint16_t hw_qid) -{ - enum ind_ctxt_cmd_sel sel = c2h ? QDMA_CTXT_SEL_CR_C2H : - QDMA_CTXT_SEL_CR_H2C; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, hw_qid); -} - -/*****************************************************************************/ -/** - * qdma_credit_ctx_conf() - configure credit context - * - * @dev_hndl: device handle - * @c2h: is c2h queue - * @hw_qid: hardware qid of the queue - * @ctxt: pointer to the context data - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_WRITE Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - /** ctxt requires only H2C-0 or C2H-1 - * return error for any other values - */ - if (c2h > 1) { - qdma_log_error("%s: c2h(%d) invalid, err:%d\n", - __func__, - c2h, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_credit_context_read(dev_hndl, c2h, hw_qid, ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_credit_context_clear(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_credit_context_invalidate(dev_hndl, c2h, hw_qid); - break; - case QDMA_HW_ACCESS_WRITE: - default: - qdma_log_error("%s: Invalid access type=%d, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_write() - create indirect interrupt context - * and program it - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the interrupt context data strucutre - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_write(void *dev_hndl, uint16_t ring_index, - const struct qdma_indirect_intr_ctxt *ctxt) -{ - uint32_t intr_ctxt[QDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint32_t baddr_l, baddr_m, baddr_h; - uint16_t num_words_count = 0; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - baddr_l = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, - ctxt->baddr_4k); - baddr_m = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, - ctxt->baddr_4k); - baddr_h = (uint32_t)FIELD_GET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, - ctxt->baddr_4k); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W0_VALID_MASK, ctxt->valid) | - FIELD_SET(QDMA_INTR_CTXT_W0_VEC_ID_MASK, ctxt->vec) | - FIELD_SET(QDMA_INTR_CTXT_W0_INT_ST_MASK, ctxt->int_st) | - FIELD_SET(QDMA_INTR_CTXT_W0_COLOR_MASK, ctxt->color) | - FIELD_SET(QDMA_INTR_CTXT_W0_BADDR_64_MASK, baddr_l); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W1_BADDR_64_MASK, baddr_m); - - intr_ctxt[num_words_count++] = - FIELD_SET(QDMA_INTR_CTXT_W2_BADDR_64_MASK, baddr_h) | - FIELD_SET(QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK, ctxt->page_size) | - FIELD_SET(QDMA_INTR_CTXT_W2_PIDX_MASK, ctxt->pidx) | - FIELD_SET(QDMA_INTR_CTXT_W2_AT_MASK, ctxt->at); - - return qdma_indirect_reg_write(dev_hndl, sel, ring_index, - intr_ctxt, num_words_count); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_read() - read indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to the output context data - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_read(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt) -{ - int rv = QDMA_SUCCESS; - uint32_t intr_ctxt[QDMA_IND_INTR_CONTEXT_NUM_WORDS] = {0}; - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - uint64_t baddr_l, baddr_m, baddr_h; - - if (!dev_hndl || !ctxt) { - qdma_log_error("%s: dev_hndl=%p intr_ctxt=%p, err:%d\n", - __func__, dev_hndl, ctxt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_indirect_reg_read(dev_hndl, sel, ring_index, - QDMA_IND_INTR_CONTEXT_NUM_WORDS, intr_ctxt); - if (rv < 0) - return rv; - - ctxt->valid = FIELD_GET(QDMA_INTR_CTXT_W0_VALID_MASK, intr_ctxt[0]); - ctxt->vec = FIELD_GET(QDMA_INTR_CTXT_W0_VEC_ID_MASK, intr_ctxt[0]); - ctxt->int_st = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W0_INT_ST_MASK, - intr_ctxt[0])); - ctxt->color = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W0_COLOR_MASK, - intr_ctxt[0])); - - baddr_l = FIELD_GET(QDMA_INTR_CTXT_W0_BADDR_64_MASK, intr_ctxt[0]); - - baddr_m = FIELD_GET(QDMA_INTR_CTXT_W1_BADDR_64_MASK, intr_ctxt[1]); - - baddr_h = FIELD_GET(QDMA_INTR_CTXT_W2_BADDR_64_MASK, intr_ctxt[2]); - ctxt->page_size = - FIELD_GET(QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK, intr_ctxt[2]); - ctxt->pidx = - (uint16_t)(FIELD_GET(QDMA_INTR_CTXT_W2_PIDX_MASK, - intr_ctxt[2])); - ctxt->at = - (uint8_t)(FIELD_GET(QDMA_INTR_CTXT_W2_AT_MASK, intr_ctxt[2])); - - ctxt->baddr_4k = - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_L_MASK, baddr_l) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_M_MASK, baddr_m) | - FIELD_SET(QDMA_INTR_CTXT_BADDR_GET_H_MASK, baddr_h); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_clear() - clear indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_clear(void *dev_hndl, uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_clear(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_context_invalidate() - invalidate indirect interrupt - * context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_indirect_intr_context_invalidate(void *dev_hndl, - uint16_t ring_index) -{ - enum ind_ctxt_cmd_sel sel = QDMA_CTXT_SEL_INT_COAL; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - return qdma_indirect_reg_invalidate(dev_hndl, sel, ring_index); -} - -/*****************************************************************************/ -/** - * qdma_indirect_intr_ctx_conf() - configure indirect interrupt context - * - * @dev_hndl: device handle - * @ring_index: indirect interrupt ring index - * @ctxt: pointer to context data - * @access_type HW access type (qdma_hw_access_type enum) value - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_indirect_intr_context_read(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_indirect_intr_context_write(dev_hndl, ring_index, - ctxt); - break; - case QDMA_HW_ACCESS_CLEAR: - rv = qdma_indirect_intr_context_clear(dev_hndl, - ring_index); - break; - case QDMA_HW_ACCESS_INVALIDATE: - rv = qdma_indirect_intr_context_invalidate(dev_hndl, - ring_index); - break; - default: - qdma_log_error("%s: access_type=%d is invalid, err:%d\n", - __func__, access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_set_default_global_csr() - function to set the global CSR register to - * default values. The value can be modified later by using the set/get csr - * functions - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_set_default_global_csr(void *dev_hndl) -{ - /* Default values */ - uint32_t cfg_val = 0, reg_val = 0; - uint32_t rng_sz[QDMA_NUM_RING_SIZES] = {2049, 65, 129, 193, 257, 385, - 513, 769, 1025, 1537, 3073, 4097, 6145, 8193, 12289, 16385}; - uint32_t tmr_cnt[QDMA_NUM_C2H_TIMERS] = {1, 2, 4, 5, 8, 10, 15, 20, 25, - 30, 50, 75, 100, 125, 150, 200}; - uint32_t cnt_th[QDMA_NUM_C2H_COUNTERS] = {2, 4, 8, 16, 24, 32, 48, 64, - 80, 96, 112, 128, 144, 160, 176, 192}; - uint32_t buf_sz[QDMA_NUM_C2H_BUFFER_SIZES] = {4096, 256, 512, 1024, - 2048, 3968, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 8192, - 9018, 16384}; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - /* Configuring CSR registers */ - /* Global ring sizes */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, 0, - QDMA_NUM_RING_SIZES, rng_sz); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - /* Counter thresholds */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, 0, - QDMA_NUM_C2H_COUNTERS, cnt_th); - - /* Timer Counters */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_TIMER_CNT, 0, - QDMA_NUM_C2H_TIMERS, tmr_cnt); - - - /* Writeback Interval */ - reg_val = - FIELD_SET(QDMA_GLBL_DSC_CFG_MAX_DSC_FETCH_MASK, - DEFAULT_MAX_DSC_FETCH) | - FIELD_SET(QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, - DEFAULT_WRB_INT); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG, reg_val); - } - - if (dev_cap.st_en) { - /* Buffer Sizes */ - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, 0, - QDMA_NUM_C2H_BUFFER_SIZES, buf_sz); - - /* Prefetch Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_C2H_PFETCH_CACHE_DEPTH); - reg_val = - FIELD_SET(QDMA_C2H_PFCH_FL_TH_MASK, - DEFAULT_PFCH_STOP_THRESH) | - FIELD_SET(QDMA_C2H_NUM_PFCH_MASK, - DEFAULT_PFCH_NUM_ENTRIES_PER_Q) | - FIELD_SET(QDMA_C2H_PFCH_QCNT_MASK, (cfg_val >> 1)) | - FIELD_SET(QDMA_C2H_EVT_QCNT_TH_MASK, - ((cfg_val >> 1) - 2)); - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_PFETCH_CFG, reg_val); - - /* C2H interrupt timer tick */ - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_INT_TIMER_TICK, - DEFAULT_C2H_INTR_TIMER_TICK); - - /* C2h Completion Coalesce Configuration */ - cfg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_C2H_CMPT_COAL_BUF_DEPTH); - reg_val = - FIELD_SET(QDMA_C2H_TICK_CNT_MASK, - DEFAULT_CMPT_COAL_TIMER_CNT) | - FIELD_SET(QDMA_C2H_TICK_VAL_MASK, - DEFAULT_CMPT_COAL_TIMER_TICK) | - FIELD_SET(QDMA_C2H_MAX_BUF_SZ_MASK, cfg_val); - qdma_reg_write(dev_hndl, QDMA_OFFSET_C2H_WRB_COAL_CFG, reg_val); - - /* H2C throttle Configuration*/ - reg_val = - FIELD_SET(QDMA_H2C_DATA_THRESH_MASK, - QDMA_H2C_THROT_DATA_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_DATA_MASK, - QDMA_THROT_EN_DATA) | - FIELD_SET(QDMA_H2C_REQ_THRESH_MASK, - QDMA_H2C_THROT_REQ_THRESH) | - FIELD_SET(QDMA_H2C_REQ_THROT_EN_REQ_MASK, - QDMA_THROT_EN_REQ); - qdma_reg_write(dev_hndl, QDMA_OFFSET_H2C_REQ_THROT, reg_val); - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_pidx_update() - function to update the desc PIDX - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @reg_info: data needed for the PIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info) -{ - uint32_t reg_addr = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!is_vf) { - reg_addr = (is_c2h) ? QDMA_OFFSET_DMAP_SEL_C2H_DSC_PIDX : - QDMA_OFFSET_DMAP_SEL_H2C_DSC_PIDX; - } else { - reg_addr = (is_c2h) ? QDMA_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX : - QDMA_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX; - } - - reg_addr += (qid * QDMA_PIDX_STEP); - - reg_val = FIELD_SET(QDMA_DMA_SEL_DESC_PIDX_MASK, reg_info->pidx) | - FIELD_SET(QDMA_DMA_SEL_IRQ_EN_MASK, - reg_info->irq_en); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_cmpt_cidx_update() - function to update the CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX : - QDMA_OFFSET_DMAP_SEL_CMPT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += (qid * QDMA_CMPT_CIDX_STEP); - - reg_val = - FIELD_SET(QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK, - reg_info->wrb_cidx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK, - reg_info->counter_idx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK, - reg_info->timer_idx) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK, - reg_info->trig_mode) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK, - reg_info->wrb_en) | - FIELD_SET(QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK, reg_info->irq_en); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_queue_intr_cidx_update() - function to update the CMPT CIDX update - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @qid: Queue id relative to the PF/VF calling this API - * @reg_info: data needed for the CIDX register update - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info) -{ - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_DMAP_SEL_INT_CIDX : - QDMA_OFFSET_DMAP_SEL_INT_CIDX; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_info) { - qdma_log_error("%s: reg_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_addr += qid * QDMA_INT_CIDX_STEP; - - reg_val = - FIELD_SET(QDMA_DMA_SEL_INT_SW_CIDX_MASK, reg_info->sw_cidx) | - FIELD_SET(QDMA_DMA_SEL_INT_RING_IDX_MASK, reg_info->rng_idx); - - qdma_reg_write(dev_hndl, reg_addr, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_user_bar() - Function to get the - * AXI Master Lite(user bar) number - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @func_id: function id of the PF - * @user_bar: pointer to hold the AXI Master Lite number - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint8_t func_id, uint8_t *user_bar) -{ - uint8_t bar_found = 0; - uint8_t bar_idx = 0; - uint32_t user_bar_id = 0; - uint32_t reg_addr = (is_vf) ? QDMA_OFFSET_VF_USER_BAR_ID : - QDMA_OFFSET_GLBL2_PF_BARLITE_EXT; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!user_bar) { - qdma_log_error("%s: user_bar is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - user_bar_id = qdma_reg_read(dev_hndl, reg_addr); - - if (!is_vf) - user_bar_id = (user_bar_id >> (6 * func_id)) & 0x3F; - else - user_bar_id = user_bar_id & 0x3F; - - for (bar_idx = 0; bar_idx < QDMA_BAR_NUM; bar_idx++) { - if (user_bar_id & (1 << bar_idx)) { - *user_bar = bar_idx; - bar_found = 1; - break; - } - } - if (bar_found == 0) { - *user_bar = 0; - qdma_log_error("%s: Bar not found, vf:%d, usrbar:%d, err:%d\n", - __func__, - is_vf, - *user_bar, - -QDMA_ERR_HWACC_BAR_NOT_FOUND); - return -QDMA_ERR_HWACC_BAR_NOT_FOUND; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_get_device_attributes() - Function to get the qdma device attributes - * - * @dev_hndl: device handle - * @dev_info: pointer to hold the device info - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info) -{ - uint8_t count = 0; - uint32_t reg_val = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!dev_info) { - qdma_log_error("%s: dev_info is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - /* number of PFs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_PF_BARLITE_INT); - if (FIELD_GET(QDMA_GLBL2_PF0_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF1_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF2_BAR_MAP_MASK, reg_val)) - count++; - if (FIELD_GET(QDMA_GLBL2_PF3_BAR_MAP_MASK, reg_val)) - count++; - dev_info->num_pfs = count; - - /* Number of Qs */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_CHANNEL_QDMA_CAP); - dev_info->num_qs = FIELD_GET(QDMA_GLBL2_MULTQ_MAX_MASK, reg_val); - - /* FLR present */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_MISC_CAP); - dev_info->mailbox_en = FIELD_GET(QDMA_GLBL2_MAILBOX_EN_MASK, reg_val); - dev_info->flr_present = FIELD_GET(QDMA_GLBL2_FLR_PRESENT_MASK, reg_val); - dev_info->mm_cmpt_en = FIELD_GET(QDMA_GLBL2_MM_CMPT_EN_MASK, reg_val); - - /* ST/MM enabled? */ - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL2_CHANNEL_MDMA); - dev_info->mm_en = (FIELD_GET(QDMA_GLBL2_MM_C2H_MASK, reg_val) - && FIELD_GET(QDMA_GLBL2_MM_H2C_MASK, reg_val)) ? 1 : 0; - dev_info->st_en = (FIELD_GET(QDMA_GLBL2_ST_C2H_MASK, reg_val) - && FIELD_GET(QDMA_GLBL2_ST_H2C_MASK, reg_val)) ? 1 : 0; - - /* num of mm channels */ - /* TODO : Register not yet defined for this. Hard coding it to 1.*/ - dev_info->mm_channel_max = 1; - - dev_info->debug_mode = 0; - dev_info->desc_eng_mode = 0; - dev_info->qid2vec_ctx = 0; - dev_info->cmpt_ovf_chk_dis = 1; - dev_info->mailbox_intr = 1; - dev_info->sw_desc_64b = 1; - dev_info->cmpt_desc_64b = 1; - dev_info->dynamic_bar = 1; - dev_info->legacy_intr = 1; - dev_info->cmpt_trig_count_timer = 1; - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_hw_ram_sbe_err_process() - Function to dump SBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_ram_sbe_err_process(void *dev_hndl) -{ - qdma_dump_reg_info(dev_hndl, QDMA_OFFSET_RAM_SBE_STAT, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_hw_ram_dbe_err_process() - Function to dump DBE error debug information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_ram_dbe_err_process(void *dev_hndl) -{ - qdma_dump_reg_info(dev_hndl, QDMA_OFFSET_RAM_DBE_STAT, - 1, NULL, 0); -} - -/*****************************************************************************/ -/** - * qdma_hw_desc_err_process() - Function to dump Descriptor Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_desc_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t desc_err_reg_list[] = { - QDMA_OFFSET_GLBL_DSC_ERR_STS, - QDMA_OFFSET_GLBL_DSC_ERR_LOG0, - QDMA_OFFSET_GLBL_DSC_ERR_LOG1, - QDMA_OFFSET_GLBL_DSC_DBG_DAT0, - QDMA_OFFSET_GLBL_DSC_DBG_DAT1, - QDMA_OFFSET_GLBL_DSC_ERR_LOG2 - }; - int desc_err_num_regs = sizeof(desc_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < desc_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, desc_err_reg_list[i], - 1, NULL, 0); - } -} - -/*****************************************************************************/ -/** - * qdma_hw_trq_err_process() - Function to dump Target Access Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_trq_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t trq_err_reg_list[] = { - QDMA_OFFSET_GLBL_TRQ_ERR_STS, - QDMA_OFFSET_GLBL_TRQ_ERR_LOG - }; - int trq_err_reg_num_regs = sizeof(trq_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < trq_err_reg_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, trq_err_reg_list[i], - 1, NULL, 0); - } - - -} - -/*****************************************************************************/ -/** - * qdma_hw_st_h2c_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_st_h2c_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_h2c_err_reg_list[] = { - QDMA_OFFSET_H2C_ERR_STAT, - QDMA_OFFSET_H2C_FIRST_ERR_QID, - QDMA_OFFSET_H2C_DBG_REG0, - QDMA_OFFSET_H2C_DBG_REG1, - QDMA_OFFSET_H2C_DBG_REG2, - QDMA_OFFSET_H2C_DBG_REG3, - QDMA_OFFSET_H2C_DBG_REG4 - }; - int st_h2c_err_num_regs = sizeof(st_h2c_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_h2c_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, st_h2c_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_hw_st_c2h_err_process() - Function to dump MM H2C Error information - * - * @dev_hndl: device handle - * @buf: Bufffer for the debug info to be dumped in - * @buflen: Length of the buffer - * - * Return: void - *****************************************************************************/ -static void qdma_hw_st_c2h_err_process(void *dev_hndl) -{ - int i = 0; - uint32_t st_c2h_err_reg_list[] = { - QDMA_OFFSET_C2H_ERR_STAT, - QDMA_OFFSET_C2H_FATAL_ERR_STAT, - QDMA_OFFSET_C2H_FIRST_ERR_QID, - QDMA_OFFSET_C2H_STAT_S_AXIS_C2H_ACCEPTED, - QDMA_OFFSET_C2H_STAT_S_AXIS_CMPT_ACCEPTED, - QDMA_OFFSET_C2H_STAT_DESC_RSP_PKT_ACCEPTED, - QDMA_OFFSET_C2H_STAT_AXIS_PKG_CMP, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_0, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_1, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_2, - QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_3, - QDMA_OFFSET_C2H_STAT_DESC_RSP_DROP_ACCEPTED, - QDMA_OFFSET_C2H_STAT_DESC_RSP_ERR_ACCEPTED - }; - int st_c2h_err_num_regs = sizeof(st_c2h_err_reg_list)/sizeof(uint32_t); - - for (i = 0; i < st_c2h_err_num_regs; i++) { - qdma_dump_reg_info(dev_hndl, st_c2h_err_reg_list[i], - 1, NULL, 0); - } -} - - -/*****************************************************************************/ -/** - * qdma_hw_get_error_name() - Function to get the error in string format - * - * @err_idx: error index - * - * Return: string - success and NULL on failure - *****************************************************************************/ -const char *qdma_hw_get_error_name(uint32_t err_idx) -{ - if (err_idx >= QDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, returning NULL\n", - __func__, (enum qdma_error_idx)err_idx); - return NULL; - } - - return qdma_err_info[(enum qdma_error_idx)err_idx].err_name; -} - -/*****************************************************************************/ -/** - * qdma_hw_error_process() - Function to find the error that got - * triggered and call the handler qdma_hw_error_handler of that - * particular error. - * - * @dev_hndl: device handle - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_error_process(void *dev_hndl) -{ - uint32_t glbl_err_stat = 0, err_stat = 0; - uint32_t bit = 0, i = 0; - int32_t idx = 0; - struct qdma_dev_attributes dev_cap; - uint32_t hw_err_position[TOTAL_LEAF_ERROR_AGGREGATORS] = { - QDMA_DSC_ERR_POISON, - QDMA_TRQ_ERR_UNMAPPED, - QDMA_ST_C2H_ERR_MTY_MISMATCH, - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - QDMA_SBE_ERR_MI_H2C0_DAT, - QDMA_DBE_ERR_MI_H2C0_DAT - }; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - glbl_err_stat = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_STAT); - if (!glbl_err_stat) - return QDMA_HW_ERR_NOT_DETECTED; - - qdma_log_info("addr = 0x%08x val = 0x%08x", - QDMA_OFFSET_GLBL_ERR_STAT, - glbl_err_stat); - for (i = 0; i < TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - bit = hw_err_position[i]; - - if ((!dev_cap.st_en) && (bit == QDMA_ST_C2H_ERR_MTY_MISMATCH || - bit == QDMA_ST_FATAL_ERR_MTY_MISMATCH || - bit == QDMA_ST_H2C_ERR_ZERO_LEN_DESC)) - continue; - - err_stat = qdma_reg_read(dev_hndl, - qdma_err_info[bit].stat_reg_addr); - - if (err_stat) { - qdma_log_info("addr = 0x%08x val = 0x%08x", - qdma_err_info[bit].stat_reg_addr, - err_stat); - - qdma_err_info[bit].qdma_hw_err_process( - dev_hndl); - - for (idx = bit; idx < all_hw_errs[i]; idx++) { - /* call the platform specific handler */ - if (err_stat & qdma_err_info[idx].leaf_err_mask) - qdma_log_error("%s detected %s", - __func__, - qdma_hw_get_error_name(idx)); - } - - qdma_reg_write(dev_hndl, - qdma_err_info[bit].stat_reg_addr, - err_stat); - - } - - } - - /* Write 1 to the global status register to clear the bits */ - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_STAT, glbl_err_stat); - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_hw_error_enable() - Function to enable all or a specific error - * - * @dev_hndl: device handle - * @err_idx: error index - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_hw_error_enable(void *dev_hndl, uint32_t err_idx) -{ - uint32_t idx = 0, i = 0; - uint32_t reg_val = 0; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (err_idx > QDMA_ERRS_ALL) { - qdma_log_error("%s: err_idx=%d is invalid, err:%d\n", - __func__, err_idx, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (err_idx == QDMA_ERRS_ALL) { - for (i = 0; i < TOTAL_LEAF_ERROR_AGGREGATORS; i++) { - - idx = all_hw_errs[i]; - - /* Don't access streaming registers in - * MM only bitstreams - */ - if (!dev_cap.st_en) { - if (idx == QDMA_ST_C2H_ERR_ALL || - idx == QDMA_ST_FATAL_ERR_ALL || - idx == QDMA_ST_H2C_ERR_ALL) - continue; - } - - reg_val = qdma_err_info[idx].leaf_err_mask; - qdma_reg_write(dev_hndl, - qdma_err_info[idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, - QDMA_OFFSET_GLBL_ERR_MASK); - reg_val |= FIELD_SET( - qdma_err_info[idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK, - reg_val); - } - - } else { - /* Don't access streaming registers in MM only bitstreams - * QDMA_C2H_ERR_MTY_MISMATCH to QDMA_H2C_ERR_ALL are all - * ST errors - */ - if (!dev_cap.st_en) { - if (err_idx >= QDMA_ST_C2H_ERR_MTY_MISMATCH && - err_idx <= QDMA_ST_H2C_ERR_ALL) - return QDMA_SUCCESS; - } - - reg_val = qdma_reg_read(dev_hndl, - qdma_err_info[err_idx].mask_reg_addr); - reg_val |= FIELD_SET(qdma_err_info[err_idx].leaf_err_mask, 1); - qdma_reg_write(dev_hndl, - qdma_err_info[err_idx].mask_reg_addr, reg_val); - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK); - reg_val |= FIELD_SET(qdma_err_info[err_idx].global_err_mask, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_ERR_MASK, reg_val); - } - - return QDMA_SUCCESS; -} - - -/*****************************************************************************/ -/** - * qdma_soft_dump_config_regs() - Function to get qdma config register dump in a - * buffer - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen) -{ - uint32_t i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs) / sizeof((qdma_config_regs)[0]); - uint32_t len = 0, val = 0; - int rv = QDMA_SUCCESS; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (buflen < qdma_soft_reg_dump_buf_len()) { - qdma_log_error("%s: Buffer too small, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - if (is_vf) { - qdma_log_error("%s: Wrong API used for VF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - reg_info = qdma_config_regs; - for (i = 0; i < num_regs; i++) { - if ((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) - continue; - - for (j = 0; j < reg_info[i].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", reg_info[i].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - val = qdma_reg_read(dev_hndl, - (reg_info[i].addr + (j * 4))); - rv = dump_reg(buf + len, buflen - len, - (reg_info[i].addr + (j * 4)), - name, val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - } - - return len; -} - -/* - * qdma_fill_intr_ctxt() - Helper function to fill interrupt context - * into structure - * - */ -static void qdma_fill_intr_ctxt(struct qdma_indirect_intr_ctxt *intr_ctxt) -{ - ind_intr_ctxt_entries[0].value = intr_ctxt->valid; - ind_intr_ctxt_entries[1].value = intr_ctxt->vec; - ind_intr_ctxt_entries[2].value = intr_ctxt->int_st; - ind_intr_ctxt_entries[3].value = intr_ctxt->color; - ind_intr_ctxt_entries[4].value = - intr_ctxt->baddr_4k & 0xFFFFFFFF; - ind_intr_ctxt_entries[5].value = - (intr_ctxt->baddr_4k >> 32) & 0xFFFFFFFF; - ind_intr_ctxt_entries[6].value = intr_ctxt->page_size; - ind_intr_ctxt_entries[7].value = intr_ctxt->pidx; - ind_intr_ctxt_entries[8].value = intr_ctxt->at; -} - - -static uint32_t qdma_intr_context_buf_len(void) -{ - uint32_t len = 0; - - len += (((sizeof(ind_intr_ctxt_entries) / - sizeof(ind_intr_ctxt_entries[0])) + 1) * - REG_DUMP_SIZE_PER_LINE); - return len; -} - -/* - * dump_intr_context() - Helper function to dump interrupt context into string - * - * return len - length of the string copied into buffer - */ -static int dump_intr_context(struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, int buf_sz) -{ - int i = 0; - int n; - int len = 0; - int rv; - char banner[DEBGFS_LINE_SZ]; - - qdma_fill_intr_ctxt(intr_ctx); - - for (i = 0; i < DEBGFS_LINE_SZ - 5; i++) { - rv = QDMA_SNPRINTF_S(banner + i, - (DEBGFS_LINE_SZ - i), - sizeof("-"), "-"); - if ((rv < 0) || (rv > (int)sizeof("-"))) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - } - - /* Interrupt context dump */ - n = sizeof(ind_intr_ctxt_entries) / - sizeof((ind_intr_ctxt_entries)[0]); - for (i = 0; i < n; i++) { - if ((len >= buf_sz) || ((len + DEBGFS_LINE_SZ) >= buf_sz)) - goto INSUF_BUF_EXIT; - - if (i == 0) { - if ((len + (3 * DEBGFS_LINE_SZ)) >= buf_sz) - goto INSUF_BUF_EXIT; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%50s %d", - "Interrupt Context for ring#", ring_index); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), - DEBGFS_LINE_SZ, "\n%s\n", banner); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - rv = QDMA_SNPRINTF_S(buf + len, (buf_sz - len), DEBGFS_LINE_SZ, - "%-47s %#-10x %u\n", - ind_intr_ctxt_entries[i].name, - ind_intr_ctxt_entries[i].value, - ind_intr_ctxt_entries[i].value); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - goto INSUF_BUF_EXIT; - } - len += rv; - } - - return len; - -INSUF_BUF_EXIT: - if (buf_sz > DEBGFS_LINE_SZ) { - rv = QDMA_SNPRINTF_S((buf + buf_sz - DEBGFS_LINE_SZ), - buf_sz, DEBGFS_LINE_SZ, - "\n\nInsufficient buffer size, partial context dump\n"); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%d:%s QDMA_SNPRINTF_S() failed, err:%d\n", - __LINE__, __func__, - rv); - } - } - - qdma_log_error("%s: Insufficient buffer size, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - - return -QDMA_ERR_NO_MEM; -} - - -/*****************************************************************************/ -/** - * qdma_dump_intr_context() - Function to get qdma interrupt context dump in a - * buffer - * - * @dev_hndl: device handle - * @hw_qid: queue id - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!intr_ctx) { - qdma_log_error("%s: intr_ctx is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - req_buflen = qdma_intr_context_buf_len(); - if (buflen < req_buflen) { - qdma_log_error("%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_intr_context(intr_ctx, ring_index, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_soft_dump_queue_context() - Function to get qdma queue context dump in a - * buffer - * - * @dev_hndl: device handle - * @st: Queue Mode (ST or MM) - * @q_type: Queue Type - * @ctxt_data: Context Data - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen) -{ - int rv = 0; - uint32_t req_buflen = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!ctxt_data) { - qdma_log_error("%s: ctxt_data is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: invalid q_type, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_soft_context_buf_len(st, q_type, &req_buflen); - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error( - "%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - rv = dump_soft_context(ctxt_data, st, q_type, buf, buflen); - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_read_dump_queue_context() - Function to read and dump the queue - * context in the user-provided buffer. This API is valid only for PF and - * should not be used for VFs. For VF's use qdma_dump_queue_context() API - * after reading the context through mailbox. - * - * @dev_hndl: device handle - * @is_vf: VF or PF - * @hw_qid: queue id - * @st: Queue Mode(ST or MM) - * @q_type: Queue type(H2C/C2H/CMPT)* - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: Length up-till the buffer is filled -success and < 0 - failure - *****************************************************************************/ -int qdma_soft_read_dump_queue_context(void *dev_hndl, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen) -{ - int rv = QDMA_SUCCESS; - uint32_t req_buflen = 0; - struct qdma_descq_context context; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - if (q_type >= QDMA_DEV_Q_TYPE_MAX) { - qdma_log_error("%s: Not supported for q_type, err = %d\n", - __func__, -QDMA_ERR_INV_PARAM); - - return -QDMA_ERR_INV_PARAM; - } - - rv = qdma_soft_context_buf_len(st, q_type, &req_buflen); - - if (rv != QDMA_SUCCESS) - return rv; - - if (buflen < req_buflen) { - qdma_log_error( - "%s: Too small buffer(%d), reqd(%d), err:%d\n", - __func__, buflen, req_buflen, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - - qdma_memset(&context, 0, sizeof(struct qdma_descq_context)); - - if (q_type != QDMA_DEV_Q_TYPE_CMPT) { - rv = qdma_sw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.sw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:sw ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_hw_ctx_conf(dev_hndl, (uint8_t)q_type, qid_hw, - &(context.hw_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:hw ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - rv = qdma_credit_ctx_conf(dev_hndl, (uint8_t)q_type, - qid_hw, - &(context.cr_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error("%s:cr ctxt read fail, err = %d", - __func__, rv); - return rv; - } - - if (st && (q_type == QDMA_DEV_Q_TYPE_C2H)) { - rv = qdma_pfetch_ctx_conf(dev_hndl, - qid_hw, &(context.pfetch_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s:pftch ctxt read fail, err = %d", - __func__, rv); - return rv; - } - } - } - - if ((st && (q_type == QDMA_DEV_Q_TYPE_C2H)) || - (!st && (q_type == QDMA_DEV_Q_TYPE_CMPT))) { - rv = qdma_cmpt_ctx_conf(dev_hndl, qid_hw, - &(context.cmpt_ctxt), - QDMA_HW_ACCESS_READ); - if (rv < 0) { - qdma_log_error( - "%s:cmpt ctxt read fail, err = %d", - __func__, rv); - return rv; - } - } - - rv = dump_soft_context(&context, st, q_type, buf, buflen); - - return rv; -} -/*****************************************************************************/ -/** - * qdma_is_legacy_intr_pend() - function to get legacy_intr_pending status bit - * - * @dev_hndl: device handle - * - * Return: legacy interrupt pending status bit value - *****************************************************************************/ -int qdma_is_legacy_intr_pend(void *dev_hndl) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - if (FIELD_GET(QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK, reg_val)) - return QDMA_SUCCESS; - - qdma_log_error("%s: no pending legacy intr, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR; -} - -/*****************************************************************************/ -/** - * qdma_clear_pend_legacy_intr() - function to clear legacy_intr_pending bit - * - * @dev_hndl: device handle - * - * Return: void - *****************************************************************************/ -int qdma_clear_pend_legacy_intr(void *dev_hndl) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK, 1); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_legacy_intr_conf() - function to disable/enable legacy interrupt - * - * @dev_hndl: device handle - * @enable: enable/disable flag. 1 - enable, 0 - disable - * - * Return: void - *****************************************************************************/ -int qdma_legacy_intr_conf(void *dev_hndl, enum status_type enable) -{ - uint32_t reg_val; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_INTR_CFG_EN_LGCY_INTR_MASK, enable); - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_INTERRUPT_CFG, reg_val); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_init_ctxt_memory() - function to initialize the context memory - * - * @dev_hndl: device handle - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_init_ctxt_memory(void *dev_hndl) -{ -#ifdef ENABLE_INIT_CTXT_MEMORY - uint32_t data[QDMA_REG_IND_CTXT_REG_COUNT]; - uint16_t i = 0; - struct qdma_dev_attributes dev_info; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_memset(data, 0, sizeof(uint32_t) * QDMA_REG_IND_CTXT_REG_COUNT); - qdma_get_device_attributes(dev_hndl, &dev_info); - - for (; i < dev_info.num_qs; i++) { - int sel = QDMA_CTXT_SEL_SW_C2H; - int rv; - - for (; sel <= QDMA_CTXT_SEL_PFTCH; sel++) { - /** if the st mode(h2c/c2h) not enabled - * in the design, then skip the PFTCH - * and CMPT context setup - */ - if ((dev_info.st_en == 0) && - ((sel == QDMA_CTXT_SEL_PFTCH) || - (sel == QDMA_CTXT_SEL_CMPT))) { - qdma_log_debug("%s: ST context is skipped:", - __func__); - qdma_log_debug("sel = %d\n", sel); - continue; - } - - rv = qdma_indirect_reg_clear(dev_hndl, - (enum ind_ctxt_cmd_sel)sel, i); - if (rv < 0) - return rv; - } - } - - /* fmap */ - for (i = 0; i < dev_info.num_pfs; i++) - qdma_indirect_reg_clear(dev_hndl, - QDMA_CTXT_SEL_FMAP, i); - -#else - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } -#endif - return QDMA_SUCCESS; - -} - -static int get_reg_entry(uint32_t reg_addr, int *reg_entry) -{ - uint32_t i = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs)/ - sizeof((qdma_config_regs)[0]); - - reg_info = qdma_config_regs; - - for (i = 0; (i < num_regs - 1); i++) { - if (reg_info[i].addr == reg_addr) { - *reg_entry = i; - break; - } - } - - if (i >= num_regs - 1) { - qdma_log_error("%s: 0x%08x is missing register list, err:%d\n", - __func__, - reg_addr, - -QDMA_ERR_INV_PARAM); - *reg_entry = -1; - return -QDMA_ERR_INV_PARAM; - } - - return 0; -} - -/*****************************************************************************/ -/** - * qdma_soft_dump_config_reg_list() - Dump the registers - * - * @dev_hndl: device handle - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * @buf : pointer to buffer to be filled - * @buflen : Length of the buffer - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_soft_dump_config_reg_list(void *dev_hndl, uint32_t total_regs, - struct qdma_reg_data *reg_list, char *buf, uint32_t buflen) -{ - uint32_t j = 0, len = 0; - uint32_t reg_count = 0; - int reg_data_entry; - int rv = 0; - char name[DEBGFS_GEN_NAME_SZ] = ""; - struct xreg_info *reg_info = qdma_config_regs; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!buf) { - qdma_log_error("%s: buf is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (reg_count = 0; - (reg_count < total_regs);) { - - rv = get_reg_entry(reg_list[reg_count].reg_addr, - ®_data_entry); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - - for (j = 0; j < reg_info[reg_data_entry].repeat; j++) { - rv = QDMA_SNPRINTF_S(name, DEBGFS_GEN_NAME_SZ, - DEBGFS_GEN_NAME_SZ, - "%s_%d", - reg_info[reg_data_entry].name, j); - if ((rv < 0) || (rv > DEBGFS_GEN_NAME_SZ)) { - qdma_log_error( - "%d:%s snprintf failed, err:%d\n", - __LINE__, __func__, - rv); - return -QDMA_ERR_NO_MEM; - } - rv = dump_reg(buf + len, buflen - len, - (reg_info[reg_data_entry].addr + (j * 4)), - name, - reg_list[reg_count + j].reg_val); - if (rv < 0) { - qdma_log_error( - "%s Buff too small, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - len += rv; - } - reg_count += j; - } - - return len; -} - - -/*****************************************************************************/ -/** - * qdma_read_reg_list() - read the register values - * - * @dev_hndl: device handle - * @is_vf: Whether PF or VF - * @total_regs : Max registers to read - * @reg_list : array of reg addr and reg values - * - * Return: returns the platform specific error code - *****************************************************************************/ -int qdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list) -{ - uint16_t reg_count = 0, i = 0, j = 0; - struct xreg_info *reg_info; - uint32_t num_regs = - sizeof(qdma_config_regs)/ - sizeof((qdma_config_regs)[0]); - struct qdma_dev_attributes dev_cap; - uint32_t reg_start_addr = 0; - int reg_index = 0; - int rv = 0; - - if (!is_vf) { - qdma_log_error("%s: not supported for PF, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!reg_list) { - qdma_log_error("%s: reg_list is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - switch (reg_rd_group) { - case QDMA_REG_READ_GROUP_1: - reg_start_addr = QDMA_REG_GROUP_1_START_ADDR; - break; - case QDMA_REG_READ_GROUP_2: - reg_start_addr = QDMA_REG_GROUP_2_START_ADDR; - break; - case QDMA_REG_READ_GROUP_3: - reg_start_addr = QDMA_REG_GROUP_3_START_ADDR; - break; - case QDMA_REG_READ_GROUP_4: - reg_start_addr = QDMA_REG_GROUP_4_START_ADDR; - break; - default: - qdma_log_error("%s: Invalid group received\n", - __func__); - return -QDMA_ERR_INV_PARAM; - } - - rv = get_reg_entry(reg_start_addr, ®_index); - if (rv < 0) { - qdma_log_error("%s: register missing in list, err:%d\n", - __func__, - -QDMA_ERR_INV_PARAM); - return rv; - } - reg_info = &qdma_config_regs[reg_index]; - - for (i = 0, reg_count = 0; - ((i < num_regs - 1 - reg_index) && - (reg_count < QDMA_MAX_REGISTER_DUMP)); i++) { - - if (((GET_CAPABILITY_MASK(dev_cap.mm_en, dev_cap.st_en, - dev_cap.mm_cmpt_en, dev_cap.mailbox_en) - & reg_info[i].mode) == 0) || - (reg_info[i].read_type == QDMA_REG_READ_PF_ONLY)) - continue; - - for (j = 0; j < reg_info[i].repeat && - (reg_count < QDMA_MAX_REGISTER_DUMP); - j++) { - reg_list[reg_count].reg_addr = - (reg_info[i].addr + (j * 4)); - reg_list[reg_count].reg_val = - qdma_reg_read(dev_hndl, - reg_list[reg_count].reg_addr); - reg_count++; - } - } - - *total_regs = reg_count; - return rv; -} - -/*****************************************************************************/ -/** - * qdma_write_global_ring_sizes() - function to set the global ring size array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_rng_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_RING_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_ring_sizes() - function to get the global rng_sz array - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_rng_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_ring_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_rng_sz) -{ - if (!dev_hndl || !glbl_rng_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_rng_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_rng_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_RING_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_GLBL_RNG_SZ, index, count, - glbl_rng_sz); - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_timer_count() - function to set the timer values - * - * @dev_hndl: device handle - * @glbl_tmr_cnt: pointer to the array having the values to write - * @index: Index from where the values needs to written - * @count: number of entries to be written - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_TIMER_CNT, - index, count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_timer_count() - function to get the timer values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_tmr_cnt: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_timer_count(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_tmr_cnt) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_tmr_cnt || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_tmr_cnt=%p, err:%d\n", - __func__, dev_hndl, glbl_tmr_cnt, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_TIMERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_TIMERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, - QDMA_OFFSET_C2H_TIMER_CNT, index, - count, glbl_tmr_cnt); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_counter_threshold() - function to set the counter - * threshold values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_cnt_th: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_counter_threshold() - function to get the counter threshold - * values - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_cnt_th: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_counter_threshold(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_cnt_th) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_cnt_th || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_cnt_th=%p, err:%d\n", - __func__, dev_hndl, glbl_cnt_th, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_COUNTERS) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_COUNTERS, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_C2H_CNT_TH, index, - count, glbl_cnt_th); - else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_write_global_buffer_sizes() - function to set the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to written - * @count: number of entries to be written - * @glbl_buf_sz: pointer to the array having the values to write - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_write_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, const uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_write_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_read_global_buffer_sizes() - function to get the buffer sizes - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @glbl_buf_sz: pointer to array to hold the values read - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_read_global_buffer_sizes(void *dev_hndl, uint8_t index, - uint8_t count, uint32_t *glbl_buf_sz) -{ - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl || !glbl_buf_sz || !count) { - qdma_log_error("%s: dev_hndl=%p glbl_buf_sz=%p, err:%d\n", - __func__, dev_hndl, glbl_buf_sz, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if ((index + count) > QDMA_NUM_C2H_BUFFER_SIZES) { - qdma_log_error("%s: index=%u count=%u > %d, err:%d\n", - __func__, index, count, - QDMA_NUM_C2H_BUFFER_SIZES, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en) - qdma_read_csr_values(dev_hndl, QDMA_OFFSET_C2H_BUF_SZ, index, - count, glbl_buf_sz); - else { - qdma_log_error("%s: ST is not supported, err:%d\n", - __func__, - -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_csr_conf() - function to configure global csr - * - * @dev_hndl: device handle - * @index: Index from where the values needs to read - * @count: number of entries to be read - * @csr_val: uint32_t pointer to csr value - * @csr_type: Type of the CSR (qdma_global_csr_type enum) to configure - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * (index + count) shall not be more than 16 - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (csr_type) { - case QDMA_CSR_RING_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_read_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_write_global_ring_sizes( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_TIMER_CNT: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_read_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_write_global_timer_count( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_CNT_TH: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_read_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_write_global_counter_threshold( - dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - case QDMA_CSR_BUF_SZ: - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = - qdma_read_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - case QDMA_HW_ACCESS_WRITE: - rv = - qdma_write_global_buffer_sizes(dev_hndl, - index, - count, - csr_val); - break; - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - break; - default: - qdma_log_error("%s: csr_type(%d) invalid, err:%d\n", - __func__, - csr_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_write() - function to set the writeback - * interval - * - * @dev_hndl device handle - * @wb_int: Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_global_writeback_interval_write(void *dev_hndl, - enum qdma_wrb_interval wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (wb_int >= QDMA_NUM_WRB_INTERVALS) { - qdma_log_error("%s: wb_int=%d is invalid, err:%d\n", - __func__, wb_int, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG); - reg_val |= FIELD_SET(QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, wb_int); - - qdma_reg_write(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_read() - function to get the writeback - * interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -static int qdma_global_writeback_interval_read(void *dev_hndl, - enum qdma_wrb_interval *wb_int) -{ - uint32_t reg_val; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - if (!wb_int) { - qdma_log_error("%s: wb_int is NULL, err:%d\n", __func__, - -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.st_en || dev_cap.mm_cmpt_en) { - reg_val = qdma_reg_read(dev_hndl, QDMA_OFFSET_GLBL_DSC_CFG); - *wb_int = (enum qdma_wrb_interval)FIELD_GET( - QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK, reg_val); - } else { - qdma_log_error("%s: ST or MM cmpt not supported, err:%d\n", - __func__, -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED); - return -QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED; - } - - return QDMA_SUCCESS; -} - -/*****************************************************************************/ -/** - * qdma_global_writeback_interval_conf() - function to configure - * the writeback interval - * - * @dev_hndl: device handle - * @wb_int: pointer to the data to hold Writeback Interval - * @access_type HW access type (qdma_hw_access_type enum) value - * QDMA_HW_ACCESS_CLEAR - Not supported - * QDMA_HW_ACCESS_INVALIDATE - Not supported - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type) -{ - int rv = QDMA_SUCCESS; - - switch (access_type) { - case QDMA_HW_ACCESS_READ: - rv = qdma_global_writeback_interval_read(dev_hndl, wb_int); - break; - case QDMA_HW_ACCESS_WRITE: - rv = qdma_global_writeback_interval_write(dev_hndl, *wb_int); - break; - case QDMA_HW_ACCESS_CLEAR: - case QDMA_HW_ACCESS_INVALIDATE: - default: - qdma_log_error("%s: access_type(%d) invalid, err:%d\n", - __func__, - access_type, - -QDMA_ERR_INV_PARAM); - rv = -QDMA_ERR_INV_PARAM; - break; - } - - return rv; -} - - -/*****************************************************************************/ -/** - * qdma_mm_channel_conf() - Function to enable/disable the MM channel - * - * @dev_hndl: device handle - * @channel: MM channel number - * @is_c2h: Queue direction. Set 1 for C2H and 0 for H2C - * @enable: Enable or disable MM channel - * - * Presently, we have only 1 MM channel - * - * Return: 0 - success and < 0 - failure - *****************************************************************************/ -int qdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable) -{ - uint32_t reg_addr = (is_c2h) ? QDMA_OFFSET_C2H_MM_CONTROL : - QDMA_OFFSET_H2C_MM_CONTROL; - struct qdma_dev_attributes dev_cap; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - qdma_get_device_attributes(dev_hndl, &dev_cap); - - if (dev_cap.mm_en) { - qdma_reg_write(dev_hndl, - reg_addr + (channel * QDMA_MM_CONTROL_STEP), - enable); - } - - return QDMA_SUCCESS; -} - - -int qdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen) -{ - uint32_t total_num_regs = qdma_get_config_num_regs(); - struct xreg_info *config_regs = qdma_get_config_regs(); - const char *bitfield_name; - uint32_t i = 0, num_regs_idx = 0, k = 0, j = 0, - bitfield = 0, lsb = 0, msb = 31; - int rv = 0; - uint32_t reg_val; - uint32_t data_len = 0; - - if (!dev_hndl) { - qdma_log_error("%s: dev_handle is NULL, err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - return -QDMA_ERR_INV_PARAM; - } - - for (i = 0; i < total_num_regs; i++) { - if (reg_addr == config_regs[i].addr) { - j = i; - break; - } - } - - if (i == total_num_regs) { - qdma_log_error("%s: Register not found err:%d\n", - __func__, -QDMA_ERR_INV_PARAM); - if (buf) - QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "Register not found 0x%x\n", reg_addr); - return -QDMA_ERR_INV_PARAM; - } - - num_regs_idx = (j + num_regs < total_num_regs) ? - (j + num_regs) : total_num_regs; - - for (; j < num_regs_idx ; j++) { - reg_val = qdma_reg_read(dev_hndl, - config_regs[j].addr); - - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "\n%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info("%-40s 0x%-7x %-#10x %-10d\n", - config_regs[j].name, - config_regs[j].addr, - reg_val, reg_val); - - - for (k = 0; - k < config_regs[j].num_bitfields; k++) { - - bitfield = - config_regs[j].bitfields[k].field_mask; - bitfield_name = - config_regs[i].bitfields[k].field_name; - lsb = 0; - msb = 31; - - while (!(BIT(lsb) & bitfield)) - lsb++; - - while (!(BIT(msb) & bitfield)) - msb--; - - if (msb != lsb) { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%2u,%2u] %#-10x\n", - bitfield_name, - msb, lsb, - (reg_val & bitfield) >> lsb); - - - } else { - if (buf) { - rv = QDMA_SNPRINTF_S(buf, buflen, - DEBGFS_LINE_SZ, - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> - lsb); - if ((rv < 0) || (rv > DEBGFS_LINE_SZ)) { - qdma_log_error( - "%s: Insufficient buffer, err:%d\n", - __func__, - -QDMA_ERR_NO_MEM); - return -QDMA_ERR_NO_MEM; - } - buf += rv; - data_len += rv; - buflen -= rv; - } else - qdma_log_info( - "%-40s [%5u] %#-10x\n", - bitfield_name, - lsb, - (reg_val & bitfield) >> lsb); - - } - } - } - - return data_len; - -} - diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_access.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_access.h deleted file mode 100644 index f71ee57..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_access.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_SOFT_ACCESS_H_ -#define __QDMA_SOFT_ACCESS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DOC: QDMA common library interface definitions - * - * Header file *qdma_access.h* defines data structures and function signatures - * exported by QDMA common library. - */ - -#include "qdma_platform.h" - -/** - * enum qdma_error_idx - qdma errors - */ -enum qdma_error_idx { - /* Descriptor errors */ - QDMA_DSC_ERR_POISON, - QDMA_DSC_ERR_UR_CA, - QDMA_DSC_ERR_PARAM, - QDMA_DSC_ERR_ADDR, - QDMA_DSC_ERR_TAG, - QDMA_DSC_ERR_FLR, - QDMA_DSC_ERR_TIMEOUT, - QDMA_DSC_ERR_DAT_POISON, - QDMA_DSC_ERR_FLR_CANCEL, - QDMA_DSC_ERR_DMA, - QDMA_DSC_ERR_DSC, - QDMA_DSC_ERR_RQ_CANCEL, - QDMA_DSC_ERR_DBE, - QDMA_DSC_ERR_SBE, - QDMA_DSC_ERR_ALL, - - /* TRQ Errors */ - QDMA_TRQ_ERR_UNMAPPED, - QDMA_TRQ_ERR_QID_RANGE, - QDMA_TRQ_ERR_VF_ACCESS, - QDMA_TRQ_ERR_TCP_TIMEOUT, - QDMA_TRQ_ERR_ALL, - - /* C2H Errors */ - QDMA_ST_C2H_ERR_MTY_MISMATCH, - QDMA_ST_C2H_ERR_LEN_MISMATCH, - QDMA_ST_C2H_ERR_QID_MISMATCH, - QDMA_ST_C2H_ERR_DESC_RSP_ERR, - QDMA_ST_C2H_ERR_ENG_WPL_DATA_PAR_ERR, - QDMA_ST_C2H_ERR_MSI_INT_FAIL, - QDMA_ST_C2H_ERR_ERR_DESC_CNT, - QDMA_ST_C2H_ERR_PORTID_CTXT_MISMATCH, - QDMA_ST_C2H_ERR_PORTID_BYP_IN_MISMATCH, - QDMA_ST_C2H_ERR_CMPT_INV_Q_ERR, - QDMA_ST_C2H_ERR_CMPT_QFULL_ERR, - QDMA_ST_C2H_ERR_CMPT_CIDX_ERR, - QDMA_ST_C2H_ERR_CMPT_PRTY_ERR, - QDMA_ST_C2H_ERR_ALL, - - /* Fatal Errors */ - QDMA_ST_FATAL_ERR_MTY_MISMATCH, - QDMA_ST_FATAL_ERR_LEN_MISMATCH, - QDMA_ST_FATAL_ERR_QID_MISMATCH, - QDMA_ST_FATAL_ERR_TIMER_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_PFCH_II_RAM_RDBE, - QDMA_ST_FATAL_ERR_CMPT_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_PFCH_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_INT_CTXT_RAM_RDBE, - QDMA_ST_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE, - QDMA_ST_FATAL_ERR_TUSER_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_QID_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE, - QDMA_ST_FATAL_ERR_WPL_DATA_PAR, - QDMA_ST_FATAL_ERR_ALL, - - /* H2C Errors */ - QDMA_ST_H2C_ERR_ZERO_LEN_DESC, - QDMA_ST_H2C_ERR_CSI_MOP, - QDMA_ST_H2C_ERR_NO_DMA_DSC, - QDMA_ST_H2C_ERR_SBE, - QDMA_ST_H2C_ERR_DBE, - QDMA_ST_H2C_ERR_ALL, - - /* Single bit errors */ - QDMA_SBE_ERR_MI_H2C0_DAT, - QDMA_SBE_ERR_MI_C2H0_DAT, - QDMA_SBE_ERR_H2C_RD_BRG_DAT, - QDMA_SBE_ERR_H2C_WR_BRG_DAT, - QDMA_SBE_ERR_C2H_RD_BRG_DAT, - QDMA_SBE_ERR_C2H_WR_BRG_DAT, - QDMA_SBE_ERR_FUNC_MAP, - QDMA_SBE_ERR_DSC_HW_CTXT, - QDMA_SBE_ERR_DSC_CRD_RCV, - QDMA_SBE_ERR_DSC_SW_CTXT, - QDMA_SBE_ERR_DSC_CPLI, - QDMA_SBE_ERR_DSC_CPLD, - QDMA_SBE_ERR_PASID_CTXT_RAM, - QDMA_SBE_ERR_TIMER_FIFO_RAM, - QDMA_SBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_SBE_ERR_QID_FIFO_RAM, - QDMA_SBE_ERR_TUSER_FIFO_RAM, - QDMA_SBE_ERR_WRB_COAL_DATA_RAM, - QDMA_SBE_ERR_INT_QID2VEC_RAM, - QDMA_SBE_ERR_INT_CTXT_RAM, - QDMA_SBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_SBE_ERR_PFCH_CTXT_RAM, - QDMA_SBE_ERR_WRB_CTXT_RAM, - QDMA_SBE_ERR_PFCH_LL_RAM, - QDMA_SBE_ERR_H2C_PEND_FIFO, - QDMA_SBE_ERR_ALL, - - /* Double bit Errors */ - QDMA_DBE_ERR_MI_H2C0_DAT, - QDMA_DBE_ERR_MI_C2H0_DAT, - QDMA_DBE_ERR_H2C_RD_BRG_DAT, - QDMA_DBE_ERR_H2C_WR_BRG_DAT, - QDMA_DBE_ERR_C2H_RD_BRG_DAT, - QDMA_DBE_ERR_C2H_WR_BRG_DAT, - QDMA_DBE_ERR_FUNC_MAP, - QDMA_DBE_ERR_DSC_HW_CTXT, - QDMA_DBE_ERR_DSC_CRD_RCV, - QDMA_DBE_ERR_DSC_SW_CTXT, - QDMA_DBE_ERR_DSC_CPLI, - QDMA_DBE_ERR_DSC_CPLD, - QDMA_DBE_ERR_PASID_CTXT_RAM, - QDMA_DBE_ERR_TIMER_FIFO_RAM, - QDMA_DBE_ERR_PAYLOAD_FIFO_RAM, - QDMA_DBE_ERR_QID_FIFO_RAM, - QDMA_DBE_ERR_TUSER_FIFO_RAM, - QDMA_DBE_ERR_WRB_COAL_DATA_RAM, - QDMA_DBE_ERR_INT_QID2VEC_RAM, - QDMA_DBE_ERR_INT_CTXT_RAM, - QDMA_DBE_ERR_DESC_REQ_FIFO_RAM, - QDMA_DBE_ERR_PFCH_CTXT_RAM, - QDMA_DBE_ERR_WRB_CTXT_RAM, - QDMA_DBE_ERR_PFCH_LL_RAM, - QDMA_DBE_ERR_H2C_PEND_FIFO, - QDMA_DBE_ERR_ALL, - - QDMA_ERRS_ALL -}; - -struct qdma_hw_err_info { - enum qdma_error_idx idx; - const char *err_name; - uint32_t mask_reg_addr; - uint32_t stat_reg_addr; - uint32_t leaf_err_mask; - uint32_t global_err_mask; - void (*qdma_hw_err_process)(void *dev_hndl); -}; - - -int qdma_set_default_global_csr(void *dev_hndl); - -int qdma_get_version(void *dev_hndl, uint8_t is_vf, - struct qdma_hw_version_info *version_info); - -int qdma_pfetch_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_prefetch_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_sw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_sw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_fmap_conf(void *dev_hndl, uint16_t func_id, - struct qdma_fmap_cfg *config, - enum qdma_hw_access_type access_type); - -int qdma_cmpt_ctx_conf(void *dev_hndl, uint16_t hw_qid, - struct qdma_descq_cmpt_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_hw_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_hw_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_credit_ctx_conf(void *dev_hndl, uint8_t c2h, uint16_t hw_qid, - struct qdma_descq_credit_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_indirect_intr_ctx_conf(void *dev_hndl, uint16_t ring_index, - struct qdma_indirect_intr_ctxt *ctxt, - enum qdma_hw_access_type access_type); - -int qdma_queue_pidx_update(void *dev_hndl, uint8_t is_vf, uint16_t qid, - uint8_t is_c2h, const struct qdma_q_pidx_reg_info *reg_info); - -int qdma_queue_cmpt_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_q_cmpt_cidx_reg_info *reg_info); - -int qdma_queue_intr_cidx_update(void *dev_hndl, uint8_t is_vf, - uint16_t qid, const struct qdma_intr_cidx_reg_info *reg_info); - -int qdma_init_ctxt_memory(void *dev_hndl); - -int qdma_legacy_intr_conf(void *dev_hndl, enum status_type enable); - -int qdma_clear_pend_legacy_intr(void *dev_hndl); - -int qdma_is_legacy_intr_pend(void *dev_hndl); - -int qdma_dump_intr_context(void *dev_hndl, - struct qdma_indirect_intr_ctxt *intr_ctx, - int ring_index, - char *buf, uint32_t buflen); - -uint32_t qdma_soft_reg_dump_buf_len(void); - -uint32_t qdma_get_config_num_regs(void); - -struct xreg_info *qdma_get_config_regs(void); - -int qdma_soft_context_buf_len(uint8_t st, - enum qdma_dev_q_type q_type, uint32_t *buflen); - -int qdma_soft_dump_config_regs(void *dev_hndl, uint8_t is_vf, - char *buf, uint32_t buflen); - -int qdma_soft_dump_queue_context(void *dev_hndl, - uint8_t st, - enum qdma_dev_q_type q_type, - struct qdma_descq_context *ctxt_data, - char *buf, uint32_t buflen); - -int qdma_soft_read_dump_queue_context(void *dev_hndl, - uint16_t qid_hw, - uint8_t st, - enum qdma_dev_q_type q_type, - char *buf, uint32_t buflen); - -int qdma_hw_error_process(void *dev_hndl); - -const char *qdma_hw_get_error_name(uint32_t err_idx); - -int qdma_hw_error_enable(void *dev_hndl, uint32_t err_idx); - -int qdma_get_device_attributes(void *dev_hndl, - struct qdma_dev_attributes *dev_info); - -int qdma_get_user_bar(void *dev_hndl, uint8_t is_vf, - uint8_t func_id, uint8_t *user_bar); - -int qdma_soft_dump_config_reg_list(void *dev_hndl, - uint32_t total_regs, - struct qdma_reg_data *reg_list, - char *buf, uint32_t buflen); - -int qdma_read_reg_list(void *dev_hndl, uint8_t is_vf, - uint16_t reg_rd_group, - uint16_t *total_regs, - struct qdma_reg_data *reg_list); - -int qdma_global_csr_conf(void *dev_hndl, uint8_t index, uint8_t count, - uint32_t *csr_val, - enum qdma_global_csr_type csr_type, - enum qdma_hw_access_type access_type); - -int qdma_global_writeback_interval_conf(void *dev_hndl, - enum qdma_wrb_interval *wb_int, - enum qdma_hw_access_type access_type); - -int qdma_mm_channel_conf(void *dev_hndl, uint8_t channel, uint8_t is_c2h, - uint8_t enable); - -int qdma_dump_reg_info(void *dev_hndl, uint32_t reg_addr, - uint32_t num_regs, char *buf, uint32_t buflen); - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_SOFT_ACCESS_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_reg.h b/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_reg.h deleted file mode 100644 index 38b35e9..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_access/qdma_soft_access/qdma_soft_reg.h +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef __QDMA_SOFT_REG_H__ -#define __QDMA_SOFT_REG_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * User defined helper macros for masks and shifts. If the same macros are - * defined in linux kernel code , then undefined them and used the user - * defined macros - */ -#ifdef CHAR_BIT -#undef CHAR_BIT -#endif -#define CHAR_BIT 8 - -#ifdef BIT -#undef BIT -#endif -#define BIT(n) (1u << (n)) - -#ifdef BITS_PER_BYTE -#undef BITS_PER_BYTE -#endif -#define BITS_PER_BYTE CHAR_BIT - -#ifdef BITS_PER_LONG -#undef BITS_PER_LONG -#endif -#define BITS_PER_LONG (sizeof(uint32_t) * BITS_PER_BYTE) - -#ifdef BITS_PER_LONG_LONG -#undef BITS_PER_LONG_LONG -#endif -#define BITS_PER_LONG_LONG (sizeof(uint64_t) * BITS_PER_BYTE) - -#ifdef GENMASK -#undef GENMASK -#endif -#define GENMASK(h, l) \ - ((0xFFFFFFFF << (l)) & (0xFFFFFFFF >> (BITS_PER_LONG - 1 - (h)))) - -#ifdef GENMASK_ULL -#undef GENMASK_ULL -#endif -#define GENMASK_ULL(h, l) \ - ((0xFFFFFFFFFFFFFFFF << (l)) & \ - (0xFFFFFFFFFFFFFFFF >> (BITS_PER_LONG_LONG - 1 - (h)))) - - -#define DEBGFS_LINE_SZ (81) - - -#define QDMA_H2C_THROT_DATA_THRESH 0x4000 -#define QDMA_THROT_EN_DATA 1 -#define QDMA_THROT_EN_REQ 0 -#define QDMA_H2C_THROT_REQ_THRESH 0x60 - -/* - * Q Context programming (indirect) - */ - -#define QDMA_REG_IND_CTXT_REG_COUNT 8 -#define QDMA_REG_IND_CTXT_WCNT_1 1 -#define QDMA_REG_IND_CTXT_WCNT_2 2 -#define QDMA_REG_IND_CTXT_WCNT_3 3 -#define QDMA_REG_IND_CTXT_WCNT_4 4 -#define QDMA_REG_IND_CTXT_WCNT_5 5 -#define QDMA_REG_IND_CTXT_WCNT_6 6 -#define QDMA_REG_IND_CTXT_WCNT_7 7 -#define QDMA_REG_IND_CTXT_WCNT_8 8 - -/* ------------------------- QDMA_TRQ_SEL_IND (0x00800) ----------------*/ -#define QDMA_OFFSET_IND_CTXT_DATA 0x804 -#define QDMA_OFFSET_IND_CTXT_MASK 0x824 -#define QDMA_OFFSET_IND_CTXT_CMD 0x844 -#define QDMA_IND_CTXT_CMD_BUSY_MASK 0x1 - -/** QDMA_IND_REG_SEL_FMAP */ -#define QDMA_FMAP_CTXT_W1_QID_MAX_MASK GENMASK(11, 0) -#define QDMA_FMAP_CTXT_W0_QID_MASK GENMASK(10, 0) - -/** QDMA_IND_REG_SEL_SW_C2H */ -/** QDMA_IND_REG_SEL_SW_H2C */ -#define QDMA_SW_CTXT_W4_INTR_AGGR_MASK BIT(11) -#define QDMA_SW_CTXT_W4_VEC_MASK GENMASK(10, 0) -#define QDMA_SW_CTXT_W3_DSC_H_MASK GENMASK(31, 0) -#define QDMA_SW_CTXT_W2_DSC_L_MASK GENMASK(31, 0) -#define QDMA_SW_CTXT_W1_IS_MM_MASK BIT(31) -#define QDMA_SW_CTXT_W1_MRKR_DIS_MASK BIT(30) -#define QDMA_SW_CTXT_W1_IRQ_REQ_MASK BIT(29) -#define QDMA_SW_CTXT_W1_ERR_WB_SENT_MASK BIT(28) -#define QDMA_SW_CTXT_W1_ERR_MASK GENMASK(27, 26) -#define QDMA_SW_CTXT_W1_IRQ_NO_LAST_MASK BIT(25) -#define QDMA_SW_CTXT_W1_PORT_ID_MASK GENMASK(24, 22) -#define QDMA_SW_CTXT_W1_IRQ_EN_MASK BIT(21) -#define QDMA_SW_CTXT_W1_WBK_EN_MASK BIT(20) -#define QDMA_SW_CTXT_W1_MM_CHN_MASK BIT(19) -#define QDMA_SW_CTXT_W1_BYP_MASK BIT(18) -#define QDMA_SW_CTXT_W1_DSC_SZ_MASK GENMASK(17, 16) -#define QDMA_SW_CTXT_W1_RNG_SZ_MASK GENMASK(15, 12) -#define QDMA_SW_CTXT_W1_FETCH_MAX_MASK GENMASK(7, 5) -#define QDMA_SW_CTXT_W1_AT_MASK BIT(4) -#define QDMA_SW_CTXT_W1_WB_INT_EN_MASK BIT(3) -#define QDMA_SW_CTXT_W1_WBI_CHK_MASK BIT(2) -#define QDMA_SW_CTXT_W1_FCRD_EN_MASK BIT(1) -#define QDMA_SW_CTXT_W1_QEN_MASK BIT(0) -#define QDMA_SW_CTXT_W0_FUNC_ID_MASK GENMASK(24, 17) -#define QDMA_SW_CTXT_W0_IRQ_ARM_MASK BIT(16) -#define QDMA_SW_CTXT_W0_PIDX GENMASK(15, 0) - - - -#define QDMA_PFTCH_CTXT_W1_VALID_MASK BIT(13) -#define QDMA_PFTCH_CTXT_W1_SW_CRDT_H_MASK GENMASK(12, 0) -#define QDMA_PFTCH_CTXT_W0_SW_CRDT_L_MASK GENMASK(31, 29) -#define QDMA_PFTCH_CTXT_W0_Q_IN_PFETCH_MASK BIT(28) -#define QDMA_PFTCH_CTXT_W0_PFETCH_EN_MASK BIT(27) -#define QDMA_PFTCH_CTXT_W0_ERR_MASK BIT(26) -#define QDMA_PFTCH_CTXT_W0_PORT_ID_MASK GENMASK(7, 5) -#define QDMA_PFTCH_CTXT_W0_BUF_SIZE_IDX_MASK GENMASK(4, 1) -#define QDMA_PFTCH_CTXT_W0_BYPASS_MASK BIT(0) - - - - -#define QDMA_COMPL_CTXT_W4_INTR_AGGR_MASK BIT(15) -#define QDMA_COMPL_CTXT_W4_INTR_VEC_MASK GENMASK(14, 4) -#define QDMA_COMPL_CTXT_W4_AT_MASK BIT(3) -#define QDMA_COMPL_CTXT_W4_OVF_CHK_DIS_MASK BIT(2) -#define QDMA_COMPL_CTXT_W4_FULL_UPDT_MASK BIT(1) -#define QDMA_COMPL_CTXT_W4_TMR_RUN_MASK BIT(0) -#define QDMA_COMPL_CTXT_W3_USR_TRG_PND_MASK BIT(31) -#define QDMA_COMPL_CTXT_W3_ERR_MASK GENMASK(30, 29) -#define QDMA_COMPL_CTXT_W3_VALID_MASK BIT(28) -#define QDMA_COMPL_CTXT_W3_CIDX_MASK GENMASK(27, 12) -#define QDMA_COMPL_CTXT_W3_PIDX_H_MASK GENMASK(11, 0) -#define QDMA_COMPL_CTXT_W2_PIDX_L_MASK GENMASK(31, 28) -#define QDMA_COMPL_CTXT_W2_DESC_SIZE_MASK GENMASK(27, 26) -#define QDMA_COMPL_CTXT_W2_BADDR_64_H_MASK GENMASK(25, 0) -#define QDMA_COMPL_CTXT_W1_BADDR_64_L_MASK GENMASK(31, 6) -#define QDMA_COMPL_CTXT_W0_RING_SZ_MASK GENMASK(31, 28) -#define QDMA_COMPL_CTXT_W0_COLOR_MASK BIT(27) -#define QDMA_COMPL_CTXT_W0_INT_ST_MASK GENMASK(26, 25) -#define QDMA_COMPL_CTXT_W0_TIMER_IDX_MASK GENMASK(24, 21) -#define QDMA_COMPL_CTXT_W0_COUNTER_IDX_MASK GENMASK(20, 17) -#define QDMA_COMPL_CTXT_W0_FNC_ID_MASK GENMASK(12, 5) -#define QDMA_COMPL_CTXT_W0_TRIG_MODE_MASK GENMASK(4, 2) -#define QDMA_COMPL_CTXT_W0_EN_INT_MASK BIT(1) -#define QDMA_COMPL_CTXT_W0_EN_STAT_DESC_MASK BIT(0) - -/** QDMA_IND_REG_SEL_HW_C2H */ -/** QDMA_IND_REG_SEL_HW_H2C */ -#define QDMA_HW_CTXT_W1_FETCH_PEND_MASK GENMASK(14, 11) -#define QDMA_HW_CTXT_W1_EVENT_PEND_MASK BIT(10) -#define QDMA_HW_CTXT_W1_IDL_STP_B_MASK BIT(9) -#define QDMA_HW_CTXT_W1_DSC_PND_MASK BIT(8) -#define QDMA_HW_CTXT_W0_CRD_USE_MASK GENMASK(31, 16) -#define QDMA_HW_CTXT_W0_CIDX_MASK GENMASK(15, 0) - -/** QDMA_IND_REG_SEL_CR_C2H */ -/** QDMA_IND_REG_SEL_CR_H2C */ -#define QDMA_CR_CTXT_W0_CREDT_MASK GENMASK(15, 0) - -/** QDMA_IND_REG_SEL_INTR */ - - -#define QDMA_INTR_CTXT_W2_AT_MASK BIT(18) -#define QDMA_INTR_CTXT_W2_PIDX_MASK GENMASK(17, 6) -#define QDMA_INTR_CTXT_W2_PAGE_SIZE_MASK GENMASK(5, 3) -#define QDMA_INTR_CTXT_W2_BADDR_64_MASK GENMASK(2, 0) -#define QDMA_INTR_CTXT_W1_BADDR_64_MASK GENMASK(31, 0) -#define QDMA_INTR_CTXT_W0_BADDR_64_MASK GENMASK(31, 15) -#define QDMA_INTR_CTXT_W0_COLOR_MASK BIT(14) -#define QDMA_INTR_CTXT_W0_INT_ST_MASK BIT(13) -#define QDMA_INTR_CTXT_W0_VEC_ID_MASK GENMASK(11, 1) -#define QDMA_INTR_CTXT_W0_VALID_MASK BIT(0) - - - - - -/* ------------------------ QDMA_TRQ_SEL_GLBL (0x00200)-------------------*/ -#define QDMA_OFFSET_GLBL_RNG_SZ 0x204 -#define QDMA_OFFSET_GLBL_SCRATCH 0x244 -#define QDMA_OFFSET_GLBL_ERR_STAT 0x248 -#define QDMA_OFFSET_GLBL_ERR_MASK 0x24C -#define QDMA_OFFSET_GLBL_DSC_CFG 0x250 -#define QDMA_GLBL_DSC_CFG_WB_ACC_INT_MASK GENMASK(2, 0) -#define QDMA_GLBL_DSC_CFG_MAX_DSC_FETCH_MASK GENMASK(5, 3) -#define QDMA_OFFSET_GLBL_DSC_ERR_STS 0x254 -#define QDMA_OFFSET_GLBL_DSC_ERR_MSK 0x258 -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG0 0x25C -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG1 0x260 -#define QDMA_OFFSET_GLBL_TRQ_ERR_STS 0x264 -#define QDMA_OFFSET_GLBL_TRQ_ERR_MSK 0x268 -#define QDMA_OFFSET_GLBL_TRQ_ERR_LOG 0x26C -#define QDMA_OFFSET_GLBL_DSC_DBG_DAT0 0x270 -#define QDMA_OFFSET_GLBL_DSC_DBG_DAT1 0x274 -#define QDMA_OFFSET_GLBL_DSC_ERR_LOG2 0x27C -#define QDMA_OFFSET_GLBL_INTERRUPT_CFG 0x2C4 -#define QDMA_GLBL_INTR_CFG_EN_LGCY_INTR_MASK BIT(0) -#define QDMA_GLBL_INTR_LGCY_INTR_PEND_MASK BIT(1) - -/* ------------------------- QDMA_TRQ_SEL_C2H (0x00A00) ------------------*/ -#define QDMA_OFFSET_C2H_TIMER_CNT 0xA00 -#define QDMA_OFFSET_C2H_CNT_TH 0xA40 -#define QDMA_OFFSET_C2H_QID2VEC_MAP_QID 0xA80 -#define QDMA_OFFSET_C2H_QID2VEC_MAP 0xA84 -#define QDMA_OFFSET_C2H_STAT_S_AXIS_C2H_ACCEPTED 0xA88 -#define QDMA_OFFSET_C2H_STAT_S_AXIS_CMPT_ACCEPTED 0xA8C -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_PKT_ACCEPTED 0xA90 -#define QDMA_OFFSET_C2H_STAT_AXIS_PKG_CMP 0xA94 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_ACCEPTED 0xA98 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_CMP 0xA9C -#define QDMA_OFFSET_C2H_STAT_WRQ_OUT 0xAA0 -#define QDMA_OFFSET_C2H_STAT_WPL_REN_ACCEPTED 0xAA4 -#define QDMA_OFFSET_C2H_STAT_TOTAL_WRQ_LEN 0xAA8 -#define QDMA_OFFSET_C2H_STAT_TOTAL_WPL_LEN 0xAAC -#define QDMA_OFFSET_C2H_BUF_SZ 0xAB0 -#define QDMA_OFFSET_C2H_ERR_STAT 0xAF0 -#define QDMA_OFFSET_C2H_ERR_MASK 0xAF4 -#define QDMA_OFFSET_C2H_FATAL_ERR_STAT 0xAF8 -#define QDMA_OFFSET_C2H_FATAL_ERR_MASK 0xAFC -#define QDMA_OFFSET_C2H_FATAL_ERR_ENABLE 0xB00 -#define QDMA_OFFSET_C2H_ERR_INT 0xB04 -#define QDMA_OFFSET_C2H_PFETCH_CFG 0xB08 -#define QDMA_C2H_EVT_QCNT_TH_MASK GENMASK(31, 25) -#define QDMA_C2H_PFCH_QCNT_MASK GENMASK(24, 18) -#define QDMA_C2H_NUM_PFCH_MASK GENMASK(17, 9) -#define QDMA_C2H_PFCH_FL_TH_MASK GENMASK(8, 0) -#define QDMA_OFFSET_C2H_INT_TIMER_TICK 0xB0C -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_DROP_ACCEPTED 0xB10 -#define QDMA_OFFSET_C2H_STAT_DESC_RSP_ERR_ACCEPTED 0xB14 -#define QDMA_OFFSET_C2H_STAT_DESC_REQ 0xB18 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_0 0xB1C -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_1 0xB20 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_2 0xB24 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_3 0xB28 -#define QDMA_OFFSET_C2H_DBG_PFCH_ERR_CTXT 0xB2C -#define QDMA_OFFSET_C2H_FIRST_ERR_QID 0xB30 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_IN 0xB34 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_OUT 0xB38 -#define QDMA_OFFSET_C2H_STAT_NUM_CMPT_DRP 0xB3C -#define QDMA_OFFSET_C2H_STAT_NUM_STAT_DESC_OUT 0xB40 -#define QDMA_OFFSET_C2H_STAT_NUM_DSC_CRDT_SENT 0xB44 -#define QDMA_OFFSET_C2H_STAT_NUM_FCH_DSC_RCVD 0xB48 -#define QDMA_OFFSET_C2H_STAT_NUM_BYP_DSC_RCVD 0xB4C -#define QDMA_OFFSET_C2H_WRB_COAL_CFG 0xB50 -#define QDMA_C2H_MAX_BUF_SZ_MASK GENMASK(31, 26) -#define QDMA_C2H_TICK_VAL_MASK GENMASK(25, 14) -#define QDMA_C2H_TICK_CNT_MASK GENMASK(13, 2) -#define QDMA_C2H_SET_GLB_FLUSH_MASK BIT(1) -#define QDMA_C2H_DONE_GLB_FLUSH_MASK BIT(0) -#define QDMA_OFFSET_C2H_INTR_H2C_REQ 0xB54 -#define QDMA_OFFSET_C2H_INTR_C2H_MM_REQ 0xB58 -#define QDMA_OFFSET_C2H_INTR_ERR_INT_REQ 0xB5C -#define QDMA_OFFSET_C2H_INTR_C2H_ST_REQ 0xB60 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_ACK 0xB64 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_FAIL 0xB68 -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_MSIX_NO_MSIX 0xB6C -#define QDMA_OFFSET_C2H_INTR_H2C_ERR_C2H_MM_CTXT_INVAL 0xB70 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_MSIX_ACK 0xB74 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_MSIX_FAIL 0xB78 -#define QDMA_OFFSET_C2H_INTR_C2H_ST_NO_MSIX 0xB7C -#define QDMA_OFFSET_C2H_INTR_C2H_ST_CTXT_INVAL 0xB80 -#define QDMA_OFFSET_C2H_STAT_WR_CMP 0xB84 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_4 0xB88 -#define QDMA_OFFSET_C2H_STAT_DEBUG_DMA_ENG_5 0xB8C -#define QDMA_OFFSET_C2H_DBG_PFCH_QID 0xB90 -#define QDMA_OFFSET_C2H_DBG_PFCH 0xB94 -#define QDMA_OFFSET_C2H_INT_DEBUG 0xB98 -#define QDMA_OFFSET_C2H_STAT_IMM_ACCEPTED 0xB9C -#define QDMA_OFFSET_C2H_STAT_MARKER_ACCEPTED 0xBA0 -#define QDMA_OFFSET_C2H_STAT_DISABLE_CMP_ACCEPTED 0xBA4 -#define QDMA_OFFSET_C2H_PAYLOAD_FIFO_CRDT_CNT 0xBA8 -#define QDMA_OFFSET_C2H_PFETCH_CACHE_DEPTH 0xBE0 -#define QDMA_OFFSET_C2H_CMPT_COAL_BUF_DEPTH 0xBE4 - -/* ------------------------- QDMA_TRQ_SEL_H2C (0x00E00) ------------------*/ -#define QDMA_OFFSET_H2C_ERR_STAT 0xE00 -#define QDMA_OFFSET_H2C_ERR_MASK 0xE04 -#define QDMA_OFFSET_H2C_FIRST_ERR_QID 0xE08 -#define QDMA_OFFSET_H2C_DBG_REG0 0xE0C -#define QDMA_OFFSET_H2C_DBG_REG1 0xE10 -#define QDMA_OFFSET_H2C_DBG_REG2 0xE14 -#define QDMA_OFFSET_H2C_DBG_REG3 0xE18 -#define QDMA_OFFSET_H2C_DBG_REG4 0xE1C -#define QDMA_OFFSET_H2C_FATAL_ERR_EN 0xE20 -#define QDMA_OFFSET_H2C_REQ_THROT 0xE24 -#define QDMA_H2C_REQ_THROT_EN_REQ_MASK BIT(31) -#define QDMA_H2C_REQ_THRESH_MASK GENMASK(25, 17) -#define QDMA_H2C_REQ_THROT_EN_DATA_MASK BIT(16) -#define QDMA_H2C_DATA_THRESH_MASK GENMASK(15, 0) - - -/* ------------------------- QDMA_TRQ_SEL_H2C_MM (0x1200) ----------------*/ -#define QDMA_OFFSET_H2C_MM_CONTROL 0x1204 -#define QDMA_OFFSET_H2C_MM_CONTROL_W1S 0x1208 -#define QDMA_OFFSET_H2C_MM_CONTROL_W1C 0x120C -#define QDMA_OFFSET_H2C_MM_STATUS 0x1240 -#define QDMA_OFFSET_H2C_MM_STATUS_RC 0x1244 -#define QDMA_OFFSET_H2C_MM_COMPLETED_DESC_COUNT 0x1248 -#define QDMA_OFFSET_H2C_MM_ERR_CODE_EN_MASK 0x1254 -#define QDMA_OFFSET_H2C_MM_ERR_CODE 0x1258 -#define QDMA_OFFSET_H2C_MM_ERR_INFO 0x125C -#define QDMA_OFFSET_H2C_MM_PERF_MON_CONTROL 0x12C0 -#define QDMA_OFFSET_H2C_MM_PERF_MON_CYCLE_COUNT_0 0x12C4 -#define QDMA_OFFSET_H2C_MM_PERF_MON_CYCLE_COUNT_1 0x12C8 -#define QDMA_OFFSET_H2C_MM_PERF_MON_DATA_COUNT_0 0x12CC -#define QDMA_OFFSET_H2C_MM_PERF_MON_DATA_COUNT_1 0x12D0 -#define QDMA_OFFSET_H2C_MM_DEBUG 0x12E8 - -/* ------------------------- QDMA_TRQ_SEL_C2H_MM (0x1000) ----------------*/ -#define QDMA_OFFSET_C2H_MM_CONTROL 0x1004 -#define QDMA_OFFSET_C2H_MM_CONTROL_W1S 0x1008 -#define QDMA_OFFSET_C2H_MM_CONTROL_W1C 0x100C -#define QDMA_OFFSET_C2H_MM_STATUS 0x1040 -#define QDMA_OFFSET_C2H_MM_STATUS_RC 0x1044 -#define QDMA_OFFSET_C2H_MM_COMPLETED_DESC_COUNT 0x1048 -#define QDMA_OFFSET_C2H_MM_ERR_CODE_EN_MASK 0x1054 -#define QDMA_OFFSET_C2H_MM_ERR_CODE 0x1058 -#define QDMA_OFFSET_C2H_MM_ERR_INFO 0x105C -#define QDMA_OFFSET_C2H_MM_PERF_MON_CONTROL 0x10C0 -#define QDMA_OFFSET_C2H_MM_PERF_MON_CYCLE_COUNT_0 0x10C4 -#define QDMA_OFFSET_C2H_MM_PERF_MON_CYCLE_COUNT_1 0x10C8 -#define QDMA_OFFSET_C2H_MM_PERF_MON_DATA_COUNT_0 0x10CC -#define QDMA_OFFSET_C2H_MM_PERF_MON_DATA_COUNT_1 0x10D0 -#define QDMA_OFFSET_C2H_MM_DEBUG 0x10E8 - -/* ------------------------- QDMA_TRQ_SEL_GLBL1 (0x0) -----------------*/ -#define QDMA_OFFSET_CONFIG_BLOCK_ID 0x0 -#define QDMA_CONFIG_BLOCK_ID_MASK GENMASK(31, 16) - - -/* ------------------------- QDMA_TRQ_SEL_GLBL2 (0x00100) ----------------*/ -#define QDMA_OFFSET_GLBL2_ID 0x100 -#define QDMA_OFFSET_GLBL2_PF_BARLITE_INT 0x104 -#define QDMA_GLBL2_PF3_BAR_MAP_MASK GENMASK(23, 18) -#define QDMA_GLBL2_PF2_BAR_MAP_MASK GENMASK(17, 12) -#define QDMA_GLBL2_PF1_BAR_MAP_MASK GENMASK(11, 6) -#define QDMA_GLBL2_PF0_BAR_MAP_MASK GENMASK(5, 0) -#define QDMA_OFFSET_GLBL2_PF_VF_BARLITE_INT 0x108 -#define QDMA_OFFSET_GLBL2_PF_BARLITE_EXT 0x10C -#define QDMA_OFFSET_GLBL2_PF_VF_BARLITE_EXT 0x110 -#define QDMA_OFFSET_GLBL2_CHANNEL_INST 0x114 -#define QDMA_OFFSET_GLBL2_CHANNEL_MDMA 0x118 -#define QDMA_GLBL2_ST_C2H_MASK BIT(16) -#define QDMA_GLBL2_ST_H2C_MASK BIT(17) -#define QDMA_GLBL2_MM_C2H_MASK BIT(8) -#define QDMA_GLBL2_MM_H2C_MASK BIT(0) -#define QDMA_OFFSET_GLBL2_CHANNEL_STRM 0x11C -#define QDMA_OFFSET_GLBL2_CHANNEL_QDMA_CAP 0x120 -#define QDMA_GLBL2_MULTQ_MAX_MASK GENMASK(11, 0) -#define QDMA_OFFSET_GLBL2_CHANNEL_PASID_CAP 0x128 -#define QDMA_OFFSET_GLBL2_CHANNEL_FUNC_RET 0x12C -#define QDMA_OFFSET_GLBL2_SYSTEM_ID 0x130 -#define QDMA_OFFSET_GLBL2_MISC_CAP 0x134 - -#define QDMA_GLBL2_DEVICE_ID_MASK GENMASK(31, 28) -#define QDMA_GLBL2_VIVADO_RELEASE_MASK GENMASK(27, 24) -#define QDMA_GLBL2_VERSAL_IP_MASK GENMASK(23, 20) -#define QDMA_GLBL2_RTL_VERSION_MASK GENMASK(19, 16) -#define QDMA_OFFSET_GLBL2_DBG_PCIE_RQ0 0x1B8 -#define QDMA_OFFSET_GLBL2_DBG_PCIE_RQ1 0x1BC -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_WR0 0x1C0 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_WR1 0x1C4 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_RD0 0x1C8 -#define QDMA_OFFSET_GLBL2_DBG_AXIMM_RD1 0x1CC - -/* used for VF bars identification */ -#define QDMA_OFFSET_VF_USER_BAR_ID 0x1018 -#define QDMA_OFFSET_VF_CONFIG_BAR_ID 0x1014 - -/* FLR programming */ -#define QDMA_OFFSET_VF_REG_FLR_STATUS 0x1100 -#define QDMA_OFFSET_PF_REG_FLR_STATUS 0x2500 -#define QDMA_FLR_STATUS_MASK 0x1 - -/* VF qdma version */ -#define QDMA_OFFSET_VF_VERSION 0x1014 -#define QDMA_OFFSET_PF_VERSION 0x2414 -#define QDMA_GLBL2_VF_UNIQUE_ID_MASK GENMASK(31, 16) -#define QDMA_GLBL2_VF_DEVICE_ID_MASK GENMASK(15, 12) -#define QDMA_GLBL2_VF_VIVADO_RELEASE_MASK GENMASK(11, 8) -#define QDMA_GLBL2_VF_VERSAL_IP_MASK GENMASK(7, 4) -#define QDMA_GLBL2_VF_RTL_VERSION_MASK GENMASK(3, 0) - - -/* ------------------------- QDMA_TRQ_SEL_QUEUE_PF (0x18000) ----------------*/ - -#define QDMA_OFFSET_DMAP_SEL_INT_CIDX 0x18000 -#define QDMA_OFFSET_DMAP_SEL_H2C_DSC_PIDX 0x18004 -#define QDMA_OFFSET_DMAP_SEL_C2H_DSC_PIDX 0x18008 -#define QDMA_OFFSET_DMAP_SEL_CMPT_CIDX 0x1800C - -#define QDMA_OFFSET_VF_DMAP_SEL_INT_CIDX 0x3000 -#define QDMA_OFFSET_VF_DMAP_SEL_H2C_DSC_PIDX 0x3004 -#define QDMA_OFFSET_VF_DMAP_SEL_C2H_DSC_PIDX 0x3008 -#define QDMA_OFFSET_VF_DMAP_SEL_CMPT_CIDX 0x300C - -#define QDMA_DMA_SEL_INT_SW_CIDX_MASK GENMASK(15, 0) -#define QDMA_DMA_SEL_INT_RING_IDX_MASK GENMASK(23, 16) -#define QDMA_DMA_SEL_DESC_PIDX_MASK GENMASK(15, 0) -#define QDMA_DMA_SEL_IRQ_EN_MASK BIT(16) -#define QDMA_DMAP_SEL_CMPT_IRQ_EN_MASK BIT(28) -#define QDMA_DMAP_SEL_CMPT_STS_DESC_EN_MASK BIT(27) -#define QDMA_DMAP_SEL_CMPT_TRG_MODE_MASK GENMASK(26, 24) -#define QDMA_DMAP_SEL_CMPT_TMR_CNT_MASK GENMASK(23, 20) -#define QDMA_DMAP_SEL_CMPT_CNT_THRESH_MASK GENMASK(19, 16) -#define QDMA_DMAP_SEL_CMPT_WRB_CIDX_MASK GENMASK(15, 0) - -/* ------------------------- Hardware Errors ------------------------------ */ -#define TOTAL_LEAF_ERROR_AGGREGATORS 7 - -#define QDMA_OFFSET_GLBL_ERR_INT 0xB04 -#define QDMA_GLBL_ERR_FUNC_MASK GENMASK(7, 0) -#define QDMA_GLBL_ERR_VEC_MASK GENMASK(22, 12) -#define QDMA_GLBL_ERR_ARM_MASK BIT(24) - -#define QDMA_OFFSET_GLBL_ERR_STAT 0x248 -#define QDMA_OFFSET_GLBL_ERR_MASK 0x24C -#define QDMA_GLBL_ERR_RAM_SBE_MASK BIT(0) -#define QDMA_GLBL_ERR_RAM_DBE_MASK BIT(1) -#define QDMA_GLBL_ERR_DSC_MASK BIT(2) -#define QDMA_GLBL_ERR_TRQ_MASK BIT(3) -#define QDMA_GLBL_ERR_ST_C2H_MASK BIT(8) -#define QDMA_GLBL_ERR_ST_H2C_MASK BIT(11) - -#define QDMA_OFFSET_C2H_ERR_STAT 0xAF0 -#define QDMA_OFFSET_C2H_ERR_MASK 0xAF4 -#define QDMA_C2H_ERR_MTY_MISMATCH_MASK BIT(0) -#define QDMA_C2H_ERR_LEN_MISMATCH_MASK BIT(1) -#define QDMA_C2H_ERR_QID_MISMATCH_MASK BIT(3) -#define QDMA_C2H_ERR_DESC_RSP_ERR_MASK BIT(4) -#define QDMA_C2H_ERR_ENG_WPL_DATA_PAR_ERR_MASK BIT(6) -#define QDMA_C2H_ERR_MSI_INT_FAIL_MASK BIT(7) -#define QDMA_C2H_ERR_ERR_DESC_CNT_MASK BIT(9) -#define QDMA_C2H_ERR_PORTID_CTXT_MISMATCH_MASK BIT(10) -#define QDMA_C2H_ERR_PORTID_BYP_IN_MISMATCH_MASK BIT(11) -#define QDMA_C2H_ERR_CMPT_INV_Q_ERR_MASK BIT(12) -#define QDMA_C2H_ERR_CMPT_QFULL_ERR_MASK BIT(13) -#define QDMA_C2H_ERR_CMPT_CIDX_ERR_MASK BIT(14) -#define QDMA_C2H_ERR_CMPT_PRTY_ERR_MASK BIT(15) -#define QDMA_C2H_ERR_ALL_MASK 0xFEDB - -#define QDMA_OFFSET_C2H_FATAL_ERR_STAT 0xAF8 -#define QDMA_OFFSET_C2H_FATAL_ERR_MASK 0xAFC -#define QDMA_C2H_FATAL_ERR_MTY_MISMATCH_MASK BIT(0) -#define QDMA_C2H_FATAL_ERR_LEN_MISMATCH_MASK BIT(1) -#define QDMA_C2H_FATAL_ERR_QID_MISMATCH_MASK BIT(3) -#define QDMA_C2H_FATAL_ERR_TIMER_FIFO_RAM_RDBE_MASK BIT(4) -#define QDMA_C2H_FATAL_ERR_PFCH_II_RAM_RDBE_MASK BIT(8) -#define QDMA_C2H_FATAL_ERR_CMPT_CTXT_RAM_RDBE_MASK BIT(9) -#define QDMA_C2H_FATAL_ERR_PFCH_CTXT_RAM_RDBE_MASK BIT(10) -#define QDMA_C2H_FATAL_ERR_DESC_REQ_FIFO_RAM_RDBE_MASK BIT(11) -#define QDMA_C2H_FATAL_ERR_INT_CTXT_RAM_RDBE_MASK BIT(12) -#define QDMA_C2H_FATAL_ERR_CMPT_COAL_DATA_RAM_RDBE_MASK BIT(14) -#define QDMA_C2H_FATAL_ERR_TUSER_FIFO_RAM_RDBE_MASK BIT(15) -#define QDMA_C2H_FATAL_ERR_QID_FIFO_RAM_RDBE_MASK BIT(16) -#define QDMA_C2H_FATAL_ERR_PAYLOAD_FIFO_RAM_RDBE_MASK BIT(17) -#define QDMA_C2H_FATAL_ERR_WPL_DATA_PAR_MASK BIT(18) -#define QDMA_C2H_FATAL_ERR_ALL_MASK 0x7DF1B - -#define QDMA_OFFSET_H2C_ERR_STAT 0xE00 -#define QDMA_OFFSET_H2C_ERR_MASK 0xE04 -#define QDMA_H2C_ERR_ZERO_LEN_DESC_MASK BIT(0) -#define QDMA_H2C_ERR_CSI_MOP_MASK BIT(1) -#define QDMA_H2C_ERR_NO_DMA_DSC_MASK BIT(2) -#define QDMA_H2C_ERR_SBE_MASK BIT(3) -#define QDMA_H2C_ERR_DBE_MASK BIT(4) -#define QDMA_H2C_ERR_ALL_MASK 0x1F - -#define QDMA_OFFSET_GLBL_DSC_ERR_STAT 0x254 -#define QDMA_OFFSET_GLBL_DSC_ERR_MASK 0x258 -#define QDMA_GLBL_DSC_ERR_POISON_MASK BIT(0) -#define QDMA_GLBL_DSC_ERR_UR_CA_MASK BIT(1) -#define QDMA_GLBL_DSC_ERR_PARAM_MASK BIT(2) -#define QDMA_GLBL_DSC_ERR_ADDR_MASK BIT(3) -#define QDMA_GLBL_DSC_ERR_TAG_MASK BIT(4) -#define QDMA_GLBL_DSC_ERR_FLR_MASK BIT(5) -#define QDMA_GLBL_DSC_ERR_TIMEOUT_MASK BIT(9) -#define QDMA_GLBL_DSC_ERR_DAT_POISON_MASK BIT(16) -#define QDMA_GLBL_DSC_ERR_FLR_CANCEL_MASK BIT(19) -#define QDMA_GLBL_DSC_ERR_DMA_MASK BIT(20) -#define QDMA_GLBL_DSC_ERR_DSC_MASK BIT(21) -#define QDMA_GLBL_DSC_ERR_RQ_CANCEL_MASK BIT(22) -#define QDMA_GLBL_DSC_ERR_DBE_MASK BIT(23) -#define QDMA_GLBL_DSC_ERR_SBE_MASK BIT(24) -#define QDMA_GLBL_DSC_ERR_ALL_MASK 0x1F9023F - -#define QDMA_OFFSET_GLBL_TRQ_ERR_STAT 0x264 -#define QDMA_OFFSET_GLBL_TRQ_ERR_MASK 0x268 -#define QDMA_GLBL_TRQ_ERR_UNMAPPED_MASK BIT(0) -#define QDMA_GLBL_TRQ_ERR_QID_RANGE_MASK BIT(1) -#define QDMA_GLBL_TRQ_ERR_VF_ACCESS_MASK BIT(2) -#define QDMA_GLBL_TRQ_ERR_TCP_TIMEOUT_MASK BIT(3) -#define QDMA_GLBL_TRQ_ERR_ALL_MASK 0xF - -#define QDMA_OFFSET_RAM_SBE_STAT 0xF4 -#define QDMA_OFFSET_RAM_SBE_MASK 0xF0 -#define QDMA_SBE_ERR_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_SBE_ERR_MI_C2H0_DAT_MASK BIT(4) -#define QDMA_SBE_ERR_H2C_RD_BRG_DAT_MASK BIT(9) -#define QDMA_SBE_ERR_H2C_WR_BRG_DAT_MASK BIT(10) -#define QDMA_SBE_ERR_C2H_RD_BRG_DAT_MASK BIT(11) -#define QDMA_SBE_ERR_C2H_WR_BRG_DAT_MASK BIT(12) -#define QDMA_SBE_ERR_FUNC_MAP_MASK BIT(13) -#define QDMA_SBE_ERR_DSC_HW_CTXT_MASK BIT(14) -#define QDMA_SBE_ERR_DSC_CRD_RCV_MASK BIT(15) -#define QDMA_SBE_ERR_DSC_SW_CTXT_MASK BIT(16) -#define QDMA_SBE_ERR_DSC_CPLI_MASK BIT(17) -#define QDMA_SBE_ERR_DSC_CPLD_MASK BIT(18) -#define QDMA_SBE_ERR_PASID_CTXT_RAM_MASK BIT(19) -#define QDMA_SBE_ERR_TIMER_FIFO_RAM_MASK BIT(20) -#define QDMA_SBE_ERR_PAYLOAD_FIFO_RAM_MASK BIT(21) -#define QDMA_SBE_ERR_QID_FIFO_RAM_MASK BIT(22) -#define QDMA_SBE_ERR_TUSER_FIFO_RAM_MASK BIT(23) -#define QDMA_SBE_ERR_WRB_COAL_DATA_RAM_MASK BIT(24) -#define QDMA_SBE_ERR_INT_QID2VEC_RAM_MASK BIT(25) -#define QDMA_SBE_ERR_INT_CTXT_RAM_MASK BIT(26) -#define QDMA_SBE_ERR_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define QDMA_SBE_ERR_PFCH_CTXT_RAM_MASK BIT(28) -#define QDMA_SBE_ERR_WRB_CTXT_RAM_MASK BIT(29) -#define QDMA_SBE_ERR_PFCH_LL_RAM_MASK BIT(30) -#define QDMA_SBE_ERR_H2C_PEND_FIFO_MASK BIT(31) -#define QDMA_SBE_ERR_ALL_MASK 0xFFFFFF11 - -#define QDMA_OFFSET_RAM_DBE_STAT 0xFC -#define QDMA_OFFSET_RAM_DBE_MASK 0xF8 -#define QDMA_DBE_ERR_MI_H2C0_DAT_MASK BIT(0) -#define QDMA_DBE_ERR_MI_C2H0_DAT_MASK BIT(4) -#define QDMA_DBE_ERR_H2C_RD_BRG_DAT_MASK BIT(9) -#define QDMA_DBE_ERR_H2C_WR_BRG_DAT_MASK BIT(10) -#define QDMA_DBE_ERR_C2H_RD_BRG_DAT_MASK BIT(11) -#define QDMA_DBE_ERR_C2H_WR_BRG_DAT_MASK BIT(12) -#define QDMA_DBE_ERR_FUNC_MAP_MASK BIT(13) -#define QDMA_DBE_ERR_DSC_HW_CTXT_MASK BIT(14) -#define QDMA_DBE_ERR_DSC_CRD_RCV_MASK BIT(15) -#define QDMA_DBE_ERR_DSC_SW_CTXT_MASK BIT(16) -#define QDMA_DBE_ERR_DSC_CPLI_MASK BIT(17) -#define QDMA_DBE_ERR_DSC_CPLD_MASK BIT(18) -#define QDMA_DBE_ERR_PASID_CTXT_RAM_MASK BIT(19) -#define QDMA_DBE_ERR_TIMER_FIFO_RAM_MASK BIT(20) -#define QDMA_DBE_ERR_PAYLOAD_FIFO_RAM_MASK BIT(21) -#define QDMA_DBE_ERR_QID_FIFO_RAM_MASK BIT(22) -#define QDMA_DBE_ERR_TUSER_FIFO_RAM_MASK BIT(23) -#define QDMA_DBE_ERR_WRB_COAL_DATA_RAM_MASK BIT(24) -#define QDMA_DBE_ERR_INT_QID2VEC_RAM_MASK BIT(25) -#define QDMA_DBE_ERR_INT_CTXT_RAM_MASK BIT(26) -#define QDMA_DBE_ERR_DESC_REQ_FIFO_RAM_MASK BIT(27) -#define QDMA_DBE_ERR_PFCH_CTXT_RAM_MASK BIT(28) -#define QDMA_DBE_ERR_WRB_CTXT_RAM_MASK BIT(29) -#define QDMA_DBE_ERR_PFCH_LL_RAM_MASK BIT(30) -#define QDMA_DBE_ERR_H2C_PEND_FIFO_MASK BIT(31) -#define QDMA_DBE_ERR_ALL_MASK 0xFFFFFF11 - -#define QDMA_OFFSET_MBOX_BASE_VF 0x1000 -#define QDMA_OFFSET_MBOX_BASE_PF 0x2400 - -#ifdef __cplusplus -} -#endif - -#endif /* __QDMA_SOFT_REG_H__ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_config.h b/QDMA/windows/sys/libqdma/source/qdma_config.h deleted file mode 100644 index 2cd7193..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_config.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#define QDMA_QBASE 0 -#define QDMA_TOTAL_Q 2048 diff --git a/QDMA/windows/sys/libqdma/source/qdma_license.h b/QDMA/windows/sys/libqdma/source/qdma_license.h deleted file mode 100644 index cca956a..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_license.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef LIBQDMA_QDMA_LICENSE_H_ -#define LIBQDMA_QDMA_LICENSE_H_ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -#endif /* LIBQDMA_QDMA_LICENSE_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_platform.cpp b/QDMA/windows/sys/libqdma/source/qdma_platform.cpp deleted file mode 100644 index e9400c7..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_platform.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "qdma.h" -#include "qdma_platform.h" -#include "qdma_access_errors.h" -#include "trace.h" - -#ifdef ENABLE_WPP_TRACING -#include "qdma_platform.tmh" -#endif - -using namespace xlnx; - -/** Xilinx TAG for tagged memory allocations */ -static constexpr ULONG QDMA_MEMPOOL_TAG = 'MADQ'; -static WDFSPINLOCK resource_manager_lock = nullptr; - -struct err_code_map error_code_map_list[] = { - {QDMA_SUCCESS, STATUS_SUCCESS}, - {QDMA_ERR_INV_PARAM, STATUS_INVALID_PARAMETER}, - {QDMA_ERR_NO_MEM, STATUS_BUFFER_TOO_SMALL}, - {QDMA_ERR_HWACC_BUSY_TIMEOUT, STATUS_IO_TIMEOUT}, - {QDMA_ERR_HWACC_INV_CONFIG_BAR, STATUS_INVALID_HW_PROFILE}, - {QDMA_ERR_HWACC_NO_PEND_LEGCY_INTR, STATUS_UNSUCCESSFUL}, - {QDMA_ERR_HWACC_BAR_NOT_FOUND, STATUS_NOT_FOUND}, - {QDMA_ERR_HWACC_FEATURE_NOT_SUPPORTED, STATUS_NOT_SUPPORTED}, - {QDMA_ERR_RM_RES_EXISTS, STATUS_UNSUCCESSFUL}, - {QDMA_ERR_RM_RES_NOT_EXISTS, STATUS_UNSUCCESSFUL}, - {QDMA_ERR_RM_DEV_EXISTS, STATUS_UNSUCCESSFUL}, - {QDMA_ERR_RM_DEV_NOT_EXISTS, STATUS_UNSUCCESSFUL}, - {QDMA_ERR_RM_NO_QUEUES_LEFT, STATUS_UNSUCCESSFUL}, - {QDMA_ERR_RM_QMAX_CONF_REJECTED, STATUS_UNSUCCESSFUL} -}; - - -void qdma_udelay( - UINT32 delay_us) -{ - KeStallExecutionProcessor(delay_us); -} - -/* Suppressing the static analysis tool reported warning. - * Common qdma_access.c file takes care of acquiring and - * releasing the locks properly via callbacks APIs - * NOTE: These callback funtions are intended to use only - * by HW access common code. - */ -#pragma warning(suppress: 28167) -int qdma_reg_access_lock( - void *dev_hndl) -{ - qdma_device *qdma_dev = static_cast<qdma_device *>(dev_hndl); - WdfSpinLockAcquire(qdma_dev->register_access_lock); - return 0; -} - -#pragma warning(suppress: 28167) -int qdma_reg_access_release( - void *dev_hndl) -{ - qdma_device *qdma_dev = static_cast<qdma_device *>(dev_hndl); - WdfSpinLockRelease(qdma_dev->register_access_lock); - return 0; -} - -void qdma_reg_write( - void *dev_hndl, - uint32_t reg_offset, - uint32_t val) -{ - qdma_device *qdma_dev = static_cast<qdma_device *>(dev_hndl); - qdma_dev->qdma_conf_reg_write(reg_offset, (ULONG)val); -} - -uint32_t qdma_reg_read( - void *dev_hndl, - uint32_t reg_offset) -{ - qdma_device *qdma_dev = static_cast<qdma_device *>(dev_hndl); - return qdma_dev->qdma_conf_reg_read(reg_offset); -} - -void qdma_get_hw_access( - void *dev_hndl, - struct qdma_hw_access **hw) -{ - qdma_device *qdma_dev = static_cast<qdma_device *>(dev_hndl); - *hw = &qdma_dev->hw; -} - -void qdma_strncpy( - char *dest, - const char *src, - size_t n) -{ - RtlStringCchPrintfA(dest, n, "%s", src); -} - -int qdma_get_err_code( - int acc_err_code) -{ - int n; - - if (acc_err_code < 0) - acc_err_code = -(acc_err_code); - - n = sizeof(error_code_map_list) / sizeof(error_code_map_list[0]); - if (acc_err_code < n) - return (error_code_map_list[acc_err_code].err_code); - else - return STATUS_UNSUCCESSFUL; -} - -void *qdma_calloc( - uint32_t num_blocks, - uint32_t size) -{ - size_t total_size = (size_t)num_blocks * size; - void *ptr = ExAllocatePoolWithTag(NonPagedPoolNx, total_size, QDMA_MEMPOOL_TAG); - if (ptr != NULL) { - RtlZeroMemory(ptr, total_size); - } - - return ptr; -} - -void qdma_memfree( - void *memptr) -{ - ExFreePoolWithTag(memptr, QDMA_MEMPOOL_TAG); -} - -int qdma_resource_lock_init(void) -{ - if (resource_manager_lock == nullptr) { - WDF_OBJECT_ATTRIBUTES attr; - WDF_OBJECT_ATTRIBUTES_INIT(&attr); - attr.ParentObject = WdfGetDriver(); - - NTSTATUS status = WdfSpinLockCreate(&attr, &resource_manager_lock); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_QDMA, "Resource lock creation failed!"); - return -1; - } - } - - return 0; -} - -/* Suppressing the static analysis tool reported warning. - * Common qdma_access.c file takes care of acquiring and - * releasing the locks properly via callback APIs - * NOTE: These callback funtions are intended to use only - * by HW access common code. - */ -#pragma warning(suppress: 28167) -void qdma_resource_lock_take(void) -{ - WdfSpinLockAcquire(resource_manager_lock); -} - -#pragma warning(suppress: 28167) -void qdma_resource_lock_give(void) -{ - WdfSpinLockRelease(resource_manager_lock); -} diff --git a/QDMA/windows/sys/libqdma/source/qdma_platform_env.h b/QDMA/windows/sys/libqdma/source/qdma_platform_env.h deleted file mode 100644 index 3aeb023..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_platform_env.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#ifndef LIBQDMA_QDMA_PLATFORM_ENV_H_ -#define LIBQDMA_QDMA_PLATFORM_ENV_H_ - -#pragma once - -#ifndef STRICT -#define STRICT -#endif - -#include <ntddk.h> -#include <wdf.h> -#include <ntintsafe.h> -#include <ntstrsafe.h> -#include <stdio.h> -#include <stddef.h> - -#include "trace.h" - -#define QDMA_SNPRINTF_S _snprintf_s - -typedef UINT32 uint32_t; -typedef UINT8 uint8_t; -typedef UINT16 uint16_t; -typedef UINT64 uint64_t; -typedef INT32 int32_t; - -#endif /* LIBQDMA_QDMA_PLATFORM_ENV_H_ */ diff --git a/QDMA/windows/sys/libqdma/source/qdma_reg_ext.h b/QDMA/windows/sys/libqdma/source/qdma_reg_ext.h deleted file mode 100644 index caa068e..0000000 --- a/QDMA/windows/sys/libqdma/source/qdma_reg_ext.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include <ntintsafe.h> -#include <stddef.h> - -namespace xlnx { - -/* ----------- constants ----------- */ -static constexpr UINT8 DEFAULT_USER_BAR = 1; - -/* register base address */ -static constexpr size_t qdma_trq_cmc_msix_table = 0x0000'2000; -static constexpr size_t qdma_msix_vectors_mask_step = 0x0000'000c; - -/* HW Config Constants */ -static constexpr size_t qdma_max_msix_vectors_per_pf = 8; - -/* ---------- struct definitions ---------- */ -#pragma pack(1) - -/* ---------- descriptor structures ---------- */ -struct c2h_descriptor { - UINT64 addr; -}; -static_assert(sizeof(c2h_descriptor) == (8 * sizeof(UINT8)), "c2h_descriptor must be 8 bytes wide!"); - -struct h2c_descriptor { - UINT16 cdh_flags; /**< Dont care bits */ - UINT16 pld_len; /**< Packet length in bytes */ - UINT16 length; - UINT16 sop : 1; - UINT16 eop : 1; - UINT16 reserved : 14; - UINT64 addr; -}; -static_assert(sizeof(h2c_descriptor) == (16 * sizeof(UINT8)), "h2c_descriptor must be 16 bytes wide!"); - -struct mm_descriptor { - UINT64 addr; - - UINT64 length : 28; - UINT64 valid : 1; - UINT64 sop : 1; - UINT64 eop : 1; - UINT64 reserved_0 : 33; - - UINT64 dest_addr; - - UINT64 reserved_1; -}; -static_assert(sizeof(mm_descriptor) == (32 * sizeof(UINT8)), "mm_descriptor must be 32 bytes wide!"); - -/* interrupt ring entry structure */ -struct intr_entry { - /* Desc bits */ - UINT32 desc_pidx : 16; - UINT32 desc_cidx : 16; - - UINT32 desc_color : 1; - UINT32 desc_int_state : 2; - UINT32 desc_err : 2; - /* source bits */ - UINT32 rsvd : 1; - UINT32 intr_type : 1; - UINT32 qid : 24; - UINT32 color : 1; -}; -static_assert(sizeof(intr_entry) == (8 * sizeof(UINT8)), "intr_entry must be 8 bytes wide!"); - -struct cpm_intr_entry { - /* Desc bits */ - UINT32 desc_pidx : 16; - UINT32 desc_cidx : 16; - - UINT32 desc_color : 1; - UINT32 desc_int_state : 2; - UINT32 desc_err : 4; - /* source bits */ - UINT32 rsvd : 11; - UINT32 err_int : 1; - UINT32 intr_type : 1; - UINT32 qid : 11; - UINT32 color : 1; -}; -static_assert(sizeof(cpm_intr_entry) == (8 * sizeof(UINT8)), "intr_entry must be 8 bytes wide!"); -/* ------ */ - -/* ---------- writeback structures ---------- */ - -/** c2h_wb_header_8B -- C2H Completion data structure - * This includes user defined data, optional color, err bits, etc.,. - * The user defined data has four size options: 8B, 16B, 32B and 64B - * - * The below format is specific to QDMA example design present in vivado - */ -struct c2h_wb_header_8B { - /** @data_frmt : 0 indicates valid length field is present */ - UINT64 data_frmt : 1; - /** @color : Indicates the validity of the entry */ - UINT64 color : 1; - /** @desc_error : Indicates the error status */ - UINT64 desc_error : 1; - /** @desc_used : Indicates whether data descriptor used */ - UINT64 desc_used : 1; - /** @length : Length of the completion entry */ - UINT64 length : 16; - /** @user_rsv : Reserved */ - UINT64 user_rsv : 4; - /** @user_defined_0 : User Defined Data (UDD) */ - UINT64 user_defined_0 : 40; -}; -static_assert(sizeof(c2h_wb_header_8B) == (8 * sizeof(UINT8)), "c2h_wb_header_8B must be 8 bytes wide!"); - -struct c2h_wb_header_16B : c2h_wb_header_8B { - /** @user_defined_1 : User Defined Data (UDD) for 16B completion size */ - UINT64 user_defined_1; -}; -static_assert(sizeof(c2h_wb_header_16B) == (16 * sizeof(UINT8)), "c2h_wb_header_16B must be 16 bytes wide!"); - -struct c2h_wb_header_32B : c2h_wb_header_16B { - /** @user_defined_2 : User Defined Data (UDD) for 32B completion size */ - UINT64 user_defined_2[2]; -}; -static_assert(sizeof(c2h_wb_header_32B) == (32 * sizeof(UINT8)), "c2h_wb_header_32B must be 32 bytes wide!"); - -struct c2h_wb_header_64B : c2h_wb_header_32B { - /** @user_defined_3 : User Defined Data (UDD) for 64B completion size */ - UINT64 user_defined_3[4]; -}; -static_assert(sizeof(c2h_wb_header_64B) == (64 * sizeof(UINT8)), "c2h_wb_header_64B must be 64 bytes wide!"); - - -struct wb_status_base { - UINT16 pidx; - UINT16 cidx; -}; - -struct c2h_wb_status : wb_status_base { - UINT32 color : 1; - UINT32 irq_state : 2; - UINT32 reserved : 29; -}; -static_assert(sizeof(c2h_wb_status) == (sizeof(UINT64)), "c2h_wb_status must be 64 bits wide!"); -static_assert(sizeof(c2h_wb_status) == (sizeof(c2h_wb_header_8B)), "c2h_wb_status and c2h_wb_header_8B must be same size!"); - -struct h2c_wb_status : wb_status_base { - UINT32 reserved_1; -}; -static_assert(sizeof(h2c_wb_status) == (sizeof(UINT64)), "h2c_wb_status must be 64 bits wide!"); - -using mm_wb_status = h2c_wb_status; /* MM wb status has same struct layout as h2c wb */ - -#pragma pack() - -} /* namespace xlnx */ diff --git a/QDMA/windows/sys/libqdma/source/thread.cpp b/QDMA/windows/sys/libqdma/source/thread.cpp deleted file mode 100644 index 65ec4b3..0000000 --- a/QDMA/windows/sys/libqdma/source/thread.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include "thread.h" -#include "qdma.h" -#include "trace.h" - -#ifdef ENABLE_WPP_TRACING -#include "thread.tmh" -#endif - -using namespace xlnx; -KDEFERRED_ROUTINE queueDataDpc; - -VOID qdma_poll_thread( - PVOID context) -{ - qdma_thread *th = (qdma_thread *)context; - KAFFINITY affinity = (KAFFINITY)1 << th->id; - KeSetSystemAffinityThread(affinity); - - TraceVerbose(TRACE_THREAD, "Thread active on CPU core : %lu", th->id); - - while (1) { - - KeWaitForSingleObject(&th->semaphore, - Executive, - KernelMode, - FALSE, - NULL); - - InterlockedDecrement(&th->sem_count); - - if (th->terminate) { - TraceVerbose(TRACE_THREAD, "Terminating thread on CPU core: %lu", th->id); - PsTerminateSystemThread(STATUS_SUCCESS); - } - - WdfSpinLockAcquire(th->lock); - - PLIST_ENTRY entry; - PLIST_ENTRY temp; - LIST_FOR_EACH_ENTRY_SAFE(&th->poll_ops_head, temp, entry) { - poll_operation_entry *poll_op = CONTAINING_RECORD(entry, poll_operation_entry, list_entry); - poll_op->op.fn(poll_op->op.arg); - } - - WdfSpinLockRelease(th->lock); - } -} - -ULONG thread_manager::get_active_proc_cnt(void) -{ - return KeQueryActiveProcessorCount(NULL); -} - -_Use_decl_annotations_ -VOID -queueDataDpc( - PKDPC dpc, - PVOID context, - PVOID arg1, - PVOID arg2) -{ - UNREFERENCED_PARAMETER(dpc); - UNREFERENCED_PARAMETER(context); - UNREFERENCED_PARAMETER(arg2); - - qdma_thread* thread = static_cast<qdma_thread *>(arg1); - wakeup_thread(thread); -} - -void thread_manager::init_dpc(qdma_thread *thread) { - KeInitializeDpc(&thread->dpc, queueDataDpc, thread); -} - -NTSTATUS thread_manager::create_sys_threads(queue_op_mode mode) -{ - ULONG i = 0; - NTSTATUS status = STATUS_SUCCESS; - - active_processors = get_active_proc_cnt(); - - threads = static_cast<qdma_thread *>(qdma_calloc(active_processors, sizeof(qdma_thread))); - if (nullptr == threads) { - return STATUS_INSUFFICIENT_RESOURCES; - } - - for (i = 0; i < active_processors; ++i) { - /* THREAD DATA INITIALIZATION */ - threads[i].weight = 0; - threads[i].id = i; - threads[i].terminate = false; - INIT_LIST_HEAD(&threads[i].poll_ops_head); - - KeInitializeSemaphore(&threads[i].semaphore, 0, MAXLONG); - - status = PsCreateSystemThread(&threads[i].th_handle, - (ACCESS_MASK)0, - NULL, - (HANDLE)0, - NULL, - qdma_poll_thread, - &threads[i]); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_THREAD, "Failed to create thread on cpu core %d - %!STATUS!", i, status); - break; - } - - ObReferenceObjectByHandle(threads[i].th_handle, - THREAD_ALL_ACCESS, - NULL, - KernelMode, - &threads[i].th_object, - NULL); - - ZwClose(threads[i].th_handle); - - status = WdfSpinLockCreate(WDF_NO_OBJECT_ATTRIBUTES, &threads[i].lock); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_THREAD, "Failed to create thread spinlock for CPU core %d - %!STATUS!", i, status); - active_threads = i + 1; - goto ErrExit; - } - - /* Per Thread DPC creation */ - if (mode != queue_op_mode::POLL_MODE) { - init_dpc(&threads[i]); - } - } - - active_threads = i; - - if ((ULONG)0 == active_threads) { - /* If no thread is active, then return failure. */ - goto ErrExit; - } - - status = WdfSpinLockCreate(WDF_NO_OBJECT_ATTRIBUTES, &lock); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_THREAD, "Failed to create thread manager lock %!STATUS!", status); - goto ErrExit; - } - - TraceVerbose(TRACE_THREAD, "Active threads %lu", active_threads); - - return status; - -ErrExit: - terminate_sys_threads(); - return status; -} - -void thread_manager::terminate_sys_threads(void) -{ - if (nullptr == threads) - return; - - for (ULONG i = 0; i < active_threads; ++i) { - threads[i].terminate = true; - KeReleaseSemaphore(&threads[i].semaphore, 0, 1, FALSE); - } - - for (ULONG i = 0; i < active_threads; ++i) { - if (threads[i].lock) - WdfObjectDelete(threads[i].lock); - - KeWaitForSingleObject(threads[i].th_object, - Executive, - KernelMode, - FALSE, - NULL); - - ObDereferenceObject(threads[i].th_object); - } - - if (lock) { - WdfObjectDelete(lock); - lock = nullptr; - } - - qdma_memfree(threads); - threads = nullptr; -} - -void err_poll_thread(PVOID context) -{ - err_thread *ctx = (err_thread *)context; - LARGE_INTEGER Interval; - Interval.QuadPart = WDF_REL_TIMEOUT_IN_MS(1000); - - while (1) { - ctx->device->hw.qdma_hw_error_process(ctx->device); - - if (ctx->terminate) { - TraceVerbose(TRACE_THREAD, "ctx->terminate"); - PsTerminateSystemThread(STATUS_SUCCESS); - } - - KeDelayExecutionThread(KernelMode, FALSE, &Interval); - } -} - -NTSTATUS thread_manager::create_err_poll_thread(qdma_device *device) -{ - err_th_para = static_cast<err_thread *>(qdma_calloc(1, sizeof(err_thread))); - if (nullptr == err_th_para) { - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* THREAD DATA INITIALIZATION */ - err_th_para->terminate = false; - err_th_para->device = device; - - auto status = PsCreateSystemThread(&err_th_para->th_handle, - (ACCESS_MASK)0, - NULL, - (HANDLE)0, - NULL, - err_poll_thread, - err_th_para); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_THREAD, "Failed to create Error handling thread - %!STATUS!", status); - qdma_memfree(err_th_para); - err_th_para = nullptr; - return status; - } - - ObReferenceObjectByHandle(err_th_para->th_handle, - THREAD_ALL_ACCESS, - NULL, - KernelMode, - &err_th_para->th_object, - NULL); - - ZwClose(err_th_para->th_handle); - - TraceVerbose(TRACE_THREAD, "Error handling Thread Active"); - - return STATUS_SUCCESS; -} - -void thread_manager::terminate_err_poll_thread(void) -{ - TraceVerbose(TRACE_THREAD, "terminating error handling thread"); - - if (err_th_para == nullptr) - return; - - err_th_para->terminate = true; - - KeWaitForSingleObject(err_th_para->th_object, - Executive, - KernelMode, - FALSE, - NULL); - - ObDereferenceObject(err_th_para->th_object); - - qdma_memfree(err_th_para); - err_th_para = nullptr; -} - -poll_operation_entry *thread_manager::register_poll_function(poll_op& ops) -{ - UINT32 weight; - UINT32 sel_weight_id; - - WdfSpinLockAcquire(lock); - - weight = threads[0].weight; - sel_weight_id = 0; - - for (ULONG i = 1; i < active_threads; ++i) { - if (weight > threads[i].weight) { - weight = threads[i].weight; - sel_weight_id = i; - } - } - - threads[sel_weight_id].weight++; - WdfSpinLockRelease(lock); - - poll_operation_entry *poll_op_entry = static_cast<poll_operation_entry *> - (qdma_calloc(1, sizeof(poll_operation_entry))); - if (nullptr == poll_op_entry) { - return nullptr; - } - - poll_op_entry->op.fn = ops.fn; - poll_op_entry->op.arg = ops.arg; - poll_op_entry->thread = &threads[sel_weight_id]; - - /* To Avoid Visual studio static analysis reported warning */ - WDFSPINLOCK th_lock = threads[sel_weight_id].lock; - WdfSpinLockAcquire(th_lock); - LIST_ADD_TAIL(&threads[sel_weight_id].poll_ops_head, &poll_op_entry->list_entry); - WdfSpinLockRelease(th_lock); - - TraceVerbose(TRACE_THREAD, "Poll function registered for thread : %u New Weight : %u, Poll Handle : %p", - sel_weight_id, threads[sel_weight_id].weight, poll_op_entry); - - return poll_op_entry; -} - -void thread_manager::unregister_poll_function(poll_operation_entry *poll_entry) -{ - qdma_thread *thread = poll_entry->thread; - - WdfSpinLockAcquire(lock); - thread->weight--; - WdfSpinLockRelease(lock); - - WdfSpinLockAcquire(thread->lock); - PLIST_ENTRY entry = &(poll_entry->list_entry); - LIST_DEL_NODE(entry); - WdfSpinLockRelease(thread->lock); - - qdma_memfree(poll_entry); -} - -void xlnx::wakeup_thread(qdma_thread* thread) -{ - if (thread->sem_count <= 10) { - InterlockedIncrement(&thread->sem_count); - KeReleaseSemaphore(&thread->semaphore, 0, 1, FALSE); - } -} diff --git a/QDMA/windows/sys/libqdma/source/thread.h b/QDMA/windows/sys/libqdma/source/thread.h deleted file mode 100644 index 7600e80..0000000 --- a/QDMA/windows/sys/libqdma/source/thread.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include "qdma_platform_env.h" -#include "qdma_config.h" -#include "qdma_exports.h" -#include "qdma_reg_ext.h" - -namespace xlnx { -/* Forward declaration */ -class qdma_device; -struct queue_pair; - -typedef void (*poll_fn) (void *); - -struct poll_op { - poll_fn fn; - void *arg; -}; - -struct qdma_thread { - bool terminate; - ULONG id; - HANDLE th_handle; - KSEMAPHORE semaphore; - volatile LONG sem_count = 0; - void *th_object; - UINT32 weight; - WDFSPINLOCK lock; - /* Per thread DPC object to wake up the thread for completion processing */ - KDPC dpc; - LIST_ENTRY poll_ops_head; -}; - -struct poll_operation_entry { - poll_op op; - qdma_thread *thread; - LIST_ENTRY list_entry; -}; - -struct err_thread { - bool terminate; - HANDLE th_handle; - void *th_object; - qdma_device *device = nullptr; -}; - -struct thread_manager { - ULONG active_processors = 0; - ULONG active_threads = 0; - WDFSPINLOCK lock = nullptr; - - qdma_thread *threads = nullptr; - err_thread *err_th_para = nullptr; - - ULONG get_active_proc_cnt(void); - NTSTATUS create_sys_threads(queue_op_mode mode); - void terminate_sys_threads(void); - void init_dpc(qdma_thread *thread); - NTSTATUS create_err_poll_thread(qdma_device *device); - void terminate_err_poll_thread(void); - - poll_operation_entry *register_poll_function(poll_op& ops); - void unregister_poll_function(poll_operation_entry *poll_entry); -}; - -void wakeup_thread(qdma_thread *thread); - -} /* namespace xlnx */ - - diff --git a/QDMA/windows/sys/libqdma/source/trace.h b/QDMA/windows/sys/libqdma/source/trace.h deleted file mode 100644 index 1dcb727..0000000 --- a/QDMA/windows/sys/libqdma/source/trace.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#if defined(DBG) || defined(ENABLE_WPP) -#define ENABLE_WPP_TRACING -#endif - -/** - * Define the tracing flags. - * - * Tracing GUID - 0bed1f17-aa40-5163-c038-33715b81ae49 - * Trace Name : 'Xilinx-QDMA-Debug' - */ -#define WPP_CONTROL_GUIDS \ - WPP_DEFINE_CONTROL_GUID( \ - QDMATraceGuid, (0bed1f17, aa40, 5163, c038, 33715b81ae49), \ - \ - WPP_DEFINE_BIT(TRACE_PCIE) \ - WPP_DEFINE_BIT(TRACE_INTR) \ - WPP_DEFINE_BIT(TRACE_THREAD) \ - WPP_DEFINE_BIT(TRACE_QDMA) \ - WPP_DEFINE_BIT(TRACE_DBG) \ - WPP_DEFINE_BIT(TRACE_QDMA_ACCESS) \ - ) - -/* WPP_LEVEL_FLAGS_LOGGER and WPP_LEVEL_FLAGS_ENABLED support trace functions - with LEVEL and FLAGS static parameters (in that order) prior to any dynamic - parameters (such as MSG) -*/ -#define WPP_LEVEL_FLAGS_LOGGER(level, flags) \ - WPP_LEVEL_LOGGER(flags) - -#define WPP_LEVEL_FLAGS_ENABLED(level, flags) \ - (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= level) - -/* Optimize WPP tracing call site conditional checks - - NOTE: This is only safe if we ensure no WPP tracing functions are called - before WPP_INIT_TRACING() or after WPP_CLEANUP(). -*/ -#define WPP_CHECK_INIT - - -// -// This comment block is scanned by the trace preprocessor to define our -// Trace functions. -// -// begin_wpp config -// FUNC TraceVerbose{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS, MSG, ...); -// FUNC TraceInfo{LEVEL=TRACE_LEVEL_INFORMATION}(FLAGS, MSG, ...); -// FUNC TraceWarning{LEVEL=TRACE_LEVEL_WARNING}(FLAGS, MSG, ...); -// FUNC TraceError{LEVEL=TRACE_LEVEL_ERROR}(FLAGS, MSG, ...); -// FUNC TraceEvents(LEVEL, FLAGS, MSG, ...); -// FUNC qdma_log_error{LEVEL=TRACE_LEVEL_ERROR, FLAGS=TRACE_QDMA_ACCESS}(MSG, ...); -// FUNC qdma_log_debug{LEVEL=TRACE_LEVEL_VERBOSE, FLAGS=TRACE_QDMA_ACCESS}(MSG, ...); -// FUNC qdma_log_info{LEVEL=TRACE_LEVEL_INFORMATION, FLAGS=TRACE_QDMA_ACCESS}(MSG, ...); -// FUNC qdma_log_warn{LEVEL=TRACE_LEVEL_WARNING, FLAGS=TRACE_QDMA_ACCESS}(MSG, ...); -// end_wpp -// - -/** WPP tracing is disabled by default in release configuration. - * so stub out definitions and functions - * - * To Enable WPP Tracing, Enable Run WPP Tracing in settings and - * define MACRO "ENABLE_WPP" - */ -#ifndef ENABLE_WPP_TRACING -#define WPP_INIT_TRACING(driver_object, registry_path) -#define WPP_CLEANUP(driver_object) -#define TraceVerbose(flags, ...) (__VA_ARGS__) -#define TraceInfo(flags, ...) (__VA_ARGS__) -#define TraceWarning(flags, ...) (__VA_ARGS__) -#define TraceError(flags, ...) (__VA_ARGS__) -#define TraceEvents(flags, ...) (__VA_ARGS__) -#define qdma_log_error(...) (__VA_ARGS__) -#define qdma_log_debug(...) (__VA_ARGS__) -#define qdma_log_info(...) (__VA_ARGS__) -#define qdma_log_warn(...) (__VA_ARGS__) -#endif diff --git a/QDMA/windows/sys/libqdma/source/xpcie.cpp b/QDMA/windows/sys/libqdma/source/xpcie.cpp deleted file mode 100644 index ad4ba76..0000000 --- a/QDMA/windows/sys/libqdma/source/xpcie.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#include <initguid.h> -#include "xpcie.hpp" -#include "qdma_reg_ext.h" -#include "trace.h" -#include <pciprop.h> - -#ifdef ENABLE_WPP_TRACING -#include "xpcie.tmh" -#endif - -using namespace xlnx; - -NTSTATUS xpcie_device::map( - const WDFCMRESLIST resources) -{ - num_bars = 0; - const ULONG num_resources = WdfCmResourceListGetCount(resources); - TraceVerbose(TRACE_PCIE, "# PCIe resources = %d", num_resources); - - for (ULONG i = 0; i < num_resources; i++) { - PCM_PARTIAL_RESOURCE_DESCRIPTOR resource = WdfCmResourceListGetDescriptor(resources, i); - if (resource == nullptr) { - TraceError(TRACE_PCIE, "WdfCmResourceListGetDescriptor() fails"); - return STATUS_DEVICE_CONFIGURATION_ERROR; - } - - if (resource->Type == CmResourceTypeMemory) { - /** index = 0 indictaes the first BAR details found in resource list, - index = 1 indicates the second BAR detauls found in resource list, etc., - - This index is not the BAR number. - */ - bars[num_bars].index = num_bars; - bars[num_bars].length = resource->u.Memory.Length; - bars[num_bars].base = static_cast<UCHAR *>(MmMapIoSpaceEx(resource->u.Memory.Start, - resource->u.Memory.Length, PAGE_READWRITE | PAGE_NOCACHE)); - - if (bars[num_bars].base == nullptr) { - TraceError(TRACE_PCIE, "MmMapIoSpace returned NULL! for BAR%u", num_bars); - return STATUS_DEVICE_CONFIGURATION_ERROR; - } - TraceVerbose(TRACE_PCIE, "MM BAR %d (addr:0x%lld, length:%llu) mapped at 0x%08p", - num_bars, resource->u.Memory.Start.QuadPart, bars[num_bars].length, bars[num_bars].base); - num_bars++; - } - } - - return STATUS_SUCCESS; -} - -void xpcie_device::unmap(void) -{ - /* Unmap any I/O ports. Disconnecting from the interrupt will be done automatically by the framework. */ - for (unsigned int i = 0; i < num_bars; i++) { - if (bars[i].base != nullptr) { - TraceVerbose(TRACE_PCIE, "Unmapping BAR%d, VA:(%p) Length %llu", i, bars[i].base, bars[i].length); - MmUnmapIoSpace(bars[i].base, bars[i].length); - bars[i].base = nullptr; - } - } -} - -NTSTATUS xpcie_device::get_bdf(const WDFDEVICE device, UINT32 &bdf) -{ - ULONG bus_number; - ULONG address; - NTSTATUS status; - ULONG length; - union pci_sbdf dev_sbdf; - - status = WdfDeviceQueryProperty(device, DevicePropertyBusNumber, - sizeof(bus_number), (PVOID)&bus_number, - &length); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_PCIE, - "WdfDeviceQueryProperty failed for DevicePropertyBusNumber: %!STATUS!", - status); - return status; - } - - status = WdfDeviceQueryProperty(device, DevicePropertyAddress, - sizeof(address), (PVOID)&address, - &length); - if (!NT_SUCCESS(status)) { - TraceError(TRACE_PCIE, - "WdfDeviceQueryProperty failed for DevicePropertyAddress: %!STATUS!", - status); - return status; - } - - dev_sbdf.val = 0x0; - dev_sbdf.sbdf.seg_no = (bus_number >> 8) & 0xFFFF; - dev_sbdf.sbdf.bus_no = bus_number & 0xFF; - dev_sbdf.sbdf.dev_no = (address >> 16) & 0xFFFF; - dev_sbdf.sbdf.fun_no = address & 0xFFFF; - - TraceVerbose(TRACE_PCIE, - "PCIe Seg_No : 0x%X, Bus_No : 0x%X, Dev_No: 0x%X, Fun_No: 0x%X", - dev_sbdf.sbdf.seg_no, dev_sbdf.sbdf.bus_no, dev_sbdf.sbdf.dev_no, dev_sbdf.sbdf.fun_no); - - bdf = dev_sbdf.val; - - return STATUS_SUCCESS; -} - -ULONG xpcie_device::get_num_msix_vectors(void) const -{ - return msix_vectors; -} - -NTSTATUS xpcie_device::find_num_msix_vectors( - const WDFDEVICE device) -{ - NTSTATUS status; - ULONG intr_support; - ULONG intr_max; - ULONG length; - DEVPROPTYPE type; - WDF_DEVICE_PROPERTY_DATA dev_prop_data; - - msix_vectors = 0; - - WDF_DEVICE_PROPERTY_DATA_INIT(&dev_prop_data, &DEVPKEY_PciDevice_InterruptSupport); - - status = WdfDeviceQueryPropertyEx(device, &dev_prop_data, sizeof(intr_support), (PVOID)&intr_support, - &length, &type); - - if (!NT_SUCCESS(status)) { - TraceError(TRACE_PCIE, - "WdfDeviceQueryProperty failed for PciDevice_InterruptSupport: %!STATUS!", - status); - return status; - } - - TraceVerbose(TRACE_PCIE, "PciDevice_InterruptSupport: %d, type : %d", intr_support, type); - - if (!(intr_support & DevProp_PciDevice_InterruptType_MsiX)) { - TraceError(TRACE_PCIE, "MSI-X interrupts are not supported"); - return STATUS_NOT_SUPPORTED; - } - - WDF_DEVICE_PROPERTY_DATA_INIT(&dev_prop_data, &DEVPKEY_PciDevice_InterruptMessageMaximum); - - status = WdfDeviceQueryPropertyEx(device, &dev_prop_data, sizeof(intr_max), (PVOID)&intr_max, - &length, &type); - - if (!NT_SUCCESS(status)) { - TraceError(TRACE_PCIE, - "WdfDeviceQueryProperty failed for DEVPKEY_PciDevice_InterruptMessageMaximum: %!STATUS!", - status); - return status; - } - - TraceVerbose(TRACE_PCIE, "InterruptMessageMaximum: %d, type : %d", intr_max, type); - - msix_vectors = intr_max; - - return STATUS_SUCCESS; -} - -NTSTATUS xpcie_device::assign_config_bar(const UINT8 bar_idx) -{ - if (bar_idx > num_bars) - return STATUS_UNSUCCESSFUL; - - config_bar = &bars[bar_idx]; - return STATUS_SUCCESS; -} - - -NTSTATUS xpcie_device::assign_bar_types(const UINT8 user_bar_idx) -{ - UINT32 config_bar_idx = 0; - config_bar_idx = (UINT8)(config_bar - bars); - - if (num_bars > 1) { - user_bar = &bars[user_bar_idx]; - TraceInfo(TRACE_PCIE, "AXI Master Lite BAR %u", (user_bar_idx * 2)); - - if (num_bars > 2) { - for (auto i = 0u; i < num_bars; ++i) { - if (i == user_bar_idx || i == config_bar_idx) - continue; - - bypass_bar = &bars[i]; - TraceInfo(TRACE_PCIE, "AXI Bridge Master BAR %d", (i * 2)); - break; - } - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS xpcie_device::read_bar( - qdma_bar_type bar_type, - size_t offset, - void* data, - size_t size) const -{ - xpcie_device::bar *bar = nullptr; - - if ((nullptr == data) || ((size_t)0 == size)) { - return STATUS_INVALID_PARAMETER; - } - - switch (bar_type) { - case qdma_bar_type::CONFIG_BAR: - bar = config_bar; - break; - case qdma_bar_type::USER_BAR: - bar = user_bar; - break; - case qdma_bar_type::BYPASS_BAR: - bar = bypass_bar; - break; - } - - if (nullptr == bar) - return STATUS_INVALID_PARAMETER; - - return bar->read(offset, data, size); -} - -NTSTATUS xpcie_device::write_bar( - qdma_bar_type bar_type, - size_t offset, - void* data, - size_t size) const -{ - xpcie_device::bar *bar = nullptr; - - if ((nullptr == data) || ((size_t)0 == size)) { - return STATUS_INVALID_PARAMETER; - } - - switch (bar_type) { - case qdma_bar_type::CONFIG_BAR: - bar = config_bar; - break; - case qdma_bar_type::USER_BAR: - bar = user_bar; - break; - case qdma_bar_type::BYPASS_BAR: - bar = bypass_bar; - break; - } - - if (nullptr == bar) - return STATUS_INVALID_PARAMETER; - - return bar->write(offset, data, size); -} - -NTSTATUS xpcie_device::get_bar_info( - qdma_bar_type bar_type, - PVOID &bar_base, - size_t &bar_length) const -{ - switch (bar_type) { - case qdma_bar_type::CONFIG_BAR: - bar_base = (PVOID)config_bar->base; - bar_length = config_bar->length; - break; - case qdma_bar_type::USER_BAR: - bar_base = (PVOID)user_bar->base; - bar_length = user_bar->length; - break; - case qdma_bar_type::BYPASS_BAR: - bar_base = (PVOID)bypass_bar->base; - bar_length = bypass_bar->length; - break; - default: - bar_base = NULL; - bar_length = (size_t)0; - return STATUS_INVALID_PARAMETER; - } - - return STATUS_SUCCESS; -} - -ULONG xpcie_device::conf_reg_read(size_t offset) const -{ - NT_ASSERTMSG("Error: BAR not assigned!", config_bar->base != nullptr); - NT_ASSERTMSG("Error: BAR overrun!", ((offset + sizeof(ULONG)) <= config_bar->length)); - - return READ_REGISTER_ULONG(reinterpret_cast<volatile ULONG*>(config_bar->base + offset)); -} - -void xpcie_device::conf_reg_write(size_t offset, ULONG data) const -{ - NT_ASSERTMSG("Error: BAR not assigned!", config_bar->base != nullptr); - NT_ASSERTMSG("Error: BAR overrun!", ((offset + sizeof(ULONG)) <= config_bar->length)); - - WRITE_REGISTER_ULONG(reinterpret_cast<volatile ULONG*>(config_bar->base + offset), data); -} - -NTSTATUS xpcie_device::bar::write( - const size_t offset, - void *data, - const size_t size) const -{ - if (base == nullptr) { - TraceError(TRACE_PCIE, "Attempted to access non-mapped BAR!"); - return STATUS_INVALID_ADDRESS; - } - - /* check if request runs over BAR address space */ - if ((offset + size) > length) { - TraceError(TRACE_PCIE, "Error: BAR overrun!"); - return STATUS_INVALID_PARAMETER; - } - - UCHAR *vaddr = base + offset; - - if (size % sizeof(ULONG64) == 0) { - WRITE_REGISTER_BUFFER_ULONG64(reinterpret_cast<volatile ULONG64*>(vaddr), - static_cast<PULONG64>(data), static_cast<ULONG>(size) / sizeof(ULONG64)); - } else if (size % sizeof(ULONG) == 0) { - WRITE_REGISTER_BUFFER_ULONG(reinterpret_cast<volatile ULONG*>(vaddr), - static_cast<PULONG>(data), static_cast<ULONG>(size) / sizeof(ULONG)); - } else if (size % sizeof(USHORT) == 0) { - WRITE_REGISTER_BUFFER_USHORT(reinterpret_cast<volatile USHORT*>(vaddr), - static_cast<PUSHORT>(data), static_cast<ULONG>(size) / sizeof(USHORT)); - } else { - WRITE_REGISTER_BUFFER_UCHAR(reinterpret_cast<volatile UCHAR*>(vaddr), - static_cast<PUCHAR>(data), static_cast<ULONG>(size)); - } - - return STATUS_SUCCESS; -} - -NTSTATUS xpcie_device::bar::read( - const size_t offset, - void *data, - const size_t size) const -{ - if (base == nullptr) { - TraceError(TRACE_PCIE, "Attempted to access non-mapped BAR!"); - return STATUS_INVALID_ADDRESS; - } - - /* check if request runs over BAR address space */ - if ((offset + size) > length) { - TraceError(TRACE_PCIE, "Error: BAR overrun!"); - return STATUS_INVALID_PARAMETER; - } - - UCHAR* vaddr = base + offset; - - if (size % sizeof(ULONG) == 0) { - READ_REGISTER_BUFFER_ULONG(reinterpret_cast<volatile ULONG*>(vaddr), static_cast<PULONG>(data), static_cast<ULONG>(size) / sizeof(ULONG)); - } else if (size % sizeof(USHORT) == 0) { - READ_REGISTER_BUFFER_USHORT(reinterpret_cast<volatile USHORT*>(vaddr), static_cast<PUSHORT>(data), static_cast<ULONG>(size) / sizeof(USHORT)); - } else { - READ_REGISTER_BUFFER_UCHAR(vaddr, static_cast<PUCHAR>(data), static_cast<ULONG>(size)); - } - - return STATUS_SUCCESS; -} diff --git a/QDMA/windows/sys/libqdma/source/xpcie.hpp b/QDMA/windows/sys/libqdma/source/xpcie.hpp deleted file mode 100644 index 232c331..0000000 --- a/QDMA/windows/sys/libqdma/source/xpcie.hpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2020 Xilinx, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -#pragma once - -#include "qdma_platform_env.h" -#include "qdma_exports.h" -#include <wdmguid.h> -#include <wchar.h> - -namespace xlnx { - -struct sbdf { - UINT32 fun_no : 3; - UINT32 dev_no : 5; - UINT32 bus_no : 8; - UINT32 seg_no : 16; -}; - -union pci_sbdf { - struct sbdf sbdf; - UINT32 val; -}; - -class xpcie_device { - struct bar { - /** kernel virtual address of pcie BAR */ - UCHAR *base = nullptr; - /** length of address space in Bytes */ - size_t length = 0; - /** BAR index, not to confuse with BAR number */ - unsigned int index = 0; - - NTSTATUS read(size_t offset, void* data, size_t size) const; - NTSTATUS write(size_t offset, void* data, size_t size) const; - }; - - static constexpr size_t MAX_NUM_BARS = 6; - ULONG msix_vectors = 0; - UINT32 num_bars = 0; - bar bars[MAX_NUM_BARS]; - bar* config_bar = nullptr; - bar* user_bar = nullptr; - bar* bypass_bar = nullptr; - -public: - NTSTATUS map(const WDFCMRESLIST resources); - void unmap(void); - NTSTATUS find_num_msix_vectors(const WDFDEVICE device); - ULONG get_num_msix_vectors(void) const; - NTSTATUS assign_config_bar(const UINT8 bar_idx); - NTSTATUS assign_bar_types(const UINT8 user_bar_idx); - NTSTATUS get_bdf(const WDFDEVICE device, UINT32 &bdf); - - NTSTATUS read_bar(qdma_bar_type bar_type, size_t offset, void* data, size_t size) const; - NTSTATUS write_bar(qdma_bar_type bar_type, size_t offset, void* data, size_t size) const; - ULONG conf_reg_read(size_t offset) const; - void conf_reg_write(size_t offset, ULONG data) const; - NTSTATUS get_bar_info(qdma_bar_type bar_type, PVOID &bar_base, size_t &bar_length) const; -}; -} /* namespace xlnx */ - - diff --git a/README.md b/README.md deleted file mode 100644 index 194a65f..0000000 --- a/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Xilinx DMA IP Reference drivers - -## Xilinx QDMA - -The Xilinx PCI Express Multi Queue DMA (QDMA) IP provides high-performance direct memory access (DMA) via PCI Express. The PCIe QDMA can be implemented in UltraScale+ devices. - -Both the linux kernel driver and the DPDK driver can be run on a PCI Express root port host PC to interact with the QDMA endpoint IP via PCI Express. - -### Getting Started - -* [QDMA Reference Drivers Comprehensive documentation](https://xilinx.github.io/dma_ip_drivers/) - -## Xilinx-VSEC (XVSEC) - -Xilinx-VSEC (XVSEC) are Xilinx supported VSECs. The XVSEC Driver helps creating and deploying designs that may include the Xilinx VSEC PCIe Features. - -VSEC (Vendor Specific Extended Capability) is a feature of PCIe. - -The VSEC itself is implemented in the PCIe extended capability register in the FPGA hardware (as either soft or hard IP). The drivers and SW are created to interface with and use this hardware implemented feature. - -The XVSEC driver currently include the MCAP VSEC, but will be expanded to include the XVC VSEC and NULL VSEC. - -### Getting Started - -* [XVSEC Linux Kernel Reference Driver Comprehensive documentation](https://xilinx.github.io/dma_ip_drivers/) - -### Support - -Refer to Xilinx PCIe Forum for any queries/issues/support required w.r.t Xilinx's DMA IP Reference Drivers - -Note: Issues are disabled in github for these drivers. All the queries shall be redirected through Xilinx PCIe Forum link given below. - -* [Xilinx PCIe Forum](https://forums.xilinx.com/t5/PCIe-and-CPM/bd-p/PCIe) \ No newline at end of file diff --git a/XDMA/linux-kernel/RELEASE b/RELEASE similarity index 100% rename from XDMA/linux-kernel/RELEASE rename to RELEASE diff --git a/XDMA/linux-kernel/COPYING b/XDMA/linux-kernel/COPYING deleted file mode 100644 index 3912109..0000000 --- a/XDMA/linux-kernel/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/XVSEC/linux-kernel/COPYING b/XVSEC/linux-kernel/COPYING deleted file mode 100644 index 3912109..0000000 --- a/XVSEC/linux-kernel/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/XVSEC/linux-kernel/LICENSE b/XVSEC/linux-kernel/LICENSE deleted file mode 100644 index 703e647..0000000 --- a/XVSEC/linux-kernel/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -BSD License - -For Xilinx DMA IP software - -Copyright (c) 2016-present, Xilinx, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Xilinx nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/XVSEC/linux-kernel/Makefile b/XVSEC/linux-kernel/Makefile deleted file mode 100644 index 0b574bf..0000000 --- a/XVSEC/linux-kernel/Makefile +++ /dev/null @@ -1,99 +0,0 @@ -SHELL = /bin/bash -BUILD_DIR = ./build - -kernelrelease := $(shell uname -r) - -# evaluate install paths -ifeq ($(install_path),) - # defaults - kernel_install_path ?= $(PREFIX)/lib/modules/$(kernelrelease)/updates/kernel/drivers/xvsec - dev_install_path ?= /usr/local/include/ - user_install_path ?= /usr/local/sbin -else # bundled install - kernel_install_path ?= $(install_path)/modules - dev_install_path ?= $(install_path)/include/ - user_install_path ?= $(install_path)/bin -endif - -.PHONY: all -all: drv libxvsec tools - -.PHONY : drv -drv : - @echo "#######################"; - @echo "#### drv ####"; - @echo "#######################"; - cd drv && $(MAKE) - -.PHONY : libxvsec -libxvsec : - @echo "#######################"; - @echo "#### libxvsec ####"; - @echo "#######################"; - cd libxvsec && $(MAKE) - -.PHONY : tools -tools : libxvsec app -app : - @echo "#######################"; - @echo "#### tools ####"; - @echo "#######################"; - cd tools && $(MAKE) -.PHONY : clean -clean : - @echo "#########################"; - @echo "#### removing driver ####"; - @echo "#########################"; - cd drv && $(MAKE) clean - @echo "#########################"; - @echo "#### removing Lib #######"; - @echo "#########################"; - cd libxvsec && $(MAKE) clean - @echo "#########################"; - @echo "#### removing tools #####"; - @echo "#########################"; - cd tools && $(MAKE) clean - -.PHONY : install -install : - @echo "installing kernel modules to $(kernel_install_path) ..." - @mkdir -p -m 755 $(kernel_install_path) - @install -v -m 644 $(BUILD_DIR)/modules/*.ko $(kernel_install_path) - @depmod -a || true - - @echo "installing development headers to $(dev_install_path) ..." - @mkdir -p -m 755 $(dev_install_path) - @install -v -m 755 $(BUILD_DIR)/modules/*.h $(dev_install_path) - - @echo "installing user tools to $(user_install_path) ..." - @mkdir -p -m 755 $(user_install_path) - @install -v -m 755 $(BUILD_DIR)/xvsecctl $(user_install_path) - -.PHONY : uninstall -uninstall : - @echo "Un-installing $(kernel_install_path) ..." - @/bin/rm -rf $(kernel_install_path)/* - @depmod -a - - @echo "Un-installing user tools under $(user_install_path) ..." - @/bin/rm -f $(user_install_path)/xvsecctl - - @echo "Un-installing development headers under $(dev_install_path) ..." - @/bin/rm -r $(dev_install_path) - -.PHONY: help -help: - @echo "Build Targets:";\ - echo " install - Installs all compiled drivers.";\ - echo " uninstall - Uninstalls drivers.";\ - echo " clean - Removes all generated files.";\ - echo " drv - builds the kernel driver"; \ - echo " libxvsec - builds the user space library"; \ - echo " tools - builds the application tool"; - @echo;\ - echo "Build Options:";\ - echo " kernel_install_path=<path>";\ - echo " - kernel module install path.";\ - echo " user_install_path=<path>";\ - echo " - user cli tool install path.";\ - echo; diff --git a/XVSEC/linux-kernel/README b/XVSEC/linux-kernel/README deleted file mode 100644 index dca5b3b..0000000 --- a/XVSEC/linux-kernel/README +++ /dev/null @@ -1 +0,0 @@ -docs/README diff --git a/XVSEC/linux-kernel/RELEASE b/XVSEC/linux-kernel/RELEASE deleted file mode 100644 index 9eac0f2..0000000 --- a/XVSEC/linux-kernel/RELEASE +++ /dev/null @@ -1,81 +0,0 @@ -Release: 2020.2.1 -================= - -NOTE: - This release is based on the 2020.2.1 XVSEC-MCAP Design. - - XVSEC driver is implemented to support Ultrascale, Ultrascale+, and Versal devices. - -SUPPORTED FEATURES: -=================== - -Release: 2020.2.1 ------------------ -- Integrated the following pull requests in mainline - https://github.com/Xilinx/dma_ip_drivers/pull/134/commits/3a9351b0cc30f355a6d48a33b7b76aaae38434c0 - https://github.com/Xilinx/dma_ip_drivers/pull/134/commits/cb1659b84021d449fc9388d3e04ebef7422932e7 - https://github.com/Xilinx/dma_ip_drivers/pull/134/commits/12a076ad89094d297bbc8d88d42527b7b24723b8 - https://github.com/Xilinx/dma_ip_drivers/pull/134/commits/3414e46e64c27dad5d6399429157f3038e439ae4 - https://github.com/Xilinx/dma_ip_drivers/pull/134/commits/d1fe085fd931f66a8e5d4217414fc514e345534f - https://github.com/Xilinx/dma_ip_drivers/pull/134/commits/7805b271bee7344c02c311b01c918e1c43e3ebe5 - -- Fixed the compilation issue for Ubuntu 20.04 LTS - -Release: 2020.2 ---------------- -- The XVSEC kernel driver 2020.2 Supports - - US/US+ devices (MCAP Rev 0 and 1) - - Versal device (MCAP Rev 2) -- Supports Multiple VSECs on the same device -- Supports Multiple devices connected on the same host - -- Generic VSEC functionality - - Lists the supported VSECs by the device - - Verbose information about the device - -- The following MCAP operations supported for Versal devices - - MCAP Module Reset - - List MCAP Register set - - File Download at user specified address - - Fixed Address download for FIFO devices - - Increment Address download - - 32b mode download for 32b supported devices - - 128b mode download for 128b suppported devices - - Slow and Fast download mode supported - - File Upload from user specified address - - Fixed Address upload for FIFO devices - - Increment Address upload - - Access(Read/Write) any MCAP register by providing offset - - Access(Read/Write) any Device register connected to AXI bus by providing address - - Set the AXI cache and protections bits - -Release: 2018.3 ---------------- -- The XVSEC kernel driver 2018.3 Supports - - US/US+ devices (MCAP Rev 0 and 1) - -- MCAP VSEC functionality is implemented as part of the XVSEC driver -- Multiple Devices on the Same Host supported - - Unique character device gets created per device -- The following Generic VSEC operations supported - - Listing the supported VSECs by HW - - Verbose Information of the given device -- The following MCAP operations supported - - Configuration Logic Reset - - MCAP Module Reset - - Full Reset (Both Configuration Logic and MCAP Module Reset) - - Dump MCAP Read Data Registers - - Dump MCAP Register set - - Dump FPGA Configuration Register set - - Access(Read/Write) any MCAP register by providing offset - - Access(Read/Write) any FPGA configuration register by providing register number - - Program partial clear bitstream - - Program Stage-2/partial reconfigurable bitstream - -DRIVER LIMITATIONS: -=================== -- Only MCAP VSEC is supported - -KNOWN Issues: -=========== -XVSEC kernel driver 2020.2 does not support Fast download mode for Versal devices. diff --git a/XVSEC/linux-kernel/docs/README b/XVSEC/linux-kernel/docs/README deleted file mode 100644 index a9e436c..0000000 --- a/XVSEC/linux-kernel/docs/README +++ /dev/null @@ -1,662 +0,0 @@ -############################################################################### - - Xilinx XVSEC Software README - -############################################################################### -_____________________________________________________________________________ -Contents - -1. Installation - 1.1 Compiling the XVSEC Software - 1.2 Installing the compiled binaries - 1.3 Loading the Kernel module -2. Xilinx "xvsecctl" Command-line Utility - 2.1 Using xvsecctl for Generic VSEC functionality - 2.2 US/US+ MCAP Specific Commands - 2.3 Versal MCAP Specific Commands - -_____________________________________________________________________________ -1. Installation: -================ - - 1.1 Compiling the XVSEC Software: - -------------------------------- - - In order to compile the Xilinx VSEC software, a configured and compiled - Linux kernel source tree is required. The source tree may be only compiled - header files, or a complete tree. The source tree needs to be configured - and the header files need to be compiled. And, the Linux kernel must be - configured to use modules. - - Additionally, the /lib/modules must have been set up for this particular - kernel - (i.e. "make modules_install" has been run with the Linux kernel source tree). - - a. QDMA Linux Kernel Driver is available in Xilinx github at - https://github.com/Xilinx/dma_ip_drivers/tree/master/XVSEC/linux-kernel - - b. Compile the Xilinx XVSEC Linux driver: - - [xilinx@]# make clean all - - a sub-directory build/ will be created as a result of running "make". - - By default, xvsec kernel module, xvsec user space library and - xvsec application tool gets compiled - - To compile Kernel driver(xvsec.ko): - [xilinx@]# make drv - - To compile user space library(libxvsec.a): - [xilinx@]# make libxvsec - - To compile application tool(xvsecctl): - [xilinx@]# make tools - - 1.2 Installing the compiled binaries: - ------------------------------------- - - To install the XVSEC software, the installer must be the root user, then - run "make install". - - [xilinx@]# make install - - The XVSEC module will be installed in the - /lib/modules/<linux_kernel_version>/updates/kernel/drivers/xvsec directory. - - The xvsecctl tool will be installed in /user/local/sbin. - - 1.3 Loading the Kernel module: - -------------------------------- - - To load the module run modprobe as follows: - - [root@]# modprobe xvsec - - Now the XVSEC software is ready for use. - The eaxmple for the system having VCU1525(US+) card connected on bus 0x03 and device number 0x00 will have char dev nodes as below : - - - Default generic char device node - **/dev/xvsec0300** - - For US+ MCAP specific functionalities - **/dev/xvsec0300_mcap**. - -2. Xilinx "xvsecctl" Command-line Utility: -====================================== - - The Xilinx XVSEC control tool, xvsecctl, is a Command Line utility - which is installed in /usr/local/sbin/ and allows controlling of - Xilinx VSEC functionality. - - For help run: - xvsecctl -h - - It can perform the following functions: - - - Generic VSEC functionality - - Lists the supported VSECs by the device - - Verbose information about the device - - - US/US+ device specific functionality - - Configuration Logic Reset - - MCAP Module Reset - - Full Reset (Both Configuration Logic and MCAP Module Reset) - - List MCAP Read Data Registers - - List MCAP Register set - - List FPGA Configuration Register set - - Access(Read/Write) any MCAP register by providing offset - - Access(Read/Write) any FPGA configuration register by providing register number - - Program partial clear bitstream - - Program Stage-2/partial reconfigurable bitstream - - - Versal device specific functionality - - MCAP Module Reset - - List MCAP Register set - - File Download at user specified address - - Fixed Address download for FIFO devices - - Increment Address download - - 32b mode download for 32b supported devices - - 128b mode download for 128b suppported devices - - Slow and Fast download mode supported - - File Upload from user specified address - - Fixed Address upload for FIFO devices - - Increment Address upload - - Access(Read/Write) any MCAP register by providing offset - - Access(Read/Write) any Device register connected to AXI bus by providing address - - Set the AXI cache and protections bits - - 2.1 Using xvsecctl for Generic VSEC functionality - ------------------------------------------------- - - Note: - Following parameters are common for all the commands. - b <bus_no>: - - Specify PCI bus no on which device sits. - F <dev_no>: - - Specify PCI device no on the bus. - - 2.1.1. List XVSEC Capabilities - -------------------------- - - command: ./xvsecctl -b<bus_no> -F <dev_no> -l - - Description: - Lists the supported VSECs - - Example: - [xilinx@]# ./xvsecctl -b 0x65 -F 0x0 -l - - No of Supported Extended capabilities : 3 - VSEC ID VSEC Rev VSEC Name Driver Support - ------- -------- --------- -------------- - 0x0001 0x0001 PCIe_MCAP_VSEC Yes - 0x0000 0x0000 UNKNOWN No - 0x0008 0x0000 PCIe_XVC_DEBUG_VSEC No - - - 2.1.2. Lists basic information about the device - ------------------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -v - - Description: - Prints Verbose Information of the given device. - - Example: - [xilinx@]# ./xvsecctl -b 0x65 -F 0x0 -v - - Xilinx VSEC Tool : v2020.2.0 - Xilinx VSEC Library : v2020.2.0 - ----------------------------------- - vendor_id = 0x10EE - device_id = 0xB03F - device_no = 0x0 - device_fn = 0x0 - subsystem_vendor = 0x10EE - subsystem_device = 0x7 - class_id = 0x5800 - cfg_size = 0x1000 - is_msi_enabled = 0x0 - is_msix_enabled = 0x0 - - 2.2 US/US+ MCAP Specific Options - -------------------------------- - - 2.2.1. MCAP Reset - ----------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -r - - Description: - It Performs Simple Reset. - - Example: - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -r - - MCAP version: 1 - Configuration Logic Reset Successful - - 2.2.2. MCAP Module Reset - ------------------------ - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -m - - Description: - Performs Module Reset. - - Example: - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -m - - MCAP version: 1 - MCAP Module Reset Successful - - - 2.2.3. MCAP Full Reset - ---------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -f - - Description: - This command Performs Full Reset. It is equivalent to MCAP Simpale Reset + MCAP Module Reset. - - Example: - [xilinx@]# sudo ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -f - - MCAP version: 1 - Both Configuration Logic & MCAP Module Reset Successful - - 2.2.4. Lists Data register Contents - ----------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -D - - Description: - Reads and prints MCAP Data Registers. - - Example: - [xilinx@]# sudo ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -D - - MCAP version: 1 - BYTE OFFSET Register Name Data Value - ----------- ---------------- ---------- - 0x001C FPGA Read Data[0] 0x00000000 - 0x0020 FPGA Read Data[1] 0x00000000 - 0x0024 FPGA Read Data[2] 0x00000000 - 0x0028 FPGA Read Data[3] 0x00000000 - - 2.2.5. Lists MCAP Register Contents - ----------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -d - - Description: - It Dumps all the MCAP config Registers. - - Example: - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -d - - MCAP version: 1 - BYTE OFFSET Register Name Data Value - ----------- ---------------- ---------- - 0x0000 Ext Capability 0x4801000B - 0x0004 VSEC Header 0x02C10001 - 0x0008 FPGA JTAG ID 0x14B31093 - 0x000C FPGA BitStream Ver 0x00000000 - 0x0010 Status 0x00000004 - bit 0 MCAP Error 0 - bit 1 MCAP EOS 0 - bit 4 MCAP Read Complete 0 - bit 5:7 MCAP Read Count 0 - bit 8 MCAP FIFO Overflow 0 - bit 12:15 MCAP FIFO Occupancy 0 - bit 24 Req for MCAP Release 0 - 0x0014 Control 0x00001000 - bit 0 MCAP Enable 0 - bit 1 MCAP Read Enable 0 - bit 4 MCAP Reset 0 - bit 5 MCAP Module Reset 0 - bit 8 Req for MCAP by PCIe 0 - bit 12 MCAP Design Switch 1 - bit 16 Write Data Reg Enable 0 - 0x0018 FPGA Write Data 0x00000000 - 0x001C FPGA Read Data[0] 0x0000000B - 0x0020 FPGA Read Data[1] 0x00000000 - 0x0024 FPGA Read Data[2] 0x00000000 - 0x0028 FPGA Read Data[3] 0x00000000 - - 2.2.6. Lists FPGA Config Reg Dump - --------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -o - - Description: - Reads and prints all FPGA Config Registers. - - Example: - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -o - - MCAP version: 1 - FPGA CFG Registers Dump (see Configuration User Guide for more details) - - Register No Register Name Data Value - ----------- ---------------- ---------- - 0x0000 crc 0x00000000 - 0x0001 far 0x07FC0000 - 0x0002 fdri 0x00000000 - 0x0003 fdro 0x00000000 - 0x0004 cmd 0x00000000 - 0x0005 ctl0 0x00000401 - 0x0006 mask 0x00000000 - 0x0007 stat 0x109079FC - 0x0008 lout 0x00000000 - 0x0009 cor0 0x38003FE5 - 0x000A mfwr 0x00000000 - 0x000B cbc 0x00000000 - 0x000C idcode 0x14B31093 - 0x000D axss 0x00000000 - 0x000E cor1 0x00400000 - 0x0010 wbstar 0x00000000 - 0x0011 timer 0x00000000 - 0x0014 scratchpad 0x00000000 - 0x0016 bootsts 0x00000001 - 0x0018 ctl1 0x00000000 - 0x001F bspi 0x0000000B - - 2.2.7. Access the MCAP Registers - -------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -a <byte offset> [type [data]] - - Description: - This command is used to read/write the MCAP config Register. - - Parameters: - <byte offset>: - - MCAP register offset - [type[data]]: - - Write operation with data - - b for byte data [8 bits] read - - h for half word data [16 bits] read - - w for word data [32 bits] read - - Examples: - 1) Read MCAP register - --------------------- - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -a 0x4 w - - MCAP version: 1 - [XVSEC] : xvsec_mcap_access_config_reg : read operation completed - BYTE OFFSET Register Name Data Value - ----------- ---------------- ---------- - 0x0004 VSEC Header 0x02C10001 - - 2) Write MCAP register - ---------------------- - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -a 0x14 w 0x10000 - - MCAP version: 1 - [XVSEC] : xvsec_mcap_access_config_reg : write operation completed - BYTE OFFSET Register Name Data Value - ----------- ---------------- ---------- - 0x0014 Control 0x00010000 - - 2.2.8. Access FPGA Config Registers - ----------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -s <register no> [w [data]] - - Description: - This command is used to read/write the FPGA config Register. - - Parameters: - <register no>: - - FPGA register offset - [w [data]]: - - Write operation with data - - Read Operation if 'w' not given - - Examples: - 1) Read FPGA config register - ---------------------------- - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -s 0x14 - - MCAP version: 1 - [XVSEC] : xvsec_mcap_access_fpga_config_reg : read operation completed - Register No Register Name Data Value - ----------- ---------------- ---------- - 0x0014 scratchpad 0x00000000 - - 2) Write FPGA config register - ---------------------------- - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -s 0x14 w 0xDEADBEEF - MCAP version: 1 - In -s option - [XVSEC] : xvsec_mcap_access_fpga_config_reg : write operation completed - Register No Register Name Data Value - ----------- ---------------- ---------- - 0x0014 scratchpad 0xDEADBEEF - - 2.2.9. Program Stage 2 Bit-stream(.bin/.bit/.rbt) - ------------------------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -p <file> - - Description: - Programs Stage 2 Bitstream into FPGA. Supported file extentions are *.bin, *.bit, *.rbt. - - Example: - [xilinx@]# ./xvsecctl -b 0x08 -F 0x0 -c 0x1 -p Tul_Des03_tfu_update_region_partial.bit - - MCAP version: 1 - [XVSEC] : xvsec_mcap_configure_fpga : Bitstream Program successful - FPGA configuration successful - - 2.3 Versal MCAP Specific Options - -------------------------------- - - 2.3.1. MCAP Module Reset - ------------------------ - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -m - - Description: - It Performs MCAP Module Reset. - - Example: - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -m - - MCAP version: 2 - MCAP Module Reset Successful - - 2.3.2. Lists MCAP Register Contents - ----------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -d - - Description: - It will print the contents of the MCAP Registers. - - Example: - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -d - - MCAP version: 2 - BYTE OFFSET Register Name Data Value - ----------- ---------------- ---------- - 0x0000 Ext Capability 0x3A01000B - 0x0004 VSEC Header 0x02020001 - 0x0008 Status 0x01800000 - bit 5:4 MCAP Read/Write Status 0 - bit 8 MCAP Read Complete 0 - bit 20:16 MCAP FIFO Occupancy 0 - bit 21 MCAP Write FIFO Full 0 - bit 22 Write FIFO Almost Full 0 - bit 23 Write FIFO Almost Empty 1 - bit 24 MCAP Write FIFO Empty 1 - bit 25 Write FIFO Overflow 0 - 0x000C Control 0x00000000 - bit 0 MCAP Read Enable 0 - bit 4 MCAP Write Enable 0 - bit 5 MCAP 128-bit Mode 0 - bit 8 MCAP Reset 0 - bit 19:16 MCAP AXI Cache 0 - bit 22:20 MCAP AXI Protect 0 - 0x0010 MCAP RW Addr Register 0x00000000 - 0x0014 MCAP Write Data 0x00000000 - 0x0018 MCAP Read Data 0x00000000 - - 2.3.3. PDI Download - ------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -p mode <32b/128b> type <fixed/incr> <Address> <PDI File> [tr_mode <slow/fast>] [sbi <SBI reg block addr>] - - Description: - This command is used to Download the specified File (.pdi) at given address. - - Parameters: - mode - - <32b>: 32-bit mode should be used - - <128b>: 128-bit mode should be used - type - - <fixed>: Address is fixed - - <incr>: Address should be incremented based on specified mode - <Address> - - Address to be used for PDI download - <PDI File> - - PDI file to be downloaded - [tr_mode ] - - optional slow/fast download mode option for data transfer - - If tr_mode is not specified, it will use Default(fast) mode - [sbi ] - - required specifier if targeting PDI download to slave boot - interface (SBI) and the SBI_CTRL register has not been set to - accept data from the AXI interface (0xF1220004[4:2] != 3'b010) - - Can be specified without tr_mode or after tr_mode - - If targeting PDI download to SBI, both the SBI FIFO address - and the SBI reg block address must be mapped in hardware - from the CPM master to the PMC slave and there must be NMU remap(s) - in place to remap from a 32 bit address to a 48 bit address - - Examples: - 1) Slow mode example: 32b, incr mode with DDR at address 0x0 - ------------------------------------------------------------ - [xilinx@]# ./xvsecctl -b 0x01 -F 0x0 -c 0x1 -p mode 32b type incr 0x0 ./design_routed_tandem_off_rp_1_partial.pdi tr_mode slow - - MCAP version: 2 - tr_mode: 0 - [XVSEC] : xvsec_mcap_file_download : File Download successful - File Download successful - - 2) Fast mode example: 128b, incr mode with DDR at address 0x0 - ------------------------------------------------------------- - [xilinx@]# ./xvsecctl -b 0x01 -F 0x0 -c 0x1 -p mode 128b type incr 0x0 ./design_routed_tandem_off_rp_1_partial.pdi tr_mode fast - - MCAP version: 2 - tr_mode: 1 - [XVSEC] : xvsec_mcap_file_download : File Download successful - File Download successful - - 3) Slow mode example: 128b, fixed mode with SBI fixed address 0xF2100000 - ------------------------------------------------------------------------ - [xilinx@]# ./xvsecctl -b 0x01 -F 0x0 -c 0x1 -p mode 128b type fixed 0xF2100000 ./design_routed_tandem_off_rp_1_partial.pdi tr_mode slow sbi 0x10000 - - MCAP version: 2 - tr_mode: 1 - [XVSEC] : xvsec_mcap_file_download : File Download successful - File Download successful - - 2.3.4. PDI Upload - ----------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -t type <fixed/incr> <Address> <Length_2_Read> <PDI File> - - Description: - It Reads the contents at given address for the given length into given file - - Parameters: - type - - <fixed>: Address is fixed - - <incr>: Address should be incremented based on specified mode - <Address> - - Address to Read the contents - <Length_2_Read> - - Number of bytes to read - <PDI File> - - Read the contents and save in given file - - Example: - 1) PDI upload with incr mode and DDR at address 0x0 - ------------------------------------------------------------ - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -t type incr 0x0 843312 ./read_from_ddr_32bit_incr.pdi - - MCAP version: 2 - [XVSEC] : xvsec_mcap_file_upload : File Upload successful - File Upload successful - - 2.3.5. Access MCAP Register - --------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -a <Reg Offset> <b/h/w> <Data> - - Description: - This command is used to read/write the MCAP config Register. - - Parameters: - <byte offset>: - - MCAP register offset - [type[data]]: - - Write operation with data - - b for byte data [8 bits] read - - h for half word data [16 bits] read - - w for word data [32 bits] read - - Examples: - 1) Read MCAP register - --------------------- - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -a 0xc w - - MCAP version: 2 - [XVSEC] : xvsec_mcap_access_config_reg : read operation completed - BYTE OFFSET Register Name Data Value - ----------- ---------------- ---------- - 0x000C Control 0x00000000 - - 2) Write MCAP register - ---------------------- - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -a 0xc w 0x0010 - - MCAP version: 2 - [XVSEC] : xvsec_mcap_access_config_reg : write operation completed - BYTE OFFSET Register Name Data Value - ----------- ---------------- ---------- - 0x000C Control 0x00000010 - - 2.3.6. Access the AXI Registers - ------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 -x mode <32b/128b> <address> w <data> - - Description: - This command is used to read/write the 32b/128b AXI addresses. - - Parameters: - mode - - <32b>: 32-bit mode should be used - - <128b>: 128-bit mode should be used - - Mode is Not valid for Read Operation - <Address> - - Address to be used for PDI download - [w [data]] - - Write operation with data - - Read Operation if 'w' not given - - Examples: - 1) 32bit AXI read - ----------------- - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -x 0xf11a0008 - - MCAP version: 2 - [XVSEC] : xvsec_mcap_access_axi_reg : read operation completed - axi address: Data Value - ------------ ---------- - 0xF11A0008: 0x00000000 - - 2) 32-bit AXI write - ------------------- - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -x mode 32b 0xf11a0008 w 0x00302021 - - MCAP version: 2 - [XVSEC] : xvsec_mcap_access_axi_reg : write operation completed - axi address: Data Value - ------------ ---------- - 0xF11A0008: 0x00302021 - - 3) 128b AXI write - ----------------- - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -x mode 128b 0x0 w 0xA0000000 0xB1000000 0xC2000000 0xF10000FF - - MCAP version: 2 - [XVSEC] : xvsec_mcap_access_axi_reg : write operation completed - axi address: Data Value - ------------ ---------- - 0x00000000: 0xA0000000 - 0x00000004: 0xB1000000 - 0x00000008: 0xC2000000 - 0x0000000C: 0xF10000FF - - 2.3.7. To set AXI cache and protection settings - ----------------------------------------------- - - command: ./xvsecctl -b <bus_no> -F <dev_no> -c 0x1 [axi_cache <data> axi_prot <data>] - - Description: - It will configure the AXI cache and protections bits. - - Parameters: - [axi_cache <data>] - axi_cache valid range 0 to 15 - [axi_prot <data>] - axi_prot valid range 0 to 7 - - Example: - [xilinx@]# ./xvsecctl -b 0x01 -F 0 -c 1 -q axi_cache 0x1 axi_prot 0x2 - - MCAP version: 2 - axi_cache: 0x1 - axi_prot: 0x2 - diff --git a/XVSEC/linux-kernel/drv/Makefile b/XVSEC/linux-kernel/drv/Makefile deleted file mode 100644 index 6e1a1b7..0000000 --- a/XVSEC/linux-kernel/drv/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -XVSEC_HOME := $(shell pwd) -XVSEC_KVER := $(shell uname -r) - -build_path := ../build -module_path := $(build_path)/modules -obj-m += xvsec.o -xvsec-objs := xvsec_drv.o xvsec_cdev.o xvsec_util.o -xvsec-objs += ./xvsec_mcap/xvsec_mcap.o -xvsec-objs += ./xvsec_mcap/us/xvsec_mcap_us.o -xvsec-objs += ./xvsec_mcap/versal/xvsec_mcap_versal.o - -ccflags-y := -I$(PWD) -I$(PWD)/xvsec_mcap -ccflags-y += -I$(PWD)/xvsec_mcap/us -ccflags-y += -I$(PWD)/xvsec_mcap/versal - -all: - @mkdir -p -m 755 $(build_path) - @mkdir -p -m 755 $(module_path) - @mkdir -p -m 755 $(module_path)/obj - @mkdir -p -m 755 $(module_path)/obj/xvsec_mcap - @mkdir -p -m 755 $(module_path)/obj/xvsec_mcap/us - @mkdir -p -m 755 $(module_path)/obj/xvsec_mcap/versal - make -C /lib/modules/$(XVSEC_KVER)/build M=$(XVSEC_HOME) modules - @mv *.ko $(module_path)/ - @cp xvsec_drv.h $(module_path)/ - @cp ./xvsec_mcap/xvsec_mcap.h $(module_path)/ - @mv *.o $(module_path)/obj/ - @mv .*cmd $(module_path)/obj/ - @mv *.symvers $(module_path)/obj/ - @mv *.mod* $(module_path)/obj/ - @mv *.order* $(module_path)/obj/ - @mv .tmp* $(module_path)/obj/ - @mv ./xvsec_mcap/*.o $(module_path)/obj/xvsec_mcap/ - @mv ./xvsec_mcap/us/*.o $(module_path)/obj/xvsec_mcap/us/ - @mv ./xvsec_mcap/versal/*.o $(module_path)/obj/xvsec_mcap/versal/ - -clean: - @rm -rf $(module_path) - make -C /lib/modules/$(XVSEC_KVER)/build M=$(XVSEC_HOME) clean diff --git a/XVSEC/linux-kernel/drv/version.h b/XVSEC/linux-kernel/drv/version.h deleted file mode 100644 index f9a2069..0000000 --- a/XVSEC/linux-kernel/drv/version.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2018-2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XVSEC_VERSION_H__ -#define __XVSEC_VERSION_H__ - -#define XVSEC_MODULE_NAME "xvsec" -#define XVSEC_MODULE_DESC "Xilinx VSEC Library" - -#define XVSEC_VERSION_MAJOR 2020 -#define XVSEC_VERSION_MINOR 2 -#define XVSEC_VERSION_PATCH 1 - -#define XVSEC_DRV_VERSION \ - __stringify(XVSEC_VERSION_MAJOR) "." \ - __stringify(XVSEC_VERSION_MINOR) "." \ - __stringify(XVSEC_VERSION_PATCH) - -#define XVSEC_DRV_VERSION_NUM \ - ((XVSEC_VERSION_MAJOR)*1000 + \ - (XVSEC_VERSION_MINOR)*100 + \ - XVSEC_VERSION_PATCH) - -#endif /* ifndef __XVSEC_VERSION_H__ */ diff --git a/XVSEC/linux-kernel/drv/xvsec_cdev.c b/XVSEC/linux-kernel/drv/xvsec_cdev.c deleted file mode 100644 index 5ff1aad..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_cdev.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2018-2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include <linux/ioctl.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/aer.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/version.h> -#include <linux/pci.h> -#include <linux/vmalloc.h> -#include <linux/cdev.h> -#include <linux/fcntl.h> -#include <linux/sched.h> -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/delay.h> -#include <linux/fs.h> -#include <linux/uaccess.h> - -#include "xvsec_drv.h" -#include "xvsec_drv_int.h" -#include "xvsec_cdev.h" - - -int xvsec_cdev_create( - struct pci_dev *pdev, - struct cdev_info *char_dev, - const struct file_operations *fops, - const char *dev_name) -{ - int ret = 0; - uint8_t bus_no; - uint8_t dev_no; - - if ((pdev == NULL) || (char_dev == NULL) || - (fops == NULL)) { - pr_err(__FILE__": Invalid Parameters\n"); - return -EINVAL; - } - - bus_no = pdev->bus->number; - dev_no = PCI_SLOT(pdev->devfn); - - ret = alloc_chrdev_region(&char_dev->dev_no, - XVSEC_MINOR_BASE, XVSEC_MINOR_COUNT, XVSEC_NODE_NAME); - if (ret < 0) { - pr_err("Major number allocation is failed\n"); - goto CLEANUP1; - } - - char_dev->major_no = - MAJOR(char_dev->dev_no); - - pr_info("The major number is %d, bus no : %d, dev no : %d\n", - char_dev->major_no, bus_no, dev_no); - - cdev_init(&char_dev->cdev, fops); - - ret = cdev_add(&char_dev->cdev, char_dev->dev_no, 1); - if (ret < 0) { - pr_err("Unable to add cdev\n"); - goto CLEANUP2; - } - - if (dev_name != NULL) { - snprintf(char_dev->name, - XVSEC_CDEV_NAME_MAX_LEN, "%s%02X%02X_%s", - XVSEC_NODE_NAME, bus_no, dev_no, dev_name); - } else { - snprintf(char_dev->name, - XVSEC_CDEV_NAME_MAX_LEN, "%s%02X%02X", - XVSEC_NODE_NAME, bus_no, dev_no); - } - - kobject_set_name(&char_dev->cdev.kobj, "%s", char_dev->name); - - char_dev->sys_device = - device_create(g_xvsec_class, NULL, - char_dev->dev_no, NULL, "%s", char_dev->name); - - if (IS_ERR(char_dev->sys_device)) { - pr_err("failed to create device"); - ret = -(PTR_ERR(char_dev->sys_device)); - goto CLEANUP3; - } - - pr_info("%s : %s\n", __func__, char_dev->name); - - return ret; - -CLEANUP3: - cdev_del(&char_dev->cdev); -CLEANUP2: - unregister_chrdev_region(char_dev->dev_no, - XVSEC_MINOR_COUNT); -CLEANUP1: - return ret; - -} -EXPORT_SYMBOL_GPL(xvsec_cdev_create); - -void xvsec_cdev_remove( - struct cdev_info *char_dev) -{ - if (char_dev == NULL) - return; - - pr_info("%s : %s\n", __func__, char_dev->name); - device_destroy(g_xvsec_class, char_dev->dev_no); - cdev_del(&char_dev->cdev); - unregister_chrdev_region(char_dev->dev_no, 1); -} -EXPORT_SYMBOL_GPL(xvsec_cdev_remove); - -MODULE_LICENSE("Dual BSD/GPL"); diff --git a/XVSEC/linux-kernel/drv/xvsec_cdev.h b/XVSEC/linux-kernel/drv/xvsec_cdev.h deleted file mode 100644 index 99e68a9..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_cdev.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2018-2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XVSEC_CDEV_H__ -#define __XVSEC_CDEV_H__ - -/** - * @file xvsec_cdev.h - * - * Xilinx XVSEC Driver Library Definitions - * - * Header file *xvsec_cdev.h* defines data structures neeed for - * character device implementation by the driver - * - * These data structures are purely internal to the driver - * and not meant to user - */ - - -/** @defgroup xvsec_enums Enumerations - */ -/** @defgroup xvsec_struct Data Structures - */ -/** - * @defgroup xvsec_defines Definitions - * @{ - */ - - -#define XVSEC_CDEV_NAME_MAX_LEN (20) - -#define XVSEC_NODE_NAME "xvsec" - -/** - * XVSEC char device first minor number - */ -#define XVSEC_MINOR_BASE (0) -/** - * XVSEC char device total minor numbers count - */ -#define XVSEC_MINOR_COUNT (1) - - -/** @} */ - -struct cdev_info { - dev_t dev_no; - int major_no; - char name[XVSEC_CDEV_NAME_MAX_LEN]; - struct cdev cdev; - struct device *sys_device; -}; - -int xvsec_cdev_create( - struct pci_dev *pdev, - struct cdev_info *char_dev, - const struct file_operations *fops, - const char *dev_name); - -void xvsec_cdev_remove( - struct cdev_info *char_dev); - -#endif /* __XVSEC_CDEV_H__ */ diff --git a/XVSEC/linux-kernel/drv/xvsec_drv.c b/XVSEC/linux-kernel/drv/xvsec_drv.c deleted file mode 100644 index 64d4b84..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_drv.c +++ /dev/null @@ -1,570 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2018-2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include <linux/ioctl.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/aer.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/version.h> -#include <linux/pci.h> -#include <linux/vmalloc.h> -#include <linux/cdev.h> -#include <linux/fcntl.h> -#include <linux/sched.h> -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/delay.h> -#include <linux/fs.h> -#include <linux/uaccess.h> - - -#include "version.h" -#include "xvsec_drv.h" -#include "xvsec_drv_int.h" -#include "xvsec_cdev.h" -#include "xvsec_mcap.h" - -static char version[] = XVSEC_MODULE_DESC " v" XVSEC_DRV_VERSION "\n"; -static struct xvsec_dev xvsec_dev; - -/** Global context information to store VSEC information of all pcie devices */ -struct class *g_xvsec_class; - -/** ioctl function to retrieve capability list of a pcie-device */ -static long xvsec_ioc_get_cap_list(struct file *filep, - uint32_t cmd, unsigned long arg); - -/** ioctl function to retrieve the pcie-device info */ -static long xvsec_ioc_get_device_info(struct file *filep, - uint32_t cmd, unsigned long arg); - -/** This structure holds the vsec information supported by this driver - * - * All supported VSECs by this driver should be added here. - * - * This is the master VSEC list supported by this driver - */ -static struct vsec_ops xvsec_supported_ops[] = { - /** MCAP VSEC info */ - { - .vsec_id = XVSEC_MCAP_VSEC_ID, - .vsec_module_init = xvsec_mcap_module_init, - .vsec_module_exit = xvsec_mcap_module_exit, - } -}; - - -static int xvsec_populate_vsec_capabilities(struct context *dev_ctx, - int index, uint32_t vendor_data) -{ - int ret = 0; - uint16_t vsec_rev_id = 0x0; - uint16_t vsec_id = 0x0; - - dev_ctx->capabilities.vsec_info[index].is_supported = false; - - vsec_id = (uint16_t)(vendor_data & XVSEC_VSEC_ID_POS) >> - XVSEC_VSEC_ID_SHIFT; - - dev_ctx->capabilities.vsec_info[index].cap_id = vsec_id; - - vsec_rev_id = (vendor_data & XVSEC_REV_ID_POS) >> - XVSEC_REV_ID_SHIFT; - - dev_ctx->capabilities.vsec_info[index].rev_id = vsec_rev_id; - - pr_debug("%s: vsec_id: %d, vsec_rev_id: %d\n", __func__, - dev_ctx->capabilities.vsec_info[index].cap_id, - dev_ctx->capabilities.vsec_info[index].rev_id); - - switch (dev_ctx->capabilities.vsec_info[index].cap_id) { - case XVSEC_MCAP_VSEC_ID: - dev_ctx->capabilities.vsec_info[index].is_supported = true; - snprintf(dev_ctx->capabilities.vsec_info[index].name, - MAX_VSEC_STR_LEN, - "PCIe_MCAP_VSEC "); - break; - case XVSEC_XVC_DEBUG_VSEC_ID: - snprintf(dev_ctx->capabilities.vsec_info[index].name, - MAX_VSEC_STR_LEN, - "PCIe_XVC_DEBUG_VSEC"); - break; - case XVSEC_SCID_VSEC_ID: - snprintf(dev_ctx->capabilities.vsec_info[index].name, - MAX_VSEC_STR_LEN, - "PCIe_SCID_VSEC "); - break; - case XVSEC_ALF_VSEC_ID: - snprintf(dev_ctx->capabilities.vsec_info[index].name, - MAX_VSEC_STR_LEN, - "PCIe_ALF_VSEC "); - break; - case XVSEC_SWITCH_VSEC_ID: - snprintf(dev_ctx->capabilities.vsec_info[index].name, - MAX_VSEC_STR_LEN, - "PCIe_SWITCH_VSEC "); - break; - case XVSEC_NULL_VSEC_ID: - snprintf(dev_ctx->capabilities.vsec_info[index].name, - MAX_VSEC_STR_LEN, - "PCIe_NULL_VSEC "); - break; - default: - snprintf(dev_ctx->capabilities.vsec_info[index].name, - MAX_VSEC_STR_LEN, - "UNKNOWN "); - break; - } - - return ret; -} - -static int xvsec_retrieve_vsec_capabilities(struct context *dev_ctx) -{ - int ret = 0; - int offset = 0; - int nxt_offset; - int index = 0; - uint16_t i, j; - uint16_t count = 0; - struct pci_dev *pdev = dev_ctx->pdev; - uint32_t vendor_data; - - index = 0; - do { - nxt_offset = pci_find_next_ext_capability(pdev, - offset, XVSEC_EXT_CAP_VSEC_ID); - if (nxt_offset == 0) - break; - - ret = pci_read_config_dword(pdev, - (nxt_offset + XVSEC_VENDOR_HEADER_OFFSET), - &vendor_data); - - if (ret != 0) { - pr_warn("pci_read_config_dword failed with error"); - pr_warn(" %d, offset : 0x%X\n", ret, offset); - break; - } - - dev_ctx->capabilities.vsec_info[index].offset = nxt_offset; - xvsec_populate_vsec_capabilities(dev_ctx, index, vendor_data); - offset = nxt_offset; - - for (i = 0; i < ARRAY_SIZE(xvsec_supported_ops); i++) { - if (dev_ctx->capabilities.vsec_info[index].cap_id == - xvsec_supported_ops[i].vsec_id) - count++; - } - - index = index + 1; - } while (nxt_offset != 0); - - dev_ctx->capabilities.no_of_caps = index; - - pr_debug("dev_ctx->capabilities.no_of_caps : %d\n", index); - - /** Allocate memory for supported vsec count to store its context */ - dev_ctx->vsec_supported_cnt = count; - dev_ctx->vsec_ctx = - kzalloc((count * sizeof(struct vsec_context)), GFP_KERNEL); - if (dev_ctx->vsec_ctx == NULL) { - pr_err("Memory Allocation failed for dev_ctx->vsec_ctx"); - return -(ENOMEM); - } - - - /** Scan through supported vsec ids */ - index = 0; - for (i = 0; i < dev_ctx->capabilities.no_of_caps; i++) { - for (j = 0; j < ARRAY_SIZE(xvsec_supported_ops); j++) { - if (dev_ctx->capabilities.vsec_info[i].cap_id == - xvsec_supported_ops[j].vsec_id) { - dev_ctx->vsec_ctx[index].vsec_offset = - dev_ctx->capabilities.vsec_info[i].offset; - dev_ctx->vsec_ctx[index].vsec_ops = - &xvsec_supported_ops[j]; - dev_ctx->vsec_ctx[index].pdev = dev_ctx->pdev; - index++; - break; - } - } - } - - return ret; -} - -static int xvsec_gen_open(struct inode *inode, struct file *filep) -{ - int ret = 0; - struct context *dev_ctx; - struct file_priv *priv; - - dev_ctx = container_of(inode->i_cdev, - struct context, generic_cdev.cdev); - - spin_lock(&dev_ctx->lock); - - if (dev_ctx->fopen_cnt != 0) { - ret = -(EBUSY); - goto CLEANUP; - } - - priv = kzalloc(sizeof(struct file_priv), GFP_KERNEL); - if (priv == NULL) { - ret = -(ENOMEM); - goto CLEANUP; - } - - dev_ctx->fopen_cnt++; - - priv->dev_ctx = (void *)dev_ctx; - filep->private_data = priv; - - pr_info("%s success\n", __func__); - -CLEANUP: - spin_unlock(&dev_ctx->lock); - return ret; -} - -static int xvsec_gen_close(struct inode *inode, struct file *filep) -{ - struct file_priv *priv = filep->private_data; - struct context *dev_ctx = (struct context *)priv->dev_ctx; - - spin_lock(&dev_ctx->lock); - if (dev_ctx->fopen_cnt == 0) { - pr_warn("File Open/close mismatch\n"); - } else { - dev_ctx->fopen_cnt--; - pr_info("%s success\n", __func__); - } - kfree(priv); - spin_unlock(&dev_ctx->lock); - - return 0; -} - -static long xvsec_ioc_get_cap_list(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv *priv = filep->private_data; - struct context *dev_ctx = (struct context *)priv->dev_ctx; - - pr_debug("ioctl : IOC_XVSEC_GET_CAP_LIST\n"); - - spin_lock(&dev_ctx->lock); - ret = copy_to_user((void __user *)arg, - (void *)&dev_ctx->capabilities, - sizeof(struct xvsec_capabilities)); - spin_unlock(&dev_ctx->lock); - - return ret; -} - -static int xvsec_get_dev_info(struct context *dev_ctx, - union device_info *dev_info) -{ - int ret = 0; - struct pci_dev *pdev = dev_ctx->pdev; - - dev_info->vendor_id = pdev->vendor; - dev_info->device_id = pdev->device; - dev_info->device_no = PCI_SLOT(pdev->devfn); - dev_info->device_fn = PCI_FUNC(pdev->devfn); - dev_info->subsystem_vendor = pdev->subsystem_vendor; - dev_info->subsystem_device = pdev->subsystem_device; - dev_info->class_id = pdev->class; - dev_info->cfg_size = pdev->cfg_size; - dev_info->is_msi_enabled = pdev->msi_enabled; - dev_info->is_msix_enabled = pdev->msix_enabled; - - return ret; -} - -static long xvsec_ioc_get_device_info(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv *priv = filep->private_data; - struct context *dev_ctx = (struct context *)priv->dev_ctx; - union device_info dev_info; - - pr_debug("ioctl : IOC_GET_DEVICE_INFO\n"); - - spin_lock(&dev_ctx->lock); - ret = xvsec_get_dev_info(dev_ctx, &dev_info); - spin_unlock(&dev_ctx->lock); - - if (ret < 0) - goto CLEANUP; - - ret = copy_to_user((void __user *)arg, - (void *)&dev_info, sizeof(union device_info)); -CLEANUP: - return ret; -} - - -static const struct xvsec_ioctl_ops xvsec_gen_ioctl_ops[] = { - {IOC_XVSEC_GET_CAP_LIST, xvsec_ioc_get_cap_list}, - {IOC_XVSEC_GET_DEVICE_INFO, xvsec_ioc_get_device_info}, -}; - -static long xvsec_gen_ioctl(struct file *filep, uint32_t cmd, unsigned long arg) -{ - int ret = 0; - int index, cmd_cnt; - bool cmd_found = false; - - cmd_cnt = ARRAY_SIZE(xvsec_gen_ioctl_ops); - for (index = 0; index < cmd_cnt; index++) { - if (xvsec_gen_ioctl_ops[index].cmd == cmd) { - cmd_found = true; - ret = xvsec_gen_ioctl_ops[index].fpfunction( - filep, cmd, arg); - break; - } - } - if (cmd_found == false) - ret = -(EINVAL); - - return ret; -} - -/** pcie device generic fops structure */ -static const struct file_operations xvsec_gen_fops = { - .owner = THIS_MODULE, - .open = xvsec_gen_open, - .release = xvsec_gen_close, - .unlocked_ioctl = xvsec_gen_ioctl, -}; - - -static int xvsec_initialize(struct pci_dev *pdev, struct context *dev_ctx) -{ - int ret = 0; - int status; - uint16_t index; - struct vsec_ops *vsec_ops; - - if ((pdev == NULL) || (dev_ctx == NULL)) - return -(EINVAL); - - dev_ctx->pdev = pdev; - - pr_info("%s : dev_ctx address : %p\n", __func__, dev_ctx); - - ret = xvsec_retrieve_vsec_capabilities(dev_ctx); - if (ret < 0) { - pr_err("Error In retrieving VSEC capabilities :"); - pr_err(" err code : %d\n", ret); - return ret; - } - - spin_lock_init(&dev_ctx->lock); - ret = xvsec_cdev_create(pdev, - &dev_ctx->generic_cdev, &xvsec_gen_fops, NULL); - if (ret < 0) { - pr_err("xvsec_cdev_create failed for generic cdev, err : %d\n", - ret); - } - - /** Initialize the supported VSEC IDs */ - for (index = 0; index < dev_ctx->vsec_supported_cnt; index++) { - vsec_ops = dev_ctx->vsec_ctx[index].vsec_ops; - status = vsec_ops->vsec_module_init(&dev_ctx->vsec_ctx[index]); - if (status < 0) { - pr_warn("vsec_module_init failed"); - pr_warn(" Index : %d, VSEC ID : %d\n", index, - dev_ctx->vsec_ctx[index].vsec_ops->vsec_id); - } - } - - return ret; -} -EXPORT_SYMBOL_GPL(xvsec_initialize); - -static int xvsec_deinitialize(struct context *dev_ctx) -{ - int ret = 0; - uint16_t index; - struct vsec_ops *vsec_ops; - - if (dev_ctx == NULL) - return -(EINVAL); - - pr_err("%s : cnt : %d\n", __func__, dev_ctx->vsec_supported_cnt); - - xvsec_cdev_remove(&dev_ctx->generic_cdev); - - for (index = 0; index < dev_ctx->vsec_supported_cnt; index++) { - vsec_ops = dev_ctx->vsec_ctx[index].vsec_ops; - vsec_ops->vsec_module_exit(&dev_ctx->vsec_ctx[index]); - } - - /** Checkpatch : kfree(NULL) is safe */ - kfree(dev_ctx->vsec_ctx); - dev_ctx->vsec_ctx = NULL; - - return ret; -} -EXPORT_SYMBOL_GPL(xvsec_deinitialize); - -static int __init xvsec_drv_init(void) -{ - int ret = 0; - int index, loop; - uint32_t dev_count, count; - bool duplicate; - struct pci_dev *pdev; - struct pci_dev **pdev_list = NULL; - - - pr_info("%s", version); - - dev_count = 0x0; - pdev = NULL; - do { - pdev = pci_get_device(XILINX_VENDOR_ID, PCI_ANY_ID, pdev); - if (pdev == NULL) - break; - - dev_count = dev_count + 1; - } while (pdev != NULL); - - if (dev_count == 0) - return 0; - - g_xvsec_class = class_create(THIS_MODULE, XVSEC_NODE_NAME); - if (IS_ERR(g_xvsec_class)) { - pr_err("failed to create class"); - ret = -(PTR_ERR(g_xvsec_class)); - return ret; - } - - - pdev_list = kzalloc((dev_count * sizeof(struct pci_dev *)), - GFP_KERNEL); - if (pdev_list == NULL) { - class_destroy(g_xvsec_class); - g_xvsec_class = NULL; - return -(ENOMEM); - } - - count = 0; - pdev = NULL; - for (index = 0; index < dev_count; index++) { - duplicate = false; - pdev = pci_get_device(XILINX_VENDOR_ID, PCI_ANY_ID, pdev); - if (pdev == NULL) { - ret = -(EBUSY); - goto CLEANUP_PDEV_MEM; - } - for (loop = 0; loop < count; loop++) { - if ((pdev_list[loop]->bus->number == pdev->bus->number) - && (PCI_SLOT(pdev_list[loop]->devfn) == - PCI_SLOT(pdev->devfn))) { - duplicate = true; - break; - } - } - - if (duplicate == false) { - pdev_list[count] = pdev; - count = count + 1; - } - } - - xvsec_dev.ctx = kzalloc((count * sizeof(struct context)), - GFP_KERNEL); - if (xvsec_dev.ctx == NULL) { - ret = -(ENOMEM); - goto CLEANUP_PDEV_MEM; - } - - dev_count = count; - xvsec_dev.dev_cnt = dev_count; - for (index = 0; index < dev_count; index++) { - ret = xvsec_initialize(pdev_list[index], &xvsec_dev.ctx[index]); - if (ret < 0) { - pr_err("xvsec_initialize() failed with error "); - pr_err("%d for device %d\n", ret, (index + 1)); - goto CLEANUP; - } else { - pr_info("xvsec_initialize() success for device %d\n", - (index + 1)); - } - } - xvsec_dev.dev_cnt = index; - - kfree(pdev_list); - pr_info("%s : Success\n", __func__); - - return ret; -CLEANUP: - for (; index > 0; index--) - xvsec_deinitialize(&xvsec_dev.ctx[index - 1]); - - kfree(xvsec_dev.ctx); - xvsec_dev.ctx = NULL; - -CLEANUP_PDEV_MEM: - kfree(pdev_list); - class_destroy(g_xvsec_class); - g_xvsec_class = NULL; - return ret; -} - -static void __exit xvsec_drv_exit(void) -{ - int index; - int ret; - - for (index = 0; index < xvsec_dev.dev_cnt; index++) { - ret = xvsec_deinitialize(&xvsec_dev.ctx[index]); - if (ret < 0) { - pr_err("xvsec_deinitialize() failed with error "); - pr_err("%d for device %d\n", ret, (index + 1)); - } else { - pr_info("xvsec_deinitialize() success for device %d\n", - (index + 1)); - } - } - - pr_info("In %s : dev_cnt : %d\n", __func__, xvsec_dev.dev_cnt); - - class_destroy(g_xvsec_class); - g_xvsec_class = NULL; - kfree(xvsec_dev.ctx); - xvsec_dev.ctx = NULL; -} - -module_init(xvsec_drv_init); -module_exit(xvsec_drv_exit); - -MODULE_INFO(intree, "Y"); -MODULE_LICENSE("Dual BSD/GPL"); -MODULE_VERSION(XVSEC_DRV_VERSION); -MODULE_AUTHOR("Xilinx Inc."); -MODULE_DESCRIPTION("XVSEC Device Driver"); diff --git a/XVSEC/linux-kernel/drv/xvsec_drv.h b/XVSEC/linux-kernel/drv/xvsec_drv.h deleted file mode 100644 index c31a79c..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_drv.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XVSEC_DRV_H__ -#define __XVSEC_DRV_H__ - -/** - * @file xvsec_drv.h - * - * Xilinx XVSEC Driver Library Interface Definitions - * - * Header file *xvsec_drv.h* defines data structures and ioctl codes - * exported by Xilinx XVSEC driver for common VSEC operations. - * - * These data structures and ioctl codes can be used by user space - * applications to carry-out the XVSEC functionality - */ - -/** @defgroup xvsec_enums Enumerations - */ -/** @defgroup xvsec_struct Data Structures - */ -/** @defgroup xvsec_union Data Structures - */ -/** - * @defgroup xvsec_defines Definitions - * @{ - */ - -/** - * XVSEC ioctl magic character - */ -#define XVSEC_IOC_MAGIC 'v' - -/** - * Maximum Supported capabilities by the driver - */ -#define MAX_CAPABILITIES_SUPPORTED 10 - -/** - * Maximum Vsec string length - */ -#define MAX_VSEC_STR_LEN 20 - -/** - * Unknown VSEC Revision ID - */ -#define VSEC_REV_UNKNOWN (0xFF) - -/** @} */ - -/** - * @struct - device_info - * @brief PCIe device information for verbose option - * - * @ingroup xvsec_union - */ -union device_info { - struct { - /** PCIe Vendor Identifier */ - uint16_t vendor_id; - /** PCIe Device Identifier */ - uint16_t device_id; - /** PCIe Device number */ - uint16_t device_no; - /** PCIe Device function */ - uint16_t device_fn; - /** PCIe Subsystem Vendor Identifier */ - uint16_t subsystem_vendor; - /** PCIe Subsystem Device Identifier */ - uint16_t subsystem_device; - /** PCIe Class Identifier */ - uint16_t class_id; - /** Flag which indicates MSI enabled status */ - uint32_t is_msi_enabled; - /** Flag which indicates MSIx enabled status */ - uint32_t is_msix_enabled; - /** Size of the PCIe Device configuration space */ - int cfg_size; - }; -}; - -/** - * @struct - xvsec_vsec_info - * @brief Xilinx Vendor Specific Capabilities device information - * - * @ingroup xvsec_struct - */ -struct xvsec_vsec_info { - /** Capability ID Info */ - uint16_t cap_id; - /** VSEC revision Info */ - uint16_t rev_id; - /** Capability Offset Info in PCIe configuration space */ - uint16_t offset; - /** VSEC Capability name */ - char name[MAX_VSEC_STR_LEN]; - /** info to check capability supported by this drv or not*/ - bool is_supported; -}; - -/** - * @struct - xvsec_capabilities - * @brief Xilinx Vendor Specific Capabilities present in the device - * - * @ingroup xvsec_struct - */ -struct xvsec_capabilities { - /** Number of VSEC capabilities supported by the device */ - uint16_t no_of_caps; - /** Vsec inforamtion */ - struct xvsec_vsec_info vsec_info[MAX_CAPABILITIES_SUPPORTED]; -}; - -/** - * Capability list operation code to use in ioctls - */ -#define CODE_XVSEC_GET_CAP_LIST 0 - -/** - * Device Info operation code to use in ioctls - */ -#define CODE_XVSEC_GET_DEV_INFO 1 - -/** - * ioctl code for retrieving the XVSEC capability list - */ -#define IOC_XVSEC_GET_CAP_LIST \ - _IOW(XVSEC_IOC_MAGIC, CODE_XVSEC_GET_CAP_LIST, \ - struct xvsec_capabilities *) - -/** - * ioctl code for retrieving the Device information - */ -#define IOC_XVSEC_GET_DEVICE_INFO \ - _IOWR(XVSEC_IOC_MAGIC, CODE_XVSEC_GET_DEV_INFO, \ - union device_info *) - -#endif /* __XVSEC_DRV_H__ */ diff --git a/XVSEC/linux-kernel/drv/xvsec_drv_int.h b/XVSEC/linux-kernel/drv/xvsec_drv_int.h deleted file mode 100644 index 2d17240..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_drv_int.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XVSEC_DRV_INT_H__ -#define __XVSEC_DRV_INT_H__ - -#include "xvsec_cdev.h" - -/** - * @file xvsec_drv_int.h - * - * Xilinx XVSEC Driver Library Definitions - * - * Header file *xvsec_drv_int.h* defines data structures - * needed for driver implementation - * - * These data structures are purely internal to the driver - * and not meant to user - */ - -/** - * XILINX PCIe vendor ID - */ -#define XILINX_VENDOR_ID (uint16_t)(0x10ee) - -#define XVSEC_EXT_CAP_VSEC_ID (0x000B) - -#define XVSEC_MCAP_VSEC_ID (0x0001) -#define XVSEC_XVC_DEBUG_VSEC_ID (0x0008) -#define XVSEC_SCID_VSEC_ID (0x0010) -#define XVSEC_ALF_VSEC_ID (0x0020) -#define XVSEC_SWITCH_VSEC_ID (0x0040) -#define XVSEC_NULL_VSEC_ID (0xFFFF) - - -#define INVALID_DEVICE_INDEX (uint8_t)(255) -#define INVALID_OFFSET (0xFFFF) - -/** - * Extended Capability Header Offset - */ -#define XVSEC_EXTENDED_HEADER_OFFSET (0x0000) -/** - * Vendor Specific Header Offset - * - * provides details about the VSEC information - */ -#define XVSEC_VENDOR_HEADER_OFFSET (0x0004) -#define XVSEC_VSEC_ID_SHIFT 0 -#define XVSEC_REV_ID_SHIFT 16 -#define XVSEC_VSEC_ID_POS (0xFFFF << XVSEC_VSEC_ID_SHIFT) -#define XVSEC_REV_ID_POS (0xF << XVSEC_REV_ID_SHIFT) -#define XVSEC_MCAP_ID (0x0001) - - -struct file_priv { - void *dev_ctx; -}; - -struct xvsec_ioctl_ops { - uint32_t cmd; - long (*fpfunction)(struct file *filep, uint32_t cmd, unsigned long arg); -}; - -struct vsec_context { - struct pci_dev *pdev; - spinlock_t lock; - struct cdev_info char_dev; - int fopen_cnt; - uint16_t vsec_offset; - struct vsec_ops *vsec_ops; - void *vsec_priv; -}; - -struct vsec_ops { - uint32_t vsec_id; - int (*vsec_module_init)(struct vsec_context *vsec_ctx); - void (*vsec_module_exit)(struct vsec_context *vsec_ctx); -}; - -struct context { - struct pci_dev *pdev; - int fopen_cnt; - spinlock_t lock; - struct cdev_info generic_cdev; - uint16_t vsec_supported_cnt; - struct vsec_context *vsec_ctx; - struct xvsec_capabilities capabilities; -}; - -struct xvsec_dev { - uint32_t dev_cnt; - struct context *ctx; -}; - -extern struct class *g_xvsec_class; - -int xvsec_mcap_module_init(struct vsec_context *dev_ctx); -void xvsec_mcap_module_exit(struct vsec_context *dev_ctx); - -#endif /* __XVSEC_DRV_INT_H__ */ diff --git a/XVSEC/linux-kernel/drv/xvsec_mcap/us/xvsec_mcap_us.c b/XVSEC/linux-kernel/drv/xvsec_mcap/us/xvsec_mcap_us.c deleted file mode 100644 index 81cb53d..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_mcap/us/xvsec_mcap_us.c +++ /dev/null @@ -1,1190 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include <linux/ioctl.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/aer.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/version.h> -#include <linux/pci.h> -#include <linux/vmalloc.h> -#include <linux/cdev.h> -#include <linux/fcntl.h> -#include <linux/sched.h> -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/delay.h> -#include <linux/fs.h> -#include <linux/uaccess.h> - -#include "xvsec_util.h" -#include "xvsec_drv.h" -#include "xvsec_drv_int.h" -#include "xvsec_mcap.h" -#include "xvsec_mcap_us.h" - - - -static const uint16_t fpga_valid_addr[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, - 0x05, 0x06, 0x07, 0x08, 0x09, - 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, - 0x10, 0x11, 0x14, 0x16, 0x18, - 0x1F - }; - - -static void xvsec_fpga_cfg_setup(struct vsec_context *mcap_ctx, - enum oper operation); -static void xvsec_fpga_cfg_teardown(struct vsec_context *mcap_ctx); -static void xvsec_fpga_cfg_write_cmd(struct vsec_context *mcap_ctx, - enum oper operation, uint8_t offset, uint16_t word_count); -static void xvsec_fpga_cfg_write_data(struct vsec_context *mcap_ctx, - uint32_t data); -static int xvsec_mcap_req_access(struct vsec_context *mcap_ctx, - uint32_t *restore); -static int xvsec_mcap_program(struct vsec_context *mcap_ctx, char *fname); -static int xvsec_write_rbt(struct vsec_context *mcap_ctx, - struct file *filep, loff_t size); -static int xvsec_write_bit(struct vsec_context *mcap_ctx, - struct file *filep, loff_t size); -static int xvsec_write_bin(struct vsec_context *mcap_ctx, - struct file *filep, loff_t size); - -static int check_for_completion(struct vsec_context *mcap_ctx, - uint32_t *ret); - - -static void xvsec_fpga_cfg_setup(struct vsec_context *mcap_ctx, - enum oper operation) -{ - int wr_offset; - int index; - struct pci_dev *pdev = mcap_ctx->pdev; - - wr_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_WRITE_DATA_REG; - - switch (operation) { - case FPGA_WR_CMD: - for (index = 0; index < 16; index++) - pci_write_config_dword(pdev, wr_offset, DUMMY_WORD); - pci_write_config_dword(pdev, wr_offset, BUS_WIDTH_SYNC); - pci_write_config_dword(pdev, wr_offset, BUS_WIDTH_DETECT); - pci_write_config_dword(pdev, wr_offset, DUMMY_WORD); - pci_write_config_dword(pdev, wr_offset, DUMMY_WORD); - pci_write_config_dword(pdev, wr_offset, SYNC_WORD); - pci_write_config_dword(pdev, wr_offset, NOOP); - pci_write_config_dword(pdev, wr_offset, NOOP); - break; - - case FPGA_RD_CMD: - default: - - pci_write_config_dword(pdev, wr_offset, DUMMY_WORD); - pci_write_config_dword(pdev, wr_offset, BUS_WIDTH_SYNC); - pci_write_config_dword(pdev, wr_offset, BUS_WIDTH_DETECT); - pci_write_config_dword(pdev, wr_offset, DUMMY_WORD); - pci_write_config_dword(pdev, wr_offset, SYNC_WORD); - pci_write_config_dword(pdev, wr_offset, NOOP); - - break; - } -} - -static void xvsec_fpga_cfg_teardown(struct vsec_context *mcap_ctx) -{ - int wr_offset; - struct pci_dev *pdev = mcap_ctx->pdev; - - wr_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_WRITE_DATA_REG; - - pci_write_config_dword(pdev, wr_offset, TYPE1_WR_CMD); - pci_write_config_dword(pdev, wr_offset, DESYNC); - pci_write_config_dword(pdev, wr_offset, NOOP); - pci_write_config_dword(pdev, wr_offset, NOOP); -} - -static void xvsec_fpga_cfg_write_cmd(struct vsec_context *mcap_ctx, - enum oper operation, uint8_t offset, uint16_t word_count) -{ - int wr_offset; - union type1_header header; - struct pci_dev *pdev = mcap_ctx->pdev; - - wr_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_WRITE_DATA_REG; - - header.data = 0x0; - - header.header_type = TYPE1_HEADER_TYPE; - header.opcode = (operation == FPGA_WR_CMD) ? - FPGA_CFG_WRITE : FPGA_CFG_READ; - header.address = offset; - header.word_count = word_count; - - pci_write_config_dword(pdev, wr_offset, header.data); - if (operation == FPGA_RD_CMD) { - pci_write_config_dword(pdev, wr_offset, NOOP); - pci_write_config_dword(pdev, wr_offset, NOOP); - } -} - -static void xvsec_fpga_cfg_write_data(struct vsec_context *mcap_ctx, - uint32_t data) -{ - int wr_offset; - struct pci_dev *pdev = mcap_ctx->pdev; - - wr_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_WRITE_DATA_REG; - - pci_write_config_dword(pdev, wr_offset, data); - pci_write_config_dword(pdev, wr_offset, NOOP); - pci_write_config_dword(pdev, wr_offset, NOOP); -} - -static int check_for_completion(struct vsec_context *mcap_ctx, uint32_t *ret) -{ - unsigned long retry_count = 0; - int i; - uint16_t sts_offset, data_off; - uint32_t sts_data; - struct pci_dev *pdev = mcap_ctx->pdev; - - sts_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_STATUS_REGISTER; - data_off = mcap_ctx->vsec_offset + XVSEC_MCAP_WRITE_DATA_REG; - - pci_read_config_dword(pdev, sts_offset, &sts_data); - - while ((sts_data & XVSEC_MCAP_STATUS_EOS) == 0x0) { - msleep(20); - for (i = 0 ; i < EMCAP_EOS_LOOP_COUNT; i++) - pci_write_config_dword(pdev, data_off, EMCAP_NOOP_VAL); - - pci_read_config_dword(pdev, sts_offset, &sts_data); - retry_count++; - if (retry_count > EMCAP_EOS_RETRY_COUNT) { - pr_err("Error: The MCAP EOS bit did not assert after"); - pr_err(" programming the specified programming file\n"); - pr_err("Status Reg : 0x%X\n", sts_data); - *ret = sts_data; - return -EIO; - } - } - *ret = sts_data; - return 0; -} - -static int xvsec_mcap_req_access(struct vsec_context *mcap_ctx, - uint32_t *restore) -{ - int ret = 0; - int delay = XVSEC_MCAP_LOOP_COUNT; - uint16_t mcap_offset; - uint16_t ctrl_offset, sts_offset; - uint32_t ctrl_data, sts_data; - struct pci_dev *pdev = mcap_ctx->pdev; - - mcap_offset = mcap_ctx->vsec_offset; - if (mcap_offset == INVALID_OFFSET) - return -(EPERM); - - ctrl_offset = mcap_offset + XVSEC_MCAP_CONTROL_REGISTER; - sts_offset = mcap_offset + XVSEC_MCAP_STATUS_REGISTER; - - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - *restore = ctrl_data; - - pci_read_config_dword(pdev, sts_offset, &sts_data); - - if ((sts_data & XVSEC_MCAP_STATUS_ACCESS) != 0x0) { - - ctrl_data = ctrl_data | - (XVSEC_MCAP_CTRL_ENABLE | XVSEC_MCAP_CTRL_REQ_ACCESS); - - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - do { - pci_read_config_dword(pdev, sts_offset, &sts_data); - if ((sts_data & XVSEC_MCAP_STATUS_ACCESS) == 0x0) - break; - - delay = delay - 1; - } while (delay != 0); - - if (delay == 0) { - pr_err("Unable to get the FPGA CFG Access\n"); - - ctrl_data = ctrl_data & - ~(XVSEC_MCAP_CTRL_ENABLE | - XVSEC_MCAP_CTRL_REQ_ACCESS); - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - ret = -(EBUSY); - } - } - - return ret; -} - -int xvsec_mcap_reset(struct vsec_context *mcap_ctx) -{ - int ret = 0; - uint16_t mcap_offset; - uint16_t ctrl_offset, status_offset; - uint32_t ctrl_data, status_data, read_data, restore; - struct pci_dev *pdev = mcap_ctx->pdev; - - /* Acquire the Access */ - ret = xvsec_mcap_req_access(mcap_ctx, &restore); - if (ret < 0) - return ret; - - mcap_offset = mcap_ctx->vsec_offset; - ctrl_offset = mcap_offset + XVSEC_MCAP_CONTROL_REGISTER; - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - - /* Asserting the Reset */ - ctrl_data = ctrl_data | XVSEC_MCAP_CTRL_RESET | - XVSEC_MCAP_CTRL_ENABLE | XVSEC_MCAP_CTRL_REQ_ACCESS; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - /* Read Back */ - pci_read_config_dword(pdev, ctrl_offset, &read_data); - if ((read_data & XVSEC_MCAP_CTRL_RESET) == 0x0) - ret = -(EBUSY); - - status_offset = mcap_offset + XVSEC_MCAP_STATUS_REGISTER; - pci_read_config_dword(pdev, status_offset, &status_data); - if ((status_data & XVSEC_MCAP_STATUS_ERR) == 0x1) - ret = -(EBUSY); - - pci_write_config_dword(pdev, ctrl_offset, restore); - - return ret; -} - -int xvsec_mcap_module_reset(struct vsec_context *mcap_ctx) -{ - int ret = 0; - uint16_t mcap_offset; - uint16_t ctrl_offset, status_offset; - uint32_t ctrl_data, status_data, read_data, restore; - struct pci_dev *pdev = mcap_ctx->pdev; - - /* Acquire the Access */ - ret = xvsec_mcap_req_access(mcap_ctx, &restore); - if (ret < 0) - return ret; - - mcap_offset = mcap_ctx->vsec_offset; - ctrl_offset = mcap_offset + XVSEC_MCAP_CONTROL_REGISTER; - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - - /* Asserting the Module Reset */ - ctrl_data = ctrl_data | XVSEC_MCAP_CTRL_MOD_RESET | - XVSEC_MCAP_CTRL_ENABLE | XVSEC_MCAP_CTRL_REQ_ACCESS; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - /* Read Back */ - pci_read_config_dword(pdev, ctrl_offset, &read_data); - if ((read_data & XVSEC_MCAP_CTRL_MOD_RESET) == 0x0) - ret = -(EBUSY); - - status_offset = mcap_offset + XVSEC_MCAP_STATUS_REGISTER; - pci_read_config_dword(pdev, status_offset, &status_data); - if ((status_data & XVSEC_MCAP_STATUS_ERR) == 0x1) - ret = -(EBUSY); - - - pci_write_config_dword(pdev, ctrl_offset, restore); - - return ret; -} - -int xvsec_mcap_full_reset(struct vsec_context *mcap_ctx) -{ - int ret = 0; - uint16_t mcap_offset; - uint16_t ctrl_offset, status_offset; - uint32_t ctrl_data, status_data, read_data, restore; - struct pci_dev *pdev = mcap_ctx->pdev; - - /* Acquire the Access */ - ret = xvsec_mcap_req_access(mcap_ctx, &restore); - if (ret < 0) - return ret; - - mcap_offset = mcap_ctx->vsec_offset; - ctrl_offset = mcap_offset + XVSEC_MCAP_CONTROL_REGISTER; - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - - /* Asserting the Module Reset */ - ctrl_data = ctrl_data | - XVSEC_MCAP_CTRL_RESET | XVSEC_MCAP_CTRL_MOD_RESET | - XVSEC_MCAP_CTRL_ENABLE | XVSEC_MCAP_CTRL_REQ_ACCESS; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - /* Read Back */ - pci_read_config_dword(pdev, ctrl_offset, &read_data); - if ((read_data & - (XVSEC_MCAP_CTRL_RESET | XVSEC_MCAP_CTRL_MOD_RESET)) == 0x0) - ret = -(EBUSY); - - status_offset = mcap_offset + XVSEC_MCAP_STATUS_REGISTER; - pci_read_config_dword(pdev, status_offset, &status_data); - if ((status_data & XVSEC_MCAP_STATUS_ERR) == 0x1) - ret = -(EBUSY); - - pci_write_config_dword(pdev, ctrl_offset, restore); - - return ret; -} - -int xvsec_mcap_get_data_regs(struct vsec_context *mcap_ctx, uint32_t regs[4]) -{ - uint16_t mcap_offset; - struct pci_dev *pdev = mcap_ctx->pdev; - - mcap_offset = mcap_ctx->vsec_offset; - if (mcap_offset == INVALID_OFFSET) - return -(EPERM); - - pci_read_config_dword(pdev, - (mcap_offset + XVSEC_MCAP_READ_DATA_REG0), ®s[0]); - pci_read_config_dword(pdev, - (mcap_offset + XVSEC_MCAP_READ_DATA_REG1), ®s[1]); - pci_read_config_dword(pdev, - (mcap_offset + XVSEC_MCAP_READ_DATA_REG2), ®s[2]); - pci_read_config_dword(pdev, - (mcap_offset + XVSEC_MCAP_READ_DATA_REG3), ®s[3]); - - return 0; -} - -int xvsec_mcap_get_regs(struct vsec_context *mcap_ctx, - union mcap_regs *regs) -{ - uint16_t mcap_offset; - uint16_t index; - uint32_t *ptr; - struct pci_dev *pdev = mcap_ctx->pdev; - - regs->v1.valid = 0; - - mcap_offset = mcap_ctx->vsec_offset; - if (mcap_offset == INVALID_OFFSET) - return -(EPERM); - - ptr = ®s->v1.ext_cap_header; - for (index = 0; index <= (XVSEC_MCAP_READ_DATA_REG3 / 4); index++) { - pci_read_config_dword(pdev, mcap_offset, &ptr[index]); - mcap_offset = mcap_offset + 4; - } - - regs->v1.valid = 1; - - return 0; -} - -int xvsec_mcap_get_fpga_regs(struct vsec_context *mcap_ctx, - union fpga_cfg_regs *regs) -{ - int ret = 0; - int index, reg_count; - int ctrl_offset, sts_offset; - int rd_offset; - uint32_t rd_data, ctrl_data, sts_data, restore; - uint16_t count; - uint32_t *reg_dump; - struct pci_dev *pdev = mcap_ctx->pdev; - - - pr_info("In %s\n", __func__); - - regs->v1.valid = 0; - regs->v1.far = 1; - - - /* Acquire the Access */ - ret = xvsec_mcap_req_access(mcap_ctx, &restore); - if (ret < 0) - return ret; - - rd_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_READ_DATA_REG0; - ctrl_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_CONTROL_REGISTER; - sts_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_STATUS_REGISTER; - - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - ctrl_data = ctrl_data | - XVSEC_MCAP_CTRL_WR_ENABLE | XVSEC_MCAP_CTRL_ENABLE | - XVSEC_MCAP_CTRL_REQ_ACCESS; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - xvsec_fpga_cfg_setup(mcap_ctx, FPGA_RD_CMD); - - reg_count = ARRAY_SIZE(fpga_valid_addr); - /* sizeof(fpga_valid_addr)/sizeof(fpga_valid_addr[0]); */ - reg_dump = ®s->v1.crc; - for (index = 0; index < reg_count; index++) { - xvsec_fpga_cfg_write_cmd(mcap_ctx, FPGA_RD_CMD, - fpga_valid_addr[index], 1); - - ctrl_data = ctrl_data | XVSEC_MCAP_CTRL_RD_ENABLE; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - count = 0x0; - while (count < 20) { - pci_read_config_dword(pdev, sts_offset, &sts_data); - if ((sts_data & 0x10) != 0x0) - break; - count = count + 1; - msleep(20); - } - - if (count >= 20) { - /* FIXME : should discuss with brain martin - * and close this teardown - */ - pr_err("Time out happened while "); - pr_err("reading FPGA CFG Register\n"); - ret = -(EBUSY); - goto CLEANUP; - } - - pci_read_config_dword(pdev, rd_offset, &rd_data); - - reg_dump[index] = rd_data; - - ctrl_data = ctrl_data & (~XVSEC_MCAP_CTRL_RD_ENABLE); - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - } - - if (ret == 0) - regs->v1.valid = 1; - -CLEANUP: - xvsec_fpga_cfg_teardown(mcap_ctx); - - pci_write_config_dword(pdev, ctrl_offset, restore); - - return ret; -} - -int xvsec_mcap_program_bitstream(struct vsec_context *mcap_ctx, - union bitstream_file *bit_files) -{ - int ret = 0; - uint16_t ctrl_offset; - uint32_t ctrl_data, restore; - char bitfile[MAX_FLEN]; - uint16_t len; - struct pci_dev *pdev = mcap_ctx->pdev; - - bit_files->v1.status = MCAP_BITSTREAM_PROGRAM_FAILURE; - - if ((bit_files->v1.partial_clr_file == NULL) && - (bit_files->v1.bitstream_file == NULL)) { - pr_err("Both Bit files are NULL\n"); - return -(EINVAL); - } - - /* Acquire the Access */ - ret = xvsec_mcap_req_access(mcap_ctx, &restore); - if (ret < 0) - return ret; - - ctrl_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_CONTROL_REGISTER; - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - - /* Asserting the Reset */ - ctrl_data = ctrl_data | XVSEC_MCAP_CTRL_WR_ENABLE | - XVSEC_MCAP_CTRL_ENABLE | XVSEC_MCAP_CTRL_REQ_ACCESS; - - - ctrl_data = ctrl_data & - ~(XVSEC_MCAP_CTRL_RESET | XVSEC_MCAP_CTRL_MOD_RESET | - XVSEC_MCAP_CTRL_RD_ENABLE | XVSEC_MCAP_CTRL_CFG_SWICTH); - - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - pr_info("Ctrl Data : 0x%X, 0x%X\n", ctrl_offset, ctrl_data); - - if (bit_files->v1.partial_clr_file != NULL) { - len = strnlen_user( - (char __user *)bit_files->v1.partial_clr_file, - MAX_FLEN); - if (len > MAX_FLEN) { - pr_err("File Name too long\n"); - goto CLEANUP; - } - - ret = strncpy_from_user(bitfile, - (char __user *)bit_files->v1.partial_clr_file, len); - if (ret < 0) { - pr_err("File Name Copy Failed\n"); - goto CLEANUP; - } - pr_info("Clear File Name : %s\n", bitfile); - - ret = xvsec_mcap_program(mcap_ctx, bitfile); - if (ret < 0) { - pr_err("[xvsec_mcap] : xvsec_mcap_program "); - pr_err("failed for partial clear file with err : "); - pr_err("%d\n", ret); - - goto CLEANUP; - } - } - - if (bit_files->v1.bitstream_file != NULL) { - len = strnlen_user( - (char __user *)bit_files->v1.bitstream_file, - MAX_FLEN); - if (len > MAX_FLEN) { - pr_err("File Name too long\n"); - goto CLEANUP; - } - - ret = strncpy_from_user(bitfile, - (char __user *)bit_files->v1.bitstream_file, len); - if (ret < 0) { - pr_err("File Name Copy Failed\n"); - goto CLEANUP; - } - - pr_info("Bit File Name : %s\n", bitfile); - - ret = xvsec_mcap_program(mcap_ctx, bitfile); - if (ret < 0) { - pr_err("[xvsec_mcap] : xvsec_mcap_program "); - pr_err("failed for bit file with err : %d\n", ret); - goto CLEANUP; - } - restore = restore | XVSEC_MCAP_CTRL_CFG_SWICTH; - } - - if (ret == 0) - bit_files->v1.status = MCAP_BITSTREAM_PROGRAM_SUCCESS; - -CLEANUP: - pci_write_config_dword(pdev, ctrl_offset, restore); - - return ret; -} - -static int xvsec_parse_rbt_file(struct file *filep, int file_size, int *offset) -{ - uint8_t chunk_size; - char raw_buf[RBT_WORD_LEN]; - int search_off = 0, len; - int size, index; - uint8_t count; - - size = file_size; - count = 0x0; - memset(raw_buf, 0, RBT_WORD_LEN); - while (size != 0) { - chunk_size = (size > RBT_WORD_LEN) ? RBT_WORD_LEN : size; - len = xvsec_util_fread(filep, search_off, - (uint8_t *)raw_buf, - chunk_size); - - for (index = 0; index < len ; index++) { - if ((raw_buf[index] == '1') || - (raw_buf[index] == '0')) { - count = count + 1; - } else { - count = 0x0; - } - - if (count >= RBT_WORD_LEN) - break; - } - - if (count >= RBT_WORD_LEN) { - *offset = search_off + (index + 1) - chunk_size; - len = xvsec_util_fread(filep, - *offset, (uint8_t *)raw_buf, RBT_WORD_LEN); - count = 0x0; - for (index = 0; index < len ; index++) { - if ((raw_buf[index] == '1') || - (raw_buf[index] == '0')) { - count = count + 1; - } - } - if (count == RBT_WORD_LEN) - break; - return -(EAGAIN); - - } - - search_off = search_off + len; - size = size - len; - } - - if (size == 0) - return -(ENOEXEC); - - return 0; -} - -static int xvsec_write_rbt(struct vsec_context *mcap_ctx, - struct file *filep, loff_t size) -{ - int status; - char bitdata[RBT_WORD_LEN + 1], dummy_data = 0; - uint16_t wr_offset; - uint32_t *buf, buf_index; - int i, len, offset = 0, remain_size, dummy_len; - uint32_t worddata, chunk_size; - bool done; - struct pci_dev *pdev = mcap_ctx->pdev; - - status = xvsec_parse_rbt_file(filep, size, &offset); - if (status < 0) - return -(ENOEXEC); - - pr_info("File Parsed Successfully..Offset found : 0x%X\n", offset); - - buf = kmalloc(DMA_HWICAP_BITFILE_BUFFER_SIZE, GFP_KERNEL); - if (buf == NULL) - return -(ENOMEM); - - remain_size = size - offset; - worddata = 0x0; - buf_index = 0x0; - done = false; - wr_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_WRITE_DATA_REG; - - memset(bitdata, 0, (RBT_WORD_LEN + 1)); - while (done == false) { - chunk_size = (remain_size > (RBT_WORD_LEN + 1)) ? - (RBT_WORD_LEN + 1) : remain_size; - len = xvsec_util_fread(filep, offset, - (uint8_t *)bitdata, - chunk_size); - /* Discarding Comments */ - if (bitdata[0] == '#') { - offset = offset + chunk_size; - remain_size = remain_size - chunk_size; - continue; - } - - if (len != chunk_size) - pr_warn("Len and chunk_size mismatch\n"); - - for (i = 0; i < (len - 1) ; i++) { - if ((bitdata[i] == '1') || (bitdata[i] == '0')) { - worddata = (worddata << 1) | - (bitdata[i] - 0x30); - } else { - pr_info("Corrupted Character : %c, 0x%X\n", - bitdata[i], bitdata[i]); - break; - } - } - - if (i != (len - 1)) { - pr_err("Corrupted rbt file..Found ASCII character\n"); - pr_err("in middle of the bits\n"); - pr_info("i : %d, len : %d\n", i, len); - - kfree(buf); - return -(EFAULT); - } - - buf[buf_index] = worddata; - worddata = 0x0; - offset = offset + chunk_size; - remain_size = remain_size - chunk_size; - - buf_index = buf_index + 1; - /* Check whether complete buffer filled up */ - if (((buf_index * 4) == DMA_HWICAP_BITFILE_BUFFER_SIZE) || - (remain_size == 0x0)) { - - /* Write the Data to MCAP */ - for (i = 0; i < buf_index; i++) { - pci_write_config_dword(pdev, wr_offset, buf[i]); - - /* FROM SDAccel Code: - * This delay resolves the MIG calibration - * issues we have been seeing with - * Tandem Stage 2 Loading - */ - udelay(1); - } - buf_index = 0x0; - } - - /* More than one word in a same line..just ignore that data */ - if (bitdata[len - 1] != '\n') { - pr_info("Found multiple words in single line\n"); - pr_info("Character : %c\n", bitdata[len - 1]); - while (remain_size != 0) { - dummy_len = xvsec_util_fread(filep, - offset, (uint8_t *)&dummy_data, 1); - offset = offset + 1; - remain_size = remain_size - 1; - if ((dummy_data == '\n') || (dummy_len != 1)) - break; - } - } - - if (remain_size == 0) - done = true; - } - - kfree(buf); - return offset; -} - -static int xvsec_write_bit(struct vsec_context *mcap_ctx, - struct file *filep, loff_t size) -{ - int err; - uint8_t val = 0, len = 0; - uint32_t index, loop; - uint64_t offset = 0x0; - uint32_t *buf = NULL; - uint16_t chunk = 0; - uint16_t wr_offset; - loff_t remain_size = 0; - bool sync_found = false; - struct pci_dev *pdev = mcap_ctx->pdev; - - /* - * .bit files are not guaranteed to be aligned with - * the bitstream sync word on a 32-bit boundary. So, - * we need to check every byte here. - */ - while (xvsec_util_fread(filep, offset, &val, 1) == 1) { - if (offset >= size) { - pr_err("[xvsec_cdev] : Reached End of BIT file"); - pr_err(" Failed to find the sync word\n"); - return -(EINVAL); - } - len++; offset++; - if ((val == MCAP_SYNC_BYTE0) && - (xvsec_util_fread(filep, - offset, &val, 1)) == 1) { - len++; offset++; - if ((val == MCAP_SYNC_BYTE1) && - (xvsec_util_fread(filep, - offset, &val, 1)) == 1) { - len++; offset++; - if ((val == MCAP_SYNC_BYTE2) && - (xvsec_util_fread(filep, - offset, &val, 1)) == 1) { - len++; offset++; - if (val == MCAP_SYNC_BYTE3) { - sync_found = true; - break; - } - } - } - } - } - - if (sync_found != true) { - pr_err("[xvsec_cdev] : Failed to Read BIT file\n"); - return -(EINVAL); - } - - pr_info("found sync pattern : %d\n", len); - - buf = kmalloc(DMA_HWICAP_BITFILE_BUFFER_SIZE, GFP_KERNEL); - if (buf == NULL) - return -(ENOMEM); - - buf[0] = (uint32_t)cpu_to_be32(MCAP_SYNC_DWORD); - - remain_size = size - len; - index = 4; - wr_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_WRITE_DATA_REG; - while (remain_size != 0) { - chunk = (remain_size > DMA_HWICAP_BITFILE_BUFFER_SIZE) ? - DMA_HWICAP_BITFILE_BUFFER_SIZE : remain_size; - - chunk = (index == 0) ? chunk : (chunk - 4); - - err = xvsec_util_fread(filep, - offset, (uint8_t *)&buf[index/4], chunk); - if (err < 0) - goto CLEANUP; - - for (loop = 0; loop < ((chunk+index) / 4); loop++) { - pci_write_config_dword(pdev, wr_offset, - (uint32_t)cpu_to_be32(buf[loop])); - - /* FROM SDAccel Code: - * This delay resolves the MIG calibration issues - * we have been seeing with Tandem Stage 2 Loading - */ - udelay(1); - } - - - index = 0; - offset = offset + chunk; - remain_size = remain_size - chunk; - } - -CLEANUP: - kfree(buf); - return offset; -} - -static int xvsec_write_bin(struct vsec_context *mcap_ctx, - struct file *filep, loff_t size) -{ - int err = 0; - uint32_t loop; - uint64_t offset = 0x0; - uint32_t *buf; - uint16_t chunk = 0; - uint16_t wr_offset; - loff_t remain_size = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - - - buf = kmalloc(DMA_HWICAP_BITFILE_BUFFER_SIZE, GFP_KERNEL); - if (buf == NULL) - return -(ENOMEM); - - memset(buf, 0, DMA_HWICAP_BITFILE_BUFFER_SIZE); - remain_size = size; - wr_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_WRITE_DATA_REG; - while (remain_size != 0) { - chunk = (remain_size > DMA_HWICAP_BITFILE_BUFFER_SIZE) ? - DMA_HWICAP_BITFILE_BUFFER_SIZE : remain_size; - - - err = xvsec_util_fread(filep, - offset, (uint8_t *)&buf[0], chunk); - if (err < 0) - goto CLEANUP; - - for (loop = 0; loop < (chunk / 4); loop++) { - pci_write_config_dword(pdev, wr_offset, - (uint32_t)cpu_to_be32(buf[loop])); - - /* FROM SDAccel Code: - * This delay resolves the MIG calibration issues - * we have been seeing with Tandem Stage 2 Loading - */ - udelay(1); - } - - offset = offset + chunk; - remain_size = remain_size - chunk; - } -CLEANUP: - kfree(buf); - return err; -} - -static int xvsec_mcap_program(struct vsec_context *mcap_ctx, char *fname) -{ - int ret = 0; - loff_t file_size; - struct file *filep; - uint32_t sts_data; - - pr_info("Before fopen\n"); - pr_info("file name : %p\n", fname); - filep = xvsec_util_fopen(fname, O_RDONLY, 0); - if (filep == NULL) - return -(ENOENT); - - pr_info("After fopen\n"); - - ret = xvsec_util_get_file_size(fname, &file_size); - if (ret < 0) - goto CLEANUP; - - pr_info("After getsize\n"); - - if (file_size <= 0) { - ret = -(EINVAL); - goto CLEANUP; - } - - if (xvsec_util_find_file_type(fname, MCAP_RBT_FILE) == 0) { - ret = xvsec_write_rbt(mcap_ctx, filep, file_size); - pr_info("xvsec_write_rbt : output : 0x%X\n", ret); - if (ret < 0) - goto CLEANUP; - } else if (xvsec_util_find_file_type(fname, MCAP_BIT_FILE) == 0) { - ret = xvsec_write_bit(mcap_ctx, filep, file_size); - if (ret < 0) - goto CLEANUP; - } else if (xvsec_util_find_file_type(fname, MCAP_BIN_FILE) == 0) { - ret = xvsec_write_bin(mcap_ctx, filep, file_size); - if (ret < 0) - goto CLEANUP; - } - - ret = check_for_completion(mcap_ctx, &sts_data); - if ((ret != 0) || - ((sts_data & XVSEC_MCAP_STATUS_ERR) != 0x0) || - ((sts_data & XVSEC_MCAP_STATUS_FIFO_OVFL) != 0x0)) { - pr_err("Performing Full Reset\n"); - xvsec_mcap_full_reset(mcap_ctx); - ret = -(EIO); - } - -CLEANUP: - xvsec_util_fclose(filep); - return ret; - -} - -int xvsec_mcap_rd_cfg_addr(struct vsec_context *mcap_ctx, - union cfg_data *data) -{ - int ret = 0; - uint8_t byte_data; - uint16_t short_data; - uint32_t word_data; - uint32_t address; - struct pci_dev *pdev = mcap_ctx->pdev; - - address = mcap_ctx->vsec_offset + data->v1.offset; - switch (data->v1.access) { - case 'b': - ret = pci_read_config_byte(pdev, address, &byte_data); - if (ret == 0) - data->v1.data = byte_data; - break; - case 'h': - ret = pci_read_config_word(pdev, address, &short_data); - if (ret == 0) - data->v1.data = short_data; - break; - case 'w': - ret = pci_read_config_dword(pdev, address, &word_data); - if (ret == 0) - data->v1.data = word_data; - break; - default: - ret = -(EINVAL); - break; - } - - return ret; -} - -int xvsec_mcap_wr_cfg_addr(struct vsec_context *mcap_ctx, - union cfg_data *data) -{ - int ret = 0; - uint8_t byte_data; - uint16_t short_data; - uint32_t word_data; - uint32_t address; - struct pci_dev *pdev = mcap_ctx->pdev; - - address = mcap_ctx->vsec_offset + data->v1.offset; - - switch (data->v1.access) { - case 'b': - byte_data = (uint8_t)data->v1.data; - ret = pci_write_config_byte(pdev, address, byte_data); - break; - case 'h': - short_data = (uint16_t)data->v1.data; - ret = pci_write_config_word(pdev, address, short_data); - break; - case 'w': - word_data = (uint32_t)data->v1.data; - ret = pci_write_config_dword(pdev, address, word_data); - break; - default: - ret = -(EINVAL); - break; - } - - return ret; -} - -int xvsec_fpga_rd_cfg_addr(struct vsec_context *mcap_ctx, - union fpga_cfg_reg *cfg_reg) -{ - int ret = 0; - int ctrl_offset, status_offset; - int rd_offset; - int i, n; - uint32_t rd_data, ctrl_data, status_data, restore; - uint16_t count; - struct pci_dev *pdev = mcap_ctx->pdev; - - i = 0x0; - n = ARRAY_SIZE(fpga_valid_addr); - - while ((i < n) && (cfg_reg->v1.offset != fpga_valid_addr[i++])) - ; - - if ((i == n) && (cfg_reg->v1.offset != fpga_valid_addr[n - 1])) { - pr_err("Invalid FPGA Register Access : "); - pr_err("Addr : 0x%X\n", cfg_reg->v1.offset); - return -(EACCES); - } - - /* Acquire the Access */ - ret = xvsec_mcap_req_access(mcap_ctx, &restore); - if (ret < 0) - return ret; - - rd_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_READ_DATA_REG0; - ctrl_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_CONTROL_REGISTER; - status_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_STATUS_REGISTER; - - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - ctrl_data = ctrl_data | - XVSEC_MCAP_CTRL_WR_ENABLE | XVSEC_MCAP_CTRL_ENABLE | - XVSEC_MCAP_CTRL_REQ_ACCESS; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - xvsec_fpga_cfg_setup(mcap_ctx, FPGA_RD_CMD); - - xvsec_fpga_cfg_write_cmd(mcap_ctx, FPGA_RD_CMD, cfg_reg->v1.offset, 1); - - ctrl_data = ctrl_data | XVSEC_MCAP_CTRL_RD_ENABLE; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - count = 0x0; - while (count < 20) { - pci_read_config_dword(pdev, status_offset, &status_data); - if ((status_data & 0x10) != 0x0) - break; - count = count + 1; - msleep(20); - } - - if (count >= 20) { - pr_err("Time out happened while reading FPGA CFG Register\n"); - ret = -(EBUSY); - goto CLEANUP; - } - - pci_read_config_dword(pdev, rd_offset, &rd_data); - - pr_info("%s : data : 0x%X\n", __func__, rd_data); - - cfg_reg->v1.data = rd_data; - - ctrl_data = ctrl_data & (~XVSEC_MCAP_CTRL_RD_ENABLE); - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - -CLEANUP: - xvsec_fpga_cfg_teardown(mcap_ctx); - - pci_write_config_dword(pdev, ctrl_offset, restore); - - return ret; -} - -int xvsec_fpga_wr_cfg_addr(struct vsec_context *mcap_ctx, - union fpga_cfg_reg *cfg_reg) -{ - int ret = 0; - int ctrl_offset; - int i, n; - uint32_t ctrl_data, restore; - struct pci_dev *pdev = mcap_ctx->pdev; - - i = 0x0; - n = ARRAY_SIZE(fpga_valid_addr); - - while ((i < n) && (cfg_reg->v1.offset != fpga_valid_addr[i++])) - ; - - if ((i == n) && (cfg_reg->v1.offset != fpga_valid_addr[n - 1])) { - pr_err("Invalid FPGA Register Access : "); - pr_err("Addr : 0x%X\n", cfg_reg->v1.offset); - return -(EACCES); - } - - /* Acquire the Access */ - ret = xvsec_mcap_req_access(mcap_ctx, &restore); - if (ret < 0) - return ret; - - ctrl_offset = mcap_ctx->vsec_offset + XVSEC_MCAP_CONTROL_REGISTER; - - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - ctrl_data = ctrl_data | - XVSEC_MCAP_CTRL_WR_ENABLE | XVSEC_MCAP_CTRL_ENABLE | - XVSEC_MCAP_CTRL_REQ_ACCESS; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - xvsec_fpga_cfg_setup(mcap_ctx, FPGA_WR_CMD); - - xvsec_fpga_cfg_write_cmd(mcap_ctx, FPGA_WR_CMD, cfg_reg->v1.offset, 1); - - xvsec_fpga_cfg_write_data(mcap_ctx, cfg_reg->v1.data); - - xvsec_fpga_cfg_teardown(mcap_ctx); - - pci_write_config_dword(pdev, ctrl_offset, restore); - - return ret; -} - -/* - * unsupported v1 functions for US/US+ - */ -int xvsec_mcapv1_axi_rd_addr(struct vsec_context *mcap_ctx, - union axi_reg_data *cfg_reg) -{ - pr_err("AXI Read operation not supported for US/US+ devices\n"); - return -(EPERM); -} - -int xvsec_mcapv1_axi_wr_addr(struct vsec_context *mcap_ctx, - union axi_reg_data *cfg_reg) -{ - pr_err("AXI Write operation not supported for US/US+ devices\n"); - return -(EPERM); -} - -int xvsec_mcapv1_file_download(struct vsec_context *mcap_ctx, - union file_download_upload *file) -{ - pr_err("AXI File Download not supported for US/US+ devices\n"); - return -(EPERM); -} - -int xvsec_mcapv1_file_upload(struct vsec_context *mcap_ctx, - union file_download_upload *file) -{ - pr_err("AXI File upload not supported for US/US+ devices\n"); - return -(EPERM); -} -int xvsec_mcapv1_set_axi_cache_attr( - struct vsec_context *mcap_ctx, union axi_cache_attr *attr) -{ - pr_err("AXI attributes settings not supported for US/US+ devices\n"); - return -(EPERM); -} - -MODULE_LICENSE("Dual BSD/GPL"); diff --git a/XVSEC/linux-kernel/drv/xvsec_mcap/us/xvsec_mcap_us.h b/XVSEC/linux-kernel/drv/xvsec_mcap/us/xvsec_mcap_us.h deleted file mode 100644 index c016efd..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_mcap/us/xvsec_mcap_us.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XVSEC_MCAP_US_H__ -#define __XVSEC_MCAP_US_H__ - -/** - * @file xvsec_mcap_us.h - * - * Xilinx XVSEC MCAP US/US+ Driver Library Definitions - * - * Header file *xvsec_mcap_us.h* defines data structures & register - * definitions needed to implement the MCAP version 1 driver - * - * These data structures and register definitions can be used by - * XVSEC MCAP common driver - */ - - -#define MAX_FLEN (300) -#define RBT_WORD_LEN (32) - -#define XVSEC_MCAP_LOOP_COUNT (1000000) -#define EMCAP_EOS_LOOP_COUNT (100) -#define EMCAP_NOOP_VAL 0x2000000 -#define EMCAP_EOS_RETRY_COUNT 10 -#define DMA_HWICAP_BITFILE_BUFFER_SIZE 1024 /* from xbar_sys_parameters.h */ - -#define MCAP_SYNC_DWORD 0xFFFFFFFF -#define MCAP_SYNC_BYTE0 ((MCAP_SYNC_DWORD & 0xFF000000) >> 24) -#define MCAP_SYNC_BYTE1 ((MCAP_SYNC_DWORD & 0x00FF0000) >> 16) -#define MCAP_SYNC_BYTE2 ((MCAP_SYNC_DWORD & 0x0000FF00) >> 8) -#define MCAP_SYNC_BYTE3 ((MCAP_SYNC_DWORD & 0x000000FF) >> 0) - -#define MCAP_RBT_FILE ".rbt" -#define MCAP_BIT_FILE ".bit" -#define MCAP_BIN_FILE ".bin" - -/* MCAP Register Offsets */ -#define XVSEC_MCAP_EXTENDED_HEADER (0x0000) -#define XVSEC_MCAP_VENDOR_HEADER (0x0004) -#define XVSEC_MCAP_FPGA_JTAG_ID (0x0008) -#define XVSEC_MCAP_FPGA_BIT_VER (0x000c) -#define XVSEC_MCAP_STATUS_REGISTER (0x0010) -#define XVSEC_MCAP_CONTROL_REGISTER (0x0014) -#define XVSEC_MCAP_WRITE_DATA_REG (0x0018) -#define XVSEC_MCAP_READ_DATA_REG0 (0x001c) -#define XVSEC_MCAP_READ_DATA_REG1 (0x0020) -#define XVSEC_MCAP_READ_DATA_REG2 (0x0024) -#define XVSEC_MCAP_READ_DATA_REG3 (0x0028) - -#define XVSEC_MCAP_DATA_REG_CNT 4 - -#define XVSEC_MCAP_VSEC_ID_SHIFT 0 -#define XVSEC_MCAP_REV_ID_SHIFT 16 -#define XVSEC_MCAP_VSEC_ID_POS (0xFFFF << XVSEC_MCAP_VSEC_ID_SHIFT) -#define XVSEC_MCAP_REV_ID_POS (0xF << XVSEC_MCAP_REV_ID_SHIFT) - -/* CTRL REG FIELDS */ -#define XVSEC_MCAP_CTRL_ENABLE (1 << 0) -#define XVSEC_MCAP_CTRL_RD_ENABLE (1 << 1) -#define XVSEC_MCAP_CTRL_RESET (1 << 4) -#define XVSEC_MCAP_CTRL_MOD_RESET (1 << 5) -#define XVSEC_MCAP_CTRL_REQ_ACCESS (1 << 8) -#define XVSEC_MCAP_CTRL_CFG_SWICTH (1 << 12) -#define XVSEC_MCAP_CTRL_WR_ENABLE (1 << 16) - -/* STATUS REG FIELDS */ -#define XVSEC_MCAP_STATUS_ERR (1 << 0) -#define XVSEC_MCAP_STATUS_EOS (1 << 1) -#define XVSEC_MCAP_STATUS_RD_COMPLETE (1 << 4) -#define XVSEC_MCAP_STATUS_RD_COUNT (0x7 << 5) -#define XVSEC_MCAP_STATUS_FIFO_OVFL (1 << 8) -#define XVSEC_MCAP_STATUS_FIFO_LEVEL (0xF << 12) -#define XVSEC_MCAP_STATUS_ACCESS (1 << 24) - -/* FPGA CFG RD/WR SEQUENCE WORDS */ -#define DUMMY_WORD 0xFFFFFFFF -#define BUS_WIDTH_SYNC 0x000000BB -#define BUS_WIDTH_DETECT 0x11220044 -#define SYNC_WORD 0xAA995566 -#define NOOP 0x20000000 -#define TYPE1_WR_CMD 0x30008001 -#define DESYNC 0x0000000D - -#define TYPE1_HEADER_TYPE 0x1 -#define FPGA_CFG_READ 0x1 -#define FPGA_CFG_WRITE 0x2 - - -enum oper { - FPGA_WR_CMD = 0x0, - FPGA_RD_CMD, -}; - -union type1_header { - struct { - uint32_t word_count : 11; - uint32_t reserved02 : 2; - uint32_t address : 5; - uint32_t reserved01 : 9; - uint32_t opcode : 2; - uint32_t header_type : 3; - }; - uint32_t data; -}; - - -int xvsec_mcap_reset(struct vsec_context *mcap_ctx); -int xvsec_mcap_module_reset(struct vsec_context *mcap_ctx); -int xvsec_mcap_full_reset(struct vsec_context *mcap_ctx); -int xvsec_mcap_get_data_regs(struct vsec_context *mcap_ctx, - uint32_t regs[4]); -int xvsec_mcap_get_regs(struct vsec_context *mcap_ctx, - union mcap_regs *regs); -int xvsec_mcap_get_fpga_regs(struct vsec_context *mcap_ctx, - union fpga_cfg_regs *regs); -int xvsec_mcap_program_bitstream(struct vsec_context *mcap_ctx, - union bitstream_file *bit_files); -int xvsec_mcap_rd_cfg_addr(struct vsec_context *mcap_ctx, - union cfg_data *data); -int xvsec_mcap_wr_cfg_addr(struct vsec_context *mcap_ctx, - union cfg_data *data); -int xvsec_fpga_rd_cfg_addr(struct vsec_context *mcap_ctx, - union fpga_cfg_reg *cfg_reg); -int xvsec_fpga_wr_cfg_addr(struct vsec_context *mcap_ctx, - union fpga_cfg_reg *cfg_reg); - -/*unsupported for US/US+ */ -int xvsec_mcapv1_axi_rd_addr(struct vsec_context *mcap_ctx, - union axi_reg_data *cfg_reg); -int xvsec_mcapv1_axi_wr_addr(struct vsec_context *mcap_ctx, - union axi_reg_data *cfg_reg); -int xvsec_mcapv1_file_download(struct vsec_context *mcap_ctx, - union file_download_upload *file); -int xvsec_mcapv1_file_upload(struct vsec_context *mcap_ctx, - union file_download_upload *file); -int xvsec_mcapv1_set_axi_cache_attr(struct vsec_context *mcap_ctx, - union axi_cache_attr *attr); - - -#endif /* __XVSEC_MCAP_US_H__ */ diff --git a/XVSEC/linux-kernel/drv/xvsec_mcap/versal/xvsec_mcap_versal.c b/XVSEC/linux-kernel/drv/xvsec_mcap/versal/xvsec_mcap_versal.c deleted file mode 100644 index 5827f82..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_mcap/versal/xvsec_mcap_versal.c +++ /dev/null @@ -1,1144 +0,0 @@ -/* - *This file is part of the XVSEC driver for Linux - * - *Copyright (c) 2020-2022 Xilinx, Inc. - *All rights reserved. - * - *This source code is free software; you can redistribute it and/or modify it - *under the terms and conditions of the GNU General Public License, - *version 2, as published by the Free Software Foundation. - * - *This program is distributed in the hope that it will be useful, but WITHOUT - *ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - *FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - *more details. - * - *The full GNU General Public License is included in this distribution in - *the file called "COPYING". - * - */ - -#include <linux/ioctl.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/aer.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/version.h> -#include <linux/pci.h> -#include <linux/vmalloc.h> -#include <linux/cdev.h> -#include <linux/fcntl.h> -#include <linux/sched.h> -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/delay.h> -#include <linux/fs.h> -#include <linux/uaccess.h> - -#include "xvsec_drv.h" -#include "xvsec_drv_int.h" -#include "xvsec_mcap.h" -#include "xvsec_mcap_versal.h" -#include "xvsec_util.h" - -static int xvsec_mcapv2_wr_enable(struct vsec_context *mcap_ctx); -static int xvsec_mcapv2_rd_enable(struct vsec_context *mcap_ctx); -static int xvsec_mcapv2_wr_disable(struct vsec_context *mcap_ctx); -static int xvsec_mcapv2_rd_disable(struct vsec_context *mcap_ctx); -static int xvsec_mcapv2_set_mode( - struct vsec_context *mcap_ctx, enum axi_access_mode mode); -static int xvsec_mcapv2_set_address( - struct vsec_context *mcap_ctx, uint32_t address); -static int xvsec_mcapv2_set_axi_cache_prot( - struct vsec_context *mcap_ctx, uint8_t axi_cache, uint8_t axi_prot); -static int xvsec_mcapv2_write_data_reg( - struct vsec_context *mcap_ctx, uint32_t data); -static int xvsec_mcapv2_read_data_reg( - struct vsec_context *mcap_ctx, uint32_t *data); -static int xvsec_mcapv2_read_status_reg( - struct vsec_context *mcap_ctx, uint32_t *sts); -static int xvsec_mcapv2_wait_for_write_FIFO_empty( - struct vsec_context *mcap_ctx); -static int xvsec_mcapv2_check_mcap_rw_status( - struct vsec_context *mcap_ctx, uint32_t sts, - enum file_operation_status *op_status); -static int xvsec_mcapv2_read_fifo_capacity( - struct vsec_context *mcap_ctx, uint8_t *fifo_capacity); -static int xvsec_mcapv2_wait_for_rw_complete( - struct vsec_context *mcap_ctx); - -int xvsec_mcapv2_module_reset(struct vsec_context *mcap_ctx) -{ - int ret = 0; - uint16_t mcap_offset; - uint16_t ctrl_offset; - uint32_t ctrl_data, read_data, restore; - struct pci_dev *pdev = mcap_ctx->pdev; - - mcap_offset = mcap_ctx->vsec_offset; - ctrl_offset = mcap_offset + XVSEC_MCAPV2_CONTROL_REG; - pci_read_config_dword(pdev, ctrl_offset, &ctrl_data); - restore = ctrl_data; - - /* Asserting the Module Reset */ - ctrl_data = ctrl_data | XVSEC_MCAPV2_CTRL_RESET; - pci_write_config_dword(pdev, ctrl_offset, ctrl_data); - - /* Read Back */ - pci_read_config_dword(pdev, ctrl_offset, &read_data); - if ((read_data & XVSEC_MCAPV2_CTRL_RESET) == 0x0) - ret = -(EBUSY); - - pci_write_config_dword(pdev, ctrl_offset, restore); - - return ret; -} - -int xvsec_mcapv2_get_regs( - struct vsec_context *mcap_ctx, union mcap_regs *regs) -{ - uint16_t mcap_offset; - uint16_t index; - uint32_t *ptr; - struct pci_dev *pdev = mcap_ctx->pdev; - - regs->v2.valid = 0; - - mcap_offset = mcap_ctx->vsec_offset; - if (mcap_offset == INVALID_OFFSET) - return -(EPERM); - - ptr = ®s->v2.ext_cap_header; - for (index = 0; index <= (XVSEC_MCAPV2_READ_DATA_REG / 4); index++) { - pci_read_config_dword(pdev, mcap_offset, &ptr[index]); - mcap_offset = mcap_offset + 4; - } - - regs->v2.valid = 1; - - return 0; -} - -int xvsec_mcapv2_rd_cfg_addr( - struct vsec_context *mcap_ctx, union cfg_data *data) -{ - int ret = 0; - uint8_t byte_data; - uint16_t short_data; - uint32_t word_data; - uint32_t address; - struct pci_dev *pdev = mcap_ctx->pdev; - - address = mcap_ctx->vsec_offset + data->v2.offset; - switch (data->v2.access) { - case 'b': - ret = pci_read_config_byte(pdev, address, &byte_data); - if (ret == 0) - data->v2.data = byte_data; - break; - case 'h': - ret = pci_read_config_word(pdev, address, &short_data); - if (ret == 0) - data->v2.data = short_data; - break; - case 'w': - ret = pci_read_config_dword(pdev, address, &word_data); - if (ret == 0) - data->v2.data = word_data; - break; - default: - ret = -(EINVAL); - break; - } - - return ret; -} - -int xvsec_mcapv2_wr_cfg_addr( - struct vsec_context *mcap_ctx, union cfg_data *data) -{ - int ret = 0; - uint8_t byte_data; - uint16_t short_data; - uint32_t word_data; - uint32_t address; - struct pci_dev *pdev = mcap_ctx->pdev; - - address = mcap_ctx->vsec_offset + data->v2.offset; - - switch (data->v2.access) { - case 'b': - byte_data = (uint8_t)data->v2.data; - ret = pci_write_config_byte(pdev, address, byte_data); - break; - case 'h': - short_data = (uint16_t)data->v2.data; - ret = pci_write_config_word(pdev, address, short_data); - break; - case 'w': - word_data = (uint32_t)data->v2.data; - ret = pci_write_config_dword(pdev, address, word_data); - break; - default: - ret = -(EINVAL); - break; - } - - return ret; -} - -int xvsec_mcapv2_axi_rd_addr( - struct vsec_context *mcap_ctx, union axi_reg_data *cfg_reg) -{ - int ret = 0, wcnt = 0; - uint32_t data = 0, sts = 0; - uint8_t rw_status; - uint32_t address = cfg_reg->v2.address; - - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - if (XVSEC_MCAPV2_IS_RW_COMPLETE(sts) == true) { - /* TO Clear the MCAP Read Complete bit by asserting reset */ - xvsec_mcapv2_module_reset(mcap_ctx); - pr_debug("%s: MCAP Reset is issued.\n", __func__); - } - - xvsec_mcapv2_set_mode(mcap_ctx, MCAP_AXI_MODE_32B); - - xvsec_mcapv2_set_address(mcap_ctx, address); - - xvsec_mcapv2_rd_enable(mcap_ctx); - - /* Poll the MCAP Status Register MCAP Read Complete bit */ - wcnt = 0; - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - while (XVSEC_MCAPV2_IS_RW_COMPLETE(sts) != true) { - udelay(1); - if (wcnt++ >= MAX_OP_POLL_CNT) { - pr_err("%s: timeout on rw_complete.\n", __func__); - ret = -(ETIME); - goto CLEANUP; - } - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - } - - /* If the MCAP rw_status != OK, report the error to the user.*/ - XVSEC_MCAPV2_GET_RW_STATUS(sts, rw_status); - if (rw_status != XVSEC_MCAPV2_RW_OK) { - pr_err("%s: AXI write transaction failed.\n", __func__); - xvsec_mcapv2_module_reset(mcap_ctx); - pr_debug("%s: MCAP Reset is issued.\n", __func__); - ret = -(EIO); - goto CLEANUP; - } - - /*read 32bit data*/ - xvsec_mcapv2_read_data_reg(mcap_ctx, &data); - - /*return data*/ - cfg_reg->v2.data[0] = data; - -CLEANUP: - /*disable the read*/ - xvsec_mcapv2_rd_disable(mcap_ctx); - return ret; -} - -int xvsec_mcapv2_axi_wr_addr( - struct vsec_context *mcap_ctx, union axi_reg_data *cfg_reg) -{ - int ret = 0, reg_cnt = 0, wcnt = 0, i = 0; - uint8_t rw_status; - uint32_t address = cfg_reg->v2.address; - uint32_t *data = (uint32_t *)&cfg_reg->v2.data[0]; - enum axi_access_mode mode = cfg_reg->v2.mode; - uint32_t sts = 0; - - if (mode == MCAP_AXI_MODE_128B) - reg_cnt = 4; /* four 32bit writes */ - else - reg_cnt = 1; /* one 32bit writes */ - - xvsec_mcapv2_wr_enable(mcap_ctx); - xvsec_mcapv2_set_mode(mcap_ctx, mode); - - xvsec_mcapv2_set_address(mcap_ctx, address); - - for (i = 0; i < reg_cnt; i++) { - /* Wait if FIFO is full for a while */ - wcnt = 0; - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - while (XVSEC_MCAPV2_IS_FIFO_FULL(sts) == true) { - udelay(1); - if (wcnt++ >= MAX_OP_POLL_CNT) { - pr_err("%s: Timeout, FIFO FULL\n", __func__); - ret = -(ETIME); - goto CLEANUP; - } - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - } - - xvsec_mcapv2_write_data_reg(mcap_ctx, data[i]); - } - - /*If FIFO != empty and time-out reached, report error to user.*/ - wcnt = 0; - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - while (XVSEC_MCAPV2_IS_FIFO_EMPTY(sts) != true) { - udelay(1); - if (wcnt++ >= MAX_OP_POLL_CNT) { - pr_err("%s: Timeout, FIFO not Empty\n", __func__); - ret = -(ETIME); - goto CLEANUP; - } - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - } - - XVSEC_MCAPV2_GET_RW_STATUS(sts, rw_status); - /*If rw_status != OK, report error to user.*/ - if (rw_status != XVSEC_MCAPV2_RW_OK) { - pr_err("%s: AXI write transaction failed.\n", __func__); - xvsec_mcapv2_module_reset(mcap_ctx); - pr_debug("%s: MCAP Reset is issued.\n", __func__); - ret = -(EIO); - goto CLEANUP; - } - - /*If FIFO Overflow bit == set, report error to user */ - if (XVSEC_MCAPV2_IS_FIFO_OVERFLOW(sts) == true) { - pr_err("%s: Write FIFO overflow error occured.\n", __func__); - ret = -(EIO); - goto CLEANUP; - } - -CLEANUP: - return ret; -} - -int xvsec_mcapv2_file_download( - struct vsec_context *mcap_ctx, union file_download_upload *file_info) -{ - int ret = 0; - char *fname; - loff_t file_size = 0; - struct file *filep; - uint32_t dev_address; - loff_t offset; - loff_t frag_size; - loff_t rem_len = 0; - int index = 0; - int rd_len = 0; - uint32_t data_buf[MAX_FRAG_SZ / 4]; - enum axi_access_mode mode; - uint32_t sts = 0; - char pdifile[MAX_FILE_LEN]; - int len = 0; - enum data_transfer_mode tr_mode; - uint8_t fifo_capacity = 0; - uint8_t min_len = 0; - union axi_reg_data sbi_ctrl; - uint32_t sbi_address; - uint32_t sbi_ctrl_data_restore = 0; - - pr_debug("In %s\n", __func__); - - file_info->v2.op_status = FILE_OP_FAILED; - - if ((file_info->v2.mode > MCAP_AXI_MODE_128B) || - (file_info->v2.addr_type > INCREMENT_ADDRESS) || - (file_info->v2.file_name == NULL) || - (file_info->v2.tr_mode > DATA_TRANSFER_MODE_SLOW)) { - pr_err("%s: Invalid Params : mode : %d, type : %d, tr_mode : %d, name : %p", - __func__, file_info->v2.mode, file_info->v2.addr_type, - file_info->v2.tr_mode, file_info->v2.file_name); - return -(EINVAL); - } - - if (file_info->v2.file_name != NULL) { - len = strnlen_user( - (char __user *)file_info->v2.file_name, - MAX_FILE_LEN); - if (len > MAX_FILE_LEN) { - pr_err("File Name too long\n"); - file_info->v2.op_status = FILE_PATH_TOO_LONG; - return -(ENAMETOOLONG); - } - - ret = strncpy_from_user(pdifile, - (char __user *)file_info->v2.file_name, len); - if (ret < 0) { - pr_err("File Name Copy Failed\n"); - return -(EINVAL); - } - pr_info("pdi File Name : %s, tr_mode: %d\n", pdifile, - file_info->v2.tr_mode); - } - - fname = pdifile; - dev_address = file_info->v2.address; - mode = file_info->v2.mode; - tr_mode = file_info->v2.tr_mode; - sbi_address = file_info->v2.sbi_address; - - /** At present only PDI file format is implemented */ - if (xvsec_util_find_file_type(fname, MCAPV2_PDI_FILE) < 0) { - pr_err("Only PDI files supported for a while\n"); - return -(EINVAL); - } - - filep = xvsec_util_fopen(fname, O_RDONLY, 0); - if (filep == NULL) - return -(ENOENT); - - ret = xvsec_util_get_file_size(fname, &file_size); - if (ret < 0) - goto CLEANUP_EXIT; - - if (file_size <= 0) { - file_info->v2.op_status = FILE_OP_ZERO_FSIZE; - ret = -(EINVAL); - goto CLEANUP_EXIT; - } - - /* Check the file size is proper (multiple of 128bit/16Bytes) */ - if ((mode == MCAP_AXI_MODE_128B) && ((file_size % MIN_LEN_128B) != 0)) { - file_info->v2.op_status = FILE_OP_INVALID_FSIZE; - pr_err("%s: file size is not multiple of 128b/16B\n", __func__); - ret = -(EINVAL); - goto CLEANUP_EXIT; - } - - ret = xvsec_mcapv2_wait_for_write_FIFO_empty(mcap_ctx); - if (ret != 0) - goto CLEANUP_EXIT; - - /* RdModWr SBI Control register to accept data from - * MCAP datapath; restore later - */ - if (sbi_address != 0xFFFFFFFF) { - sbi_ctrl.v2.mode = MCAP_AXI_MODE_32B; - sbi_ctrl.v2.address = sbi_address + SLAVE_BOOT_CTRL_OFFSET; - xvsec_mcapv2_axi_rd_addr(mcap_ctx, &sbi_ctrl); - /* Storing in a tempeoray variable to retore in - * the control register while cleanup - */ - sbi_ctrl_data_restore = sbi_ctrl.v2.data[0]; - sbi_ctrl.v2.data[0] &= ~SBI_CTRL_IF_MASK; - sbi_ctrl.v2.data[0] |= (SBI_CTRL_IF_AXI | SBI_CTRL_ENABLE); - xvsec_mcapv2_axi_wr_addr(mcap_ctx, &sbi_ctrl); - } - - /** Enable write mode */ - xvsec_mcapv2_wr_enable(mcap_ctx); - xvsec_mcapv2_set_mode(mcap_ctx, mode); - if (file_info->v2.addr_type == FIXED_ADDRESS) - xvsec_mcapv2_set_address(mcap_ctx, dev_address); - - if (mode == MCAP_AXI_MODE_32B) - min_len = MIN_LEN_32B; - else - min_len = MIN_LEN_128B; - - offset = 0; - rem_len = file_size; - file_info->v2.err_index = 0; - memset(data_buf, 0, sizeof(data_buf)); - - while (rem_len != 0) { - frag_size = (rem_len >= MAX_FRAG_SZ) ? MAX_FRAG_SZ : rem_len; - - rd_len = xvsec_util_fread(filep, - offset, (uint8_t *)data_buf, frag_size); - - if (mode == MCAP_AXI_MODE_128B) { - /** Truncates the length for 128b mode */ - truncate_len_128b_mode(rd_len); - } else { - /** Truncates the length for 32b mode */ - truncate_len_32b_mode(rd_len); - } - - index = 0; - while (index < rd_len) { - /*read the status*/ - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - /* - * Fast download - * - no condition check except FIFO occupancy - * - FIFO occupancy, Need to check inside loop - * if the FIFO occupancy is 16 will wait for a while - * - fifo_capacity set to 1 for slow download and - * for fast download mode based on fifo occupancy - */ - fifo_capacity = 1; - if (tr_mode == DATA_TRANSFER_MODE_FAST) { - fifo_capacity = 0; - ret = xvsec_mcapv2_read_fifo_capacity( - mcap_ctx, &fifo_capacity); - if (ret != 0) - goto CLEANUP; - } - /*slow download - Fifo should be empty*/ - else if (tr_mode == DATA_TRANSFER_MODE_SLOW) { - /* Wait until the Write FIFO is empty */ - /* for 128B, check after every 4 dwords*/ - if ((index % min_len) == 0) { - ret = - xvsec_mcapv2_wait_for_write_FIFO_empty( - mcap_ctx); - if (ret != 0) - goto CLEANUP; - } - } - - while (fifo_capacity--) { - /** Continue when FIFO has some room */ - if ( - (file_info->v2.addr_type == INCREMENT_ADDRESS) - && ((index % min_len) == 0)) { - xvsec_mcapv2_set_address(mcap_ctx, - dev_address); - dev_address = dev_address + min_len; - } - - xvsec_mcapv2_write_data_reg(mcap_ctx, - data_buf[index / 4]); - index = index + 4; - - /* - * - Break This loop if remaining data is - * less then the fifo capacity and it gets - * transferred to the HW - */ - if (index >= rd_len) { - pr_debug("%s: Fifo cap: %d, index: %d, rd_len: %d\n", - __func__, fifo_capacity, - index, rd_len); - break; - } - } - - /*slow download: - * sts_ok and rw_complete for every dword - */ - if (tr_mode == DATA_TRANSFER_MODE_SLOW) { - if ((index % min_len) == 0) { - ret = xvsec_mcapv2_wait_for_rw_complete( - mcap_ctx); - if (ret != 0) - goto CLEANUP; - - xvsec_mcapv2_read_status_reg( - mcap_ctx, &sts); - ret = xvsec_mcapv2_check_mcap_rw_status( - mcap_ctx, sts, - &file_info->v2.op_status); - if (ret != 0) - goto CLEANUP; - } - } - } - - offset = offset + rd_len; - rem_len = rem_len - rd_len; - } - - /** common for all modes: - ** to check all the conditions and report to user if error **/ - - /** Wait for write transactions in FIFO are complete */ - ret = xvsec_mcapv2_wait_for_write_FIFO_empty(mcap_ctx); - if (ret != 0) - goto CLEANUP; - - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - ret = xvsec_mcapv2_check_mcap_rw_status(mcap_ctx, sts, - &file_info->v2.op_status); - if (ret != 0) - goto CLEANUP; - - /* If the MCAP FIFO Overflow bit is set report the error to the user. */ - if (XVSEC_MCAPV2_IS_FIFO_OVERFLOW(sts) == true) { - file_info->v2.op_status = FILE_OP_HW_BUSY; - pr_err("%s: Write FIFO overflow error occured.\n", __func__); - ret = -(EIO); - goto CLEANUP; - } - - /** Finally, Update op_status to SUCCESS */ - file_info->v2.op_status = FILE_OP_SUCCESS; - -CLEANUP: - if (ret != 0) { - file_info->v2.err_index = (file_size - rem_len) + index; - pr_err("%s: file_size: %lld, rem_len: %lld, rd_len: %d, index: %d, sts: 0x%X\n", - __func__, file_size, rem_len, rd_len, index, sts); - - xvsec_mcapv2_module_reset(mcap_ctx); - pr_debug("%s: MCAP Reset is issued.\n", __func__); - } - - /** Restore SBI control reg to previous state */ - if (sbi_address != 0xFFFFFFFF) { - sbi_ctrl.v2.data[0] = sbi_ctrl_data_restore; - xvsec_mcapv2_axi_wr_addr(mcap_ctx, &sbi_ctrl); - } - -CLEANUP_EXIT: - xvsec_util_fclose(filep); - - return ret; -} - -int xvsec_mcapv2_file_upload( - struct vsec_context *mcap_ctx, union file_download_upload *file_info) -{ - int ret = 0; - char *fname; - struct file *filep; - uint32_t dev_address; - loff_t offset; - loff_t frag_size = 0; - loff_t rem_len = 0; - int index = 0; - int written_len; - uint32_t data_buf[MAX_FRAG_SZ / 4]; - uint32_t wait_cnt; - bool is_rw_done; - uint8_t rw_status; - uint8_t *ptr; - loff_t file_size = 0; - uint32_t sts = 0; - char pdifile[MAX_FILE_LEN]; - int len = 0; - - pr_debug("In %s\n", __func__); - - file_info->v2.op_status = FILE_OP_FAILED; - - if ((file_info->v2.addr_type > INCREMENT_ADDRESS) || - (file_info->v2.file_name == NULL) || - (file_info->v2.length == 0)) { - pr_err("%s: Invalid Params : type : %d, name : %p", __func__, - file_info->v2.addr_type, file_info->v2.file_name); - return -(EINVAL); - } - - if (file_info->v2.file_name != NULL) { - len = strnlen_user( - (char __user *)file_info->v2.file_name, - MAX_FILE_LEN); - if (len > MAX_FILE_LEN) { - pr_err("File Name too long\n"); - file_info->v2.op_status = FILE_PATH_TOO_LONG; - return -(ENAMETOOLONG); - } - - ret = strncpy_from_user(pdifile, - (char __user *)file_info->v2.file_name, len); - if (ret < 0) { - pr_err("File Name Copy Failed\n"); - return -(EINVAL); - } - pr_info("pdi File Name : %s\n", pdifile); - } - - fname = pdifile; - dev_address = file_info->v2.address; - - /** Check for any previous read/operation completed */ - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - is_rw_done = XVSEC_MCAPV2_IS_RW_COMPLETE(sts); - if (is_rw_done == true) { - /* Reset MCAP module to clear rw_complete bit */ - xvsec_mcapv2_module_reset(mcap_ctx); - pr_debug("%s: MCAP Reset is issued.\n", __func__); - } - - filep = xvsec_util_fopen(fname, O_WRONLY|O_CREAT, 0); - if (filep == NULL) - return -(ENOENT); - - xvsec_mcapv2_set_mode(mcap_ctx, MCAP_AXI_MODE_32B); - if (file_info->v2.addr_type == FIXED_ADDRESS) - xvsec_mcapv2_set_address(mcap_ctx, dev_address); - - offset = 0; - rem_len = file_info->v2.length; - file_info->v2.err_index = 0; - - while (rem_len != 0) { - index = 0; - frag_size = (rem_len >= MAX_FRAG_SZ) ? MAX_FRAG_SZ : rem_len; - while (index < frag_size) { - if (file_info->v2.addr_type == INCREMENT_ADDRESS) { - xvsec_mcapv2_set_address(mcap_ctx, dev_address); - dev_address = dev_address + 4; - } - /** Enable read mode */ - xvsec_mcapv2_rd_enable(mcap_ctx); - - /** Wait for write transactions in FIFO are complete */ - wait_cnt = 0; - /** Wait until the Write FIFO is empty */ - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - while (((is_rw_done = - XVSEC_MCAPV2_IS_RW_COMPLETE(sts)) != true) - && (wait_cnt++ < MAX_OP_POLL_CNT)) { - /* Sleep for a while */ - udelay(1); - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - } - if (is_rw_done != true) { - pr_err("%s: Err file upload: RW Cmplt : %d\n", - __func__, is_rw_done); - file_info->v2.op_status = FILE_OP_HW_BUSY; - ret = -(EIO); - goto CLEANUP; - } - - XVSEC_MCAPV2_GET_RW_STATUS(sts, rw_status); - if (rw_status != XVSEC_MCAPV2_RW_OK) { - file_info->v2.op_status = - (enum file_operation_status)rw_status; - pr_err("%s: Err file upload: RW Status : %d\n", - __func__, rw_status); - ret = -(EIO); - goto CLEANUP; - } - xvsec_mcapv2_read_data_reg(mcap_ctx, - &data_buf[index / 4]); - index = index + 4; - - /** Check for any previous read/operation completed */ - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - xvsec_mcapv2_rd_disable(mcap_ctx); - - is_rw_done = XVSEC_MCAPV2_IS_RW_COMPLETE(sts); - if (is_rw_done == true) { - /* Reset MCAP module to clear rw_complete bit */ - xvsec_mcapv2_module_reset(mcap_ctx); - pr_debug("%s: MCAP Reset is issued.\n", - __func__); - } - - } - - written_len = 0; - ptr = (uint8_t *)data_buf; - while (written_len < frag_size) { - written_len += xvsec_util_fwrite(filep, offset, - &ptr[written_len], (frag_size - written_len)); - } - - offset = offset + frag_size; - rem_len = rem_len - frag_size; - } - - /* Make sure the file contents written to disk */ - xvsec_util_fsync(filep); - - /** Compare the requested size with file size */ - ret = xvsec_util_get_file_size(fname, &file_size); - if (ret < 0) - goto CLEANUP; - - if (file_size != file_info->v2.length) { - pr_err("%s: Could not read complete requested length\n", - __func__); - /** Replace the requested length with read length */ - file_info->v2.length = file_size; - } - - file_info->v2.op_status = FILE_OP_SUCCESS; -CLEANUP: - - if (ret != 0) { - file_info->v2.err_index = (file_size - rem_len) + index; - pr_err("%s: file_size: %lld, rem_len: %lld, frag_size: %lld, index: %d, sts: 0x%X\n", - __func__, file_size, rem_len, frag_size, index, sts); - - xvsec_mcapv2_module_reset(mcap_ctx); - pr_debug("%s: MCAP Reset is issued.\n", __func__); - } - /*disable the read*/ - xvsec_mcapv2_rd_disable(mcap_ctx); - xvsec_util_fclose(filep); - - return ret; -} - -int xvsec_mcapv2_set_axi_cache_attr( - struct vsec_context *mcap_ctx, union axi_cache_attr *attr) -{ - int ret = 0; - uint8_t axi_cache; - uint8_t axi_prot; - - axi_cache = attr->v2.axi_cache; - axi_prot = attr->v2.axi_prot; - - pr_debug("%s: axi_cache:%d, axi_prot:%d\n", - __func__, (int)axi_cache, (int)axi_prot); - ret = xvsec_mcapv2_set_axi_cache_prot(mcap_ctx, axi_cache, axi_prot); - - return ret; -} - -static int xvsec_mcapv2_wait_for_write_FIFO_empty(struct vsec_context *mcap_ctx) -{ - int ret = 0; - bool is_fifo_empty; - uint32_t wait_cnt; - uint32_t sts = 0; - - wait_cnt = 0; - /** Wait until the Write FIFO is empty */ - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - while (((is_fifo_empty = XVSEC_MCAPV2_IS_FIFO_EMPTY(sts)) != true) - && (wait_cnt++ < MAX_OP_POLL_CNT)) { - /* Sleep for a while */ - udelay(1); - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - } - if (is_fifo_empty != true) { - pr_err("%s: Timeout on FIFO Empty\n", __func__); - ret = -(ETIME); - } - - return ret; -} - -static int xvsec_mcapv2_wait_for_rw_complete(struct vsec_context *mcap_ctx) -{ - int ret = 0; - bool is_rw_done; - uint32_t wait_cnt; - uint32_t sts = 0; - - /** Wait until the rw_complete bit sets */ - wait_cnt = 0; - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - while (((is_rw_done = XVSEC_MCAPV2_IS_RW_COMPLETE(sts)) != true) - && (wait_cnt++ < MAX_OP_POLL_CNT)) { - /* Sleep for a while */ - udelay(1); - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - } - if (is_rw_done != true) { - pr_err("%s: Timeout on rw_complete\n", __func__); - ret = -(ETIME); - } - - /*reset the module to clear the rw_complete bit*/ - xvsec_mcapv2_module_reset(mcap_ctx); - pr_debug("%s: MCAP Reset is issued.\n", __func__); - - return ret; -} - -static int xvsec_mcapv2_read_fifo_capacity(struct vsec_context *mcap_ctx, - uint8_t *fifo_capacity) -{ - int ret = 0; - uint32_t wait_cnt; - uint8_t fifo_occupancy; - uint32_t sts = 0; - - wait_cnt = 0; - /** Wait if the Write FIFO occupancy reached to MAX */ - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - XVSEC_MCAPV2_GET_FIFO_OCCUPANCY(sts, fifo_occupancy); - while ((fifo_occupancy >= MAX_FIFO_OCCUPANCY)) { - - if (wait_cnt++ >= MAX_OP_POLL_CNT) { - pr_err("%s: Timeout on FIFO occupancy.\n", - __func__); - ret = -(ETIME); - break; - } - /* Sleep for a while */ - udelay(1); - - xvsec_mcapv2_read_status_reg(mcap_ctx, &sts); - XVSEC_MCAPV2_GET_FIFO_OCCUPANCY(sts, fifo_occupancy); - } - - *fifo_capacity = (MAX_FIFO_OCCUPANCY - fifo_occupancy); - - return ret; -} - - - -static int xvsec_mcapv2_check_mcap_rw_status(struct vsec_context *mcap_ctx, - uint32_t sts, enum file_operation_status *op_status) -{ - int ret = 0; - uint8_t rw_status; - - XVSEC_MCAPV2_GET_RW_STATUS(sts, rw_status); - if (rw_status != XVSEC_MCAPV2_RW_OK) { - *op_status = - (enum file_operation_status)rw_status; - pr_err("%s: Err :file download : RW Status : %d\n", - __func__, rw_status); - ret = -(EIO); - } - - return ret; -} - -static int xvsec_mcapv2_wr_enable(struct vsec_context *mcap_ctx) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t ctrl_reg; - uint32_t ctrl_data = 0; - - ctrl_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_CONTROL_REG; - pci_read_config_dword(pdev, ctrl_reg, &ctrl_data); - /* MCAP Read Enable = 0 */ - ctrl_data = ctrl_data & ~(XVSEC_MCAPV2_CTRL_READ_ENABLE); - /* MCAP Write Enable = 1 */ - ctrl_data = ctrl_data | XVSEC_MCAPV2_CTRL_WRITE_ENABLE; - - pr_debug("In %s: ctrl_reg:0x%X, ctrl_data:0x%X\n", - __func__, ctrl_reg, ctrl_data); - ret = pci_write_config_dword(pdev, ctrl_reg, ctrl_data); - - return ret; -} - -__attribute__((unused)) -static int xvsec_mcapv2_wr_disable(struct vsec_context *mcap_ctx) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t ctrl_reg; - uint32_t ctrl_data = 0; - - ctrl_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_CONTROL_REG; - pci_read_config_dword(pdev, ctrl_reg, &ctrl_data); - /* MCAP Write Enable = 0 */ - ctrl_data = ctrl_data & ~XVSEC_MCAPV2_CTRL_WRITE_ENABLE; - - pr_debug("In %s: ctrl_reg:0x%X, ctrl_data:0x%X\n", - __func__, ctrl_reg, ctrl_data); - ret = pci_write_config_dword(pdev, ctrl_reg, ctrl_data); - - return ret; -} - -static int xvsec_mcapv2_rd_enable(struct vsec_context *mcap_ctx) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t ctrl_reg; - uint32_t ctrl_data = 0; - - ctrl_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_CONTROL_REG; - pci_read_config_dword(pdev, ctrl_reg, &ctrl_data); - /* MCAP Read Enable = 1 */ - ctrl_data = ctrl_data | XVSEC_MCAPV2_CTRL_READ_ENABLE; - /* MCAP Write Enable = 0 */ - ctrl_data = ctrl_data & ~(XVSEC_MCAPV2_CTRL_WRITE_ENABLE); - - pr_debug("In %s: ctrl_reg:0x%X, ctrl_data:0x%X\n", - __func__, ctrl_reg, ctrl_data); - ret = pci_write_config_dword(pdev, ctrl_reg, ctrl_data); - - return ret; -} - -static int xvsec_mcapv2_rd_disable(struct vsec_context *mcap_ctx) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t ctrl_reg; - uint32_t ctrl_data = 0; - - ctrl_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_CONTROL_REG; - pci_read_config_dword(pdev, ctrl_reg, &ctrl_data); - /* MCAP Read Enable = 0 */ - ctrl_data = ctrl_data & ~XVSEC_MCAPV2_CTRL_READ_ENABLE; - - pr_debug("In %s: ctrl_reg:0x%X, ctrl_data:0x%X\n", - __func__, ctrl_reg, ctrl_data); - ret = pci_write_config_dword(pdev, ctrl_reg, ctrl_data); - - return ret; -} - - -static int xvsec_mcapv2_set_mode( - struct vsec_context *mcap_ctx, enum axi_access_mode mode) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t ctrl_reg; - uint32_t ctrl_data = 0; - - ctrl_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_CONTROL_REG; - pci_read_config_dword(pdev, ctrl_reg, &ctrl_data); - - if (mode == MCAP_AXI_MODE_32B) { - /* 0 for 32-bit transactions */ - ctrl_data = ctrl_data & ~XVSEC_MCAPV2_CTRL_128B_MODE; - } else if (mode == MCAP_AXI_MODE_128B) { - /* 1 for 128-bit transactions */ - ctrl_data = ctrl_data | XVSEC_MCAPV2_CTRL_128B_MODE; - } - - pr_debug("In %s: ctrl_reg:0x%X, ctrl_data:0x%X\n", - __func__, ctrl_reg, ctrl_data); - ret = pci_write_config_dword(pdev, ctrl_reg, ctrl_data); - - return ret; -} - -static int xvsec_mcapv2_set_address( - struct vsec_context *mcap_ctx, uint32_t address) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t rw_addr_reg; - - rw_addr_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_RW_ADDRESS; - - pr_debug("In %s: addr_reg:0x%X, addr:0x%X\n", - __func__, rw_addr_reg, address); - - ret = pci_write_config_dword(pdev, rw_addr_reg, address); - - return ret; -} - -static int xvsec_mcapv2_set_axi_cache_prot(struct vsec_context *mcap_ctx, - uint8_t axi_cache, uint8_t axi_prot) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t ctrl_reg; - uint32_t ctrl_data; - - ctrl_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_CONTROL_REG; - pci_read_config_dword(pdev, ctrl_reg, &ctrl_data); - - ctrl_data &= ~XVSEC_MCAPV2_CTRL_AXI_CACHE; - ctrl_data &= ~XVSEC_MCAPV2_CTRL_AXI_PROTECT; - - /*configure AXI Cache*/ - - ctrl_data = - ctrl_data | ((axi_cache & XVSEC_MCAPV2_CTRL_AXI_CACHE_MASK) << - XVSEC_MCAPV2_CTRL_AXI_CACHE_SHIFT); - - /*configure AXI Protect*/ - ctrl_data = - ctrl_data | ((axi_prot & XVSEC_MCAPV2_CTRL_AXI_PROTECT_MASK) << - XVSEC_MCAPV2_CTRL_AXI_PROTECT_SHIFT); - - pr_debug("In %s: ctrl_reg:0x%X, ctrl_data_cp:0x%X\n", - __func__, ctrl_reg, ctrl_data); - ret = pci_write_config_dword(pdev, ctrl_reg, ctrl_data); - - return ret; -} - -static int xvsec_mcapv2_write_data_reg( - struct vsec_context *mcap_ctx, uint32_t data) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t wr_data_reg; - - wr_data_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_WRITE_DATA_REG; - - pr_debug("In %s, wr_data_reg: 0x%X, data:0x%X\n", - __func__, wr_data_reg, data); - - ret = pci_write_config_dword(pdev, wr_data_reg, data); - - return ret; -} - -static int xvsec_mcapv2_read_data_reg( - struct vsec_context *mcap_ctx, uint32_t *data) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t rd_data_reg; - - rd_data_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_READ_DATA_REG; - ret = pci_read_config_dword(pdev, rd_data_reg, data); - - pr_debug("In %s, rd_data_reg: 0x%X, data:0x%X\n", - __func__, rd_data_reg, *data); - - return ret; -} - -static int xvsec_mcapv2_read_status_reg( - struct vsec_context *mcap_ctx, uint32_t *sts) -{ - int ret = 0; - struct pci_dev *pdev = mcap_ctx->pdev; - uint32_t sts_reg; - - sts_reg = mcap_ctx->vsec_offset + XVSEC_MCAPV2_STATUS_REG; - ret = pci_read_config_dword(pdev, sts_reg, sts); - - pr_debug("In %s, sts_reg: 0x%X, data:0x%X\n", __func__, sts_reg, *sts); - - return ret; -} - -/*unsupported for versal devices */ -int xvsec_mcapv2_reset(struct vsec_context *mcap_ctx) -{ - pr_err("reset is not supported for versal\n"); - return -(EPERM); -} - -int xvsec_mcapv2_full_reset(struct vsec_context *mcap_ctx) -{ - pr_err("Full reset is not supported for versal\n"); - return -(EPERM); -} - -int xvsec_mcapv2_get_data_regs(struct vsec_context *mcap_ctx, uint32_t regs[4]) -{ - pr_err("get_data_regs is not supported for versal\n"); - return -(EPERM); -} - -int xvsec_mcapv2_get_fpga_regs( - struct vsec_context *mcap_ctx, union fpga_cfg_regs *regs) -{ - pr_err("fpga read is not supported for versal\n"); - return -(EPERM); -} - -int xvsec_mcapv2_program_bitstream( - struct vsec_context *mcap_ctx, union bitstream_file *bit_files) -{ - pr_err("unsupported ioctl call for versal\n"); - return -(EPERM); -} - -int xvsec_fpgav2_rd_cfg_addr( - struct vsec_context *mcap_ctx, union fpga_cfg_reg *cfg_reg) -{ - pr_err("fpga read is not supported for versal\n"); - return -(EPERM); -} - -int xvsec_fpgav2_wr_cfg_addr( - struct vsec_context *mcap_ctx, union fpga_cfg_reg *cfg_reg) -{ - pr_err("fpga write is not supported for versal\n"); - return -(EPERM); -} - -MODULE_LICENSE("Dual BSD/GPL"); diff --git a/XVSEC/linux-kernel/drv/xvsec_mcap/versal/xvsec_mcap_versal.h b/XVSEC/linux-kernel/drv/xvsec_mcap/versal/xvsec_mcap_versal.h deleted file mode 100644 index 541371a..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_mcap/versal/xvsec_mcap_versal.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XVSEC_MCAP_VERSAL_H__ -#define __XVSEC_MCAP_VERSAL_H__ - -/** - * @file xvsec_mcap_versal.h - * - * Xilinx XVSEC Driver header file for versal MCAP register definations. - * - * Header file *xvsec_mcap_versal.h* declares mcap register macros and - * functions to use internal to driver to configure MCAP and AXI - * - */ - -#define MCAPV2_PDI_FILE ".pdi" -#define MAX_FILE_LEN 300 - -#define MAX_FRAG_SZ 512 /** in bytes */ -/** - * Versal S80 ES2 HW Limitation: - * Increased Polling timout as a workaround due to HW limitation for SBI. - * SBI is back pressuring at certain data locations in PDI - * due to PLM decoding/processing involved. Due to this it's getting - * timeout for rw_complete status for some of the data locations - * - */ -#define MAX_OP_POLL_CNT 100000 -#define MAX_FIFO_OCCUPANCY 16 - -#define MIN_LEN_32B 4 -#define MIN_LEN_128B 16 -#define truncate_len_32b_mode(val) \ - do { \ - if (val % 4) \ - val = (val / 4) * 4 ;\ - } while (0) -#define truncate_len_128b_mode(val) \ - do { \ - if (val % 16) \ - val = (val / 16) * 16; \ - } while (0) - -/* Versal SBI Control Register | Physical Addr: 0xF1220004 */ -/* Versal alias 0x1_0xxx_xxxx -> 0xFxxx_xxxx (128 MB) - * MCAP can only address 32b, must use NMU remaps in HW to reach 48b address */ -#define SLAVE_BOOT_CTRL_OFFSET (0x4) -#define SBI_CTRL_IF_MASK (0x7 << 2) -#define SBI_CTRL_IF_AXI (0x2 << 2) -#define SBI_CTRL_ENABLE (0x1 << 0) - -/* MCAP Versal Register Offsets */ -#define XVSEC_MCAPV2_EXTENDED_HEADER (0x0000) -#define XVSEC_MCAPV2_VENDOR_HEADER (0x0004) -#define XVSEC_MCAPV2_STATUS_REG (0x0008) -#define XVSEC_MCAPV2_CONTROL_REG (0x000c) -#define XVSEC_MCAPV2_RW_ADDRESS (0x0010) -#define XVSEC_MCAPV2_WRITE_DATA_REG (0x0014) -#define XVSEC_MCAPV2_READ_DATA_REG (0x0018) - -/* CTRL REG FIELDS */ -#define XVSEC_MCAPV2_CTRL_READ_ENABLE (1 << 0) -#define XVSEC_MCAPV2_CTRL_WRITE_ENABLE (1 << 4) -#define XVSEC_MCAPV2_CTRL_128B_MODE (1 << 5) -#define XVSEC_MCAPV2_CTRL_RESET (1 << 8) -#define XVSEC_MCAPV2_CTRL_AXI_CACHE (0xF << 16) /* AXI Cache 19:16 */ -#define XVSEC_MCAPV2_CTRL_AXI_PROTECT (0x7 << 20) /* AXI Protect 22:20 */ - -#define XVSEC_MCAPV2_CTRL_AXI_CACHE_MASK 0xF /* AXI Cache MASK */ -#define XVSEC_MCAPV2_CTRL_AXI_CACHE_SHIFT 16 /* AXI Cache SHIFT */ - -#define XVSEC_MCAPV2_CTRL_AXI_PROTECT_MASK 0x7 /* AXI PROTECT MASK */ -#define XVSEC_MCAPV2_CTRL_AXI_PROTECT_SHIFT 20 /* AXI PROTECT SHIFT */ - -/** STATUS REG FIELDS */ - -/** Read/Write Status 5:4 */ -#define XVSEC_MCAPV2_STATUS_RW_STS (0x3 << 4) -#define XVSEC_MCAPV2_STATUS_RW_COMPLETE (0x1 << 8) -/* FIFO Occupancy 20:16 */ -#define XVSEC_MCAPV2_STATUS_FIFO_OCCUPANCY (0x1F << 16) -#define XVSEC_MCAPV2_STATUS_WRITE_FIFO_FULL (0x1 << 21) -#define XVSEC_MCAPV2_STATUS_WRITE_FIFO_ALMOST_FULL (0x1 << 22) -#define XVSEC_MCAPV2_STATUS_WRITE_FIFO_ALMOST_EMPTY (0x1 << 23) -#define XVSEC_MCAPV2_STATUS_WRITE_FIFO_EMPTY (0x1 << 24) -#define XVSEC_MCAPV2_STATUS_WRITE_FIFO_OVERFLOW (0x1 << 25) - -#define XVSEC_MCAPV2_STATUS_FIFO_OCCUPANCY_MASK (0x1F) -#define XVSEC_MCAPV2_STATUS_FIFO_OCCUPANCY_SHIFT (16) - -#define XVSEC_MCAPV2_STATUS_RW_STS_MASK (0x3) -#define XVSEC_MCAPV2_STATUS_RW_STS_SHIFT (4) - -#define XVSEC_MCAPV2_IS_RW_COMPLETE(sts) \ - ((sts & XVSEC_MCAPV2_STATUS_RW_COMPLETE) ? true : false) -#define XVSEC_MCAPV2_IS_FIFO_FULL(sts) \ - ((sts & XVSEC_MCAPV2_STATUS_WRITE_FIFO_FULL) ? true : false) -#define XVSEC_MCAPV2_IS_FIFO_EMPTY(sts) \ - ((sts & XVSEC_MCAPV2_STATUS_WRITE_FIFO_EMPTY) ? true : false) -#define XVSEC_MCAPV2_IS_FIFO_OVERFLOW(sts) \ - ((sts & XVSEC_MCAPV2_STATUS_WRITE_FIFO_OVERFLOW) ? true : false) - -#define XVSEC_MCAPV2_GET_FIFO_OCCUPANCY(sts, occupancy) { \ - occupancy = (uint8_t)(sts >> \ - XVSEC_MCAPV2_STATUS_FIFO_OCCUPANCY_SHIFT) & \ - XVSEC_MCAPV2_STATUS_FIFO_OCCUPANCY_MASK; \ - } - -#define XVSEC_MCAPV2_GET_RW_STATUS(sts, rw_status) { \ - rw_status = (uint8_t)(sts >> \ - XVSEC_MCAPV2_STATUS_RW_STS_SHIFT) & \ - XVSEC_MCAPV2_STATUS_RW_STS_MASK; \ - } - -enum xvsec_mcapv2_rw_status { - XVSEC_MCAPV2_RW_OK = 0, - XVSEC_MCAPV2_SLVERR, - XVSEC_MCAPV2_DECERR -}; - -int xvsec_mcapv2_module_reset(struct vsec_context *mcap_ctx); -int xvsec_mcapv2_get_regs( - struct vsec_context *mcap_ctx, union mcap_regs *regs); -int xvsec_mcapv2_rd_cfg_addr( - struct vsec_context *mcap_ctx, union cfg_data *data); -int xvsec_mcapv2_wr_cfg_addr( - struct vsec_context *mcap_ctx, union cfg_data *data); -int xvsec_mcapv2_axi_rd_addr( - struct vsec_context *mcap_ctx, union axi_reg_data *cfg_reg); -int xvsec_mcapv2_axi_wr_addr( - struct vsec_context *mcap_ctx, union axi_reg_data *cfg_reg); -int xvsec_mcapv2_file_download( - struct vsec_context *mcap_ctx, union file_download_upload *file_info); -int xvsec_mcapv2_file_upload( - struct vsec_context *mcap_ctx, union file_download_upload *file_info); -int xvsec_mcapv2_set_axi_cache_attr( - struct vsec_context *mcap_ctx, union axi_cache_attr *attr); - - -/*unsupported for versal devices */ -int xvsec_mcapv2_reset(struct vsec_context *mcap_ctx); -int xvsec_mcapv2_full_reset(struct vsec_context *mcap_ctx); -int xvsec_mcapv2_get_data_regs(struct vsec_context *mcap_ctx, uint32_t regs[4]); -int xvsec_mcapv2_get_fpga_regs( - struct vsec_context *mcap_ctx, union fpga_cfg_regs *regs); -int xvsec_mcapv2_program_bitstream( - struct vsec_context *mcap_ctx, union bitstream_file *bit_files); -int xvsec_fpgav2_rd_cfg_addr( - struct vsec_context *mcap_ctx, union fpga_cfg_reg *cfg_reg); -int xvsec_fpgav2_wr_cfg_addr( - struct vsec_context *mcap_ctx, union fpga_cfg_reg *cfg_reg); - -#endif /* __XVSEC_MCAP_VERSAL_H__ */ diff --git a/XVSEC/linux-kernel/drv/xvsec_mcap/xvsec_mcap.c b/XVSEC/linux-kernel/drv/xvsec_mcap/xvsec_mcap.c deleted file mode 100644 index 0d898e8..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_mcap/xvsec_mcap.c +++ /dev/null @@ -1,873 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include <linux/ioctl.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/aer.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/version.h> -#include <linux/pci.h> -#include <linux/vmalloc.h> -#include <linux/cdev.h> -#include <linux/fcntl.h> -#include <linux/sched.h> -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/delay.h> -#include <linux/fs.h> -#include <linux/uaccess.h> - -#include "xvsec_drv.h" -#include "xvsec_drv_int.h" -#include "xvsec_cdev.h" -#include "xvsec_mcap.h" -#include "xvsec_mcap_us.h" -#include "xvsec_mcap_versal.h" - -/** - * XVSEC-MCAP character device name - */ -#define XVSEC_MCAP_CDEV_NAME "mcap" - -enum mcap_revison { - XVSEC_MCAP_US_REV = 0, - XVSEC_MCAP_USPLUS_REV = 1, - XVSEC_MCAP_VERSAL = 2, - XVSEC_MCAP_MAX_REV -}; - -struct file_priv_mcap { - void *ctx; -}; - -struct mcap_ioctl_ops { - uint32_t cmd; - long (*fpfunction)(struct file *filep, - uint32_t cmd, unsigned long arg); -}; - -struct mcap_fops { - int (*reset)(struct vsec_context *mcap_ctx); - int (*module_reset)(struct vsec_context *mcap_ctx); - int (*full_reset)(struct vsec_context *mcap_ctx); - int (*get_revision)(struct vsec_context *mcap_ctx, - uint16_t *vsec_id, uint16_t *rev_id); - int (*get_data_regs)(struct vsec_context *mcap_ctx, - uint32_t regs[4]); - int (*get_regs)(struct vsec_context *mcap_ctx, - union mcap_regs *regs); - int (*get_fpga_regs)(struct vsec_context *mcap_ctx, - union fpga_cfg_regs *regs); - int (*program_bitstream)(struct vsec_context *mcap_ctx, - union bitstream_file *bit_files); - int (*rd_cfg_addr)(struct vsec_context *mcap_ctx, - union cfg_data *data); - int (*wr_cfg_addr)(struct vsec_context *mcap_ctx, - union cfg_data *data); - int (*fpga_rd_cfg_addr)(struct vsec_context *mcap_ctx, - union fpga_cfg_reg *cfg_reg); - int (*fpga_wr_cfg_addr)(struct vsec_context *mcap_ctx, - union fpga_cfg_reg *cfg_reg); - int (*axi_rd_addr)(struct vsec_context *mcap_ctx, - union axi_reg_data *cfg_reg); - int (*axi_wr_addr)(struct vsec_context *mcap_ctx, - union axi_reg_data *cfg_reg); - int (*file_download)(struct vsec_context *mcap_ctx, - union file_download_upload *file); - int (*file_upload)(struct vsec_context *mcap_ctx, - union file_download_upload *file); - int (*set_axi_cache_attr)(struct vsec_context *mcap_ctx, - union axi_cache_attr *attr); -}; - -struct mcap_priv_ctx { - struct mcap_fops fops; - uint16_t vsec_id; - uint16_t rev_id; -}; - -static int xvsec_mcap_open(struct inode *inode, - struct file *filep); -static int xvsec_mcap_close(struct inode *inode, - struct file *filep); -static long xvsec_mcap_ioctl(struct file *filep, - uint32_t cmd, unsigned long arg); - -static long xvsec_ioc_mcap_reset(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_mcap_module_reset(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_mcap_full_reset(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_get_mcap_revision(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_get_data_regs(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_get_regs(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_get_fpga_regs(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_prog_bitstream(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_rd_dev_cfg_reg(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_wr_dev_cfg_reg(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_rd_fpga_cfg_reg(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_wr_fpga_cfg_reg(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_read_axi_reg(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_write_axi_reg(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_file_download(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_file_upload(struct file *filep, - uint32_t cmd, unsigned long arg); -static long xvsec_ioc_set_axi_attr(struct file *filep, - uint32_t cmd, unsigned long arg); - -static int xvsec_mcap_get_revision(struct vsec_context *mcap_ctx, - uint16_t *vsec_id, uint16_t *rev_id); - -static int xvsec_mcap_open(struct inode *inode, struct file *filep) -{ - int ret = 0; - struct vsec_context *mcap_ctx; - struct file_priv_mcap *priv; - - mcap_ctx = container_of(inode->i_cdev, - struct vsec_context, char_dev.cdev); - - pr_info("%s: mcap_ctx address : %p\n", __func__, mcap_ctx); - - spin_lock(&mcap_ctx->lock); - - if (mcap_ctx->fopen_cnt != 0) { - ret = -(EBUSY); - goto CLEANUP; - } - - priv = kzalloc(sizeof(struct file_priv_mcap), GFP_KERNEL); - if (priv == NULL) { - ret = -(ENOMEM); - goto CLEANUP; - } - - mcap_ctx->fopen_cnt++; - priv->ctx = (void *)mcap_ctx; - filep->private_data = priv; - - pr_debug("%s success\n", __func__); - -CLEANUP: - spin_unlock(&mcap_ctx->lock); - return ret; -} - -static int xvsec_mcap_close(struct inode *inode, struct file *filep) -{ - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - - spin_lock(&mcap_ctx->lock); - - if (mcap_ctx->fopen_cnt == 0) { - pr_warn("File Open/close mismatch\n"); - } else { - mcap_ctx->fopen_cnt--; - pr_debug("%s success\n", __func__); - } - kfree(priv); - - spin_unlock(&mcap_ctx->lock); - - return 0; -} - -static const struct mcap_ioctl_ops mcap_ioctl_ops[] = { - {IOC_MCAP_RESET, xvsec_ioc_mcap_reset}, - {IOC_MCAP_MODULE_RESET, xvsec_ioc_mcap_module_reset}, - {IOC_MCAP_FULL_RESET, xvsec_ioc_mcap_full_reset}, - {IOC_MCAP_GET_REVISION, xvsec_ioc_get_mcap_revision}, - {IOC_MCAP_GET_DATA_REGISTERS, xvsec_ioc_get_data_regs}, - {IOC_MCAP_GET_REGISTERS, xvsec_ioc_get_regs}, - {IOC_MCAP_GET_FPGA_REGISTERS, xvsec_ioc_get_fpga_regs}, - {IOC_MCAP_PROGRAM_BITSTREAM, xvsec_ioc_prog_bitstream}, - {IOC_MCAP_READ_DEV_CFG_REG, xvsec_ioc_rd_dev_cfg_reg}, - {IOC_MCAP_WRITE_DEV_CFG_REG, xvsec_ioc_wr_dev_cfg_reg}, - {IOC_MCAP_READ_FPGA_CFG_REG, xvsec_ioc_rd_fpga_cfg_reg}, - {IOC_MCAP_WRITE_FPGA_CFG_REG, xvsec_ioc_wr_fpga_cfg_reg}, - {IOC_MCAP_READ_AXI_REG, xvsec_ioc_read_axi_reg}, - {IOC_MCAP_WRITE_AXI_REG, xvsec_ioc_write_axi_reg}, - {IOC_MCAP_FILE_DOWNLOAD, xvsec_ioc_file_download}, - {IOC_MCAP_FILE_UPLOAD, xvsec_ioc_file_upload}, - {IOC_MCAP_SET_AXI_ATTR, xvsec_ioc_set_axi_attr}, -}; - -static long xvsec_ioc_mcap_reset(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - - pr_debug("ioctl : IOC_MCAP_RESET\n"); - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->reset(mcap_ctx); - spin_unlock(&mcap_ctx->lock); - - return ret; - -} - -static long xvsec_ioc_mcap_module_reset(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - - pr_debug("ioctl : IOC_MCAP_MODULE_RESET\n"); - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->module_reset(mcap_ctx); - spin_unlock(&mcap_ctx->lock); - - return ret; -} - -static long xvsec_ioc_mcap_full_reset(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - - pr_debug("ioctl : IOC_MCAP_FULL_RESET\n"); - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->full_reset(mcap_ctx); - spin_unlock(&mcap_ctx->lock); - - return ret; -} - -static long xvsec_ioc_get_mcap_revision(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - uint16_t vsec_id = 0; - uint16_t rev_id = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - - pr_debug("ioctl : IOC_MCAP_GET_REVISION\n"); - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->get_revision(mcap_ctx, &vsec_id, &rev_id); - spin_unlock(&mcap_ctx->lock); - - if (ret == 0) { - pr_debug("vsec_id: %d, rev_id: %d\n", vsec_id, rev_id); - ret = copy_to_user((void __user *)arg, - (void *)&rev_id, sizeof(uint16_t)); - } - - return ret; -} - -static long xvsec_ioc_get_data_regs(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - uint32_t read_data_reg[XVSEC_MCAP_DATA_REG_CNT]; - - pr_debug("ioctl : IOC_MCAP_GET_DATA_REGISTERS\n"); - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->get_data_regs(mcap_ctx, read_data_reg); - spin_unlock(&mcap_ctx->lock); - - memset(read_data_reg, 0, sizeof(read_data_reg)); - if (ret == 0) { - ret = copy_to_user((void __user *)arg, (void *)read_data_reg, - sizeof(uint32_t)*XVSEC_MCAP_DATA_REG_CNT); - } - - return ret; - -} - -static long xvsec_ioc_get_regs(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union mcap_regs mcap_regs; - - pr_debug("ioctl : IOC_MCAP_GET_REGISTERS\n"); - - memset(&mcap_regs, 0, sizeof(union mcap_regs)); - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->get_regs(mcap_ctx, &mcap_regs); - spin_unlock(&mcap_ctx->lock); - - if (ret == 0) { - ret = copy_to_user((void __user *)arg, - (void *)&mcap_regs, sizeof(union mcap_regs)); - } - - return ret; -} - -static long xvsec_ioc_get_fpga_regs(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union fpga_cfg_regs fpga_cfg_regs; - - pr_debug("ioctl : IOC_MCAP_GET_FPGA_REGISTERS\n"); - - memset(&fpga_cfg_regs, 0, sizeof(union fpga_cfg_regs)); - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->get_fpga_regs(mcap_ctx, &fpga_cfg_regs); - spin_unlock(&mcap_ctx->lock); - - if (ret == 0) { - ret = copy_to_user((void __user *)arg, - (void *)&fpga_cfg_regs, - sizeof(union fpga_cfg_regs)); - } - - return ret; -} - -static long xvsec_ioc_prog_bitstream(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union bitstream_file bit_files; - - pr_debug("ioctl : IOC_MCAP_PROGRAM_BITSTREAM\n"); - ret = copy_from_user(&bit_files, (void __user *)arg, - sizeof(union bitstream_file)); - - if (ret != 0) - goto CLEANUP; - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->program_bitstream(mcap_ctx, &bit_files); - spin_unlock(&mcap_ctx->lock); - - if (ret < 0) - goto CLEANUP; - - ret = copy_to_user((void __user *)arg, (void *)&bit_files, - sizeof(union bitstream_file)); - -CLEANUP: - return ret; -} - -static long xvsec_ioc_rd_dev_cfg_reg(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union cfg_data rw_cfg_data; - - pr_debug("ioctl : IOC_MCAP_READ_DEV_CFG_REG\n"); - - ret = copy_from_user(&rw_cfg_data, - (void __user *)arg, sizeof(union cfg_data)); - - if (ret != 0) - goto CLEANUP; - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->rd_cfg_addr(mcap_ctx, &rw_cfg_data); - spin_unlock(&mcap_ctx->lock); - - if (ret < 0) - goto CLEANUP; - - ret = copy_to_user((void __user *)arg, - (void *)&rw_cfg_data, sizeof(union cfg_data)); - -CLEANUP: - return ret; -} - -static long xvsec_ioc_wr_dev_cfg_reg(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union cfg_data rw_cfg_data; - - pr_debug("ioctl : IOC_MCAP_WRITE_DEV_CFG_REG\n"); - - ret = copy_from_user(&rw_cfg_data, - (void __user *)arg, sizeof(union cfg_data)); - - if (ret != 0) - goto CLEANUP; - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->wr_cfg_addr(mcap_ctx, &rw_cfg_data); - spin_unlock(&mcap_ctx->lock); - -CLEANUP: - return ret; - -} - -static long xvsec_ioc_rd_fpga_cfg_reg(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union fpga_cfg_reg fpga_cfg_data; - - pr_debug("ioctl : IOC_MCAP_READ_FPGA_CFG_REG\n"); - ret = copy_from_user(&fpga_cfg_data, - (void __user *)arg, sizeof(union fpga_cfg_reg)); - - if (ret != 0) - goto CLEANUP; - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->fpga_rd_cfg_addr(mcap_ctx, &fpga_cfg_data); - spin_unlock(&mcap_ctx->lock); - - if (ret != 0) - goto CLEANUP; - - ret = copy_to_user((void __user *)arg, - (void *)&fpga_cfg_data, sizeof(union fpga_cfg_reg)); -CLEANUP: - return ret; -} - -static long xvsec_ioc_wr_fpga_cfg_reg(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union fpga_cfg_reg fpga_cfg_data; - - pr_debug("ioctl : IOC_MCAP_WRITE_FPGA_CFG_REG\n"); - - ret = copy_from_user(&fpga_cfg_data, - (void __user *)arg, sizeof(union fpga_cfg_reg)); - - if (ret != 0) - goto CLEANUP; - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->fpga_wr_cfg_addr(mcap_ctx, &fpga_cfg_data); - spin_unlock(&mcap_ctx->lock); -CLEANUP: - return ret; -} - -static long xvsec_ioc_read_axi_reg(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union axi_reg_data axi_rd_info; - - pr_debug("ioctl : IOC_MCAP_READ_AXI_REG\n"); - - ret = copy_from_user(&axi_rd_info, - (void __user *)arg, sizeof(union axi_reg_data)); - if (ret != 0) - goto CLEANUP; - - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->axi_rd_addr(mcap_ctx, &axi_rd_info); - spin_unlock(&mcap_ctx->lock); - - if (ret == 0) { - ret = copy_to_user((void __user *)arg, - (void *)&axi_rd_info, sizeof(union axi_reg_data)); - } - -CLEANUP: - return ret; -} - -static long xvsec_ioc_write_axi_reg(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = ( - struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union axi_reg_data axi_wr_info; - - pr_debug("ioctl : IOC_MCAP_WRITE_AXI_REG\n"); - - ret = copy_from_user(&axi_wr_info, - (void __user *)arg, sizeof(union axi_reg_data)); - if (ret != 0) - goto CLEANUP; - - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->axi_wr_addr(mcap_ctx, &axi_wr_info); - spin_unlock(&mcap_ctx->lock); - -CLEANUP: - return ret; -} - -static long xvsec_ioc_file_download(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - int rv = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union file_download_upload file_args; - - pr_debug("ioctl : IOC_MCAP_FILE_DOWNLOAD\n"); - - ret = copy_from_user(&file_args, - (void __user *)arg, sizeof(union file_download_upload)); - if (ret != 0) - goto CLEANUP; - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->file_download(mcap_ctx, &file_args); - spin_unlock(&mcap_ctx->lock); - - rv = copy_to_user((void __user *)arg, (void *)&file_args, - sizeof(union file_download_upload)); - - if (rv != 0) - ret = rv; - -CLEANUP: - return ret; -} - -static long xvsec_ioc_file_upload(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - int rv = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union file_download_upload file_args; - - pr_debug("ioctl : IOC_MCAP_FILE_UPLOAD\n"); - - ret = copy_from_user(&file_args, - (void __user *)arg, sizeof(union file_download_upload)); - if (ret != 0) - goto CLEANUP; - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->file_upload(mcap_ctx, &file_args); - spin_unlock(&mcap_ctx->lock); - - rv = copy_to_user((void __user *)arg, (void *)&file_args, - sizeof(union file_download_upload)); - - if (rv != 0) - ret = rv; - -CLEANUP: - return ret; -} - -static long xvsec_ioc_set_axi_attr(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - struct file_priv_mcap *priv = filep->private_data; - struct vsec_context *mcap_ctx = (struct vsec_context *)priv->ctx; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - struct mcap_fops *mcap_fops = (struct mcap_fops *)&mcap_priv_ctx->fops; - union axi_cache_attr axi_attr_info; - - pr_debug("ioctl : IOC_MCAP_SET_AXI_ATTR\n"); - - ret = copy_from_user(&axi_attr_info, - (void __user *)arg, sizeof(union axi_cache_attr)); - if (ret != 0) - goto CLEANUP; - - spin_lock(&mcap_ctx->lock); - ret = mcap_fops->set_axi_cache_attr(mcap_ctx, &axi_attr_info); - spin_unlock(&mcap_ctx->lock); - - if (ret != 0) - goto CLEANUP; - -CLEANUP: - return ret; -} - -static long xvsec_mcap_ioctl(struct file *filep, - uint32_t cmd, unsigned long arg) -{ - int ret = 0; - int index, cmd_cnt; - bool cmd_found = false; - - cmd_cnt = ARRAY_SIZE(mcap_ioctl_ops); - for (index = 0; index < cmd_cnt; index++) { - if (mcap_ioctl_ops[index].cmd == cmd) { - cmd_found = true; - ret = mcap_ioctl_ops[index].fpfunction(filep, cmd, arg); - break; - } - } - if (cmd_found == false) - ret = -(EINVAL); - - return ret; -} - -static int xvsec_mcap_get_revision(struct vsec_context *mcap_ctx, - uint16_t *vsec_id, uint16_t *rev_id) -{ - int rv = 0; - uint16_t vendor_offset; - uint32_t vendor_data; - struct pci_dev *pdev = mcap_ctx->pdev; - static bool is_rev_avail; - struct mcap_priv_ctx *mcap_priv_ctx = - (struct mcap_priv_ctx *)mcap_ctx->vsec_priv; - - if (is_rev_avail == false) { - vendor_offset = - mcap_ctx->vsec_offset + XVSEC_MCAP_VENDOR_HEADER; - - rv = pci_read_config_dword(pdev, vendor_offset, &vendor_data); - - mcap_priv_ctx->vsec_id = - (vendor_data & XVSEC_MCAP_VSEC_ID_POS) >> - XVSEC_MCAP_VSEC_ID_SHIFT; - mcap_priv_ctx->rev_id = - (vendor_data & XVSEC_MCAP_REV_ID_POS) >> - XVSEC_MCAP_REV_ID_SHIFT; - - is_rev_avail = true; - pr_info("%s: Version details vsec_id:%d, rev_id: %d\n", - __func__, *vsec_id, *rev_id); - } else { - *vsec_id = mcap_priv_ctx->vsec_id; - *rev_id = mcap_priv_ctx->rev_id; - - pr_info("%s: vsec_id:%d, rev_id: %d\n", - __func__, *vsec_id, *rev_id); - } - - return rv; -} - -static const struct file_operations xvsec_mcap_fops = { - .owner = THIS_MODULE, - .open = xvsec_mcap_open, - .release = xvsec_mcap_close, - .unlocked_ioctl = xvsec_mcap_ioctl, -}; - -int xvsec_mcap_module_init(struct vsec_context *mcap_ctx) -{ - int rv; - struct mcap_priv_ctx *mcap_priv_ctx; - struct mcap_fops *mcap_fops; - - pr_info("%s: mcap_ctx address : %p\n", __func__, mcap_ctx); - - spin_lock_init(&mcap_ctx->lock); - mcap_priv_ctx = kzalloc(sizeof(struct mcap_priv_ctx), GFP_KERNEL); - if (mcap_priv_ctx == NULL) - return -(ENOMEM); - - /* Private context is getting used by - * xvsec_mcap_get_revision to save version info - */ - mcap_ctx->vsec_priv = (void *)mcap_priv_ctx; - rv = xvsec_mcap_get_revision(mcap_ctx, - &mcap_priv_ctx->vsec_id, &mcap_priv_ctx->rev_id); - if (rv < 0) { - pr_err("xvsec_mcap_get_version failed with error : %d\n", rv); - goto CLEANUP; - } - - if (mcap_priv_ctx->vsec_id != mcap_ctx->vsec_ops->vsec_id) { - pr_err("VSEC ID Mismatch : Context VSEC %d, Actual VSEC : %d\n", - mcap_ctx->vsec_ops->vsec_id, mcap_priv_ctx->vsec_id); - rv = -(EPERM); - goto CLEANUP; - } - - if (mcap_priv_ctx->rev_id >= XVSEC_MCAP_MAX_REV) { - pr_err("Valid MCAP Rev ID not found, rev_id : %d\n", - mcap_priv_ctx->rev_id); - rv = -(ENXIO); - goto CLEANUP; - } - - mcap_fops = &mcap_priv_ctx->fops; - if ((mcap_priv_ctx->rev_id == XVSEC_MCAP_US_REV) || - (mcap_priv_ctx->rev_id == XVSEC_MCAP_USPLUS_REV)) { - mcap_fops->reset = xvsec_mcap_reset; - mcap_fops->module_reset = xvsec_mcap_module_reset; - mcap_fops->full_reset = xvsec_mcap_full_reset; - mcap_fops->get_revision = xvsec_mcap_get_revision; - mcap_fops->get_data_regs = xvsec_mcap_get_data_regs; - mcap_fops->get_regs = xvsec_mcap_get_regs; - mcap_fops->get_fpga_regs = xvsec_mcap_get_fpga_regs; - mcap_fops->program_bitstream = xvsec_mcap_program_bitstream; - mcap_fops->rd_cfg_addr = xvsec_mcap_rd_cfg_addr; - mcap_fops->wr_cfg_addr = xvsec_mcap_wr_cfg_addr; - mcap_fops->fpga_rd_cfg_addr = xvsec_fpga_rd_cfg_addr; - mcap_fops->fpga_wr_cfg_addr = xvsec_fpga_wr_cfg_addr; - mcap_fops->axi_rd_addr = xvsec_mcapv1_axi_rd_addr; - mcap_fops->axi_wr_addr = xvsec_mcapv1_axi_wr_addr; - mcap_fops->file_download = xvsec_mcapv1_file_download; - mcap_fops->file_upload = xvsec_mcapv1_file_upload; - mcap_fops->set_axi_cache_attr = xvsec_mcapv1_set_axi_cache_attr; - - - } else if (mcap_priv_ctx->rev_id == XVSEC_MCAP_VERSAL) { - mcap_fops->reset = xvsec_mcapv2_reset; - mcap_fops->module_reset = xvsec_mcapv2_module_reset; - mcap_fops->full_reset = xvsec_mcapv2_full_reset; - mcap_fops->get_revision = xvsec_mcap_get_revision; - mcap_fops->get_data_regs = xvsec_mcapv2_get_data_regs; - mcap_fops->get_regs = xvsec_mcapv2_get_regs; - mcap_fops->get_fpga_regs = xvsec_mcapv2_get_fpga_regs; - mcap_fops->program_bitstream = xvsec_mcapv2_program_bitstream; - mcap_fops->rd_cfg_addr = xvsec_mcapv2_rd_cfg_addr; - mcap_fops->wr_cfg_addr = xvsec_mcapv2_wr_cfg_addr; - mcap_fops->fpga_rd_cfg_addr = xvsec_fpgav2_rd_cfg_addr; - mcap_fops->fpga_wr_cfg_addr = xvsec_fpgav2_wr_cfg_addr; - mcap_fops->axi_rd_addr = xvsec_mcapv2_axi_rd_addr; - mcap_fops->axi_wr_addr = xvsec_mcapv2_axi_wr_addr; - mcap_fops->file_download = xvsec_mcapv2_file_download; - mcap_fops->file_upload = xvsec_mcapv2_file_upload; - mcap_fops->set_axi_cache_attr = xvsec_mcapv2_set_axi_cache_attr; - } - - rv = xvsec_cdev_create(mcap_ctx->pdev, &mcap_ctx->char_dev, - &xvsec_mcap_fops, XVSEC_MCAP_CDEV_NAME); - if (rv < 0) { - pr_err("xvsec_cdev_create failed with error : %d\n", rv); - goto CLEANUP; - } - - return 0; - -CLEANUP: - kfree(mcap_ctx->vsec_priv); - mcap_ctx->vsec_priv = NULL; - return rv; -} - -void xvsec_mcap_module_exit(struct vsec_context *mcap_ctx) -{ - pr_debug("%s\n", __func__); - - xvsec_cdev_remove(&mcap_ctx->char_dev); - - if (mcap_ctx->vsec_priv == NULL) - pr_err("mcap_ctx->vsec_priv is NULL\n"); - - /** Checkpatch : kfree(NULL) is safe */ - kfree(mcap_ctx->vsec_priv); - mcap_ctx->vsec_priv = NULL; -} - -MODULE_LICENSE("Dual BSD/GPL"); diff --git a/XVSEC/linux-kernel/drv/xvsec_mcap/xvsec_mcap.h b/XVSEC/linux-kernel/drv/xvsec_mcap/xvsec_mcap.h deleted file mode 100644 index fc03986..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_mcap/xvsec_mcap.h +++ /dev/null @@ -1,537 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2020-2022, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XVSEC_MCAP_H__ -#define __XVSEC_MCAP_H__ - -/** - * @file xvsec_mcap.h - * - * Xilinx XVSEC MCAP Library Interface Definitions - * - * Header file *xvsec_mcap.h* defines data structures and ioctl codes - * exported by Xilinx XVSEC driver for MCAP functionality. - * - * These data structures and ioctl codes can be used by user space - * applications to carryout the XVSEC-MCAP functionality - * - * XVSEC-MCAP IP has two versions V1 & V2. - * - Version 1 implementation of MCAP is targeted for Xilinx US/US+ devices - * - Version 2 implementation of MCAP is targeted for Xilinx Versal devices - */ - -/** @defgroup xvsec_mcap_enums Enumerations - */ -/** @defgroup xvsec_mcap_union Data Structures - */ - -/** - * @defgroup xvsec_defines Definitions - * @{ - */ - -/** - * XVSEC-MCAP ioctl magic character - */ -#define XVSEC_MCAP_IOC_MAGIC 'm' - -/** @} */ - -/** - * @enum - bitstream_program_status - * @brief Enumeration for XVSEC-MCAP bitstream program Result - * - * @ingroup xvsec_mcap_enums - */ -enum bitstream_program_status { - /** Programming Success Indication */ - MCAP_BITSTREAM_PROGRAM_SUCCESS = 0, - /** Programming Failure Indication */ - MCAP_BITSTREAM_PROGRAM_FAILURE = 1 -}; - -/** - * @enum - axi_access_mode - * @brief AXI Address Access mode used to access - * AXI sub-devices via XVSEC-MCAP interface - * - * @ingroup xvsec_mcap_enums - */ -enum axi_access_mode { - /** 32-bit AXI address mode */ - MCAP_AXI_MODE_32B = 0, - /** 128-bit AXI address mode */ - MCAP_AXI_MODE_128B, -}; - -/** - * @enum - axi_address_type - * @brief Indicates the AXI device access type. - * - * FIFO type devices support fixed mode where the address is fixed. - * - * Other types of device support increment address type - * where the address to be incremented for every transaction. - * - * @ingroup xvsec_mcap_enums - */ -enum axi_address_type { - /** Fixed address type for FIFO type devices */ - FIXED_ADDRESS = 0, - /** Increment address type for other devices */ - INCREMENT_ADDRESS -}; - -/** - * @enum - data_transfer_mode - * @brief Indicates mode of data transfer for - * download functionality. - * - * @ingroup xvsec_mcap_enums - **/ -enum data_transfer_mode { - /** Fast Transfer mode - * and the default one when not specified - */ - DATA_TRANSFER_MODE_FAST = 0, - /** Slow Transfer mode */ - DATA_TRANSFER_MODE_SLOW -}; - -/** - * @enum - file_operation_status - * @brief Indicates File operation(Download/Upload) result - * - * @ingroup xvsec_mcap_enums - **/ -enum file_operation_status { - /** File Operation Successful */ - FILE_OP_SUCCESS = 0, - /** File Operation failed with XVSEC-MCAP error SLVERR */ - FILE_OP_FAIL_SLVERR = 1, - /** File Operation failed with XVSEC-MCAP error DECERR */ - FILE_OP_FAIL_DECERR = 2, - FILE_OP_RESERVED = 3, - /** File operation failed */ - FILE_OP_FAILED, - /** Zero size file is provided as input */ - FILE_OP_ZERO_FSIZE, - /** Valid File size is not provided - * - * for 32-bit mode, file size must be multiple of 32-bits / 4 bytes - * - * for 128-bit mode, file size must be multiple of 128-bits / 16 bytes - */ - FILE_OP_INVALID_FSIZE, - /** File operation failed with XVSEC-MCAP HW timeout on completion */ - FILE_OP_HW_BUSY, - /** Provided file path is too long to fit in internal buffers */ - FILE_PATH_TOO_LONG -}; - -/* - * FIXME: - * There is issue with Sphinx document generation with union - * To generate Sphinx document purposefully changed all @union to @struct - * Need to be updated with @union when there is fix from Documentation team - */ - -/** - * @struct - mcap_regs - * @brief MCAP register set - * V1 corresponds to US/US+ devices - * V2 corresponds to Versal devices - * - * @ingroup xvsec_mcap_union - */ -union mcap_regs { - /** MCAP register sets for US/US+ device*/ - struct { - /** Valid flag to indicate registers validity */ - uint32_t valid; - /** Extended capability header register */ - uint32_t ext_cap_header; - /** Vendor Specific header register */ - uint32_t vendor_header; - /** FPGA JTAG ID register */ - uint32_t fpga_jtag_id; - /** FPGA bit-stream version register */ - uint32_t fpga_bit_ver; - /** Status Register */ - uint32_t status_reg; - /** Control Register */ - uint32_t control_reg; - /** Write Data Register */ - uint32_t wr_data_reg; - /** Read Data Register: 4 data words */ - uint32_t rd_data_reg[4]; - } v1; - /** MCAP register sets for Versal device */ - struct { - /** Valid flag to indicate registers validity */ - uint32_t valid; - /** Extended capability header register */ - uint32_t ext_cap_header; - /** Vendor Specific header register */ - uint32_t vendor_header; - /** Status Register */ - uint32_t status_reg; - /** Control Register */ - uint32_t control_reg; - /** RW Address register */ - uint32_t address_reg; - /** Write Data Register */ - uint32_t wr_data_reg; - /** Read Data Register */ - uint32_t rd_data_reg; - } v2; -}; - -/** - * @struct - bitstream_file - * @brief XVSEC-MCAP bitstream parameters for programming - * V1 corresponds to US/US+ devices - * - * @ingroup xvsec_mcap_union - */ -union bitstream_file { - /** MCAP bitstream parameters for US/US+ */ - struct { - /** Partial clear bitstream file to - * program ultrascale devices - */ - char *partial_clr_file; - /** bitstream file to program */ - char *bitstream_file; - /** Status of the bitstream programming */ - enum bitstream_program_status status; - } v1; -}; - -/** - * @struct - cfg_data - * @brief Parameters needed to perform MCAP read and writes - * V1 corresponds to US/US+ devices - * V2 corresponds to Versal devices - * - * @ingroup xvsec_mcap_union - */ -union cfg_data { - /** MCAP register read/write parameters for US/US+ and Versal */ - struct { - /** access field. 'b' for byte access, 'h'for half word access, - * 'w' for word access - */ - char access; - /** VSEC address offset */ - uint16_t offset; - /** data field holds the info to write into the provided offset - * for Write operation. - * Holds the info at the provided offset for read operation - */ - uint32_t data; - } v1, v2; -}; - -/** - * @struct - fpga_cfg_reg - * @brief FPGA configuration parameters to perform read and writes - * V1 corresponds to US/US+ devices - * - * @ingroup xvsec_mcap_union - */ -union fpga_cfg_reg { - /** FPGA configuration parameters for US/US+ Devices */ - struct { - /** FPGA configuration register number */ - uint16_t offset; - /** data field holds the info to write into the provided offset - * for Write operation. - * Holds the info at the provided offset for read operation - */ - uint32_t data; - } v1; -}; - -/** - * @struct - fpga_cfg_regs - * @brief FPGA configuration register set(See UG570 for more information) - * V1 corresponds to US/US+ devices - * - * @ingroup xvsec_mcap_union - */ -union fpga_cfg_regs { - /** FPGA configuration register for US/US+ Devices */ - struct { - /** Valid flag to indicate registers validity */ - uint32_t valid; - /** CRC Register */ - uint32_t crc; - /** Frame Address Register */ - uint32_t far; - /** Frame Data Register, - * Input Register (write configuration data) - */ - uint32_t fdri; - /** Frame Data Register, - * Output Register (read configuration data) - */ - uint32_t fdro; - /** Command Register */ - uint32_t cmd; - /** Control Register 0 */ - uint32_t ctl0; - /** Mask Register for CTL0 and CTL1 Registers */ - uint32_t mask; - /** Status Register */ - uint32_t stat; - /** Legacy Output Register for Daisy Chain */ - uint32_t lout; - /** Configuration Option Register 0 */ - uint32_t cor0; - /** Multi Frame Write Register */ - uint32_t mfwr; - /** Initial CBC Value Register */ - uint32_t cbc; - /** Device ID Register */ - uint32_t idcode; - /** User Access Register */ - uint32_t axss; - /** Configuration Option Register 1 */ - uint32_t cor1; - /** Warm Boot Start Address Register */ - uint32_t wbstar; - /** Watchdog Timer Register */ - uint32_t timer; - /** Scratch Pad Register for Dummy Read and Writes */ - uint32_t scratchpad; - /** Boot History Status Register */ - uint32_t bootsts; - /** Control Register 1 */ - uint32_t ctl1; - /** BPI/SPI Configuration Options Register */ - uint32_t bspi; - } v1; -}; - -/** - * @struct - axi_reg_data - * @brief AXI register access structure (for Read & Writes) - * V2 corresponds to Versal devices - * - * @ingroup xvsec_mcap_union - */ -union axi_reg_data { - /** AXI register access parameters for Versal Devices */ - struct { - /** Holds AXI sub-device operating mode (32 bit /128 bit), - * 128 bit mode only supported for write operation - */ - enum axi_access_mode mode; - /** AXI register address */ - uint32_t address; - /** data field holds the data to write into the provided - * address for Write operation. - * Holds the data at the provided address for read operation - */ - uint32_t data[4]; - } v2; -}; - -/** - * @struct - file_download_upload - * @brief File download & upload parameters for sub-devices - * connected via NOC - * V2 corresponds to Versal devices - * - * @ingroup xvsec_mcap_union - */ -union file_download_upload { - /** File download & upload parameters for Versal Devices */ - struct { - /** Holds AXI sub-device operating mode (32 bit / 128 bit), - * 128 bit mode only supported for write operation - */ - enum axi_access_mode mode; - /** Holds address type (fixed or increment ) */ - enum axi_address_type addr_type; - /** Holds address from where download/upload should happen */ - uint32_t address; - /** File to download/upload */ - char *file_name; - /** Data length read in bytes (for upload option) */ - size_t length; - /** data transfer mode */ - enum data_transfer_mode tr_mode; - /** SBI reg block address */ - uint32_t sbi_address; - /** File Download/Upload Status */ - enum file_operation_status op_status; - /** upload/download failed at byte index */ - size_t err_index; - } v2; -}; - -/** - * @struct - axi_cache_attr - * @brief AXI cache and protection settings - * V2 corresponds to Versal devices - * - * @ingroup xvsec_mcap_union - */ -union axi_cache_attr { - /** AXI cache attributes for Versal Devices */ - struct { - /** AXI cache bits */ - uint8_t axi_cache; - /** AXI protection bits */ - uint8_t axi_prot; - } v2; -}; - -/** MCAP operation codes to be used with ioctl codes */ -#define CODE_MCAP_RESET 0 -#define CODE_MCAP_MODULE_RESET 1 -#define CODE_MCAP_FULL_RESET 2 -#define CODE_MCAP_GET_DATA_REG 3 -#define CODE_MCAP_GET_REG 4 -#define CODE_MCAP_GET_FPGA_REG 5 -#define CODE_MCAP_PROG_BITFILE 6 -#define CODE_MCAP_RD_DEV_CFG_REG 7 -#define CODE_MCAP_WR_DEV_CFG_REG 8 -#define CODE_MCAP_RD_FPGA_REG 9 -#define CODE_MCAP_WR_FPGA_REG 10 -#define CODE_MCAP_RD_AXI_REG 11 -#define CODE_MCAP_WR_AXI_REG 12 -#define CODE_MCAP_FILE_DOWNLOAD 13 -#define CODE_MCAP_FILE_UPLOAD 14 -#define CODE_MCAP_GET_REVISION 15 -#define CODE_MCAP_SET_AXI_ATTR 16 - -/** Complete set of ioctls for MCAP VSEC */ - -/** - * @defgroup xvsec_mcap_defines Definitions - * @{ - */ - -/** - * ioctl code for performing MCAP configuration logic reset - */ -#define IOC_MCAP_RESET \ - _IO(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_RESET) -/** - * ioctl code for performing MCAP Module reset - */ -#define IOC_MCAP_MODULE_RESET \ - _IO(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_MODULE_RESET) -/** - * ioctl code for performing both IOC_MCAP_RESET & IOC_MCAP_MODULE_RESET - */ -#define IOC_MCAP_FULL_RESET \ - _IO(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_FULL_RESET) -/** - * ioctl code for retrieving the MCAP Read Data Registers - */ -#define IOC_MCAP_GET_DATA_REGISTERS \ - _IOR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_GET_DATA_REG, \ - uint32_t *) -/** - * ioctl code for retrieving the MCAP Registers - */ -#define IOC_MCAP_GET_REGISTERS \ - _IOR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_GET_REG, \ - union mcap_regs *) -/** - * ioctl code for retrieving the FPGA configuration Registers - */ -#define IOC_MCAP_GET_FPGA_REGISTERS \ - _IOR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_GET_FPGA_REG, \ - union fpga_cfg_regs *) -/** - * ioctl code for programming the bitstream - */ -#define IOC_MCAP_PROGRAM_BITSTREAM \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_PROG_BITFILE, \ - union bitstream_file *) -/** - * ioctl code for reading an MCAP VSEC register - */ -#define IOC_MCAP_READ_DEV_CFG_REG \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_RD_DEV_CFG_REG, \ - union cfg_data *) -/** - * ioctl code for Writing to an MCAP VSEC register - */ -#define IOC_MCAP_WRITE_DEV_CFG_REG \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_WR_DEV_CFG_REG, \ - union cfg_data *) -/** - * ioctl code for reading an FPGA CFG register - */ -#define IOC_MCAP_READ_FPGA_CFG_REG \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_RD_FPGA_REG, \ - union fpga_cfg_reg *) -/** - * ioctl code for writing to an FPGA CFG register - */ -#define IOC_MCAP_WRITE_FPGA_CFG_REG \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_WR_FPGA_REG, \ - union fpga_cfg_reg *) -/** - * ioctl code for reading the AXI register at given address - */ -#define IOC_MCAP_READ_AXI_REG \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_RD_AXI_REG, \ - union axi_reg_data *) -/** - * ioctl code for writing the AXI register at given address with given data - */ -#define IOC_MCAP_WRITE_AXI_REG \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_WR_AXI_REG, \ - union axi_reg_data *) -/** - * ioctl code for performing file download - */ -#define IOC_MCAP_FILE_DOWNLOAD \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_FILE_DOWNLOAD, \ - union file_download_upload *) -/** - * ioctl code for performing file upload - */ -#define IOC_MCAP_FILE_UPLOAD \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_FILE_UPLOAD, \ - union file_download_upload *) -/** - * ioctl code for retrieving the revision - */ -#define IOC_MCAP_GET_REVISION \ - _IOR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_GET_REVISION, \ - uint32_t *) - -/** - * ioctl code to configure axi cache & protection attributes - */ -#define IOC_MCAP_SET_AXI_ATTR \ - _IOWR(XVSEC_MCAP_IOC_MAGIC, CODE_MCAP_SET_AXI_ATTR, \ - union axi_cache_attr *) - -/** @} */ - -#endif /* __XVSEC_MCAP_H__ */ diff --git a/XVSEC/linux-kernel/drv/xvsec_util.c b/XVSEC/linux-kernel/drv/xvsec_util.c deleted file mode 100644 index ff16de8..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_util.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2018-2022, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#include <linux/ioctl.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/aer.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/version.h> -#include <linux/pci.h> -#include <linux/vmalloc.h> -#include <linux/cdev.h> -#include <linux/fcntl.h> -#include <linux/sched.h> -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/delay.h> -#include <linux/fs.h> -#include <linux/uaccess.h> - -#include "xvsec_util.h" - -int xvsec_util_find_file_type(char *fname, const char *suffix) -{ - size_t suffix_len; - size_t fname_len; - int ret = -(EINVAL); - char *fname_suffix; - - /* Parameter Validation */ - if ((fname == NULL) || (suffix == NULL)) - return ret; - - suffix_len = strlen(suffix); - if (suffix_len == 0) - return ret; - fname_len = strlen(fname); - - fname_suffix = fname+(fname_len - suffix_len); - if (strncasecmp(fname_suffix, suffix, suffix_len) == 0) - ret = 0; - - return ret; -} - -struct file *xvsec_util_fopen(const char *path, int flags, int rights) -{ - struct file *filep; - mm_segment_t oldfs; - int err = 0; - - oldfs = get_fs(); - set_fs(KERNEL_DS); - filep = filp_open(path, (flags | O_LARGEFILE), rights); - set_fs(oldfs); - if (IS_ERR(filep) != 0) { - err = PTR_ERR(filep); - pr_err("%s : filp_open failed, err : 0x%X\n", __func__, err); - return NULL; - } - return filep; -} - -void xvsec_util_fclose(struct file *filep) -{ - filp_close(filep, NULL); -} - -int xvsec_util_fread(struct file *filep, uint64_t offset, - uint8_t *data, uint32_t size) -{ - int ret = 0; - mm_segment_t oldfs; - - oldfs = get_fs(); - set_fs(KERNEL_DS); -#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE - ret = vfs_read(filep, (char __user *)data, size, (loff_t *)&offset); -#else - ret = kernel_read(filep, (void *)data, size, (loff_t *)&offset); -#endif - filep->f_pos = offset; - set_fs(oldfs); - - if (ret < 0) { -#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE - pr_err("%s : vfs_read failed with error : %d\n", - __func__, ret); -#else - pr_err("%s : kernel_read failed with error : %d\n", - __func__, ret); -#endif - return -(EIO); - } - - return ret; -} - -int xvsec_util_fwrite(struct file *filep, uint64_t offset, - uint8_t *data, uint32_t size) -{ - int ret = 0; - mm_segment_t oldfs; - - oldfs = get_fs(); - set_fs(KERNEL_DS); -#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE - ret = vfs_write(filep, (char __user *)data, size, (loff_t *)&offset); -#else - ret = kernel_write(filep, (void *)data, size, - (loff_t *)&offset); -#endif - filep->f_pos = offset; - set_fs(oldfs); - - if (ret < 0) { -#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE - pr_err("%s : vfs_write failed, err : %d\n", __func__, ret); -#else - pr_err("%s : kernel_write failed, err : %d\n", __func__, ret); -#endif - return -(EIO); - } - - return ret; -} - -int xvsec_util_fsync(struct file *filep) -{ - vfs_fsync(filep, 0); - return 0; -} - -int xvsec_util_get_file_size(const char *fname, loff_t *size) -{ - int ret = 0; - mm_segment_t oldfs; - struct kstat stat; - - oldfs = get_fs(); - set_fs(KERNEL_DS); - - memset(&stat, 0, sizeof(struct kstat)); - ret = vfs_stat((char __user *)fname, &stat); - set_fs(oldfs); - if (ret < 0) { - pr_err("%s : vfs_stat failed with error : %d\n", __func__, ret); - return -(EIO); - } - - *size = stat.size; - - return ret; -} - diff --git a/XVSEC/linux-kernel/drv/xvsec_util.h b/XVSEC/linux-kernel/drv/xvsec_util.h deleted file mode 100644 index 2126ac9..0000000 --- a/XVSEC/linux-kernel/drv/xvsec_util.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of the XVSEC driver for Linux - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * The full GNU General Public License is included in this distribution in - * the file called "COPYING". - */ - -#ifndef __XVSEC_UTIL_H__ -#define __XVSEC_UTIL_H__ - -/** - * @file xvsec_util.h - * - * Xilinx XVSEC Utility functions - * - * Header file *xvsec_util.h* defines the utility functions that can be - * used by driver. - * - * These data structures & functions are for driver internal use - * - */ - -int xvsec_util_find_file_type(char *fname, const char *suffix); -struct file *xvsec_util_fopen(const char *path, int flags, int rights); -void xvsec_util_fclose(struct file *filep); -int xvsec_util_fread(struct file *filep, uint64_t offset, - uint8_t *data, uint32_t size); -int xvsec_util_fwrite(struct file *filep, uint64_t offset, - uint8_t *data, uint32_t size); -int xvsec_util_fsync(struct file *filep); -int xvsec_util_get_file_size(const char *fname, loff_t *size); - -#endif /* __XVSEC_UTIL_H__ */ diff --git a/XVSEC/linux-kernel/libxvsec/Makefile b/XVSEC/linux-kernel/libxvsec/Makefile deleted file mode 100644 index 56d521e..0000000 --- a/XVSEC/linux-kernel/libxvsec/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -SHELL = /bin/bash -build_dir = $(PWD)/../build -lib_dir = $(build_dir)/lib -CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I../include -I../drv/ -I../drv/xvsec_mcap/ -CFLAGS += $(EXTRA_FLAGS) - -XVSEC = libxvsec -XVSEC_OBJS := $(patsubst %.c,%.o,$(wildcard *.c)) - -all: clean $(XVSEC) - -$(XVSEC): $(XVSEC_OBJS) - @mkdir -p -m 755 $(build_dir) - @mkdir -p -m 755 $(lib_dir) - @mkdir -p -m 755 $(lib_dir)/obj - $(AR) -r $@ $^ - ranlib $@ - @mv -f $(XVSEC) $(lib_dir)/$(XVSEC).a - @cp -f xvsec.h $(lib_dir)/ - @mv -f *.o $(lib_dir)/obj/ - -clean: - @rm -rf *.o */*.o $(XVSEC).a $(lib_dir)/ diff --git a/XVSEC/linux-kernel/libxvsec/version.h b/XVSEC/linux-kernel/libxvsec/version.h deleted file mode 100644 index 39cabfa..0000000 --- a/XVSEC/linux-kernel/libxvsec/version.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * This file is part of the XVSEC userspace library which provides the - * userspace APIs to enable the XSEC driver functionality - * - * Copyright (c) 2018-2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#ifndef __XVSEC_LIB_VERSION_H__ -#define __XVSEC_LIB_VERSION_H__ - -#define __stringify1(x...) #x -#define __stringify(x...) __stringify1(x) - -#define XVSEC_LIB_MODULE_NAME "xvsec" -#define XVSEC_LIB_MODULE_DESC "Xilinx VSEC Library" - -#define XVSEC_LIB_VERSION_MAJOR 2020 -#define XVSEC_LIB_VERSION_MINOR 2 -#define XVSEC_LIB_VERSION_PATCH 1 - -#define XVSEC_LIB_VERSION \ - __stringify(XVSEC_LIB_VERSION_MAJOR) "." \ - __stringify(XVSEC_LIB_VERSION_MINOR) "." \ - __stringify(XVSEC_LIB_VERSION_PATCH) - -#define XVSEC_LIB_VERSION_NUM \ - ((XVSEC_LIB_VERSION_MAJOR)*1000 + \ - (XVSEC_LIB_VERSION_MINOR)*100 + \ - XVSEC_LIB_VERSION_PATCH) - -#endif /* ifndef __XVSEC_LIB_VERSION_H__ */ diff --git a/XVSEC/linux-kernel/libxvsec/xvsec.c b/XVSEC/linux-kernel/libxvsec/xvsec.c deleted file mode 100644 index aca414e..0000000 --- a/XVSEC/linux-kernel/libxvsec/xvsec.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * This file is part of the XVSEC userspace library which provides the - * userspace APIs to enable the XSEC driver functionality - * - * Copyright (c) 2018-2020 Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#include "version.h" -#include "xvsec.h" -#include "xvsec_int.h" -#include "xvsec_drv.h" /* kernel character Driver layer API's*/ -#include "xvsec_mcap.h" /* kernel layer MCAP API's */ - - - -#define XVSEC_MAGIC_NO 0x10EE -#define INVALID_DEVICE_INDEX 0xFFFF - -const static char version[] = - XVSEC_LIB_MODULE_DESC "\t: v" XVSEC_LIB_VERSION "\n"; - -xvsec_user_context_t *xvsec_user_ctx = NULL; -int no_of_devs; - -const char *error_codes[] = { - "XVSEC Success", - "XVSEC Operation not permitted", - "XVSEC Failure", - "XVSEC NULL Pointer", - "XVSEC Invalid Parameters", - "XVSEC Mutex Lock Fail", - "XVSEC Mutex Unlock Fail", - "XVSEC MEM Allocation Fail", - "XVSEC Operation Not Supported", - "XVSEC Bitstream Program Fail", - "XVSEC Linux System Call Fail", - "XVSEC Max Devices Limit Reached", - "XVSEC Invalid File Format", - "XVSEC Invalid Combo of Offset and Access Type", - "XVSEC Missing Capability ID", - "XVSEC Capability ID Not Supported", - "XVSEC Invalid FPGA CFG Register", - "XVSEC Invalid VSEC Offset" -}; - -int xvsec_lib_init(int max_devices) -{ - int ret = XVSEC_SUCCESS; - int status; - int index; - uint16_t failed_index; - pthread_mutexattr_t attr; - - no_of_devs = max_devices; - xvsec_user_ctx = malloc(sizeof(xvsec_user_context_t) * no_of_devs); - if(xvsec_user_ctx == NULL) - { - fprintf(stderr, "[XVSEC] : Failed to Allocate " - "memory for user context\n"); - return XVSEC_ERR_MEM_ALLOC_FAILED; - } - - memset(xvsec_user_ctx, 0, sizeof(xvsec_user_context_t)); - - status = pthread_mutexattr_init(&attr); - if(status < 0) - { - fprintf(stderr, "[XVSEC] : Failed to initialize an attribute" - " object: %s\n", strerror(status)); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - goto CLEANUP0; - } - - status = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); - if(status < 0) - { - fprintf(stderr, "[XVSEC] : Failed to set attribute " - "ERRORCHECK MUTEX: %s\n", strerror(status)); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - goto CLEANUP1; - } - - for(index = 0; index < no_of_devs; index++) - { - status = pthread_mutex_init(&xvsec_user_ctx[index].mutex, &attr); - if (status < 0) - { - fprintf(stderr, "[XVSEC] : mutex init failed for " - "device %d\n", index); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - failed_index = index; - goto CLEANUP2; - } - } - - pthread_mutexattr_destroy(&attr); - - return XVSEC_SUCCESS; - -CLEANUP2: - for(index = 0; index <= failed_index; index++) - { - pthread_mutex_destroy(&xvsec_user_ctx[index].mutex); - } -CLEANUP1: - pthread_mutexattr_destroy(&attr); -CLEANUP0: - free(xvsec_user_ctx); - xvsec_user_ctx = NULL; - return ret; -} - -int xvsec_lib_deinit(void) -{ - int ret = XVSEC_SUCCESS; - int status; - uint32_t index; - - for(index = 0; index < no_of_devs; index++) - { - status = pthread_mutex_destroy(&xvsec_user_ctx[index].mutex); - if(status < 0) - { - fprintf(stderr, "[XVSEC] : pthread_mutex_destroy " - "failed with error %d(%s) for index %u\n", - status, strerror(errno), index); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - } - } - - free(xvsec_user_ctx); - xvsec_user_ctx = NULL; - - return ret; -} - -int xvsec_open(uint16_t bus_no, uint16_t dev_no, xvsec_handle_t *handle, char* dev_str) -{ - int ret = XVSEC_SUCCESS; - int status; - char device_name[20]; - int fd; - uint32_t index; - uint32_t device_index = INVALID_DEVICE_INDEX; - - /* Parameter checking */ - if((bus_no > 255) || (dev_no > 255) || (handle == NULL) || (dev_str == NULL)) - { - fprintf(stderr, "[XVSEC] : %s : Invalid Parameters " - "bus_no:0x%04X, device no : 0x%04X, handle : %p, dev_str:%p\n", - __func__, bus_no, dev_no, handle, dev_str); - - return XVSEC_ERR_INVALID_PARAM; - } - - for(index = 0; index < no_of_devs; index++) - { - if(xvsec_user_ctx[index].handle == NULL) - { - device_index = index; - index = no_of_devs; - } - } - - if(device_index == INVALID_DEVICE_INDEX) - { - fprintf(stderr, "[XVSEC] : %s : There is no room to " - "open a device\n", __func__); - return XVSEC_MAX_DEVICES_LIMIT_REACHED; - } - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - status = snprintf(device_name, sizeof(device_name), - "/dev/xvsec%02X%02X%s", bus_no, dev_no, dev_str); - if(status < 0) - { - fprintf(stderr, "[XVSEC] : %s : snprintf returned error " - ": %d\n", __func__, status); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - goto CLEANUP; - } - else if((status == sizeof(device_name)) || - (status >= sizeof(device_name))) - { - fprintf(stderr, "[XVSEC] : %s : snprintf output truncated :" - " %d\n", __func__, status); - ret = XVSEC_ERR_OPERATION_NOT_SUPPORTED; - goto CLEANUP; - } - - fd = open(device_name, O_SYNC|O_RDWR, S_IRWXU); - if(fd < 0) - { - fprintf(stderr, "[XVSEC] : %s : open call failed on device %s " - "with error %d(%s)\n", __func__, device_name, errno, - strerror(errno)); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - goto CLEANUP; - } - - - xvsec_user_ctx[device_index].fd = fd; - xvsec_user_ctx[device_index].handle = handle; - - ((handle_t *)handle)->xvsec_magic_no = XVSEC_MAGIC_NO; - ((handle_t *)handle)->bus_no = bus_no; - ((handle_t *)handle)->dev_no = dev_no; - ((handle_t *)handle)->index = device_index; - ((handle_t *)handle)->mrev = 0xFF; - ((handle_t *)handle)->valid = true; - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_close(xvsec_handle_t *handle) -{ - int ret = XVSEC_SUCCESS; - int status; - uint16_t device_index; - - if(handle == NULL) - { - fprintf(stderr, "[XVSEC] : %s : Invalid Handle : " - "handle = %p\n", __func__, handle); - return XVSEC_ERR_NULL_POINTER; - } - - device_index = ((handle_t *)handle)->index; - - if(device_index >= no_of_devs) - { - fprintf(stderr, "[XVSEC] : %s : handle corrupted," - " handle = 0x%lX\n", __func__, *handle); - return XVSEC_ERR_OPERATION_NOT_SUPPORTED; - } - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - status = close(xvsec_user_ctx[device_index].fd); - if(status < 0) - { - fprintf(stderr, "[XVSEC] : %s : close() failed with " - "error %d(%s)\n", __func__, errno, strerror(errno)); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - } - - xvsec_user_ctx[device_index].fd = -1; - xvsec_user_ctx[device_index].handle = NULL; - memset(handle, 0, sizeof(xvsec_handle_t)); - - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_get_cap_list(xvsec_handle_t *handle, xvsec_cap_list_t *cap_list) -{ - int ret = XVSEC_SUCCESS; - int status; - uint16_t index; - uint16_t device_index; - struct xvsec_capabilities xvsec_caps; - - /* Parameter Validation */ - if((handle == NULL) || (cap_list == NULL)) - { - return XVSEC_ERR_INVALID_PARAM; - } - - status = xvsec_validate_handle(handle); - if(status < 0) - { - return status; - } - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - memset(&xvsec_caps, 0, sizeof(struct xvsec_capabilities)); - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_XVSEC_GET_CAP_LIST, &xvsec_caps); - if(status < 0) - { - fprintf(stderr, "[XVSEC] : %s : ioctl for " - "IOC_XVSEC_GET_CAP_LIST failed with error %d(%s)\n", - __func__, errno, strerror(errno)); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - goto CLEANUP; - } - - cap_list->no_of_caps = (xvsec_caps.no_of_caps > MAX_CAPS_SUPPORTED) ? - MAX_CAPS_SUPPORTED : xvsec_caps.no_of_caps; - - for(index = 0; index < cap_list->no_of_caps; index++) - { - cap_list->cap_info[index].is_supported = xvsec_caps.vsec_info[index].is_supported; - cap_list->cap_info[index].cap_id = xvsec_caps.vsec_info[index].cap_id; - cap_list->cap_info[index].rev_id = xvsec_caps.vsec_info[index].rev_id; - - snprintf(cap_list->cap_info[index].cap_name, XVSEC_MAX_VSEC_STR_LEN, - "%s", xvsec_caps.vsec_info[index].name); - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_show_device(xvsec_handle_t *handle) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - union device_info dev_info; - - /* Parameter Validation */ - if(handle == NULL) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_XVSEC_GET_DEVICE_INFO, &dev_info); - if(status < 0) - { - fprintf(stderr, "[XVSEC] : %s : ioctl for " - "IOC_GET_DEVICE_INFO failed with error %d(%s)\n", - __func__, errno, strerror(errno)); - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - goto CLEANUP; - } - - fprintf(stdout, "%s", version); - fprintf(stdout, "-----------------------------------\n"); - - fprintf(stdout, "vendor_id = 0x%X\n", dev_info.vendor_id ); - fprintf(stdout, "device_id = 0x%X\n", dev_info.device_id ); - fprintf(stdout, "device_no = 0x%X\n", dev_info.device_no ); - fprintf(stdout, "device_fn = 0x%X\n", dev_info.device_fn ); - fprintf(stdout, "subsystem_vendor = 0x%X\n", dev_info.subsystem_vendor); - fprintf(stdout, "subsystem_device = 0x%X\n", dev_info.subsystem_device); - fprintf(stdout, "class_id = 0x%X\n", dev_info.class_id ); - fprintf(stdout, "cfg_size = 0x%X\n", dev_info.cfg_size ); - fprintf(stdout, "is_msi_enabled = 0x%X\n", dev_info.is_msi_enabled ); - fprintf(stdout, "is_msix_enabled = 0x%X\n", dev_info.is_msix_enabled ); - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_validate_handle(xvsec_handle_t *handle) -{ - uint16_t device_index; - - device_index = ((handle_t *)handle)->index; - if(device_index >= no_of_devs) - { - fprintf(stderr, "[XVSEC] : %s : corrupted Handle\n", __func__); - return XVSEC_ERR_OPERATION_NOT_SUPPORTED; - } - - if(xvsec_user_ctx[device_index].handle != handle) - { - fprintf(stderr, "[XVSEC] : %s : Invalid Handle\n", __func__); - return XVSEC_ERR_OPERATION_NOT_SUPPORTED; - } - return XVSEC_SUCCESS; -} diff --git a/XVSEC/linux-kernel/libxvsec/xvsec.h b/XVSEC/linux-kernel/libxvsec/xvsec.h deleted file mode 100644 index 1ff47b5..0000000 --- a/XVSEC/linux-kernel/libxvsec/xvsec.h +++ /dev/null @@ -1,877 +0,0 @@ -/* - * This file is part of the XVSEC userspace library which provides the - * userspace APIs to enable the XSEC driver functionality - * - * Copyright (c) 2018-2022, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#ifndef __XVSEC_H__ -#define __XVSEC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <stdbool.h> -#include <string.h> -#include <pthread.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/ioctl.h> -#include <byteswap.h> - -/** - * @file - * @brief This file contains the interface declarations of XVSEC User Space - * Library - * - */ - -/** @defgroup xvsec_api_enums Enumerations - */ -/** @defgroup xvsec_api_struct Data Structures - */ -/** @defgroup xvsec_api_union Data Structures - */ -/** @defgroup xvsec_api_func Exported Functions - */ -/** @defgroup xvsec_api_var Exported Variables - */ - - -/** - * @defgroup xvsec_api_defines Definitions - * @{ - */ - - -/** Indicates Success of API call */ -#define XVSEC_SUCCESS (0) -/** Indicates Operation not permitted */ -#define XVSEC_EPERM (-1) -/** Indicates Failure of API call */ -#define XVSEC_FAILURE (-2) -/** Indicates one or more NULL pointer passed as parameter */ -#define XVSEC_ERR_NULL_POINTER (-3) -/** Indicates one or more invalid parameters passed */ -#define XVSEC_ERR_INVALID_PARAM (-4) -/** Indicates mutex lock failed */ -#define XVSEC_ERR_MUTEX_LOCK_FAIL (-5) -/** Indicates mutex unlock failed while trying to release */ -#define XVSEC_ERR_MUTEX_UNLOCK_FAIL (-6) -/** Indicates memory allocation failed */ -#define XVSEC_ERR_MEM_ALLOC_FAILED (-7) -/** Indicates the requested operation is not supported */ -#define XVSEC_ERR_OPERATION_NOT_SUPPORTED (-8) -/** Indicates BitStream programming Failed */ -#define XVSEC_ERR_BITSTREAM_PROGRAM (-9) -/** Indicates one of the linux system call Failed */ -#define XVSEC_ERR_LINUX_SYSTEM_CALL (-10) -/** Indicates No more devices present to open */ -#define XVSEC_MAX_DEVICES_LIMIT_REACHED (-11) -/** Indicates unsupported file format provided */ -#define XVSEC_ERR_INVALID_FILE_FORMAT (-12) -/** Indicates Offset and Access combination - * is incorrect (Ex : u16 needs an even offset, u32 needs an offset divisible - * by 4 */ -#define XVSEC_ERR_INVALID_OFFSET_ACCESS_COMBO (-13) -/** Indicates Capability ID is not provided */ -#define XVSEC_ERR_CAPABILITY_ID_MISSING (-14) -/** Indicates Capability ID is not supported */ -#define XVSEC_ERR_CAPABILITY_NOT_SUPPORTED (-15) -/** Indicates FPGA CFG Register number provided - * is invalid (or) access to the requested register is prohibited */ -#define XVSEC_ERR_INVALID_FPGA_REG_NUM (-16) -/** Indicates Provided VSEC Offset is invalid */ -#define XVSEC_ERR_INVALID_OFFSET (-17) - -/** Maximum supported Capability ID by the Library */ -#define MAX_CAPS_SUPPORTED (10) - -/** Maximum VSEC name String length */ -#define XVSEC_MAX_VSEC_STR_LEN (20) - -/** @} */ - -/** Unique XVSEC handle per device. - * This handle is needed for all XVSEC operations - * @ingroup xvsec_api_var - */ -typedef uint64_t xvsec_handle_t; - -/** - * @enum - access_type_t - * @brief Register/Offset Access Type(Byte/Short/Word) - * @ingroup xvsec_api_enums - */ -typedef enum access_type_t -{ - /** 8 bits access (read/write) */ - ACCESS_BYTE = 0, - /** 16 bits access (read/write) */ - ACCESS_SHORT, - /** 32 bits access (read/write) */ - ACCESS_WORD, -}access_type_t; - -/** - * @struct - xvsec_cap_t - * @brief Capability Information - * @ingroup xvsec_api_struct - */ -typedef struct xvsec_cap_t -{ - /** Capability Identifier */ - uint16_t cap_id; - /** MCAP Revision info */ - uint16_t rev_id; - /** Capability Name */ - char cap_name[XVSEC_MAX_VSEC_STR_LEN]; - /** info to check capability supported by this drv or not*/ - bool is_supported; -}xvsec_cap_t; - -/** - * @struct - xvsec_cap_list_t - * @brief Capability List - * @ingroup xvsec_api_struct - */ -typedef struct xvsec_cap_list_t -{ - /** No of capabilities supported */ - uint16_t no_of_caps; - /** Capabilities Information */ - xvsec_cap_t cap_info[MAX_CAPS_SUPPORTED]; -}xvsec_cap_list_t; - -/** - * @struct - xvsec_mcap_sts_reg_t - * @brief MCAP Status Register Fields - * @ingroup xvsec_api_struct - */ -typedef union xvsec_mcap_sts_reg_t { - /** MCAP sts bits for US/US+ Devices */ - struct { - /** Error */ - uint32_t err : 1; - /** End of Startup Signal */ - uint32_t eos : 1; - uint32_t reserved01 : 2; - /** MCAP Read complete flag */ - uint32_t read_complete : 1; - /** MCAP Read word count */ - uint32_t read_count : 3; - /** MCAP Write Buffer FIFO overflow */ - uint32_t fifo_ovfl : 1; - uint32_t reserved02 : 3; - /** MCAP Write Buffer FIFO Occupency */ - uint32_t fifo_occu : 4; - uint32_t reserved03 : 8; - /** MCAP Request for Release Flag */ - uint32_t req4mcap_rel : 1; - uint32_t reserved04 : 7; - }v1; - /** MCAP sts bits for Versal Devices */ - struct { - /** Reserved */ - uint32_t reserved01 : 4; - /** MCAP Read/Write Status */ - uint32_t rw_status : 2; - /** Reserved */ - uint32_t reserved02 : 2; - /** MCAP Read Complete */ - uint32_t rd_complete : 1; - /** Reserved */ - uint32_t reserved03 : 7; - /** MCAP FIFO Occupancy */ - uint32_t fifo_occupancy : 5; - /** MCAP Write FIFO Full */ - uint32_t wr_fifo_full : 1; - /** Write FIFO Almost Full */ - uint32_t wr_fifo_almost_full : 1; - /** Write FIFO Almost Empty */ - uint32_t wr_fifo_almost_empty : 1; - /* MCAP Write FIFO Empty */ - uint32_t wr_fifo_empty : 1; - /** Write FIFO Overflow */ - uint32_t wr_fifo_overflow : 1; - /** Reserved */ - uint32_t reserved04 : 6; - }v2; - -}xvsec_mcap_sts_reg_t; - -/** - * @struct - xvsec_mcap_ctl_reg_t - * @brief MCAP Control Register Fields - * @ingroup xvsec_api_struct - */ -typedef union xvsec_mcap_ctl_reg_t { - /** MCAP ctrl bits for US/US+ */ - struct { - /** MCAP Module Enable */ - uint32_t enable : 1; - /** MCAP Read Enable to perform FPGA CFG Read operation */ - uint32_t rd_enable : 1; - uint32_t reserved01 : 2; - /** MCAP Configurable Region Reset */ - uint32_t reset : 1; - /** MCAP Module Reset */ - uint32_t module_reset : 1; - uint32_t reserved02 : 2; - /** Request for gaining access to configurable region */ - uint32_t req4mcap_pcie : 1; - uint32_t reserved03 : 3; - /** MCAP Design Switch : Must be SET after loading bitstream */ - uint32_t cfg_desgn_sw : 1; - uint32_t reserved04 : 3; - /** MCAP Write Register Enable */ - uint32_t wr_reg_enable : 1; - uint32_t reserved05 : 15; - }v1; - /** MCAP ctrl bits for Versal */ - struct { - /** MCAP Read Enable */ - uint32_t rd_enable : 1; - uint32_t reserved01 : 3; - /** MCAP Write Enable */ - uint32_t wr_enable : 1; - /** MCAP 128-bit Mode */ - uint32_t mode : 1; - uint32_t reserved02 : 2; - /** MCAP Module Reset */ - uint32_t reset : 1; - uint32_t reserved03 : 7; - /** MCAP AXI Cache */ - uint32_t axi_cache : 4; - /** MCAP AXI Protect */ - uint32_t axi_protect : 3; - uint32_t reserved04 : 9; - }v2; -}xvsec_mcap_ctl_reg_t; - -/** - * @struct - xvsec_mcap_regs_t - * @brief MCAP Register set - * @ingroup xvsec_api_struct - */ -typedef union xvsec_mcap_regs_t { - /** MCAP cfg register set for US/US+ */ - struct { - /** Extended capability header register */ - uint32_t cap_header; - /** Vendor Specific header register */ - uint32_t vendor_header; - /** FPGA JTAG ID register */ - uint32_t fpga_jtag_id; - /** FPGA bit-stream version register */ - uint32_t fpga_bitstream_ver; - /** Status Register */ - uint32_t status_reg; - /** Control Register */ - uint32_t control_reg; - /** Write Data Register */ - uint32_t write_data_reg; - /** Read Data Register: 4 data words */ - uint32_t read_data_reg[4]; - }v1; - /** MCAP cfg register set for Versal devices */ - struct { - /** Extended capability header register */ - uint32_t ext_cap_header; - /** Vendor Specific header register */ - uint32_t vendor_header; - /** Status Register */ - uint32_t status_reg; - /** Control Register */ - uint32_t control_reg; - /** RW Address register */ - uint32_t address_reg; - /** Write Data Register */ - uint32_t wr_data_reg; - /** Read Data Register */ - uint32_t rd_data_reg; - }v2; -}xvsec_mcap_regs_t; - -/** - * @struct - xvsec_fpga_cfg_regs_t - * @brief FPGA Configuration Register set - * @ingroup xvsec_api_struct - */ -typedef union xvsec_fpga_cfg_regs_t { - /** FPGA Configuration Register set for US/US+ devices */ - struct { - /** CRC Register */ - uint32_t crc; - /** Frame Address Register */ - uint32_t far; - /** Frame Data Register, Input Register (write configuration data) */ - uint32_t fdri; - /** Frame Data Register, Output Register (read configuration data) */ - uint32_t fdro; - /** Command Register */ - uint32_t cmd; - /** Control Register 0 */ - uint32_t ctl0; - /** Mask Register for CTL0 and CTL1 Registers */ - uint32_t mask; - /** Status Register */ - uint32_t stat; - /** Legacy Output Register for Daisy Chain */ - uint32_t lout; - /** Configuration Option Register 0 */ - uint32_t cor0; - /** Multi Frame Write Register */ - uint32_t mfwr; - /** Initial CBC Value Register */ - uint32_t cbc; - /** Device ID Register */ - uint32_t idcode; - /** User Access Register */ - uint32_t axss; - /** Configuration Option Register 1 */ - uint32_t cor1; - /** Warm Boot Start Address Register */ - uint32_t wbstar; - /** Watchdog Timer Register */ - uint32_t timer; - /** Scratch Pad Register for Dummy Read and Writes */ - uint32_t scratchpad; - /** Boot History Status Register */ - uint32_t bootsts; - /** Control Register 1 */ - uint32_t ctl1; - /** BPI/SPI Configuration Options Register */ - uint32_t bspi; - }v1; /* fpga register set for US/US+ */ -}xvsec_fpga_cfg_regs_t; - -/** Error codes in human readable form - * @ingroup xvsec_api_var - */ -extern const char *error_codes[]; - -/** - * @enum - mcap_revision_t - * @brief Revision ID for MCAP IP - * @ingroup xvsec_api_enums - */ -typedef enum mcap_revision_t { - /** MCAP Revision for Ultrascale device */ - MCAP_US = 0, - /** MCAP Revision for Ultrascale plus device */ - MCAP_USPLUS, - /** MCAP Revision for Versal device */ - MCAP_VERSAL, - /** Unsupported MCAP Revision by this Driver */ - INVALID_MCAP_REVISION, -}mcap_revision_t; - -/** - * @struct - _cfg_data - * @brief Parameters for accessing MCAP Registers(Read/Write) - * @ingroup xvsec_api_struct - */ -typedef struct _cfg_data { - /** access field. 'b' for byte access, 'h'for half word access, - * 'w' for word access - */ - char access; - /** VSEC address offset */ - uint16_t offset; - /** data field holds the information to write into the provided offset - * for Write operation. - * Holds the information at the provided offset for read operation - */ - uint32_t data; -}cfg_data_t; - -/** - * @enum - _axi_access_mode - * @brief AXI Devices addressing mode (32 bit/128 bit) - * - * @ingroup xvsec_api_enums - **/ -typedef enum _axi_access_mode { - /** 32-bit addressing mode */ - XVSEC_MCAP_AXI_MODE_32B = 0, - /** 128-bit addressing mode */ - XVSEC_MCAP_AXI_MODE_128B, -}axi_access_mode_t; - -/** - * @enum - _data_transfer_mode - * @brief Indicates mode of data transfer for - * download functionality. - * - * @ingroup xvsec_api_enums - **/ -typedef enum _data_transfer_mode { - /** Fast Transfer mode - * and the default one when not specified */ - XVSEC_MCAP_DATA_TR_MODE_FAST = 0, - /** Slow Transfer mode */ - XVSEC_MCAP_DATA_TR_MODE_SLOW, -}data_transfer_mode_t; - -/** - * @enum - _file_operation_status - * @brief Indicates File operation(Download/Upload) result - * - * @ingroup xvsec_api_enums - **/ -typedef enum _file_operation_status { - /** File Operation Successful */ - XVSEC_MCAP_FILE_OP_SUCCESS = 0, - /** File Operation failed with XVSEC-MCAP error SLVERR */ - XVSEC_MCAP_FILE_OP_FAIL_SLVERR = 1, - /** File Operation failed with XVSEC-MCAP error DECERR */ - XVSEC_MCAP_FILE_OP_FAIL_DECERR = 2, - XVSEC_MCAP_FILE_OP_RESERVED = 3, - /** File operation failed */ - XVSEC_MCAP_FILE_OP_FAILED, - /** Zero size file is provided as input */ - XVSEC_MCAP_FILE_OP_ZERO_FSIZE, - /** Valid File size is not provided - * - * for 32-bit mode, file size must be multiple of 32-bits / 4 bytes - * - * for 128-bit mode, file size must be multiple of 128-bits / 16 bytes - */ - XVSEC_MCAP_FILE_OP_INVALID_FSIZE, - /** File operation failed with XVSEC-MCAP HW timeout on completion */ - XVSEC_MCAP_FILE_OP_HW_BUSY, - /** Provided file path is too long to fit in internal buffers */ - XVSEC_MCAP_FILE_PATH_TOO_LONG -}file_operation_status_t; - - -/** - * @struct - _axi_reg_data - * @brief AXI register access structure (for Read & Writes) - * V2 corresponds to Versal devices - * - * @ingroup xvsec_api_union - **/ - -typedef union _axi_reg_data{ - /** AXI register access parameters for Versal devices */ - struct { - /** Holds the AXI sub-device operating mode (32 bit mode/128 bit mode), - * 128 bit mode only supported for write operation - **/ - axi_access_mode_t mode; - /** AXI register address */ - uint32_t address; - /** data field holds the data to write into the provided address - * for Write operation. - * Holds the data at the provided address for read operation - **/ - uint32_t data[4]; - }v2; -}axi_reg_data_t; -/** - * @struct _axi_cache_attr - * @brief AXI cache and protection settings - * V2 corresponds to Versal devices - * - * @ingroup xvsec_api_union - **/ - -typedef union _axi_cache_attr{ - /** AXI cache attributes for Versal devices */ - struct { - /** AXI cache bits */ - uint8_t axi_cache; - /** AXI protection bits */ - uint8_t axi_prot; - }v2; -}axi_cache_attr_t; - -/*****************************************************************************/ -/** - * xvsec_lib_init() - Initializes the XVSEC Library by allocating memory - * to support requested number of devices - * - * @param[in] max_devices Maximum devices to support - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_MEM_ALLOC_FAILED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Filure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_lib_init(int max_devices); - -/*****************************************************************************/ -/** - * xvsec_lib_deinit() - De-initializes the XVSEC Library by - * freeing allocated memory and clearing the context - * - * @param none - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_lib_deinit(void); - -/*****************************************************************************/ -/** - * xvsec_open() - Opens XVSEC character device which is dedicated to the given - * bus number and device number and returns a unique handle to - * access the device - * - * - * @param[in] bus_no PCIe bus number on which device sits - * @param[in] dev_no Device number in the PCIe bus - * @param[in] dev_str string to append to create character device. - * @param[out] handle Unique handle returned to access the device - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_MAX_DEVICES_LIMIT_REACHED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_open(uint16_t bus_no, uint16_t dev_no, xvsec_handle_t *handle, char *dev_str); - -/*****************************************************************************/ -/** - * xvsec_close() - Closes XVSEC character device of provided handle - * - * @param[in] handle Unique handle to access the device - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_NULL_POINTER : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_close(xvsec_handle_t *handle); - -/*****************************************************************************/ -/** - * xvsec_get_cap_list() - Returns the supported VSEC capabilities - * of the given handle - * - * @param[in] handle Unique handle to access the device - * @param[out] cap_list Supported capability list - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_get_cap_list(xvsec_handle_t *handle, xvsec_cap_list_t *cap_list); - -/*****************************************************************************/ -/** - * xvsec_show_device() - Shows the device information of the given handle - * - * @param[in] handle Unique handle to access the device - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_show_device(xvsec_handle_t *handle); - -/*****************************************************************************/ -/** - * xvsec_mcap_reset() - Resets the configuration logic of the given handle - * - * @param[in] handle Unique handle to access the device - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_reset(xvsec_handle_t *handle); - -/*****************************************************************************/ -/** - * xvsec_mcap_module_reset() - Resets the MCAP module of the given handle - * - * @param[in] handle Unique handle to access the device - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_module_reset(xvsec_handle_t *handle); - -/*****************************************************************************/ -/** - * xvsec_mcap_full_reset() - Resets bothconfiguration logic & MCAP module - * of the given handle - * - * @param[in] handle Unique handle to access the device - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_full_reset(xvsec_handle_t *handle); - -/*****************************************************************************/ -/** - * xvsec_mcap_get_data_registers() - Returns the MCAP read data registers - * - * @param[in] handle Unique handle to access the device - * @param[out] data[] MCAP read data register values - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_get_data_registers(xvsec_handle_t *handle, uint32_t data[4]); - -/*****************************************************************************/ -/** - * xvsec_mcap_get_revision() - Returns the MCAP read data registers - * - * @param[in] handle Unique handle to access the device - * @param[out] rev[] MCAP read data register values - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - ******************************************************************************/ -int xvsec_mcap_get_revision(xvsec_handle_t *handle, uint32_t *rev); - -/*****************************************************************************/ -/** - * xvsec_mcap_get_registers() - Returns the MCAP register set - * - * @param[in] handle Unique handle to access the device - * @param[out] mcap_regs MCAP register values - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_get_registers(xvsec_handle_t *handle, - xvsec_mcap_regs_t *mcap_regs); - -/*****************************************************************************/ -/** - * xvsec_mcap_get_fpga_registers() - Returns the FPGA configuration register set - * - * @param[in] handle Unique handle to access the device - * @param[out] fpga_cfg_regs FPGA configuration register values - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_get_fpga_registers(xvsec_handle_t *handle, - xvsec_fpga_cfg_regs_t *fpga_cfg_regs); - -/*****************************************************************************/ -/** - * xvsec_mcap_access_config_reg() - Performs read/write operations on - * the MCAP register set - * - * @param[in] handle Unique handle to access the device - * @param[in] offset Register address offset from MCAP Base address - * @param[inout] data Data pointer which holds the data to write / - * the data after read - * @param[in] access Control specifier which specifies type of - * access (8 bits/16 bits/32 bits) - * @param[in] write Control specifier which specifies write/read - * operation - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_INVALID_OFFSET : Failure - * @return XVSEC_ERR_INVALID_OFFSET_ACCESS_COMBO : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_access_config_reg(xvsec_handle_t *handle, uint16_t offset, - void *data, access_type_t access, - bool write); - -/*****************************************************************************/ -/** - * xvsec_mcap_access_fpga_config_reg() - Performs read/write operations on - * the FPGA configuration register set - * - * @param[in] handle Unique handle to access the device - * @param[in] offset Register address offset from MCAP Base address - * @param[inout] data Data pointer which holds the data to write / - * the data after read - * @param[in] write Control specifier which specifies write/read - * operation - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @return XVSEC_ERR_INVALID_FPGA_REG_NUM : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_access_fpga_config_reg(xvsec_handle_t *handle, uint16_t offset, - void *data, bool write); - -/*****************************************************************************/ -/** - * xvsec_mcap_configure_fpga() - Performs bitstream programming on FPGA - * - * - * @param[in] handle Unique handle to access the device - * @param[in] partial_cfg_file Partial Clear bitstream file - * @param[in] bitfile Bitstream file - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @return XVSEC_ERR_INVALID_FPGA_REG_NUM : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_configure_fpga(xvsec_handle_t *handle, - char *partial_cfg_file, char *bitfile); - - -/*****************************************************************************/ -/** - * xvsec_mcap_access_axi_reg - Performs AXI read/write operations - * - * @param[in] handle Unique handle to access the device - * @param[in] address axi address to be read/write - * @param[inout] value Data pointer which holds the data to write/read - * For Read Only 32b mode is supported. For Write 32b/128b modes are supported. - * Data buffer size is assumed 4 bytes in case of 32b mode - * Data buffer size is assumed 16 bytes in case of 128b mode - * - * @param[in] write Control specifier which specifies write/read - * operation - * @param[in] mode 32bit or 128bit axi mode - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_access_axi_reg(xvsec_handle_t *handle, uint32_t address, - void *value, bool write, axi_access_mode_t mode); - -/*****************************************************************************/ -/** - * xvsec_mcap_file_download() - Performs File download at specified address - * - * - * @param[in] handle Unique handle to access the device - * @param[in] fixed_address Address Type (is it fixed/incr) - * @param[in] mode_128_bit Access Mode (128 bit or 32 bit) - * @param[in] file_name File to download - * @param[in] dev_address The address to download the file - * @param[in] tr_mode Data transfer mode(slow/fast) - * @param[in] sbi_address SBI reg block address - * @param[out] op_status file download status - * @param[out] err_index file download error index - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_file_download(xvsec_handle_t *handle, - bool fixed_address, bool mode_128_bit, - char *file_name, uint32_t dev_address, - data_transfer_mode_t tr_mode, uint32_t sbi_address, - file_operation_status_t *op_status, size_t *err_index); - -/*****************************************************************************/ -/** - * xvsec_mcap_file_upload() - Performs File Upload from specified address - * - * - * @param[in] handle Unique handle to access the device - * @param[in] fixed_address Address Type (is it fixed/incr) - * @param[in] file_name File to download - * @param[in] dev_address The address to download the file - * @param[in] length Length of the file to upload - * @param[out] op_status file upload status - * @param[out] err_index file upload error index - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @return XVSEC_FAILURE : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_file_upload(xvsec_handle_t *handle, - bool fixed_address, char *file_name, - uint32_t dev_address, size_t length, - file_operation_status_t *op_status, size_t *err_index); - -/*****************************************************************************/ -/** - * xvsec_mcap_set_axi_cache_attr - To set AXI cache and protection bits - * - * @param[in] handle Unique handle to access the device - * @param[in] user_attr structure having axi cache and protection value to be set - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @return XVSEC_ERR_LINUX_SYSTEM_CALL : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_mcap_set_axi_cache_attr(xvsec_handle_t *handle, axi_cache_attr_t *user_attr); - -/*****************************************************************************/ -/** - * xvsec_lib_get_mcap_revision - To get the MCAP version info from Library - * - * @param[in] handle Unique handle to access the device - * @param[in] mrev Pointer variable to get the MCAP revision - * - * @return XVSEC_SUCCESS : Success - * @return XVSEC_ERR_INVALID_PARAM : Failure - * @return XVSEC_ERR_OPERATION_NOT_SUPPORTED : Failure - * @ingroup xvsec_api_func - *****************************************************************************/ -int xvsec_lib_get_mcap_revision(xvsec_handle_t *handle, uint8_t *mrev); - -#ifdef __cplusplus -} -#endif - -#endif /* __XVSEC_H__ */ diff --git a/XVSEC/linux-kernel/libxvsec/xvsec_int.h b/XVSEC/linux-kernel/libxvsec/xvsec_int.h deleted file mode 100644 index 8cf6b42..0000000 --- a/XVSEC/linux-kernel/libxvsec/xvsec_int.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of the XVSEC userspace library which provides the - * userspace APIs to enable the XSEC driver functionality - * - * Copyright (c) 2018-2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#ifndef __XVSEC_INT_H__ -#define __XVSEC_INT_H__ - -#define MAX_MCAP_REG_OFFSET (0x2C) -#define MAX_MCAPV2_REG_OFFSET (0x1C) - -/* Internal APIs and structures */ -typedef struct handle_t -{ - uint16_t xvsec_magic_no; /* XVSEC Magic Number */ - uint8_t bus_no; /* PCI bus number */ - uint8_t dev_no; /* Device Number on PCI bus */ - uint16_t index; /* Array Index of handle info */ - uint8_t mrev; /* mcap rev*/ - bool valid; /* Validity of the handle */ -}handle_t; - -typedef struct xvsec_user_context_t -{ - xvsec_handle_t *handle; - int fd; - pthread_mutex_t mutex; -}xvsec_user_context_t; - - -extern int no_of_devs; -extern xvsec_user_context_t *xvsec_user_ctx; - -extern int xvsec_validate_handle(xvsec_handle_t *handle); - -#endif /* __XVSEC_INT_H__ */ diff --git a/XVSEC/linux-kernel/libxvsec/xvsec_mcap.c b/XVSEC/linux-kernel/libxvsec/xvsec_mcap.c deleted file mode 100644 index a800ee0..0000000 --- a/XVSEC/linux-kernel/libxvsec/xvsec_mcap.c +++ /dev/null @@ -1,887 +0,0 @@ -/* - * This file is part of the XVSEC userspace library which provides the - * userspace APIs to enable the XSEC driver functionality - * - * Copyright (c) 2018-2022 Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#include "xvsec.h" -#include "xvsec_int.h" -#include "xvsec_drv.h" /* kernel character Driver layer API's*/ -#include "xvsec_mcap.h" /* kernel layer MCAP API's */ - -#define MCAP_LOOP_COUNT 1000000 - -#define MCAP_SYNC_DWORD 0xFFFFFFFF -#define MCAP_SYNC_BYTE0 ((MCAP_SYNC_DWORD & 0xFF000000) >> 24) -#define MCAP_SYNC_BYTE1 ((MCAP_SYNC_DWORD & 0x00FF0000) >> 16) -#define MCAP_SYNC_BYTE2 ((MCAP_SYNC_DWORD & 0x0000FF00) >> 8) -#define MCAP_SYNC_BYTE3 ((MCAP_SYNC_DWORD & 0x000000FF) >> 0) - -#define MCAP_RBT_FILE ".rbt" -#define MCAP_BIT_FILE ".bit" -#define MCAP_BIN_FILE ".bin" - -int check_error_code(int errcode, const char* fstr) -{ - int ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - - - if(errcode == XVSEC_EPERM) - { - fprintf(stderr, "[XVSEC] :Operation is not supported\n"); - ret = XVSEC_ERR_OPERATION_NOT_SUPPORTED; - } - else - { - fprintf(stderr, "[XVSEC] : ioctl failed for %s ," - "failed with error %d(%s)\n", fstr, errno, - strerror(errno)); - } - - return ret; -} - -/* MCAP specific APIs */ -int xvsec_lib_get_mcap_revision(xvsec_handle_t *handle, uint8_t *mrev) -{ - int status = 0; - /* Parameter Validation */ - if((handle == NULL) || (mrev == NULL)) - { - status = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - status = xvsec_validate_handle(handle); - if(status < 0) - { - fprintf(stderr, "[XVSEC] : handle corrupted!"); - goto CLEANUP; - } - - /*return the mcap revision*/ - if(((handle_t *)handle)->mrev == VSEC_REV_UNKNOWN) - { - status = xvsec_mcap_get_revision(handle, (uint32_t*)mrev); - if(status != XVSEC_SUCCESS) - { - fprintf(stderr, "[XVSEC] : ioctl for get mcap revision failed. ret: %d", status); - status = XVSEC_FAILURE; - goto CLEANUP; - } - ((handle_t *)handle)->mrev = *mrev; - goto CLEANUP; - } - - *mrev = ((handle_t *)handle)->mrev; - -CLEANUP: - return status; -} - -int xvsec_mcap_reset(xvsec_handle_t *handle) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - - /* Parameter Validation */ - if(handle == NULL) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - status = ioctl(xvsec_user_ctx[device_index].fd, IOC_MCAP_RESET); - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_mcap_module_reset(xvsec_handle_t *handle) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - - /* Parameter Validation */ - if(handle == NULL) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - status = ioctl(xvsec_user_ctx[device_index].fd, IOC_MCAP_MODULE_RESET); - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_mcap_full_reset(xvsec_handle_t *handle) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - - /* Parameter Validation */ - if(handle == NULL) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - status = ioctl(xvsec_user_ctx[device_index].fd, IOC_MCAP_FULL_RESET); - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_mcap_get_revision(xvsec_handle_t *handle, uint32_t *rev) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - - /* Parameter Validation */ - if((handle == NULL) || (rev == NULL)) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_GET_REVISION, rev); - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - return ret; -} - -int xvsec_mcap_set_axi_cache_attr(xvsec_handle_t *handle, axi_cache_attr_t *user_attr) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - - /* Parameter Validation */ - if((handle == NULL) || (user_attr == NULL)) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_SET_AXI_ATTR, user_attr); - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - return ret; -} - - -int xvsec_mcap_get_data_registers(xvsec_handle_t *handle, uint32_t data[4]) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - - /* Parameter Validation */ - if(handle == NULL) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - memset(data, 0, sizeof(uint32_t)*4); - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_GET_DATA_REGISTERS, data); - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - return ret; -} - -int xvsec_mcap_get_registers(xvsec_handle_t *handle, - xvsec_mcap_regs_t *mcap_regs) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - union mcap_regs regs; - uint8_t mrev; - - /* Parameter Validation */ - if((handle == NULL) || (mcap_regs == NULL)) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_lib_get_mcap_revision(handle, &mrev); - if((status != XVSEC_SUCCESS) || (mrev >= INVALID_MCAP_REVISION)) - return XVSEC_FAILURE; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - memset(®s, 0, sizeof(union mcap_regs)); - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_GET_REGISTERS, ®s); - if((status != XVSEC_SUCCESS) || ( (mrev != MCAP_VERSAL) & (regs.v1.valid == 0)) || ( (mrev == MCAP_VERSAL) & (regs.v2.valid == 0))) - { - fprintf(stderr, "[XVSEC] : %s, mrev: %d, v1.valid:%d, v2.valid:%d\n", __func__, mrev, regs.v1.valid, regs.v2.valid); - ret = check_error_code(status, __func__); - goto CLEANUP; - } - - if( mrev == MCAP_VERSAL ) - { - mcap_regs->v2.ext_cap_header = regs.v2.ext_cap_header; - mcap_regs->v2.vendor_header = regs.v2.vendor_header; - mcap_regs->v2.status_reg = regs.v2.status_reg; - mcap_regs->v2.control_reg = regs.v2.control_reg; - mcap_regs->v2.address_reg = regs.v2.address_reg; - mcap_regs->v2.wr_data_reg = regs.v2.wr_data_reg; - mcap_regs->v2.rd_data_reg = regs.v2.rd_data_reg; - } - else - { - mcap_regs->v1.cap_header = regs.v1.ext_cap_header; - mcap_regs->v1.vendor_header = regs.v1.vendor_header ; - mcap_regs->v1.fpga_jtag_id = regs.v1.fpga_jtag_id ; - mcap_regs->v1.fpga_bitstream_ver = regs.v1.fpga_bit_ver ; - mcap_regs->v1.status_reg = regs.v1.status_reg ; - mcap_regs->v1.control_reg = regs.v1.control_reg ; - mcap_regs->v1.write_data_reg = regs.v1.wr_data_reg ; - mcap_regs->v1.read_data_reg[0] = regs.v1.rd_data_reg[0]; - mcap_regs->v1.read_data_reg[1] = regs.v1.rd_data_reg[1]; - mcap_regs->v1.read_data_reg[2] = regs.v1.rd_data_reg[2]; - mcap_regs->v1.read_data_reg[3] = regs.v1.rd_data_reg[3]; - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_mcap_get_fpga_registers(xvsec_handle_t *handle, - xvsec_fpga_cfg_regs_t *fpga_cfg_regs) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - union fpga_cfg_regs regs; - uint8_t mrev; - - /* Parameter Validation */ - if((handle == NULL) || (fpga_cfg_regs == NULL)) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_lib_get_mcap_revision(handle, &mrev); - if((status != XVSEC_SUCCESS) || (mrev >= INVALID_MCAP_REVISION)) - return XVSEC_FAILURE; - - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - memset(®s, 0, sizeof(union fpga_cfg_regs)); - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_GET_FPGA_REGISTERS, ®s); - - if( (status != XVSEC_SUCCESS) || ( (mrev != MCAP_VERSAL) & (regs.v1.valid == 0))) - { - fprintf(stderr, "[XVSEC] : %s, valid : %d, mrev: %d\n", __func__, mrev, regs.v1.valid); - ret = check_error_code(status, __func__); - goto CLEANUP; - } - - if( (mrev == MCAP_US) || (mrev == MCAP_USPLUS) ) - { - - fpga_cfg_regs->v1.crc = regs.v1.crc ; - fpga_cfg_regs->v1.far = regs.v1.far ; - fpga_cfg_regs->v1.fdri = regs.v1.fdri ; - fpga_cfg_regs->v1.fdro = regs.v1.fdro ; - fpga_cfg_regs->v1.cmd = regs.v1.cmd ; - fpga_cfg_regs->v1.ctl0 = regs.v1.ctl0 ; - fpga_cfg_regs->v1.mask = regs.v1.mask ; - fpga_cfg_regs->v1.stat = regs.v1.stat ; - fpga_cfg_regs->v1.lout = regs.v1.lout ; - fpga_cfg_regs->v1.cor0 = regs.v1.cor0 ; - fpga_cfg_regs->v1.mfwr = regs.v1.mfwr ; - fpga_cfg_regs->v1.cbc = regs.v1.cbc ; - fpga_cfg_regs->v1.idcode = regs.v1.idcode ; - fpga_cfg_regs->v1.axss = regs.v1.axss ; - fpga_cfg_regs->v1.cor1 = regs.v1.cor1 ; - fpga_cfg_regs->v1.wbstar = regs.v1.wbstar ; - fpga_cfg_regs->v1.timer = regs.v1.timer ; - fpga_cfg_regs->v1.scratchpad = regs.v1.scratchpad ; - fpga_cfg_regs->v1.bootsts = regs.v1.bootsts; - fpga_cfg_regs->v1.ctl1 = regs.v1.ctl1 ; - fpga_cfg_regs->v1.bspi = regs.v1.bspi ; - } - else - { - fprintf(stderr, "[XVSEC] : mcap version is not valid: %d\n", mrev); - regs.v1.valid = 0; - ret = XVSEC_FAILURE; - goto CLEANUP; - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_mcap_access_config_reg(xvsec_handle_t *handle, uint16_t offset, - void *data, access_type_t access, bool write) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - union cfg_data cfg_data; - cfg_data_t usr_cfg_data; - uint8_t mrev; - - /* Parameter Validation */ - if((handle == NULL) || (data == NULL) || (access > ACCESS_WORD)) - return XVSEC_ERR_INVALID_PARAM; - - - status = xvsec_lib_get_mcap_revision(handle, &mrev); - if((status != XVSEC_SUCCESS) || (mrev >= INVALID_MCAP_REVISION)) - return XVSEC_FAILURE; - - - if(( (mrev == MCAP_US) || (mrev == MCAP_USPLUS)) && (offset >= MAX_MCAP_REG_OFFSET)) - { - fprintf(stderr, "[XVSEC] : %s : Invalid Offset Provided for US/US+ device\n", __func__); - return XVSEC_ERR_INVALID_OFFSET; - } - else if((mrev == MCAP_VERSAL) && (offset >= MAX_MCAPV2_REG_OFFSET)) - { - fprintf(stderr, "[XVSEC] : %s : Invalid Offset Provided for Versal device\n", __func__); - return XVSEC_ERR_INVALID_OFFSET; - } - - if(((access == ACCESS_SHORT) && (offset % 2 != 0)) || - ((access == ACCESS_WORD) && (offset % 4 != 0))) - return XVSEC_ERR_INVALID_OFFSET_ACCESS_COMBO; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - usr_cfg_data.offset = offset; - usr_cfg_data.data = 0x0; - if(write == true) - { - if(access == ACCESS_BYTE) - { - usr_cfg_data.access = 'b'; - usr_cfg_data.data = (uint32_t)(*(uint8_t *)data); - } - else if(access == ACCESS_SHORT) - { - usr_cfg_data.access = 'h'; - usr_cfg_data.data = (uint32_t)(*(uint16_t *)data); - } - else - { - usr_cfg_data.access = 'w'; - usr_cfg_data.data = (uint32_t)(*(uint32_t *)data); - } - - if( mrev == MCAP_VERSAL ) /* cfg data for Versal devices */ - { - cfg_data.v2.offset = usr_cfg_data.offset; - cfg_data.v2.access = usr_cfg_data.access; - cfg_data.v2.data = usr_cfg_data.data; - } - else /* cfg data for US/US+ devices */ - { - cfg_data.v1.offset = usr_cfg_data.offset; - cfg_data.v1.access = usr_cfg_data.access; - cfg_data.v1.data = usr_cfg_data.data; - } - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_WRITE_DEV_CFG_REG, &cfg_data); - - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - - fprintf(stdout, "[XVSEC] : %s : write operation completed\n", __func__); - } - else - { - if(access == ACCESS_BYTE) - { - usr_cfg_data.access = 'b'; - } - else if(access == ACCESS_SHORT) - { - usr_cfg_data.access = 'h'; - } - else - { - usr_cfg_data.access = 'w'; - } - if( mrev == MCAP_VERSAL ) - { - cfg_data.v2.offset = usr_cfg_data.offset; - cfg_data.v2.access = usr_cfg_data.access; - } - else - { - cfg_data.v1.offset = usr_cfg_data.offset; - cfg_data.v1.access = usr_cfg_data.access; - } - - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_READ_DEV_CFG_REG, &cfg_data); - - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - - if(mrev == MCAP_VERSAL) - usr_cfg_data.data = cfg_data.v2.data; - else - usr_cfg_data.data = cfg_data.v1.data; - - if(access == ACCESS_BYTE) - { - *(uint8_t *)data = (uint8_t)usr_cfg_data.data; - } - else if(access == ACCESS_SHORT) - { - *(uint16_t *)data = (uint16_t)usr_cfg_data.data; - } - else - { - *(uint32_t *)data = (uint32_t)usr_cfg_data.data; - } - - fprintf(stdout, "[XVSEC] : %s : read operation " - "completed\n", __func__); - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - - -int xvsec_mcap_access_axi_reg(xvsec_handle_t *handle, uint32_t address, - void *value, bool write, axi_access_mode_t mode) - -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - axi_reg_data_t axi_data; - uint32_t* data = (uint32_t*)value; - - /* Parameter Validation */ - if((handle == NULL) || (data == NULL)) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - axi_data.v2.mode = mode; - axi_data.v2.address = address; - axi_data.v2.data[0] = 0;; - - if(write == true) - { - axi_data.v2.data[0] = (uint32_t)data[0]; - axi_data.v2.data[1] = (uint32_t)data[1]; - axi_data.v2.data[2] = (uint32_t)data[2]; - axi_data.v2.data[3] = (uint32_t)data[3]; - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_WRITE_AXI_REG, &axi_data); - - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - - fprintf(stdout, "[XVSEC] : %s : write operation " - "completed\n", __func__); - } - else - { - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_READ_AXI_REG, &axi_data); - - if(status != XVSEC_SUCCESS) - { - ret = check_error_code(status, __func__); - goto CLEANUP; - } - - data[0] = (uint32_t)axi_data.v2.data[0]; - - fprintf(stdout, "[XVSEC] : %s : read operation " - "completed\n", __func__); - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - - -int xvsec_mcap_access_fpga_config_reg(xvsec_handle_t *handle, uint16_t offset, - void *data, bool write) - -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - union fpga_cfg_reg cfg_data; - uint8_t mrev; - - /* Parameter Validation */ - if((handle == NULL) || (data == NULL)) - return XVSEC_ERR_INVALID_PARAM; - - - status = xvsec_lib_get_mcap_revision(handle, &mrev); - if((status != XVSEC_SUCCESS) || (mrev >= INVALID_MCAP_REVISION)) - return XVSEC_FAILURE; - - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - cfg_data.v1.offset = offset; - cfg_data.v1.data = 0; - - if(write == true) - { - cfg_data.v1.data = (uint32_t)(*(uint32_t *)data); - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_WRITE_FPGA_CFG_REG, &cfg_data); - - if(status != XVSEC_SUCCESS) - { - if(errno == EACCES) - ret = XVSEC_ERR_INVALID_FPGA_REG_NUM; - else - ret = check_error_code(status, __func__); - - goto CLEANUP; - } - - fprintf(stdout, "[XVSEC] : %s : write operation " - "completed\n", __func__); - } - else - { - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_READ_FPGA_CFG_REG, &cfg_data); - - if(status != XVSEC_SUCCESS) - { - if(errno == EACCES) - ret = XVSEC_ERR_INVALID_FPGA_REG_NUM; - else - ret = check_error_code(status, __func__); - - goto CLEANUP; - } - - *(uint32_t *)data = (uint32_t)cfg_data.v1.data; - - fprintf(stdout, "[XVSEC] : %s : read operation " - "completed\n", __func__); - } - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - - return ret; -} - -int xvsec_mcap_configure_fpga(xvsec_handle_t *handle, - char *partial_cfg_file, char *bitfile) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - union bitstream_file bit_files; - - if((handle == NULL) || - ((partial_cfg_file == NULL) && (bitfile == NULL))) - return XVSEC_ERR_INVALID_PARAM; - - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - /* V1 arguementes for US/US+ devices to program bitstreasm */ - bit_files.v1.partial_clr_file = partial_cfg_file; - bit_files.v1.bitstream_file = bitfile; - bit_files.v1.status = MCAP_BITSTREAM_PROGRAM_FAILURE; - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_PROGRAM_BITSTREAM, &bit_files); - - if((status != XVSEC_SUCCESS) || - (bit_files.v1.status != MCAP_BITSTREAM_PROGRAM_SUCCESS)) - { - fprintf(stderr, "[XVSEC] : %s : err status : %d\n", __func__, bit_files.v1.status); - ret = check_error_code(status, __func__); - goto CLEANUP; - } - - fprintf(stdout, "[XVSEC] : %s : Bitstream Program successful\n", __func__); - - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - return ret; - -} - -int xvsec_mcap_file_download(xvsec_handle_t *handle, - bool fixed_address, bool mode_128_bit, - char *file_name, uint32_t dev_address, - data_transfer_mode_t tr_mode, uint32_t sbi_address, - file_operation_status_t *op_status, size_t *err_index) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - union file_download_upload download_info; - - if ((handle == NULL) || (file_name == NULL)) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - memset(&download_info, 0, sizeof(union file_download_upload)); - - download_info.v2.mode = - (mode_128_bit == true) ? MCAP_AXI_MODE_128B : MCAP_AXI_MODE_32B; - download_info.v2.addr_type = - (fixed_address == true) ? FIXED_ADDRESS : INCREMENT_ADDRESS; - download_info.v2.address = dev_address; - download_info.v2.file_name = file_name; - download_info.v2.op_status = FILE_OP_FAILED; - download_info.v2.tr_mode = - (tr_mode == XVSEC_MCAP_DATA_TR_MODE_SLOW) ? DATA_TRANSFER_MODE_SLOW : DATA_TRANSFER_MODE_FAST; - download_info.v2.sbi_address = sbi_address; - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_FILE_DOWNLOAD, &download_info); - - *op_status = (file_operation_status_t)download_info.v2.op_status; - *err_index = download_info.v2.err_index; - - if((status < 0) || - (download_info.v2.op_status != FILE_OP_SUCCESS)) - { - fprintf(stderr, "[XVSEC] : %s : ioctl for " - "IOC_MCAP_FILE_DOWNLOAD failed with error %d(%s), " - "status : %d, failed at index: %ld\n", __func__, - errno, strerror(errno), - download_info.v2.op_status, - download_info.v2.err_index); - - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - goto CLEANUP; - } - - fprintf(stdout, "[XVSEC] : %s : File Download successful\n", __func__); - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - return ret; -} - -int xvsec_mcap_file_upload(xvsec_handle_t *handle, - bool fixed_address, char *file_name, - uint32_t dev_address, size_t length, - file_operation_status_t *op_status, size_t *err_index) -{ - int ret = XVSEC_SUCCESS; - int status; - int device_index; - union file_download_upload upload_info; - - if ((handle == NULL) || (file_name == NULL)) - return XVSEC_ERR_INVALID_PARAM; - - status = xvsec_validate_handle(handle); - if(status < 0) - return status; - - device_index = ((handle_t *)handle)->index; - - pthread_mutex_lock(&xvsec_user_ctx[device_index].mutex); - - memset(&upload_info, 0, sizeof(union file_download_upload)); - - upload_info.v2.addr_type = - (fixed_address == true) ? FIXED_ADDRESS : INCREMENT_ADDRESS; - upload_info.v2.address = dev_address; - upload_info.v2.file_name = file_name; - upload_info.v2.length = length; - upload_info.v2.op_status = FILE_OP_FAILED; - - status = ioctl(xvsec_user_ctx[device_index].fd, - IOC_MCAP_FILE_UPLOAD, &upload_info); - - *op_status = (file_operation_status_t)upload_info.v2.op_status; - *err_index = upload_info.v2.err_index; - - if((status < 0) || - (upload_info.v2.op_status != FILE_OP_SUCCESS)) - { - fprintf(stderr, "[XVSEC] : %s : ioctl for " - "IOC_MCAP_FILE_UPLOAD failed with error %d(%s), " - "status : %d, failed at index: %ld\n", __func__, - errno, strerror(errno), - upload_info.v2.op_status, - upload_info.v2.err_index); - - ret = XVSEC_ERR_LINUX_SYSTEM_CALL; - goto CLEANUP; - } - - if (upload_info.v2.length != length) { - fprintf(stderr, "[XVSEC] : %s : Partial file uploaded, " - "Requested len : %zu, Uploaded len: %ld\n", - __func__, length, upload_info.v2.length); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - - fprintf(stdout, "[XVSEC] : %s : File Upload successful\n", __func__); - -CLEANUP: - pthread_mutex_unlock(&xvsec_user_ctx[device_index].mutex); - return ret; - -} diff --git a/XVSEC/linux-kernel/tools/Makefile b/XVSEC/linux-kernel/tools/Makefile deleted file mode 100644 index 37d7edb..0000000 --- a/XVSEC/linux-kernel/tools/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -SHELL = /bin/bash -build_dir = $(PWD)/../build -CFLAGS += -O2 -fno-inline -Wall -Wstrict-prototypes -CFLAGS += -I. -I$(build_dir)/lib/ -CFLAGS += $(EXTRA_FLAGS) -LDFLAGS += -L$(build_dir)/lib/ -lxvsec -lpthread -rdynamic - -XVSECCTL = xvsecctl -XVSECCTL_OBJS := $(patsubst %.c,%.o,$(wildcard *.c)) - -all: clean $(XVSECCTL) - -$(XVSECCTL): $(XVSECCTL_OBJS) - @mkdir -p -m 755 $(build_dir) - $(CC) $^ -o $(XVSECCTL) $(LDFLAGS) - @mv -f $(XVSECCTL) $(build_dir) - @rm -f *.o - -clean: - @rm -f *.o */*.o $(XVSECCTL) $(build_dir)/$(XVSECCTL)* $(build_dir)/*.sh diff --git a/XVSEC/linux-kernel/tools/main.c b/XVSEC/linux-kernel/tools/main.c deleted file mode 100644 index 8847398..0000000 --- a/XVSEC/linux-kernel/tools/main.c +++ /dev/null @@ -1,473 +0,0 @@ -/* - * This file is part of the XVSEC userspace application - * to enable the user to execute the XVSEC functionality - * - * Copyright (c) 2018-2022 Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include <stdbool.h> -#include <unistd.h> -#include <limits.h> -#include <signal.h> -#include <execinfo.h> - -#include "version.h" -#include "xvsec.h" -#include "main.h" -#include "mcap_ops.h" -#include "xvsec_parser.h" - -static char version[] = - XVSEC_TOOL_MODULE_DESC "\t: v" XVSEC_TOOL_VERSION "\n"; - -static int execute_xvsec_help_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_xvsec_verbose_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_xvsec_list_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int validate_capability(xvsec_handle_t *xvsec_handle, - struct args *args); - -/*extern def */ -extern int get_mcap_version(xvsec_handle_t *handle, enum mcap_revision *mrev); - -struct xvsec_ops xvsec_ops[] = { - {XVSEC_HELP, execute_xvsec_help_cmd}, - {XVSEC_VERBOSE, execute_xvsec_verbose_cmd}, - {XVSEC_LIST_VSECS, execute_xvsec_list_cmd}, - {XVSEC_OP_END, NULL} -}; - -void SignalHandler(int SignalNum) -{ - int j, nptrs; - void *buffer[100]; - char **strings; - - fprintf(stderr, "Received Signal : %d\n", SignalNum); - - nptrs = backtrace(buffer, 100); - fprintf(stderr, "backtrace() returned %d addresses\n", nptrs); - - /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) - would produce similar output to the following: */ - - strings = backtrace_symbols(buffer, nptrs); - if (strings == NULL) - { - perror("backtrace_symbols"); - exit(EXIT_FAILURE); - } - - for (j = 0; j < nptrs; j++) - { - printf("%s\n", strings[j]); - } - - free(strings); - - exit(-1); -} - -static void xvsec_common_help(FILE *fp) -{ - fprintf(fp, "Usage: xvsec -b <Bus No> -F <Device No> " - "-c <Capability ID> [Capability Supported Options]\n"); - fprintf(fp, " : xvsec -b <Bus No> -F <Device No> -l\n"); - fprintf(fp, " : xvsec -h/-H\n"); - fprintf(fp, " : xvsec -v\n\n"); - fprintf(fp, "Options:\n"); - fprintf(fp, - "\t-h/H\t\t\tHelp\n" - "\t-b <bus_no>\tSpecify PCI bus no on which device sits\n" - "\t-F <dev_no>\tSpecify PCI device no on the bus\n" - "\t-c <cap_id>\tSpecify the capability ID\n" - "\t-l \t\tList the supported Xilinx VSECs\n" - "\t-v \t\tVerbose information of Device\n" - "\n"); -} - -static void ultrascale_help(FILE *fp) -{ - fprintf(fp, - "US/US+ MCAP options(Ext Cap ID : 0xB, VSEC ID:0x0001, VSEC Rev : 0 or 1):\n" - "\t-p <file>\t Program Bitstream(.bin/.bit/.rbt)\n" - "\t-C <file>\t Partial Reconfig Clear File(.bin/.bit/.rbt)\n" - "\t-r\t\t Performs Simple Reset\n" - "\t-m\t\t Performs Module Reset\n" - "\t-f\t\t Performs Full Reset\n" - "\t-D\t\t Read Data Registers\n" - "\t-d\t\t Dump all the MCAP Registers\n" - "\t-o\t\t Dump FPGA Config Registers\n" - "\t-a <byte offset> [type [data]] Access the MCAP Registers\n" - "\t\t here type[data] - b for byte data [8 bits]\n" - "\t\t here type[data] - h for half word data [16 bits]\n" - "\t\t here type[data] - w for word data [32 bits]\n" - "\t-s <register no> [w [data]] Access FPGA Config Registers\n" - "\t\t here [w [data]] - Write operation with data\n" - "\t\t - Read Operation if 'w' not given\n" - "\t\t " - "\n"); -} - -static void versal_help(FILE *fp) -{ - fprintf(fp, - "VERSAL MCAP options(Ext Cap ID : 0xB, VSEC ID:0x0001, VSEC Rev : 2):\n" - "\t-m\t\t Performs Module Reset\n" - "\t-d\t\t Print the contents of the MCAP Registers\n" - "\t-p mode <32b/128b> type <fixed/incr> <address> <file> [tr_mode <slow/fast>] [sbi <address>] Download the specified File (.pdi) at given address\n" - "\t \tmode <32b> - 32-bit mode should be used\n" - "\t \tmode <128b> - 128-bit mode should be used\n" - "\t \ttype <fixed> - Address is fixed\n" - "\t \ttype <incr> - Address should be incremented based on specified mode\n" - "\t \ttr_mode - optional slow/fast download mode option\n" - "\t \tsbi <address> - required if download target is SBI and the address must be provided\n" - "\t-t type <fixed/incr> <address> <len> <file> Read the contents at given address for the given len into given file\n" - "\t \ttype <fixed> - Address is fixed\n" - "\t \ttype <incr> - Address should be incremented based on specified mode\n" - "\t-a <byte offset> [type [data]] Access the MCAP Registers\n" - "\t \there type[data] - b for byte data [8 bits]\n" - "\t \there type[data] - h for half word data [16 bits]\n" - "\t \there type[data] - w for word data [32 bits]\n" - "\t-x [mode <32b/128b>] <address> [w [data]] Access the AXI Registers\n" - "\t \t[mode <32b/128b>] - here mode is valid only for 32b/128b write\n" - "\t \t - Not valid for Read Operation\n" - "\t \there [w [data]] - Write operation with data\n" - "\t \t - Read Operation if 'w' not given\n" - "\t-q [axi_cache <data> axi_prot <data>] Set the AXI cache and protections bits\n" - "\t - axi_cache valid range 0 to 15, axi_prot valid range 0 to 7\n" - "\t\t " - "\n"); -} - -static void usage(FILE *fp) -{ - xvsec_common_help(fp); - ultrascale_help(fp); - versal_help(fp); -} - -static int execute_xvsec_help_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - - if(args == NULL) - return XVSEC_FAILURE; - - if(args->help.flag == false) - return XVSEC_FAILURE; - - usage(stdout); - - return 0; -} - -static int execute_xvsec_verbose_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if((xvsec_handle == NULL) || (args == NULL)) - return XVSEC_FAILURE; - - if(args->verbose.flag == false) - return XVSEC_FAILURE; - - - fprintf(stdout, "%s", version); - ret = xvsec_show_device(xvsec_handle); - if(ret < 0) - { - fprintf(stderr, "xvsec_show_device failed " - "with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - - return 0; -} - -static int execute_xvsec_list_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - uint16_t index; - - if((xvsec_handle == NULL) || (args == NULL)) - return XVSEC_FAILURE; - - if(args->list_caps.flag == false) - return XVSEC_FAILURE; - - memset(&args->list_caps.cap_list, 0, sizeof(xvsec_cap_list_t)); - ret = xvsec_get_cap_list(xvsec_handle, &args->list_caps.cap_list); - if(ret < 0) - { - fprintf(stderr, "xvsec_get_cap_list failed with error %d(%s) " - "handle : 0x%lX\n", ret, error_codes[-ret], - *xvsec_handle); - return 0; - } - - fprintf(stdout, "No of Supported Extended capabilities : %d\n", - args->list_caps.cap_list.no_of_caps); - - - fprintf(stdout, "VSEC ID\t\tVSEC Rev\tVSEC Name\tDriver Support\n"); - fprintf(stdout, "-------\t\t--------\t---------\t--------------\n"); - for(index = 0; index < args->list_caps.cap_list.no_of_caps; index++) - { - fprintf(stdout, "0x%04X\t\t0x%04X\t\t%-9s\t%-14s\n", - args->list_caps.cap_list.cap_info[index].cap_id, - args->list_caps.cap_list.cap_info[index].rev_id, - args->list_caps.cap_list.cap_info[index].cap_name, - (args->list_caps.cap_list.cap_info[index].is_supported ? "Yes" : "No")); - } - - return 0; -} - -static int validate_capability(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - uint16_t index; - bool is_capable; - xvsec_cap_list_t cap_list; - - if(args->cap_id == 0xFFFF) - { - fprintf(stderr, "ERROR: Capability ID(-c) " - "argument is missing\n"); - return XVSEC_ERR_CAPABILITY_ID_MISSING; - } - - memset(&cap_list, 0, sizeof(xvsec_cap_list_t)); - ret = xvsec_get_cap_list(xvsec_handle, &cap_list); - if(ret < 0) - { - fprintf(stderr, "xvsec_get_cap_list failed with error %d(%s) " - "handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - return ret; - } - - is_capable = false; - for(index = 0; index < cap_list.no_of_caps; index++) - { - if(cap_list.cap_info[index].cap_id == args->cap_id) - { - is_capable = true; - } - } - - if(is_capable == false) - { - fprintf(stderr, "ERROR: Capability ID(-c) %d " - "is not supported\n", args->cap_id); - return XVSEC_ERR_CAPABILITY_NOT_SUPPORTED; - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - int ret = 0, sts = 0; - int no_of_devices = 2; /* no_of_devices: Need 2 user_ctx to handle two character dev for each target */ - xvsec_handle_t xvsec_handle = -1; - xvsec_handle_t xvsec_handle_mcap = -1; - struct args args; - enum xvsec_operation op; - enum mcap_operation mcap_op; - - if (getuid() != 0) - { - fprintf(stderr, "%s : Please run in sudo mode\n", argv[0]); - return XVSEC_FAILURE; - } - - /* Check for arguments validity */ - if(argc < 2) - { - usage(stderr); - return XVSEC_FAILURE; - } - - signal(SIGSEGV, SignalHandler); - - memset(&args, 0, sizeof(struct args)); - args.bus_no = 0xFFFF; - args.dev_no = 0xFFFF; - args.cap_id = 0xFFFF; - args.rev_id.mrev = XVSEC_INVALID_MCAP_REVISION; - /* Parse the arguments */ - sts = parse_arguments(argc, argv, &args); - if(sts < 0) { - fprintf(stderr, "parse_arguments failed\n"); - return XVSEC_FAILURE; - } - - if (args.parse_err == true) { - fprintf(stderr, "Given Invalid Argument combination\n\n"); - usage(stderr); - return XVSEC_FAILURE; - } - - sts = xvsec_ops[XVSEC_HELP].execute(NULL, &args); - if(sts == 0) - { - return 0; - } - - /* Check for mandatory options provided in arguments list */ - if((args.bus_no == 0xFFFF) || (args.dev_no == 0xFFFF)) - { - fprintf(stderr, "ERROR: bus number(-b), device number(-F), " - "options are mandatory\n"); - return XVSEC_FAILURE; - } - - sts = xvsec_lib_init(no_of_devices); - if(sts < 0) - { - ret = sts; - fprintf(stderr, "xvsec_lib_init failed with error %d(%s)\n", - ret, error_codes[-ret]); - return ret; - } - - /* open system call for XVSEC character driver */ - memset(&xvsec_handle, 0, sizeof(xvsec_handle)); - sts = xvsec_open(args.bus_no, args.dev_no, &xvsec_handle, XVSEC_DEV_STR); - if(sts < 0) - { - ret = sts; - fprintf(stderr, "xvsec_handle: xvsec_open failed with error %d(%s) " - "for bus no : %d, device no : %d\n", - ret, error_codes[-ret], args.bus_no, args.dev_no); - goto CLEANUP0; - } - - /* Execute commonly Supported XVSEC Operations if requested */ - for(op = XVSEC_VERBOSE; xvsec_ops[op].execute != NULL; op++) - { - sts = xvsec_ops[op].execute(&xvsec_handle, &args); - if(sts == 0) - { - goto CLEANUP1; - } - } - - sts = validate_capability(&xvsec_handle, &args); - if(sts < 0) - { - ret = sts; - goto CLEANUP1; - } - - if(args.cap_id == MCAP_CAP_ID) - { - /* open system call for MCAP character driver */ - memset(&xvsec_handle_mcap, 0, sizeof(xvsec_handle_mcap)); - sts = xvsec_open(args.bus_no, args.dev_no, &xvsec_handle_mcap, XVSEC_MCAP_DEV_STR); - if(sts < 0) - { - ret = sts; - fprintf(stderr, "xvsec_handle_mcap: MCAP xvsec_open failed with error %d(%s) " - "for bus no : %d, device no : %d\n", - ret, error_codes[-ret], args.bus_no, args.dev_no); - - sts = xvsec_close(&xvsec_handle); - if(sts < 0) - { - ret = sts; - fprintf(stderr, "xvsec_handle: xvsec_close failed with error %d(%s) " - "for bus no : %d, device no : %d\n", ret, - error_codes[-ret], args.bus_no, args.dev_no); - } - - goto CLEANUP1; - } - - sts = xvsec_lib_get_mcap_revision(&xvsec_handle_mcap, (uint8_t *)&args.rev_id.mrev); - - if( sts != XVSEC_SUCCESS ) - { - fprintf(stderr, "Failed to get MCAP version with sts: %d\n", sts); - goto CLEANUP1; - } - else - { - fprintf(stdout, "MCAP version: %d\n", args.rev_id.mrev); - } - - /*parse args dependent on mcap version*/ - sts = parse_mcap_arguments(argc, argv, &args); - if(sts != XVSEC_SUCCESS) - { - ret = sts; - goto CLEANUP1; - } - - for(mcap_op = MCAP_RESET; - mcap_ops[mcap_op].execute != NULL; mcap_op++) - { - sts = mcap_ops[mcap_op].execute(&xvsec_handle_mcap, &args); - if(sts == 0) - { - break; - } - } - - if(mcap_ops[mcap_op].execute == NULL) - { - fprintf(stderr, "ERR : Invalid Command Given\n"); - goto CLEANUP1; - } - } - -CLEANUP1: - if (xvsec_handle != (xvsec_handle_t)(-1)) { - sts = xvsec_close(&xvsec_handle); - if(sts < 0) - { - ret = sts; - fprintf(stderr, "xvsec_close failed with error %d(%s) " - "for bus no : %d, device no : %d\n", ret, - error_codes[-ret], args.bus_no, args.dev_no); - } - } - - if (xvsec_handle_mcap != (xvsec_handle_t)(-1)) { - sts = xvsec_close(&xvsec_handle_mcap); - if(sts < 0) - { - ret = sts; - fprintf(stderr, "xvsec_close for mcap failed with " - "error %d(%s) for bus no : %d, device no : %d\n", - ret, error_codes[-ret], args.bus_no, args.dev_no); - } - } - - -CLEANUP0: - sts = xvsec_lib_deinit(); - if(sts < 0) - { - ret = sts; - fprintf(stderr, "xvsec_lib_deinit failed with error %d(%s)\n", - ret, error_codes[-ret]); - } - return ret; -} diff --git a/XVSEC/linux-kernel/tools/main.h b/XVSEC/linux-kernel/tools/main.h deleted file mode 100644 index 2ccb010..0000000 --- a/XVSEC/linux-kernel/tools/main.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * This file is part of the XVSEC userspace application - * to enable the user to execute the XVSEC functionality - * - * Copyright (c) 2018-2022 Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - - -#ifndef __MAIN_H__ -#define __MAIN_H__ - -#define XVSEC_DEV_STR "" /*string to append for character device str i.e. /dev/xvsec0300 */ -#define XVSEC_MCAP_DEV_STR "_mcap" /*string to append for character device str i.e. /dev/xvsec0300_mcap */ - -struct help_args { - bool flag; -}; - -struct verbose_args { - bool flag; -}; - -struct list_caps_args { - bool flag; - xvsec_cap_list_t cap_list; -}; - -struct mcap_reset_args { - bool flag; -}; - -struct mcap_module_reset_args { - bool flag; -}; - -struct mcap_full_reset_args { - bool flag; -}; - -struct mcap_data_dump_args { - bool flag; - uint32_t mcap_data_reg[4]; -}; - -struct mcap_reg_dump_args { - bool flag; - xvsec_mcap_regs_t mcap_regs; -}; - -struct fpga_cfg_reg_dump_args { - bool flag; - xvsec_fpga_cfg_regs_t fpga_cfg_regs; -}; - -struct mcap_access_reg { - bool flag; - bool write; - char access_type; - uint16_t offset; - uint32_t data; -}; - -struct fpga_cfg_access_reg { - bool flag; - bool write; - char cmd; - uint16_t offset; - uint32_t data; -}; - -struct mcap_program_bitstream { - bool flag; - char *abs_clr_file; - char *abs_bit_file; -}; - -struct mcap_axi_access_reg { - bool flag; - bool write; - axi_access_mode_t mode; - uint32_t address; - uint32_t data[4]; -}; - -struct mcap_file_download { - bool flag; - bool is_fixed_addr; - bool is_128b_mode; - uint32_t sbi_addr; - char *file_name; - uint32_t dev_addr; - data_transfer_mode_t tr_mode; -}; - -struct mcap_file_upload { - bool flag; - bool is_fixed_addr; - char *file_name; - uint32_t dev_addr; - size_t length; -}; - -/* enum MCAP version info */ -enum mcap_revision { - XVSEC_MCAP_US = 0, - XVSEC_MCAP_USPLUS, - XVSEC_MCAP_VERSAL, - XVSEC_INVALID_MCAP_REVISION, -}; - -struct rev_id_st{ - bool flag; - /* MCAP revision info */ - enum mcap_revision mrev; -}; - -struct mcap_axi_cache_attr{ - bool flag; - /* MCAP cache attributes */ - axi_cache_attr_t attr; -}; - -struct args { - uint16_t bus_no; - uint16_t dev_no; - uint16_t cap_id; - bool parse_err; - struct help_args help; - struct verbose_args verbose; - struct list_caps_args list_caps; - struct mcap_reset_args reset; - struct mcap_module_reset_args module_reset; - struct mcap_full_reset_args full_reset; - struct mcap_data_dump_args data_dump; - struct mcap_reg_dump_args reg_dump; - struct fpga_cfg_reg_dump_args fpga_reg_dump; - struct mcap_access_reg access_reg; - struct fpga_cfg_access_reg fpga_access_reg; - struct mcap_program_bitstream program; - struct mcap_file_download download; - struct mcap_file_upload upload; - struct rev_id_st rev_id; - struct mcap_axi_access_reg access_axi_reg; - struct mcap_axi_cache_attr axi_cache_settings; -}; - -enum xvsec_operation { - XVSEC_HELP = 0, - XVSEC_VERBOSE, - XVSEC_LIST_VSECS, - XVSEC_OP_END -}; - -struct xvsec_ops { - enum xvsec_operation op; - int (*execute)(xvsec_handle_t *xvsec_handle, struct args *args); -}; - -#endif /* __MAIN_H__ */ diff --git a/XVSEC/linux-kernel/tools/mcap_ops.c b/XVSEC/linux-kernel/tools/mcap_ops.c deleted file mode 100644 index 8426740..0000000 --- a/XVSEC/linux-kernel/tools/mcap_ops.c +++ /dev/null @@ -1,753 +0,0 @@ -/* - * This file is part of the XVSEC userspace application - * to enable the user to execute the XVSEC functionality - * - * Copyright (c) 2020-2022 Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include <stdbool.h> -#include <unistd.h> -#include <limits.h> -#include <signal.h> -#include <execinfo.h> - -#include "version.h" -#include "xvsec.h" -#include "main.h" -#include "mcap_ops.h" - -/* US/US+ MCAP registers display strings */ -static const char *MCAP_reg_names[] = { - "Ext Capability", - "VSEC Header", - "FPGA JTAG ID", - "FPGA BitStream Ver", - "Status", - "Control", - "FPGA Write Data", - "FPGA Read Data[0]", - "FPGA Read Data[1]", - "FPGA Read Data[2]", - "FPGA Read Data[3]", -}; - -static const char *MCAP_sts_fields[] = { - "MCAP Error", - "MCAP EOS", - "MCAP Read Complete", - "MCAP Read Count", - "MCAP FIFO Overflow", - "MCAP FIFO Occupancy", - "Req for MCAP Release" -}; - -static const char *MCAP_ctl_fields[] = { - "MCAP Enable", - "MCAP Read Enable", - "MCAP Reset", - "MCAP Module Reset", - "Req for MCAP by PCIe", - "MCAP Design Switch", - "Write Data Reg Enable" -}; - -static const char *fpga_cfg_reg_names[] = { - "crc", "far", "fdri", "fdro", - "cmd", "ctl0", "mask", "stat", - "lout", "cor0", "mfwr", "cbc", - "idcode", "axss", "cor1", "wbstar", - "timer", "scratchpad", "bootsts", "ctl1", - "bspi" -}; - -static const uint32_t fpga_cfg_reg_num[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, - 0x05, 0x06, 0x07, 0x08, 0x09, - 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, - 0x10, 0x11, 0x14, 0x16, 0x18, - 0x1F -}; - -/* Versal MCAP registers display strings */ -static const char *MCAPV2_reg_names[] = { - "Ext Capability", - "VSEC Header", - "Status", - "Control", - "MCAP RW Addr Register", - "MCAP Write Data", - "MCAP Read Data", -}; - -static const char *MCAPV2_sts_fields[] = { - "MCAP Read/Write Status", - "MCAP Read Complete", - "MCAP FIFO Occupancy", - "MCAP Write FIFO Full", - "Write FIFO Almost Full", - "Write FIFO Almost Empty", - "MCAP Write FIFO Empty", - "Write FIFO Overflow" -}; - -static const char *MCAPV2_ctl_fields[] = { - "MCAP Read Enable", - "MCAP Write Enable", - "MCAP 128-bit Mode", - "MCAP Reset", - "MCAP AXI Cache", - "MCAP AXI Protect" -}; - -static int execute_mcap_reset_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_module_reset_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_full_reset_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_data_regs_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_get_revision_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_regs_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_fpga_cfg_regs_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_access_reg_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_fpga_cfg_access_reg_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_program_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_access_axi_reg_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_file_download_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_file_upload_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); -static int execute_mcap_set_axi_cache_attr_cmd(xvsec_handle_t *xvsec_handle, - struct args *args); - - -static void print_mcap_sts_fields(uint32_t val); -static void print_mcap_ctl_fields(uint32_t val); - -static void print_mcapv2_sts_fields(uint32_t val); -static void print_mcapv2_ctl_fields(uint32_t val); - -struct mcap_ops mcap_ops[] = { - {MCAP_RESET, execute_mcap_reset_cmd }, - {MCAP_MODULE_RESET, execute_mcap_module_reset_cmd }, - {MCAP_FULL_RESET, execute_mcap_full_reset_cmd }, - {MCAP_GET_REVISION, execute_mcap_get_revision_cmd }, - {MCAP_GET_DATA_REGS, execute_mcap_data_regs_cmd }, - {MCAP_GET_REGS, execute_mcap_regs_cmd }, - {MCAP_GET_FPGA_CFG_REGS, execute_mcap_fpga_cfg_regs_cmd }, - {MCAP_ACCESS_REG, execute_mcap_access_reg_cmd }, - {MCAP_ACCESS_FPGA_CFG_REG, execute_mcap_fpga_cfg_access_reg_cmd }, - {MCAP_PROGRAM_BITSTREAM, execute_mcap_program_cmd }, - {MCAP_ACCESS_AXI_REG, execute_mcap_access_axi_reg_cmd }, - {MCAP_FILE_DOWNLOAD, execute_mcap_file_download_cmd }, - {MCAP_FILE_UPLOAD, execute_mcap_file_upload_cmd }, - {MCAP_SET_AXI_CACHE_ATTR, execute_mcap_set_axi_cache_attr_cmd}, - {MCAP_OP_END, NULL } -}; - -static int execute_mcap_reset_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if(args->reset.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_reset(xvsec_handle); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_reset failed " - "with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - else - { - fprintf(stdout, "Configuration Logic Reset Successful\n"); - } - - return 0; -} - -static int execute_mcap_module_reset_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if(args->module_reset.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_module_reset(xvsec_handle); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_module_reset " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - else - { - fprintf(stdout, "MCAP Module Reset Successful\n"); - } - - return 0; -} - -static int execute_mcap_full_reset_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if(args->full_reset.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_full_reset(xvsec_handle); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_full_reset failed " - "with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - else - { - fprintf(stdout, "Both Configuration Logic & " - "MCAP Module Reset Successful\n"); - } - - return 0; -} - - -static int execute_mcap_get_revision_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if(args->rev_id.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_get_revision(xvsec_handle, - &args->rev_id.mrev); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_get_revision " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - return ret; -} - -static int execute_mcap_set_axi_cache_attr_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if(args->axi_cache_settings.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_set_axi_cache_attr(xvsec_handle, - &args->axi_cache_settings.attr); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_set_axi_cache_attr " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - return ret; -} - - -static int execute_mcap_data_regs_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if(args->data_dump.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_get_data_registers(xvsec_handle, - &args->data_dump.mcap_data_reg[0]); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_get_data_registers " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - else - { - fprintf(stdout, "BYTE OFFSET\tRegister Name" - "\t\tData Value\n"); - fprintf(stdout, "-----------\t----------------" - "\t----------\n"); - fprintf(stdout, "0x001C\t\tFPGA Read Data[0]\t" - "0x%08X\n", args->data_dump.mcap_data_reg[0]); - fprintf(stdout, "0x0020\t\tFPGA Read Data[1]\t" - "0x%08X\n", args->data_dump.mcap_data_reg[1]); - fprintf(stdout, "0x0024\t\tFPGA Read Data[2]\t" - "0x%08X\n", args->data_dump.mcap_data_reg[2]); - fprintf(stdout, "0x0028\t\tFPGA Read Data[3]\t" - "0x%08X\n", args->data_dump.mcap_data_reg[3]); - } - return 0; -} - -static int execute_mcap_regs_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - uint16_t index; - uint16_t reg_count; - uint32_t *reg_value; - - if(args->reg_dump.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_get_registers(xvsec_handle, &args->reg_dump.mcap_regs); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_get_registers " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - else - { - reg_count = sizeof(args->reg_dump.mcap_regs)/sizeof(uint32_t); - if(args->rev_id.mrev == XVSEC_MCAP_VERSAL) { - reg_count = sizeof(args->reg_dump.mcap_regs.v2)/sizeof(uint32_t); - reg_value = (uint32_t *)&args->reg_dump.mcap_regs.v2 ; - } - else { - reg_count = sizeof(args->reg_dump.mcap_regs.v1)/sizeof(uint32_t); - reg_value = (uint32_t *)&args->reg_dump.mcap_regs.v1; - } - - fprintf(stdout, "BYTE OFFSET\tRegister Name\t\tData Value\n"); - fprintf(stdout, "-----------\t----------------\t----------\n"); - - if(args->rev_id.mrev == XVSEC_MCAP_VERSAL) - { - for(index = 0; index < reg_count; index++) - { - fprintf(stdout, "0x%04X\t\t%-20s\t0x%08X\n", - index*4, MCAPV2_reg_names[index], reg_value[index]); - if((index*4) == MCAPV2_STS_REG_OFFSET) - print_mcapv2_sts_fields(reg_value[index]); - if((index*4) == MCAPV2_CTL_REG_OFFSET) - print_mcapv2_ctl_fields(reg_value[index]); - } - } - else - { - for(index = 0; index < reg_count; index++) - { - - fprintf(stdout, "0x%04X\t\t%-20s\t0x%08X\n", - index*4, MCAP_reg_names[index], reg_value[index]); - if((index*4) == MCAP_STS_REG_OFFSET) - print_mcap_sts_fields(reg_value[index]); - if((index*4) == MCAP_CTL_REG_OFFSET) - print_mcap_ctl_fields(reg_value[index]); - } - } - } - return 0; -} - -static int execute_mcap_fpga_cfg_regs_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - uint16_t index; - uint16_t reg_count; - uint32_t *reg_value; - - if(args->fpga_reg_dump.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_get_fpga_registers( - xvsec_handle, &args->fpga_reg_dump.fpga_cfg_regs); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_get_fpga_registers " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - else - { - reg_count = sizeof(fpga_cfg_reg_num)/sizeof(uint32_t); - reg_value = (uint32_t *)&args->fpga_reg_dump.fpga_cfg_regs.v1; /* fpga cfg for US/US+ devices */ - - fprintf(stdout, "FPGA CFG Registers Dump " - "(see Configuration User Guide for " - "more details)\n\n"); - fprintf(stdout, "Register No\tRegister Name\t\tData Value\n"); - fprintf(stdout, "-----------\t----------------\t----------\n"); - - for(index = 0; index < reg_count; index++) - { - fprintf(stdout, "0x%04X\t\t%-20s\t0x%08X\n", - fpga_cfg_reg_num[index], - fpga_cfg_reg_names[index], - reg_value[index]); - } - } - - return 0; -} - -static int execute_mcap_access_reg_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - access_type_t access; - char print_buf[200]; - - if(args->access_reg.flag == false) - return XVSEC_FAILURE; - - if(args->access_reg.access_type == 'b') - access = ACCESS_BYTE; - else if(args->access_reg.access_type == 'h') - access = ACCESS_SHORT; - else - access = ACCESS_WORD; - - ret = xvsec_mcap_access_config_reg(xvsec_handle, - args->access_reg.offset, - (void *)&args->access_reg.data, - access, - args->access_reg.write); - if(ret < 0) - { - if(ret == XVSEC_ERR_INVALID_OFFSET_ACCESS_COMBO) - { - fprintf(stderr, "Error : The Address " - "specified is invalid for " - "the access type \'%c\'\n", - args->access_reg.access_type); - } - else if(ret == XVSEC_ERR_INVALID_OFFSET) - { - fprintf(stderr, "Error : The specified " - "VSEC offset of 0x%X is " - "not Valid.\nUse the -d option to " - "dump supported VSEC " - "registers.\n", args->access_reg.offset); - } - else - { - fprintf(stderr, - "xvsec_mcap_access_config_reg " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - } - else - { - char* dstr = NULL; - if(args->rev_id.mrev == XVSEC_MCAP_VERSAL) - dstr = (char*)MCAPV2_reg_names[args->access_reg.offset/4]; - else - dstr = (char*)MCAP_reg_names[args->access_reg.offset/4]; - - if(access == ACCESS_WORD) - { - snprintf(print_buf, 200, "0x%04X\t\t%-20s\t0x%08X\n", - args->access_reg.offset, - dstr, - args->access_reg.data); - } - else if(access == ACCESS_SHORT) - { - snprintf(print_buf, 200, "0x%04X\t\t%-20s\t0x%04X\n", - args->access_reg.offset, - dstr, - args->access_reg.data); - } - else if(access == ACCESS_BYTE) - { - snprintf(print_buf, 200, "0x%04X\t\t%-20s\t0x%02X\n", - args->access_reg.offset, - dstr, - args->access_reg.data); - } - fprintf(stdout, "BYTE OFFSET\tRegister Name\t\tData Value\n"); - fprintf(stdout, "-----------\t----------------\t----------\n"); - fprintf(stdout, "%s", print_buf); - } - - return 0; -} - -static int execute_mcap_fpga_cfg_access_reg_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - uint16_t index; - uint16_t reg_count; - - if(args->fpga_access_reg.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_access_fpga_config_reg( - xvsec_handle, args->fpga_access_reg.offset, - (void *)&args->fpga_access_reg.data, - args->fpga_access_reg.write); - if(ret < 0) - { - if(ret == XVSEC_ERR_INVALID_FPGA_REG_NUM) - { - fprintf(stderr, "Error : The specified " - "configuration register offset of 0x%X is " - "not Valid.\nUse the -o option to " - "dump supported FPGA configuration " - "registers.\n", args->fpga_access_reg.offset); - } - else - { - fprintf(stderr, - "xvsec_mcap_access_fpga_config_reg " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - } - } - else - { - reg_count = sizeof(fpga_cfg_reg_num)/sizeof(uint32_t); - for(index = 0; index < reg_count; index++) - { - if(fpga_cfg_reg_num[index] == - args->fpga_access_reg.offset) - { - break; - } - } - if(index == reg_count) - { - fprintf(stderr, "Error : The specified " - "configuration register offset of 0x%X is " - "not Valid.\nUse the -o option to " - "dump supported FPGA configuration " - "registers.\n", args->fpga_access_reg.offset); - ret = XVSEC_ERR_INVALID_FPGA_REG_NUM; - goto CLEANUP; - } - - fprintf(stdout, "Register No\tRegister Name\t\tData Value\n"); - fprintf(stdout, "-----------\t----------------\t----------\n"); - - fprintf(stdout, "0x%04X\t\t%-20s\t0x%08X\n", - fpga_cfg_reg_num[index], - fpga_cfg_reg_names[index], - args->fpga_access_reg.data); - } -CLEANUP: - return ret; -} - - -static int execute_mcap_access_axi_reg_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if(args->access_axi_reg.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_access_axi_reg( - xvsec_handle, args->access_axi_reg.address, - (void *)&args->access_axi_reg.data, - args->access_axi_reg.write, args->access_axi_reg.mode); - - if(ret < 0) - { - fprintf(stderr, - "xvsec_mcap_access_axi_reg " - "failed with error %d(%s) handle : 0x%lX\n", - ret, error_codes[-ret], *xvsec_handle); - - goto CLEANUP; - } - - fprintf(stdout, "axi address:\tData Value\n"); - fprintf(stdout, "------------\t----------\n"); - - fprintf(stdout, "0x%08X:\t0x%08X\n", args->access_axi_reg.address, args->access_axi_reg.data[0]); - if((args->access_axi_reg.write == true) && (args->access_axi_reg.mode == XVSEC_MCAP_AXI_MODE_128B)) - { - fprintf(stdout, "0x%08X:\t0x%08X\n", args->access_axi_reg.address + 0x4, args->access_axi_reg.data[1]); - fprintf(stdout, "0x%08X:\t0x%08X\n", args->access_axi_reg.address + 0x8, args->access_axi_reg.data[2]); - fprintf(stdout, "0x%08X:\t0x%08X\n", args->access_axi_reg.address + 0xc, args->access_axi_reg.data[3]); - } - -CLEANUP: - return ret; -} - -static int execute_mcap_program_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - - if(args->program.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_configure_fpga(xvsec_handle, - args->program.abs_clr_file, - args->program.abs_bit_file); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_configure_fpga " - "failed with error %d(%s) clear_file:%s, " - "bit_file:%s, handle : 0x%lX\n", ret, error_codes[-ret], - args->program.abs_clr_file, - args->program.abs_bit_file, *xvsec_handle); - } - else - { - fprintf(stdout, "FPGA configuration successful\n"); - } - - if(args->program.abs_clr_file != NULL) - free(args->program.abs_clr_file); - if(args->program.abs_bit_file != NULL) - free(args->program.abs_bit_file); - - return 0; -} - -/* US/US+ registers display strings */ -static void print_mcap_sts_fields(uint32_t val) -{ - xvsec_mcap_sts_reg_t *reg = (xvsec_mcap_sts_reg_t*)&val; - - fprintf(stdout, " bit 0\t%-20s\t%10d\n", MCAP_sts_fields[0], reg->v1.err); - fprintf(stdout, " bit 1\t%-20s\t%10d\n", MCAP_sts_fields[1], reg->v1.eos); - fprintf(stdout, " bit 4\t%-20s\t%10d\n", MCAP_sts_fields[2], reg->v1.read_complete); - fprintf(stdout, " bit 5:7\t%-20s\t%10d\n", MCAP_sts_fields[3], reg->v1.read_count); - fprintf(stdout, " bit 8\t%-20s\t%10d\n", MCAP_sts_fields[4], reg->v1.fifo_ovfl); - fprintf(stdout, " bit 12:15\t%-20s\t%10d\n", MCAP_sts_fields[5], reg->v1.fifo_occu); - fprintf(stdout, " bit 24\t%-20s\t%10d\n", MCAP_sts_fields[6], reg->v1.req4mcap_rel); -} - -static void print_mcap_ctl_fields(uint32_t val) -{ - xvsec_mcap_ctl_reg_t *reg = (xvsec_mcap_ctl_reg_t *)&val; - - fprintf(stdout, " bit 0\t%-20s\t%10d\n", MCAP_ctl_fields[0], reg->v1.enable); - fprintf(stdout, " bit 1\t%-20s\t%10d\n", MCAP_ctl_fields[1], reg->v1.rd_enable); - fprintf(stdout, " bit 4\t%-20s\t%10d\n", MCAP_ctl_fields[2], reg->v1.reset); - fprintf(stdout, " bit 5\t%-20s\t%10d\n", MCAP_ctl_fields[3], reg->v1.module_reset); - fprintf(stdout, " bit 8\t%-20s\t%10d\n", MCAP_ctl_fields[4], reg->v1.req4mcap_pcie); - fprintf(stdout, " bit 12\t%-20s\t%10d\n", MCAP_ctl_fields[5], reg->v1.cfg_desgn_sw); - fprintf(stdout, " bit 16\t%-20s\t%10d\n", MCAP_ctl_fields[6], reg->v1.wr_reg_enable); -} - -/* Versal MCAP registers display strings */ -static void print_mcapv2_sts_fields(uint32_t val) -{ - xvsec_mcap_sts_reg_t *reg = (xvsec_mcap_sts_reg_t*)&val; - - fprintf(stdout, " bit 5:4\t%-20s\t%10d\n", MCAPV2_sts_fields[0], reg->v2.rw_status); - fprintf(stdout, " bit 8\t%-20s\t%10d\n", MCAPV2_sts_fields[1], reg->v2.rd_complete); - fprintf(stdout, " bit 20:16\t%-20s\t%10d\n", MCAPV2_sts_fields[2], reg->v2.fifo_occupancy); - fprintf(stdout, " bit 21\t%-20s\t%10d\n", MCAPV2_sts_fields[3], reg->v2.wr_fifo_full); - fprintf(stdout, " bit 22\t%-20s\t%10d\n", MCAPV2_sts_fields[4], reg->v2.wr_fifo_almost_full); - fprintf(stdout, " bit 23\t%-20s\t%10d\n", MCAPV2_sts_fields[5], reg->v2.wr_fifo_almost_empty); - fprintf(stdout, " bit 24\t%-20s\t%10d\n", MCAPV2_sts_fields[6], reg->v2.wr_fifo_empty); - fprintf(stdout, " bit 25\t%-20s\t%10d\n", MCAPV2_sts_fields[7], reg->v2.wr_fifo_overflow); -} - -static void print_mcapv2_ctl_fields(uint32_t val) -{ - xvsec_mcap_ctl_reg_t *reg = (xvsec_mcap_ctl_reg_t *)&val; - - fprintf(stdout, " bit 0\t%-20s\t%10d\n", MCAPV2_ctl_fields[0], reg->v2.rd_enable); - fprintf(stdout, " bit 4\t%-20s\t%10d\n", MCAPV2_ctl_fields[1], reg->v2.wr_enable); - fprintf(stdout, " bit 5\t%-20s\t%10d\n", MCAPV2_ctl_fields[2], reg->v2.mode); - fprintf(stdout, " bit 8\t%-20s\t%10d\n", MCAPV2_ctl_fields[3], reg->v2.reset); - fprintf(stdout, " bit 19:16\t%-20s\t%10d\n", MCAPV2_ctl_fields[4], reg->v2.axi_cache); - fprintf(stdout, " bit 22:20\t%-20s\t%10d\n", MCAPV2_ctl_fields[5], reg->v2.axi_protect); -} - -static int execute_mcap_file_download_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - file_operation_status_t status = XVSEC_MCAP_FILE_OP_FAILED; - size_t err_index = 0; - - if(args->download.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_file_download(xvsec_handle, - args->download.is_fixed_addr, args->download.is_128b_mode, - args->download.file_name, args->download.dev_addr, - args->download.tr_mode, args->download.sbi_addr, &status, &err_index); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_file_download " - "failed with error %d(%s)\n", ret, error_codes[-ret]); - - if((args->download.tr_mode == XVSEC_MCAP_DATA_TR_MODE_FAST) && - ((status == XVSEC_MCAP_FILE_OP_FAIL_SLVERR) || - (status == XVSEC_MCAP_FILE_OP_FAIL_DECERR) || - (status == XVSEC_MCAP_FILE_OP_HW_BUSY) || - (status == XVSEC_MCAP_FILE_OP_FAILED))) { - fprintf(stdout, "Please try PDI transfer using download " - "option <tr_mode slow>, review option <sbi>, " - "and/or check hardware address mapping is correct\n"); - } - - } - else - { - fprintf(stdout, "File Download successful\n"); - } - - - return ret; -} - -static int execute_mcap_file_upload_cmd(xvsec_handle_t *xvsec_handle, - struct args *args) -{ - int ret = 0; - file_operation_status_t status; - size_t err_index; - - if(args->upload.flag == false) - return XVSEC_FAILURE; - - ret = xvsec_mcap_file_upload(xvsec_handle, - args->upload.is_fixed_addr,args->upload.file_name, - args->upload.dev_addr, args->upload.length, - &status, &err_index); - if(ret < 0) - { - fprintf(stderr, "xvsec_mcap_file_upload " - "failed with error %d(%s)\n", ret, error_codes[-ret]); - } - else - { - fprintf(stdout, "File Upload successful\n"); - } - - - return ret; -} diff --git a/XVSEC/linux-kernel/tools/mcap_ops.h b/XVSEC/linux-kernel/tools/mcap_ops.h deleted file mode 100644 index 7008801..0000000 --- a/XVSEC/linux-kernel/tools/mcap_ops.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the XVSEC userspace application - * to enable the user to execute the XVSEC functionality - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#ifndef __MCAP_OPS_H__ -#define __MCAP_OPS_H__ - -#define MCAP_CAP_ID (0x0001) -#define MCAP_STS_REG_OFFSET (0x10) -#define MCAP_CTL_REG_OFFSET (0x14) -#define MCAP_VSEC_HEADER_OFFSET (0x04) -#define MCAP_VSEC_REV_MASK (0xF0000) -#define MCAP_VSEC_REV_SHIFT (0x10) - -#define MCAPV2_STS_REG_OFFSET (0x08) -#define MCAPV2_CTL_REG_OFFSET (0x0C) - -enum mcap_operation { - MCAP_RESET = 0, - MCAP_MODULE_RESET, - MCAP_FULL_RESET, - MCAP_GET_REVISION, - MCAP_GET_DATA_REGS, - MCAP_GET_REGS, - MCAP_GET_FPGA_CFG_REGS, - MCAP_ACCESS_REG, - MCAP_ACCESS_FPGA_CFG_REG, - MCAP_PROGRAM_BITSTREAM, - MCAP_ACCESS_AXI_REG, - MCAP_FILE_DOWNLOAD, - MCAP_FILE_UPLOAD, - MCAP_SET_AXI_CACHE_ATTR, - MCAP_OP_END -}; - -struct mcap_ops { - enum mcap_operation op; - int (*execute)(xvsec_handle_t *xvsec_handle, struct args *args); -}; - -extern struct mcap_ops mcap_ops[]; - -#endif /* __MCAP_OPS_H__ */ diff --git a/XVSEC/linux-kernel/tools/version.h b/XVSEC/linux-kernel/tools/version.h deleted file mode 100644 index cbb9cc9..0000000 --- a/XVSEC/linux-kernel/tools/version.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * This file is part of the XVSEC userspace application - * to enable the user to execute the XVSEC functionality - * - * Copyright (c) 2018-2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#ifndef __XVSEC_TOOL_VERSION_H__ -#define __XVSEC_TOOL_VERSION_H__ - -#define __stringify1(x...) #x -#define __stringify(x...) __stringify1(x) - -#define XVSEC_TOOL_MODULE_NAME "xvsec" -#define XVSEC_TOOL_MODULE_DESC "Xilinx VSEC Tool" - -#define XVSEC_TOOL_VERSION_MAJOR 2020 -#define XVSEC_TOOL_VERSION_MINOR 2 -#define XVSEC_TOOL_VERSION_PATCH 1 - -#define XVSEC_TOOL_VERSION \ - __stringify(XVSEC_TOOL_VERSION_MAJOR) "." \ - __stringify(XVSEC_TOOL_VERSION_MINOR) "." \ - __stringify(XVSEC_TOOL_VERSION_PATCH) - -#define XVSEC_TOOL_VERSION_NUM \ - ((XVSEC_TOOL_VERSION_MAJOR)*1000 + \ - (XVSEC_TOOL_VERSION_MINOR)*100 + \ - XVSEC_TOOL_VERSION_PATCH) - -#endif /* ifndef __XVSEC_TOOL_VERSION_H__ */ diff --git a/XVSEC/linux-kernel/tools/xvsec_parser.c b/XVSEC/linux-kernel/tools/xvsec_parser.c deleted file mode 100644 index 9607463..0000000 --- a/XVSEC/linux-kernel/tools/xvsec_parser.c +++ /dev/null @@ -1,965 +0,0 @@ -/* - * This file is part of the XVSEC userspace application - * to enable the user to execute the XVSEC functionality - * - * Copyright (c) 2020-2022, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <string.h> -#include "xvsec.h" -#include "main.h" -#include "mcap_ops.h" -#include "xvsec_parser.h" -#include <libgen.h> - -static const char options[] = ":b:F:c:lp:C:rmfdvHhDoa:s:t:x:q:"; - -/* - * this is common for US/US+ and Versal devices. - * access-mcap-regs Option - */ -int parse_opt_a_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - - if(argv[optind] == NULL) - { - fprintf(stderr, "Access option " - "must be provided. Valid options are" - " \'b/h/w\'\n"); - args->parse_err = true; - goto CLEANUP; - } - if(argv[optind][1] != '\0') - { - fprintf(stderr, "Invalid Access option " - "provided %s (\'b/h/w\' are valid)\n", - argv[optind]); - args->parse_err = true; - goto CLEANUP; - } - args->access_reg.offset = - (uint16_t) strtoul(optarg, NULL, 0); - args->access_reg.access_type = - (char)argv[optind][0]; - - if((args->access_reg.access_type != 'b') && - (args->access_reg.access_type != 'h') && - (args->access_reg.access_type != 'w')) - { - fprintf(stderr, "Invalid Access option " - "provided %s (\'b/h/w\' are valid)\n", - argv[optind]); - args->parse_err = true; - goto CLEANUP; - } - - if(argv[optind + 1] != NULL) - { - args->access_reg.write = true; - args->access_reg.data = (uint32_t) - strtoul(argv[optind + 1], NULL, 0); - } - else - { - args->access_reg.write = false; - args->access_reg.data = 0x0; - } - - args->access_reg.flag = true; - -CLEANUP: - return ret; -} - -/* Access FPGA Config*/ -int parse_opt_s_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - - if (args->rev_id.mrev == XVSEC_MCAP_VERSAL) { - fprintf(stderr, "Access FPGA Config option is not " - "supported for Versal devices\n"); - args->parse_err = true; - goto CLEANUP; - } - args->fpga_access_reg.offset = - (uint16_t) strtoul(optarg, NULL, 0); - - if(argv[optind] == NULL) - { - args->fpga_access_reg.write = false; - args->fpga_access_reg.cmd = '\0'; - args->fpga_access_reg.data = 0x0; - args->fpga_access_reg.flag = true; - goto CLEANUP; - } - if(argv[optind + 1] == NULL) - { - args->parse_err = true; - goto CLEANUP; - } - args->fpga_access_reg.cmd = (char)argv[optind][0]; - if((args->fpga_access_reg.cmd == 'w') && \ - (argv[optind][1] == '\0')) - { - args->fpga_access_reg.write = true; - args->fpga_access_reg.data = (uint32_t) - strtoul(argv[optind + 1], NULL, 0); - } - else - { - fprintf(stderr, "Invalid option " - "provided %s (\'w\' is valid " - "option for write operation)\n", - argv[optind]); - args->parse_err = true; - goto CLEANUP; - } - printf("In -s option\n"); - args->fpga_access_reg.flag = true; - -CLEANUP: - return ret; -} - -/* program option */ -int parse_opt_p_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - if(args->rev_id.mrev == XVSEC_MCAP_VERSAL) - { - ret = parse_arguments_for_versal(argc, argv, args); - } - else - { - ret = parse_arguments_for_us(argc, argv, args); - } - - return ret; -} - -int parse_arguments_for_versal(int argc, char *argv[], struct args *args) -{ - int ret = 0; - uint16_t str_len; - char *file = NULL; - - if (argc < MAX_NO_OF_P_ARGS_FOR_VERSAL) { - fprintf(stderr, "Invalid number of arguments passed " - "for -p option: %d\n" - "Please enter valid arguments!\n", argc); - return XVSEC_FAILURE; - } - - if((optarg == NULL) || (argv[optind] == NULL)) { - ret = XVSEC_FAILURE; - goto CLEANUP; - } - args->download.flag = false; - - if (strncmp(optarg, "mode", sizeof("mode")) == 0) { - if (strncmp(argv[optind], "32b", sizeof("32b")) == 0) { - args->download.is_128b_mode = false; - } - else if (strncmp(argv[optind], "128b", sizeof("128b")) == 0) { - args->download.is_128b_mode = true; - } - else { - fprintf(stderr, "Invalid Mode provided, " - "Only 32b and 128b are valid\n"); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - } - - if((argv[optind + 1] == NULL) || (argv[optind + 2] == NULL)) { - ret = XVSEC_FAILURE; - goto CLEANUP; - } - - if (strncmp(argv[optind + 1], "type", sizeof("type")) == 0) { - if (strncmp(argv[optind + 2], "incr", sizeof("incr")) == 0) { - args->download.is_fixed_addr = false; - } - else if (strncmp(argv[optind + 2], "fixed", sizeof("fixed")) == 0) { - args->download.is_fixed_addr = true; - } - else { - fprintf(stderr, "Invalid Address type provided, " - "Only fixed and incr are valid\n"); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - } - - if(argv[optind + 3] == NULL) { - ret = XVSEC_FAILURE; - goto CLEANUP; - } - - args->download.dev_addr = (uint32_t) strtoul(argv[optind + 3], NULL, 0); - - str_len = strlen(argv[optind + 4]) + 1; - file = malloc(str_len * sizeof(char)); - if(file == NULL) - { - fprintf(stderr, "malloc failed while allocating" - " for size : %d\n", str_len); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - - snprintf(file, str_len, "%s", argv[optind + 4]); - - args->download.file_name = realpath(file, NULL); - if(args->download.file_name == NULL) - { - fprintf(stderr, "Absolute Path conversion " - "Failed for file with error : " - "%d(%s)\n", errno, strerror(errno)); - ret = XVSEC_FAILURE; - free(file); - goto CLEANUP; - } - - /*optional transfer mode and sbi parameters*/ - if((argv[optind + 5] == NULL)) { - args->download.tr_mode = XVSEC_MCAP_DATA_TR_MODE_FAST; - args->download.sbi_addr = 0xFFFFFFFF; - goto EXIT; - } - - if (strncmp(argv[optind + 5], "tr_mode", sizeof("tr_mode")) == 0) { - - if(argv[optind + 6] == NULL) { - fprintf(stderr, "Please enter valid transfer mode, " - "Only slow and fast are valid\n"); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - - if (strncmp(argv[optind + 6], "slow", sizeof("slow")) == 0) { - /*slow download mode*/ - args->download.tr_mode = XVSEC_MCAP_DATA_TR_MODE_SLOW; - } - else if (strncmp(argv[optind + 6], "fast", sizeof("fast")) == 0) { - /*fast download mode*/ - args->download.tr_mode = XVSEC_MCAP_DATA_TR_MODE_FAST; - } - else { - fprintf(stderr, "Invalid transfer mode provided, " - "Only slow and fast are valid\n"); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - fprintf(stdout, "tr_mode: %d\n", args->download.tr_mode); - } - else if (strncmp(argv[optind + 5], "sbi", sizeof("sbi")) == 0) - { - if(argv[optind + 6] == NULL) - { - fprintf(stderr, "Please enter valid address for sbi reg block\n"); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - else - { - args->download.sbi_addr = (uint32_t) strtoul(argv[optind + 6], NULL, 0); - } - } - - if((argv[optind + 7] == NULL)) { - args->download.sbi_addr = 0xFFFFFFFF; - goto EXIT; - } - - if (strncmp(argv[optind + 7], "sbi", sizeof("sbi")) == 0) - { - if(argv[optind + 8] == NULL) - { - fprintf(stderr, "Please enter valid address for sbi reg block\n"); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - else - { - args->download.sbi_addr = (uint32_t) strtoul(argv[optind + 8], NULL, 0); - } - } - -EXIT: - free(file); - args->download.flag = true; - -CLEANUP: - return ret; -} - -/* program option */ -int parse_arguments_for_us(int argc, char *argv[], struct args *args) -{ - int ret = 0; - uint16_t len; - char *bit_file = NULL; - - if (argc > MAX_NO_OF_P_ARGS_FOR_US) { - fprintf(stderr, "Invalid number of arguments passed " - "for -p option: %d\n" - "Please enter valid arguments!\n", argc); - return XVSEC_FAILURE; - } - - len = strlen(optarg) + 1; - bit_file = malloc(len*sizeof(char)); - if(bit_file == NULL) - { - fprintf(stderr, "malloc failed while allocating" - " for size : %d\n", len); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - snprintf(bit_file, len, "%s", optarg); - - args->program.abs_bit_file = realpath(bit_file, NULL); - if(args->program.abs_bit_file == NULL) - { - fprintf(stderr, "Absolute Path conversion " - "Failed for bit file with error : " - "%d(%s)\n", errno, strerror(errno)); - ret = XVSEC_FAILURE; - free(bit_file); - goto CLEANUP; - } - free(bit_file); - args->program.flag = true; - -CLEANUP: - return ret; -} - -/* Partial Reconfig Clear */ -int parse_opt_C_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - uint16_t len; - char *clear_file = NULL; - - len = strlen(optarg) + 1; - clear_file = malloc(len*sizeof(char)); - if(clear_file == NULL) - { - fprintf(stderr, "malloc failed while " - "allocating for size : %d\n", len); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - snprintf(clear_file, len, "%s", optarg); - - args->program.abs_clr_file = realpath(clear_file, NULL); - if(args->program.abs_clr_file == NULL) - { - fprintf(stderr, "Absolute Path conversion " - "Failed for clear file"); - ret = XVSEC_FAILURE; - free(clear_file); - goto CLEANUP; - } - free(clear_file); - args->program.flag = true; - -CLEANUP: - return ret; -} - -bool get_realpath(char* path, char *rpath) -{ - bool ret = false; - struct stat stats; - char* dirptr = NULL; - char* dirptr_abs_path = NULL; - char* fileptr = NULL; - char* dir = NULL; - char* filename = NULL; - int len = 0; - - if((path == NULL) || (rpath == NULL)) - return false; - - dirptr = strdup(path); - fileptr = strdup(path); - - if((dirptr == NULL) || (fileptr == NULL)) - { - if(dirptr != NULL) - free(dirptr); - - if(fileptr != NULL) - free(fileptr); - - return false; - } - - dir = dirname(dirptr); - filename = basename(fileptr); - - if((dir == NULL) || (filename == NULL)) - { - if(dir != NULL) - free(dir); - - if(filename != NULL) - free(filename); - - ret = false; - goto CLEANUP; - } - - (void)stat(dir, &stats); - len = 0; - - dirptr_abs_path = realpath(dirptr, NULL); - if ( S_ISDIR(stats.st_mode) & (dirptr_abs_path != NULL)) - { - len = strlen(dirptr_abs_path)+1; - if( (len + strlen(filename) + 1) >= MAX_FILE_LENGTH) - { - fprintf(stderr, "File Name is too long\n"); - goto CLEANUP_ABS_PATH; - } - - snprintf(rpath, len, "%s", dirptr_abs_path); - strcat(rpath, "/"); - strcat(rpath, filename); - ret = true; - } - -CLEANUP_ABS_PATH: - free(dirptr_abs_path); - -CLEANUP: - free(dirptr); - free(fileptr); - return ret; -} - - -/* - * retrieve argument - * - */ -int parse_opt_t_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - uint16_t str_len; - char *file = NULL; - char rpath[MAX_FILE_LENGTH]; - - if(args->rev_id.mrev != XVSEC_MCAP_VERSAL) - { - fprintf(stderr, "AXI --retrieve option is only " - "supported for Versal devices\n"); - return XVSEC_ERR_OPERATION_NOT_SUPPORTED; - } - - if((argv[optind] == NULL) || (argv[optind + 1] == NULL)) { - ret = XVSEC_FAILURE; - goto CLEANUP; - } - - if (strncmp(optarg, "type", sizeof("type")) == 0) { - if (strncmp(argv[optind], "incr", sizeof("incr")) == 0) { - args->upload.is_fixed_addr = false; - } - else if (strncmp(argv[optind], "fixed", sizeof("fixed")) == 0) { - args->upload.is_fixed_addr = true; - } - else { - fprintf(stderr, "Invalid Address type provided, " - "Only fixed and incr are valid\n"); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - } - - if(argv[optind+1] == NULL) { - ret = XVSEC_FAILURE; - goto CLEANUP; - } - - args->upload.dev_addr = (uint32_t) strtoul(argv[optind+1], NULL, 0); - args->upload.length = (size_t) strtoul(argv[optind+2], NULL, 0); - - str_len = strlen(argv[optind+3]) + 1; - file = malloc(str_len * sizeof(char)); - if(file == NULL) - { - fprintf(stderr, "malloc failed while allocating" - " for size : %d\n", str_len); - ret = XVSEC_FAILURE; - goto CLEANUP; - } - - snprintf(file, str_len, "%s", argv[optind+3]); - - args->upload.file_name = NULL; - memset(rpath, 0, MAX_FILE_LENGTH); - if(get_realpath(file, rpath) == true) - { - args->upload.file_name = rpath; - } - - if(args->upload.file_name == NULL) - { - fprintf(stderr, "Absolute Path conversion Failed" - " for file: %s\n", file); - ret = XVSEC_FAILURE; - free(file); - goto CLEANUP; - } - free(file); - args->upload.flag = true; - -CLEANUP: - return ret; -} - -/* - * Access the AXI Registers - * -x, --access-axi-regs [mode <32b/128b>] <address> [w [data]] - * - */ -int parse_opt_x_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - bool write_mode = false; - args->access_axi_reg.flag = false; - - if(args->rev_id.mrev != XVSEC_MCAP_VERSAL) - { - printf(" --access-axi-regs option is only supported for Versal devices\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - args->access_axi_reg.write = false; - - if(optarg != NULL) - { - if( strncmp(optarg, MODE_STR, sizeof(MODE_STR)) == 0) - { - if(argv[optind] != NULL) - { - if(strncmp(argv[optind], MODE_STR_32B, sizeof(MODE_STR_32B)) == 0) - { - args->access_axi_reg.mode = XVSEC_MCAP_AXI_MODE_32B; - } - else if(strncmp(argv[optind], MODE_STR_128B, sizeof(MODE_STR_128B)) == 0) - { - args->access_axi_reg.mode = XVSEC_MCAP_AXI_MODE_128B; - } - else - { - printf("Invalid mode parameters.\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - write_mode = true; - } - else - { - printf("Insufficient args for --access-axi-regs. Please enter valid mode parameters.\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - } - else - { - /*if mode is not given then it must be read operation*/ - if(optarg != NULL) - { - args->access_axi_reg.address = (int)strtol(optarg, NULL, 0); - args->access_axi_reg.mode = XVSEC_MCAP_AXI_MODE_32B; - goto READ_EXIT; - } - else - { - printf("Insufficient args for --access-axi-regs\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - } - } - if(argv[optind + 1] == NULL) - { - printf("Insufficient args for --access-axi-regs\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - if(argv[optind + 1] != NULL) - { - args->access_axi_reg.address = (int)strtol(argv[optind+1], NULL, 0); - } - else - { - printf("Error in address\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - /* this is optional */ - if(argv[optind + 2] != NULL) - { - if( strcmp(argv[optind + 2], "w") == 0) - { - if(argv[optind + 3] != NULL) - { - args->access_axi_reg.data[0] = (int)strtol(argv[optind+3], NULL, 0); - if(args->access_axi_reg.mode == XVSEC_MCAP_AXI_MODE_128B) /*expect 3 more args*/ - { - if((argv[optind + 4] != NULL) && (argv[optind + 5] != NULL) && (argv[optind + 6] != NULL)) - { - args->access_axi_reg.data[1] = (int)strtol(argv[optind+4], NULL, 0); - args->access_axi_reg.data[2] = (int)strtol(argv[optind+5], NULL, 0); - args->access_axi_reg.data[3] = (int)strtol(argv[optind+6], NULL, 0); - } - else - { - printf("Insufficient data to write. Please provide valid 128bit data to write\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - } - args->access_axi_reg.write = true; - } - else - { - printf("Insufficient args. Please provide valid data to write\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - } - } - - /*error check for mode and write parameters*/ - if((write_mode == true) && (args->access_axi_reg.write != true)) - { - printf("Insufficient args for write mode\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } -READ_EXIT: - args->access_axi_reg.flag = true; - -CLEANUP: - return ret; -} - - -/* - *Versal MCAP Cache and Protection settings - * - **/ -int parse_opt_q_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - int axi_cache = 0; - int axi_prot = 0; - - args->axi_cache_settings.flag = false; - - if(args->rev_id.mrev != XVSEC_MCAP_VERSAL) - { - printf(" --access-axi-regs option is only supported for Versal devices\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - if((optarg != NULL) && (argv[optind] != NULL)) - { - if( strncmp(optarg, CACHE_STR, sizeof(CACHE_STR)) == 0) - { - if(argv[optind] != NULL) - { - axi_cache = (int)strtol(argv[optind], NULL, 0); - printf("axi_cache: 0x%X\n", axi_cache); - if( axi_cache > 0xF ) - { - printf("please enter axi_cache in range 0-15\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - } - } - else - { - printf("Invalid args for --axi-cache-settings.\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - if((argv[optind + 1] == NULL) || (argv[optind + 2] == NULL)) - { - printf("Insufficient args for --axi-cache-settings.\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - if( strncmp(argv[optind + 1], PROT_STR, sizeof(PROT_STR)) == 0) - { - if(argv[optind + 2] != NULL) - { - axi_prot = (int)strtol(argv[optind + 2], NULL, 0); - printf("axi_prot: 0x%X\n", axi_prot); - if( axi_prot > 0x7 ) - { - printf("please enter axi_prot in range 0-7\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - } - } - else - { - printf("Invalid args for --axi-cache-settings.\n"); - ret = XVSEC_ERR_INVALID_PARAM; - goto CLEANUP; - } - - args->axi_cache_settings.attr.v2.axi_cache = axi_cache; - args->axi_cache_settings.attr.v2.axi_prot = axi_prot; - args->axi_cache_settings.flag = true; - } - -CLEANUP: - return ret; -} - -/* - * - * mcap parser function for the arguments - * dependent on the MCAP version - * - */ - -int parse_mcap_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - int opt; - - optind = 1; /* to reset the getopt*/ - - if(args == NULL) { - return XVSEC_FAILURE; - } - - if(args->cap_id != MCAP_CAP_ID) - { - args->parse_err = true; - goto CLEANUP; - } - - while ((opt = getopt(argc, argv, options)) != -1) { - if(opt == ':') - { - fprintf(stderr, "Parameters missing for the " - "Specified Option : %c\n", optopt); - args->help.flag = true; - break; - } - else if(opt == '?') - { - fprintf(stderr, "Invalid Option : %c\n", optopt); - args->help.flag = true; - break; - } - - switch (opt) { - case 'a': - ret = parse_opt_a_arguments(argc, argv, args); - break; - case 's': - ret = parse_opt_s_arguments(argc, argv, args); - break; - case 'p': - ret = parse_opt_p_arguments(argc, argv, args); - break; - case 't': - ret = parse_opt_t_arguments(argc, argv, args); - break; - case 'x': - ret = parse_opt_x_arguments(argc, argv, args); - break; - case 'C': - ret = parse_opt_C_arguments(argc, argv, args); - break; - case 'q': - ret = parse_opt_q_arguments(argc, argv, args); - break; - /* - * options already parsed - * in func parse_arguments() - * */ - case 'b': - case 'F': - case 'c': - case 'h': - case 'H': - case 'v': - case 'l': - case 'r': - case 'm': - case 'f': - case 'd': - case 'D': - case 'o': - break; - default: - fprintf(stderr, "Invalid Option :%c\n", opt); - args->help.flag = true; - break; - - } - } - - if((args->parse_err == true) || (ret != 0)) - { - if(args->program.abs_clr_file != NULL) - { - free(args->program.abs_clr_file); - args->program.abs_clr_file = NULL; - } - if(args->program.abs_bit_file != NULL) - { - free(args->program.abs_bit_file); - args->program.abs_bit_file = NULL; - } - } - -CLEANUP: - return ret; -} - -int parse_arguments(int argc, char *argv[], struct args *args) -{ - int ret = 0; - int opt; - - if(args == NULL) { - return XVSEC_FAILURE; - } - - while ((opt = getopt(argc, argv, options)) != -1) { - if(opt == ':') - { - fprintf(stderr, "Parameters missing for the " - "Specified Option : %c\n", optopt); - args->help.flag = true; - break; - } - else if(opt == '?') - { - fprintf(stderr, "Invalid Option : %c\n", optopt); - args->help.flag = true; - break; - } - - switch (opt) { - case 'b': - args->bus_no = (uint16_t) strtol(optarg, NULL, 16); - break; - case 'F': - args->dev_no = (uint16_t) strtol(optarg, NULL, 16); - break; - case 'c': - args->cap_id = (uint16_t) strtol(optarg, NULL, 16); - break; - case 'h': - case 'H': - args->help.flag = true; - break; - case 'v': - args->verbose.flag = true; - break; - case 'l': - args->list_caps.flag = true; - break; - case 'r': - if(args->cap_id != MCAP_CAP_ID) - { - args->parse_err = true; - break; - } - args->reset.flag = true; - break; - case 'm': - if(args->cap_id != MCAP_CAP_ID) - { - args->parse_err = true; - break; - } - args->module_reset.flag = true; - break; - case 'f': - if(args->cap_id != MCAP_CAP_ID) - { - args->parse_err = true; - break; - } - args->full_reset.flag = true; - break; - case 'D': - if(args->cap_id != MCAP_CAP_ID) - { - args->parse_err = true; - break; - } - args->data_dump.flag = true; - break; - case 'd': - if(args->cap_id != MCAP_CAP_ID) - { - args->parse_err = true; - break; - } - args->reg_dump.flag = true; - break; - case 'o': - if(args->cap_id != MCAP_CAP_ID) - { - args->parse_err = true; - break; - } - args->fpga_reg_dump.flag = true; - break; - /*MCAP specific args needs version info - * parsed in func parse_mcap_arguments*/ - case 'a': - case 's': - case 'p': - case 't': - case 'x': - case 'C': - case 'q': - break; - default: - fprintf(stderr, "Invalid Option :%c\n", opt); - args->help.flag = true; - break; - } - } - - return ret; -} - diff --git a/XVSEC/linux-kernel/tools/xvsec_parser.h b/XVSEC/linux-kernel/tools/xvsec_parser.h deleted file mode 100644 index 84675c5..0000000 --- a/XVSEC/linux-kernel/tools/xvsec_parser.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This file is part of the XVSEC userspace application - * to enable the user to execute the XVSEC functionality - * - * Copyright (c) 2020, Xilinx, Inc. - * All rights reserved. - * - * This source code is licensed under BSD-style license (found in the - * LICENSE file in the root directory of this source tree) - */ - -#ifndef __XVSEC_PARSER_H__ -#define __XVSEC_PARSER_H__ - -#define MODE_STR "mode" -#define CACHE_STR "axi_cache" -#define PROT_STR "axi_prot" - -#define MODE_STR_32B "32b" -#define MODE_STR_128B "128b" -#define MAX_FILE_LENGTH 300 - -#define MAX_NO_OF_P_ARGS_FOR_US 9 -#define MAX_NO_OF_P_ARGS_FOR_VERSAL 14 - -/* main parser function */ -int parse_arguments(int argc, char *argv[], struct args *args); - -/* mcap related options parser function */ -int parse_mcap_arguments(int argc, char *argv[], struct args *args); - -/* access-mcap-regs Option */ -int parse_opt_a_arguments(int argc, char *argv[], struct args *args); - -/* access-fpga-regs */ -int parse_opt_s_arguments(int argc, char *argv[], struct args *args); - -/* program option */ -int parse_opt_p_arguments(int argc, char *argv[], struct args *args); - -/* Partial Reconfig Clear */ -int parse_opt_C_arguments(int argc, char *argv[], struct args *args); - -/* retrieve arguement */ -int parse_opt_t_arguments(int argc, char *argv[], struct args *args); - -/* versal axi-regs access */ -int parse_opt_x_arguments(int argc, char *argv[], struct args *args); - -/* sub function for program options for versal */ -int parse_arguments_for_versal(int argc, char *argv[], struct args *args); - -/* sub function for program options for ultrscale */ -int parse_arguments_for_us(int argc, char *argv[], struct args *args); - -#endif /* __XVSEC_PARSER_H__ */ diff --git a/docs/source/includeme.rst b/docs/source/includeme.rst deleted file mode 100644 index 38ba804..0000000 --- a/docs/source/includeme.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../README.rst \ No newline at end of file diff --git a/XDMA/linux-kernel/include/libxdma_api.h b/include/libxdma_api.h similarity index 100% rename from XDMA/linux-kernel/include/libxdma_api.h rename to include/libxdma_api.h diff --git a/index.html b/index.html deleted file mode 100644 index 02b9c86..0000000 --- a/index.html +++ /dev/null @@ -1,30 +0,0 @@ -<html> - <head> - <meta charset="utf-8"> - <link rel="stylesheet" - href="DPDK/html/_static/css/theme.css" - type="text/css"/> - <title>Xilinx QDMA IP Drivers Documentation</title> - </head> - - <body style="background-color: white"> - <div class="section" style="background-color: white" align="center"> - <h1>Xilinx QDMA IP Drivers Documentation</h1> - <hr/> - <p> - Xilinx QDMA IP Drivers documentation is organized by release version. - </p> - <p>Please use the following links to browse Xilinx QDMA IP Drivers documentation for a specific release. - </p> - <ul style="font-size: large; font-weight: bold; list-style-type: none"> - <li><a href="2019.1/DPDK/html/index.html">2019.1 DPDK driver</a></li> - <li><a href="2019.1/linux-kernel/html/index.html">2019.1 Linux driver</a></li> - <li><a href="2019.2/DPDK/html/index.html">2019.2 DPDK driver</a></li> - <li><a href="2019.2/linux-kernel/html/index.html">2019.2 Linux driver</a></li> - <li><a href="master/DPDK/html/index.html">master DPDK driver</a></li> - <li><a href="master/linux-kernel/html/index.html">master Linux driver</a></li> - <li><a href="master/windows/html/index.html">master Windows driver</a></li> - </ul> - </div> - </body> -</html> \ No newline at end of file diff --git a/XDMA/linux-kernel/readme.txt b/readme.txt similarity index 100% rename from XDMA/linux-kernel/readme.txt rename to readme.txt diff --git a/XDMA/linux-kernel/tests/data/datafile0_4K.bin b/tests/data/datafile0_4K.bin similarity index 100% rename from XDMA/linux-kernel/tests/data/datafile0_4K.bin rename to tests/data/datafile0_4K.bin diff --git a/XDMA/linux-kernel/tests/data/datafile1_4K.bin b/tests/data/datafile1_4K.bin similarity index 100% rename from XDMA/linux-kernel/tests/data/datafile1_4K.bin rename to tests/data/datafile1_4K.bin diff --git a/XDMA/linux-kernel/tests/data/datafile2_4K.bin b/tests/data/datafile2_4K.bin similarity index 100% rename from XDMA/linux-kernel/tests/data/datafile2_4K.bin rename to tests/data/datafile2_4K.bin diff --git a/XDMA/linux-kernel/tests/data/datafile3_4K.bin b/tests/data/datafile3_4K.bin similarity index 100% rename from XDMA/linux-kernel/tests/data/datafile3_4K.bin rename to tests/data/datafile3_4K.bin diff --git a/XDMA/linux-kernel/tests/data/datafile_256K.bin b/tests/data/datafile_256K.bin similarity index 100% rename from XDMA/linux-kernel/tests/data/datafile_256K.bin rename to tests/data/datafile_256K.bin diff --git a/XDMA/linux-kernel/tests/data/datafile_32M.bin b/tests/data/datafile_32M.bin similarity index 100% rename from XDMA/linux-kernel/tests/data/datafile_32M.bin rename to tests/data/datafile_32M.bin diff --git a/XDMA/linux-kernel/tests/data/datafile_8K.bin b/tests/data/datafile_8K.bin similarity index 100% rename from XDMA/linux-kernel/tests/data/datafile_8K.bin rename to tests/data/datafile_8K.bin diff --git a/XDMA/linux-kernel/tests/dma_memory_mapped_test.sh b/tests/dma_memory_mapped_test.sh similarity index 100% rename from XDMA/linux-kernel/tests/dma_memory_mapped_test.sh rename to tests/dma_memory_mapped_test.sh diff --git a/XDMA/linux-kernel/tests/dma_streaming_test.sh b/tests/dma_streaming_test.sh similarity index 100% rename from XDMA/linux-kernel/tests/dma_streaming_test.sh rename to tests/dma_streaming_test.sh diff --git a/XDMA/linux-kernel/tests/load_driver.sh b/tests/load_driver.sh similarity index 100% rename from XDMA/linux-kernel/tests/load_driver.sh rename to tests/load_driver.sh diff --git a/XDMA/linux-kernel/tests/perform_hwcount.sh b/tests/perform_hwcount.sh similarity index 100% rename from XDMA/linux-kernel/tests/perform_hwcount.sh rename to tests/perform_hwcount.sh diff --git a/XDMA/linux-kernel/tests/run_test.sh b/tests/run_test.sh similarity index 100% rename from XDMA/linux-kernel/tests/run_test.sh rename to tests/run_test.sh diff --git a/XDMA/linux-kernel/tests/scripts_mm/fio_parse_result.sh b/tests/scripts_mm/fio_parse_result.sh similarity index 100% rename from XDMA/linux-kernel/tests/scripts_mm/fio_parse_result.sh rename to tests/scripts_mm/fio_parse_result.sh diff --git a/XDMA/linux-kernel/tests/scripts_mm/fio_test.sh b/tests/scripts_mm/fio_test.sh similarity index 100% rename from XDMA/linux-kernel/tests/scripts_mm/fio_test.sh rename to tests/scripts_mm/fio_test.sh diff --git a/XDMA/linux-kernel/tests/scripts_mm/io.sh b/tests/scripts_mm/io.sh similarity index 100% rename from XDMA/linux-kernel/tests/scripts_mm/io.sh rename to tests/scripts_mm/io.sh diff --git a/XDMA/linux-kernel/tests/scripts_mm/io_sweep.sh b/tests/scripts_mm/io_sweep.sh similarity index 100% rename from XDMA/linux-kernel/tests/scripts_mm/io_sweep.sh rename to tests/scripts_mm/io_sweep.sh diff --git a/XDMA/linux-kernel/tests/scripts_mm/libtest.sh b/tests/scripts_mm/libtest.sh similarity index 100% rename from XDMA/linux-kernel/tests/scripts_mm/libtest.sh rename to tests/scripts_mm/libtest.sh diff --git a/XDMA/linux-kernel/tests/scripts_mm/unaligned.sh b/tests/scripts_mm/unaligned.sh similarity index 100% rename from XDMA/linux-kernel/tests/scripts_mm/unaligned.sh rename to tests/scripts_mm/unaligned.sh diff --git a/XDMA/linux-kernel/tests/scripts_mm/xdma_mm.sh b/tests/scripts_mm/xdma_mm.sh similarity index 100% rename from XDMA/linux-kernel/tests/scripts_mm/xdma_mm.sh rename to tests/scripts_mm/xdma_mm.sh diff --git a/XDMA/linux-kernel/tools/Makefile b/tools/Makefile similarity index 100% rename from XDMA/linux-kernel/tools/Makefile rename to tools/Makefile diff --git a/XDMA/linux-kernel/tools/dma_from_device.c b/tools/dma_from_device.c similarity index 100% rename from XDMA/linux-kernel/tools/dma_from_device.c rename to tools/dma_from_device.c diff --git a/XDMA/linux-kernel/tools/dma_to_device.c b/tools/dma_to_device.c similarity index 100% rename from XDMA/linux-kernel/tools/dma_to_device.c rename to tools/dma_to_device.c diff --git a/XDMA/linux-kernel/tools/dma_utils.c b/tools/dma_utils.c similarity index 100% rename from XDMA/linux-kernel/tools/dma_utils.c rename to tools/dma_utils.c diff --git a/XDMA/linux-kernel/tools/performance.c b/tools/performance.c similarity index 100% rename from XDMA/linux-kernel/tools/performance.c rename to tools/performance.c diff --git a/XDMA/linux-kernel/tools/reg_rw.c b/tools/reg_rw.c similarity index 100% rename from XDMA/linux-kernel/tools/reg_rw.c rename to tools/reg_rw.c diff --git a/XDMA/linux-kernel/tools/test_chrdev.c b/tools/test_chrdev.c similarity index 100% rename from XDMA/linux-kernel/tools/test_chrdev.c rename to tools/test_chrdev.c diff --git a/XDMA/linux-kernel/xdma/Makefile b/xdma/Makefile similarity index 100% rename from XDMA/linux-kernel/xdma/Makefile rename to xdma/Makefile diff --git a/XDMA/linux-kernel/xdma/cdev_bypass.c b/xdma/cdev_bypass.c similarity index 100% rename from XDMA/linux-kernel/xdma/cdev_bypass.c rename to xdma/cdev_bypass.c diff --git a/XDMA/linux-kernel/xdma/cdev_ctrl.c b/xdma/cdev_ctrl.c similarity index 98% rename from XDMA/linux-kernel/xdma/cdev_ctrl.c rename to xdma/cdev_ctrl.c index dbc41ef..8230546 100644 --- a/XDMA/linux-kernel/xdma/cdev_ctrl.c +++ b/xdma/cdev_ctrl.c @@ -233,7 +233,11 @@ int bridge_mmap(struct file *file, struct vm_area_struct *vma) * prevent touching the pages (byte access) for swap-in, * and prevent the pages from being swapped out */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) + vm_flags_set(vma, VMEM_FLAGS); +#else vma->vm_flags |= VMEM_FLAGS; +#endif /* make MMIO accessible to user space */ rv = io_remap_pfn_range(vma, vma->vm_start, phys >> PAGE_SHIFT, vsize, vma->vm_page_prot); diff --git a/XDMA/linux-kernel/xdma/cdev_ctrl.h b/xdma/cdev_ctrl.h similarity index 100% rename from XDMA/linux-kernel/xdma/cdev_ctrl.h rename to xdma/cdev_ctrl.h diff --git a/XDMA/linux-kernel/xdma/cdev_events.c b/xdma/cdev_events.c similarity index 100% rename from XDMA/linux-kernel/xdma/cdev_events.c rename to xdma/cdev_events.c diff --git a/XDMA/linux-kernel/xdma/cdev_sgdma.c b/xdma/cdev_sgdma.c similarity index 98% rename from XDMA/linux-kernel/xdma/cdev_sgdma.c rename to xdma/cdev_sgdma.c index 7923441..d32718f 100644 --- a/XDMA/linux-kernel/xdma/cdev_sgdma.c +++ b/xdma/cdev_sgdma.c @@ -109,7 +109,7 @@ static void async_io_handler(unsigned long cb_hndl, int err) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) caio->iocb->ki_complete(caio->iocb, res, res2); #else - aio_complete(caio->iocb, res, res2); + aio_complete(caio->iocb, res, caio->res2); #endif skip_tran: spin_unlock(&caio->lock); @@ -565,12 +565,20 @@ static ssize_t cdev_aio_read(struct kiocb *iocb, const struct iovec *io, #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0) static ssize_t cdev_write_iter(struct kiocb *iocb, struct iov_iter *io) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) + return cdev_aio_write(iocb, io->__iov, io->nr_segs, io->iov_offset); +#else return cdev_aio_write(iocb, io->iov, io->nr_segs, io->iov_offset); +#endif } static ssize_t cdev_read_iter(struct kiocb *iocb, struct iov_iter *io) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) + return cdev_aio_read(iocb, io->__iov, io->nr_segs, io->iov_offset); +#else return cdev_aio_read(iocb, io->iov, io->nr_segs, io->iov_offset); +#endif } #endif diff --git a/XDMA/linux-kernel/xdma/cdev_sgdma.h b/xdma/cdev_sgdma.h similarity index 100% rename from XDMA/linux-kernel/xdma/cdev_sgdma.h rename to xdma/cdev_sgdma.h diff --git a/XDMA/linux-kernel/xdma/cdev_xvc.c b/xdma/cdev_xvc.c similarity index 100% rename from XDMA/linux-kernel/xdma/cdev_xvc.c rename to xdma/cdev_xvc.c diff --git a/XDMA/linux-kernel/xdma/cdev_xvc.h b/xdma/cdev_xvc.h similarity index 100% rename from XDMA/linux-kernel/xdma/cdev_xvc.h rename to xdma/cdev_xvc.h diff --git a/XDMA/linux-kernel/xdma/libxdma.c b/xdma/libxdma.c similarity index 100% rename from XDMA/linux-kernel/xdma/libxdma.c rename to xdma/libxdma.c diff --git a/XDMA/linux-kernel/xdma/libxdma.h b/xdma/libxdma.h similarity index 100% rename from XDMA/linux-kernel/xdma/libxdma.h rename to xdma/libxdma.h diff --git a/XDMA/linux-kernel/xdma/version.h b/xdma/version.h similarity index 100% rename from XDMA/linux-kernel/xdma/version.h rename to xdma/version.h diff --git a/XDMA/linux-kernel/xdma/xdma_cdev.c b/xdma/xdma_cdev.c similarity index 99% rename from XDMA/linux-kernel/xdma/xdma_cdev.c rename to xdma/xdma_cdev.c index 363ffb4..749bf97 100644 --- a/XDMA/linux-kernel/xdma/xdma_cdev.c +++ b/xdma/xdma_cdev.c @@ -603,7 +603,11 @@ fail: int xdma_cdev_init(void) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0) g_xdma_class = class_create(THIS_MODULE, XDMA_NODE_NAME); +#else + g_xdma_class = class_create(XDMA_NODE_NAME); +#endif if (IS_ERR(g_xdma_class)) { dbg_init(XDMA_NODE_NAME ": failed to create class"); return -EINVAL; diff --git a/XDMA/linux-kernel/xdma/xdma_cdev.h b/xdma/xdma_cdev.h similarity index 100% rename from XDMA/linux-kernel/xdma/xdma_cdev.h rename to xdma/xdma_cdev.h diff --git a/XDMA/linux-kernel/xdma/xdma_mod.c b/xdma/xdma_mod.c similarity index 100% rename from XDMA/linux-kernel/xdma/xdma_mod.c rename to xdma/xdma_mod.c diff --git a/XDMA/linux-kernel/xdma/xdma_mod.h b/xdma/xdma_mod.h similarity index 100% rename from XDMA/linux-kernel/xdma/xdma_mod.h rename to xdma/xdma_mod.h diff --git a/XDMA/linux-kernel/xdma/xdma_thread.c b/xdma/xdma_thread.c similarity index 100% rename from XDMA/linux-kernel/xdma/xdma_thread.c rename to xdma/xdma_thread.c diff --git a/XDMA/linux-kernel/xdma/xdma_thread.h b/xdma/xdma_thread.h similarity index 100% rename from XDMA/linux-kernel/xdma/xdma_thread.h rename to xdma/xdma_thread.h -- GitLab